From fdecbcc093de1908b997ef17fee79e182ddc75bd Mon Sep 17 00:00:00 2001 From: alterwain Date: Sat, 8 Feb 2025 16:02:43 +0300 Subject: [PATCH] modified: outdb modified: src/main.rs --- outdb | Bin 2592 -> 3448 bytes src/main.rs | 39 ++++++++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/outdb b/outdb index c070eec672ac9a2c58bbe3980209013ed6d03d61..ac85d77d3951fa6b63ecb7e3c2991d5b77123392 100644 GIT binary patch delta 300 zcmZ1=@cw&NzY;HzoVgyhIgh457qGKTZeaSQY|LQ6V8sx{ z;KdNi5Xhj%kjqfOV9b!4QJj(h)C%$kGt?giFo#TD!z{tG(5L7z(|Ysma^X#an=dd2 GumJ!wpjU?g delta 248 zcmew%wLnB6HzO(K3j+fK2R8!)BakiuVpbqdw>@CL<-}a~i3%DVzKma8{VVIDCI+lf z6adP}05J;?=VoLk@&IX&zTAwQL for ChunkType { match value { [0x6D, 0x68, 0x62, 0x64] => ChunkType::Database, [0x6D, 0x68, 0x73, 0x64] => ChunkType::DataSet, - [0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumList, - [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumItem, + [0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumItem, + [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumList, [0x6D, 0x68, 0x6C, 0x74] => ChunkType::TrackList, [0x6D, 0x68, 0x69, 0x74] => ChunkType::TrackItem, [0x6D, 0x68, 0x6F, 0x64] => ChunkType::StringTypes, @@ -41,8 +41,8 @@ impl From for [u8; 4] { match value { ChunkType::Database => [0x6D, 0x68, 0x62, 0x64], ChunkType::DataSet => [0x6D, 0x68, 0x73, 0x64], - ChunkType::AlbumList => [0x6D, 0x68, 0x69, 0x61], - ChunkType::AlbumItem => [0x6D, 0x68, 0x6C, 0x61], + ChunkType::AlbumItem => [0x6D, 0x68, 0x69, 0x61], + ChunkType::AlbumList => [0x6D, 0x68, 0x6C, 0x61], ChunkType::TrackList => [0x6D, 0x68, 0x6C, 0x74], ChunkType::TrackItem => [0x6D, 0x68, 0x69, 0x74], ChunkType::StringTypes => [0x6D, 0x68, 0x6F, 0x64], @@ -250,11 +250,11 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { ChunkType::DataSet => { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ds: DataSet = bincode::deserialize(&data[i..i+u]).unwrap(); - info!("val: {:?}", ds); + info!("DataSet: {:?}", ds); xdb.children.push(XDataSet { header: header, data: ds.clone(), child: match ds.data_type { 3 => XSomeList::Playlists(Vec::new()), // Playlist List 4 => XSomeList::AlbumList(Vec::new()), // Album List - _ => XSomeList::TrackList(Vec::new()) // 1 Track List + _ => XSomeList::TrackList(Vec::new()) // Track List (1) }}); }, ChunkType::AlbumList => { @@ -266,6 +266,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ai: AlbumItem = bincode::deserialize(&data[i..i+u]).unwrap(); info!("val: {:?}", ai); + info!("AlbumItem: {}", u); if let XSomeList::AlbumList(albums) = &mut xdb.find_dataset(4).child { albums.push(XAlbumItem {header: header, data: ai,args: Vec::new()}); } @@ -501,11 +502,13 @@ fn to_bytes(xdb: XDatabase) -> Vec { pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap()); pl_bytes.append(&mut args); } - let mhlp = ChunkHeader { chunk_type: ChunkType::PlaylistList.into(), end_of_chunk: 12, children_count: playlists.len() as u32 }; + 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, 4, mhlp.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhlp); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut pl_bytes); }, XSomeList::AlbumList(albums) => { @@ -513,15 +516,18 @@ fn to_bytes(xdb: XDatabase) -> Vec { for u in 0..albums.len() { let album = albums.get(u).unwrap(); let mut args = x_args_to_bytes(&album.args); - al_bytes.append(&mut generate_header(ChunkType::AlbumItem, 20,args.len())); + al_bytes.append(&mut generate_header(ChunkType::AlbumItem, 76,args.len())); al_bytes.append(&mut bincode::serialize(&album.data).unwrap()); + al_bytes.append(&mut generate_zeroes(68)); al_bytes.append(&mut args); } - let mhla = ChunkHeader { chunk_type: ChunkType::AlbumList.into(), end_of_chunk: 12, children_count: albums.len() as u32 }; + let mhla = ChunkHeader { chunk_type: ChunkType::AlbumList.into(), end_of_chunk: 92, children_count: albums.len() as u32 }; let mut mhla = bincode::serialize(&mhla).unwrap(); - bytes.append(&mut generate_header(ChunkType::DataSet, 4, mhla.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhla.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhla); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut al_bytes); }, XSomeList::TrackList(tracks) => { @@ -529,15 +535,18 @@ fn to_bytes(xdb: XDatabase) -> Vec { for u in 0..tracks.len() { let track = tracks.get(u).unwrap(); let mut args = x_args_to_bytes(&track.args); - tr_bytes.append(&mut generate_header(ChunkType::TrackItem, 292,args.len())); + 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 args); } - let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 12, children_count: tracks.len() as u32 }; + let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 92, children_count: tracks.len() as u32 }; let mut mhlt = bincode::serialize(&mhlt).unwrap(); - bytes.append(&mut generate_header(ChunkType::DataSet, 4, mhlt.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlt.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhlt); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut tr_bytes); } } @@ -564,7 +573,7 @@ fn main() { Ok(n) => { let data = &buf[..n]; let xdb = parse_bytes(data); - //info!("XDB: {:?}", xdb); + info!("XDB: {:?}", xdb); //let mut op = File::create("outdb").unwrap(); //info!("Write res: {:?}", op.write(&to_bytes(xdb))); },