diff --git a/src/music/metadata.rs b/src/music/metadata.rs index cfafddb..701abb9 100644 --- a/src/music/metadata.rs +++ b/src/music/metadata.rs @@ -25,6 +25,9 @@ pub struct CoverData { 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, path: String) -> Option { let probe = symphonia::default::get_probe(); @@ -66,10 +69,10 @@ pub fn extract_track_data(file: Vec, path: String) -> Option for tag in current_metadata.tags() { match tag.key.as_str() { - "TIT2" => title = Some(tag.value.to_string()), - "TPE1" => artist = Some(tag.value.to_string()), - "TPE2" => album_artist = Some(tag.value.to_string()), - "TALB" => album = Some(tag.value.to_string()), + "TIT2" | "TT2" => title = Some(tag.value.to_string()), + "TPE1" | "TP1" => artist = Some(tag.value.to_string()), + "TPE2" | "TP2" => album_artist = Some(tag.value.to_string()), + "TALB" | "TAL" => album = Some(tag.value.to_string()), _ => (), } } @@ -77,14 +80,33 @@ pub fn extract_track_data(file: Vec, path: String) -> Option let mut cover: Option = None; 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" { 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 { - bytes: visual.data.to_vec(), + bytes: data, mime_type, }); }