modified: outdb

modified:   src/main.rs
This commit is contained in:
Michael Wain 2025-02-08 16:02:43 +03:00
parent 34bf440691
commit fdecbcc093
2 changed files with 24 additions and 15 deletions

BIN
outdb

Binary file not shown.

View File

@ -24,8 +24,8 @@ impl From<[u8; 4]> for ChunkType {
match value { match value {
[0x6D, 0x68, 0x62, 0x64] => ChunkType::Database, [0x6D, 0x68, 0x62, 0x64] => ChunkType::Database,
[0x6D, 0x68, 0x73, 0x64] => ChunkType::DataSet, [0x6D, 0x68, 0x73, 0x64] => ChunkType::DataSet,
[0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumList, [0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumItem,
[0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumItem, [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumList,
[0x6D, 0x68, 0x6C, 0x74] => ChunkType::TrackList, [0x6D, 0x68, 0x6C, 0x74] => ChunkType::TrackList,
[0x6D, 0x68, 0x69, 0x74] => ChunkType::TrackItem, [0x6D, 0x68, 0x69, 0x74] => ChunkType::TrackItem,
[0x6D, 0x68, 0x6F, 0x64] => ChunkType::StringTypes, [0x6D, 0x68, 0x6F, 0x64] => ChunkType::StringTypes,
@ -41,8 +41,8 @@ impl From<ChunkType> for [u8; 4] {
match value { match value {
ChunkType::Database => [0x6D, 0x68, 0x62, 0x64], ChunkType::Database => [0x6D, 0x68, 0x62, 0x64],
ChunkType::DataSet => [0x6D, 0x68, 0x73, 0x64], ChunkType::DataSet => [0x6D, 0x68, 0x73, 0x64],
ChunkType::AlbumList => [0x6D, 0x68, 0x69, 0x61], ChunkType::AlbumItem => [0x6D, 0x68, 0x69, 0x61],
ChunkType::AlbumItem => [0x6D, 0x68, 0x6C, 0x61], ChunkType::AlbumList => [0x6D, 0x68, 0x6C, 0x61],
ChunkType::TrackList => [0x6D, 0x68, 0x6C, 0x74], ChunkType::TrackList => [0x6D, 0x68, 0x6C, 0x74],
ChunkType::TrackItem => [0x6D, 0x68, 0x69, 0x74], ChunkType::TrackItem => [0x6D, 0x68, 0x69, 0x74],
ChunkType::StringTypes => [0x6D, 0x68, 0x6F, 0x64], ChunkType::StringTypes => [0x6D, 0x68, 0x6F, 0x64],
@ -250,11 +250,11 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase {
ChunkType::DataSet => { ChunkType::DataSet => {
u = usize::try_from(header.end_of_chunk).unwrap() - 12; u = usize::try_from(header.end_of_chunk).unwrap() - 12;
let ds: DataSet = bincode::deserialize(&data[i..i+u]).unwrap(); 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 { xdb.children.push(XDataSet { header: header, data: ds.clone(), child: match ds.data_type {
3 => XSomeList::Playlists(Vec::new()), // Playlist List 3 => XSomeList::Playlists(Vec::new()), // Playlist List
4 => XSomeList::AlbumList(Vec::new()), // Album List 4 => XSomeList::AlbumList(Vec::new()), // Album List
_ => XSomeList::TrackList(Vec::new()) // 1 Track List _ => XSomeList::TrackList(Vec::new()) // Track List (1)
}}); }});
}, },
ChunkType::AlbumList => { ChunkType::AlbumList => {
@ -266,6 +266,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase {
u = usize::try_from(header.end_of_chunk).unwrap() - 12; u = usize::try_from(header.end_of_chunk).unwrap() - 12;
let ai: AlbumItem = bincode::deserialize(&data[i..i+u]).unwrap(); let ai: AlbumItem = bincode::deserialize(&data[i..i+u]).unwrap();
info!("val: {:?}", ai); info!("val: {:?}", ai);
info!("AlbumItem: {}", u);
if let XSomeList::AlbumList(albums) = &mut xdb.find_dataset(4).child { if let XSomeList::AlbumList(albums) = &mut xdb.find_dataset(4).child {
albums.push(XAlbumItem {header: header, data: ai,args: Vec::new()}); albums.push(XAlbumItem {header: header, data: ai,args: Vec::new()});
} }
@ -501,11 +502,13 @@ fn to_bytes(xdb: XDatabase) -> Vec<u8> {
pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap()); pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap());
pl_bytes.append(&mut args); 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(); 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 bincode::serialize(&data_set.data).unwrap());
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut mhlp); bytes.append(&mut mhlp);
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut pl_bytes); bytes.append(&mut pl_bytes);
}, },
XSomeList::AlbumList(albums) => { XSomeList::AlbumList(albums) => {
@ -513,15 +516,18 @@ fn to_bytes(xdb: XDatabase) -> Vec<u8> {
for u in 0..albums.len() { for u in 0..albums.len() {
let album = albums.get(u).unwrap(); let album = albums.get(u).unwrap();
let mut args = x_args_to_bytes(&album.args); 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 bincode::serialize(&album.data).unwrap());
al_bytes.append(&mut generate_zeroes(68));
al_bytes.append(&mut args); 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(); 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 bincode::serialize(&data_set.data).unwrap());
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut mhla); bytes.append(&mut mhla);
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut al_bytes); bytes.append(&mut al_bytes);
}, },
XSomeList::TrackList(tracks) => { XSomeList::TrackList(tracks) => {
@ -529,15 +535,18 @@ fn to_bytes(xdb: XDatabase) -> Vec<u8> {
for u in 0..tracks.len() { for u in 0..tracks.len() {
let track = tracks.get(u).unwrap(); let track = tracks.get(u).unwrap();
let mut args = x_args_to_bytes(&track.args); 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 bincode::serialize(&track.data).unwrap());
tr_bytes.append(&mut generate_zeroes(332));
tr_bytes.append(&mut args); 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(); 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 bincode::serialize(&data_set.data).unwrap());
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut mhlt); bytes.append(&mut mhlt);
bytes.append(&mut generate_zeroes(92));
bytes.append(&mut tr_bytes); bytes.append(&mut tr_bytes);
} }
} }
@ -564,7 +573,7 @@ fn main() {
Ok(n) => { Ok(n) => {
let data = &buf[..n]; let data = &buf[..n];
let xdb = parse_bytes(data); let xdb = parse_bytes(data);
//info!("XDB: {:?}", xdb); info!("XDB: {:?}", xdb);
//let mut op = File::create("outdb").unwrap(); //let mut op = File::create("outdb").unwrap();
//info!("Write res: {:?}", op.write(&to_bytes(xdb))); //info!("Write res: {:?}", op.write(&to_bytes(xdb)));
}, },