diff --git a/Cargo.lock b/Cargo.lock index 62d00ea..bef0552 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,7 +90,7 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "itunesdb" -version = "0.1.34" +version = "0.1.36" dependencies = [ "bincode", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 5f2b2d4..249dcef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "itunesdb" -version = "0.1.35" +version = "0.1.36" edition = "2021" authors = ["alterwain"] diff --git a/src/artworkdb.rs b/src/artworkdb.rs index 61035d6..84f2261 100644 --- a/src/artworkdb.rs +++ b/src/artworkdb.rs @@ -1,7 +1,7 @@ pub mod deserializer { use log::info; use crate::artworkdb::aobjects::{ADataSet, ADatabase, AImageItem, ALocationTag}; - use crate::artworkdb::objects::{ChunkHeader, ChunkType, DataSet, Database, ImageItem, ImageName, LocationTag}; + use crate::artworkdb::objects::{ChunkHeader, ChunkType, DataSet, Database, ImageFile, ImageItem, ImageName, LocationTag}; enum ChunkState { Header, @@ -47,7 +47,13 @@ pub mod deserializer { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ai: ImageItem = bincode::deserialize(&data[i..i+u]).unwrap(); let images = &mut adb.find_dataset(last_type).child; - images.push(AImageItem { data: ai, args: Vec::new() }); + images.push(AImageItem { data: Some(ai), file: None, args: Vec::new() }); + }, + ChunkType::FileImage => { + u = usize::try_from(header.end_of_chunk).unwrap() - 12; + let ai: ImageFile = bincode::deserialize(&data[i..i+u]).unwrap(); + let images = &mut adb.find_dataset(last_type).child; + images.push(AImageItem { data: None, file: Some(ai), args: Vec::new() }); }, ChunkType::LocationTag => { u = usize::try_from(header.end_of_chunk).unwrap() - 12; @@ -95,7 +101,7 @@ pub mod deserializer { } pub mod aobjects { - use crate::artworkdb::objects::{ChunkHeader, DataSet, Database, ImageItem, ImageName, LocationTag}; + use crate::artworkdb::objects::{ChunkHeader, DataSet, Database, ImageFile, ImageItem, ImageName, LocationTag}; #[derive(Debug, serde::Serialize)] pub struct ADatabase { @@ -119,7 +125,8 @@ pub mod aobjects { #[derive(Debug, serde::Serialize)] pub struct AImageItem { - pub data: ImageItem, + pub data: Option, + pub file: Option, pub args: Vec, } @@ -143,6 +150,7 @@ pub mod objects { ImageItem, LocationTag, ImageName, + FileImage, Unknown, } @@ -157,6 +165,7 @@ pub mod objects { [0x6D, 0x68, 0x6E, 0x69] => ChunkType::ImageName, [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumList, [0x6D, 0x68, 0x6C, 0x66] => ChunkType::FileList, + [0x6D, 0x68, 0x69, 0x66] => ChunkType::FileImage, _ => ChunkType::Unknown, } } @@ -174,6 +183,7 @@ pub mod objects { ChunkType::ImageName => [0x6D, 0x68, 0x6E, 0x69], ChunkType::AlbumList => [0x6D, 0x68, 0x6C, 0x61], ChunkType::FileList => [0x6D, 0x68, 0x6C, 0x66], + ChunkType::FileImage => [0x6D, 0x68, 0x69, 0x66], } } } @@ -225,6 +235,13 @@ pub mod objects { source_image_size: u32 } + #[derive(Serialize, Deserialize, PartialEq, Debug)] + pub struct ImageFile { + unknown1: u32, + correlation_id: u32, + image_size: u32 + } + #[derive(Serialize, Deserialize, PartialEq, Debug)] pub struct ImageName { number_of_children: u32,