feat(metadata): support older mp3 format and fix broken jpeg headers
This commit is contained in:
@@ -25,6 +25,9 @@ pub struct CoverData {
|
|||||||
pub mime_type: String,
|
pub mime_type: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const JPEG_SOI_AND_JFIF: &[u8; 5] = &[0xFF, 0xD8, 0xFF, 0xE0, 0x00];
|
||||||
|
const JPEG_RAW_HEADER_SEGMENT: &[u8; 8] = &[0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01];
|
||||||
|
|
||||||
pub fn extract_track_data(file: Vec<u8>, path: String) -> Option<TrackMetadata> {
|
pub fn extract_track_data(file: Vec<u8>, path: String) -> Option<TrackMetadata> {
|
||||||
let probe = symphonia::default::get_probe();
|
let probe = symphonia::default::get_probe();
|
||||||
|
|
||||||
@@ -66,10 +69,10 @@ pub fn extract_track_data(file: Vec<u8>, path: String) -> Option<TrackMetadata>
|
|||||||
|
|
||||||
for tag in current_metadata.tags() {
|
for tag in current_metadata.tags() {
|
||||||
match tag.key.as_str() {
|
match tag.key.as_str() {
|
||||||
"TIT2" => title = Some(tag.value.to_string()),
|
"TIT2" | "TT2" => title = Some(tag.value.to_string()),
|
||||||
"TPE1" => artist = Some(tag.value.to_string()),
|
"TPE1" | "TP1" => artist = Some(tag.value.to_string()),
|
||||||
"TPE2" => album_artist = Some(tag.value.to_string()),
|
"TPE2" | "TP2" => album_artist = Some(tag.value.to_string()),
|
||||||
"TALB" => album = Some(tag.value.to_string()),
|
"TALB" | "TAL" => album = Some(tag.value.to_string()),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,14 +80,33 @@ pub fn extract_track_data(file: Vec<u8>, path: String) -> Option<TrackMetadata>
|
|||||||
let mut cover: Option<CoverData> = None;
|
let mut cover: Option<CoverData> = None;
|
||||||
|
|
||||||
for visual in current_metadata.visuals() {
|
for visual in current_metadata.visuals() {
|
||||||
let mime_type = visual.media_type.clone();
|
let mut mime_type = visual.media_type.clone();
|
||||||
|
let lower_mime_type = mime_type.to_lowercase();
|
||||||
|
|
||||||
|
if lower_mime_type == "png"
|
||||||
|
|| lower_mime_type == "webp"
|
||||||
|
|| lower_mime_type == "jpeg"
|
||||||
|
|| lower_mime_type == "jpg"
|
||||||
|
{
|
||||||
|
mime_type = format!("image/{lower_mime_type}");
|
||||||
|
}
|
||||||
|
|
||||||
if mime_type != "image/png" && mime_type != "image/jpeg" && mime_type != "image/webp" {
|
if mime_type != "image/png" && mime_type != "image/jpeg" && mime_type != "image/webp" {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let data = if visual.data.starts_with(JPEG_RAW_HEADER_SEGMENT) {
|
||||||
|
let mut data = JPEG_SOI_AND_JFIF.to_vec();
|
||||||
|
|
||||||
|
data.append(&mut visual.data.to_vec());
|
||||||
|
|
||||||
|
data
|
||||||
|
} else {
|
||||||
|
visual.data.to_vec()
|
||||||
|
};
|
||||||
|
|
||||||
cover = Some(CoverData {
|
cover = Some(CoverData {
|
||||||
bytes: visual.data.to_vec(),
|
bytes: data,
|
||||||
mime_type,
|
mime_type,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user