diff --git a/outdb b/outdb index 1e67b32..ebc049e 100644 Binary files a/outdb and b/outdb differ diff --git a/src/deserializer.rs b/src/deserializer.rs index e755b06..6a94aed 100644 --- a/src/deserializer.rs +++ b/src/deserializer.rs @@ -186,7 +186,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { playlists.push(XPlaylist {header: header, data: playlist,args: Vec::new(), elems: Vec::new()}); } }, - _ => { u = 1; } + _ => { u = 1; info!("Unknown stuff happened"); } } i += u; chunk_header = None; diff --git a/src/objects.rs b/src/objects.rs index 6ea21b6..ba3f7d2 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -66,7 +66,10 @@ pub struct Database { unknown1: [u8; 32], language: u16, persistent_id: u64, - hash: [u8; 20] + hash: [u8; 20], + unk: [u8; 30], + unk1: [u8; 32], + unk2: [u8; 20] } #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] @@ -154,7 +157,14 @@ pub struct TrackItem { unk39_hash: [u8; 20], unk40: [u8; 18], album_id: u16, - mhii_link: u32 + mhii_link: u32, + unk: [u8; 32], + unk1: [u8; 32], + unk2: [u8; 32], + unk3: [u8; 32], + unk4: [u8; 32], + unk5: [u8; 32], + unk6: [u8; 32] } #[derive(Serialize, Deserialize, PartialEq, Debug)] @@ -210,7 +220,9 @@ pub struct Playlist { unk3: u32, string_mhod_count: u16, podcast_flag: u16, - list_sort_order: u32 + list_sort_order: u32, + unk1: [u8; 22], + unk2: [u8; 22], } #[derive(Serialize, Deserialize, PartialEq, Debug)] diff --git a/src/serializer.rs b/src/serializer.rs index 72a4af2..74a4f29 100644 --- a/src/serializer.rs +++ b/src/serializer.rs @@ -10,25 +10,7 @@ fn string_to_ipod16(str: &String) -> Vec { fn x_args_to_bytes(args: &Vec) -> Vec { args.iter() .filter(|arg| arg.arg_type <= 15) - .map(|arg| { - let s = string_to_ipod16(&arg.val); - let mut b = bincode::serialize(&StringEntry { - entry_type: arg.arg_type, - unk1: 0, - unk2: 0, - position: 1, - length: s.len() as u32, - unknown: 0, - unk4: 0 - }).unwrap(); - let h = bincode::serialize(&ChunkHeader { - chunk_type: ChunkType::StringTypes.into(), - end_of_chunk: 0x18, - children_count: 16 + 0x18 + s.len() as u32 - }).unwrap(); - b = [h, b, s].concat(); - return b; - }) + .map(serialize_string_arg) .flatten() .collect() } @@ -55,7 +37,7 @@ fn serialize_string_arg(xarg: &XArgument) -> Vec { unk2: 0, position: 1, length: s.len() as u32, - unknown: 0, + unknown: 1, unk4: 0 }).unwrap(); let h = bincode::serialize(&ChunkHeader { @@ -113,7 +95,6 @@ pub fn to_bytes(xdb: XDatabase) -> Vec { let mut bytes: Vec = Vec::new(); for i in 0..xdb.children.len() { let data_set = xdb.children.get(i).unwrap(); - info!("Serializer: {:?}", data_set); match &data_set.child { XSomeList::Playlists(playlists) => { let mut pl_bytes = Vec::new(); @@ -128,14 +109,14 @@ pub fn to_bytes(xdb: XDatabase) -> Vec { args.append(&mut a); } - pl_bytes.append(&mut generate_header(ChunkType::Playlist, 36,args.len())); + pl_bytes.append(&mut generate_header(ChunkType::Playlist, 172,args.len())); pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap()); - pl_bytes.append(&mut generate_zeroes(148)); + pl_bytes.append(&mut generate_zeroes(104)); pl_bytes.append(&mut args); } let mhlp = ChunkHeader { chunk_type: ChunkType::PlaylistList.into(), end_of_chunk: 92, children_count: playlists.len() as u32 }; let mut mhlp = bincode::serialize(&mhlp).unwrap(); - bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len() + pl_bytes.len() + 808)); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len() + pl_bytes.len() + 80)); // 728 bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhlp); @@ -168,7 +149,7 @@ pub fn to_bytes(xdb: XDatabase) -> Vec { let mut args = x_args_to_bytes(&track.args); tr_bytes.append(&mut generate_header(ChunkType::TrackItem, 612,args.len())); tr_bytes.append(&mut bincode::serialize(&track.data).unwrap()); - tr_bytes.append(&mut generate_zeroes(332)); + tr_bytes.append(&mut generate_zeroes(108)); tr_bytes.append(&mut args); } let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 92, children_count: tracks.len() as u32 }; @@ -186,6 +167,6 @@ pub fn to_bytes(xdb: XDatabase) -> Vec { let sdb_len = sdb.len(); let h = xdb.header.unwrap(); bytes = [sdb, generate_zeroes(h.end_of_chunk - sdb_len as u32), bytes].concat(); - bytes = [generate_header(ChunkType::Database, (h.end_of_chunk - 12) as usize, bytes.len()), bytes].concat(); + bytes = [generate_header(ChunkType::Database, (h.end_of_chunk - 12) as usize, bytes.len() - (h.end_of_chunk - 12) as usize), bytes].concat(); bytes } \ No newline at end of file