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 {
[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<ChunkType> 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<u8> {
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<u8> {
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<u8> {
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)));
},