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,
|
||||
}
|
||||
|
||||
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> {
|
||||
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() {
|
||||
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<u8>, path: String) -> Option<TrackMetadata>
|
||||
let mut cover: Option<CoverData> = 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,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user