feat(metadata): support older mp3 format and fix broken jpeg headers

This commit is contained in:
2024-12-16 06:12:34 +01:00
parent 8b9bf1afce
commit 2be5849251

View File

@@ -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,
}); });
} }