diff --git a/outdb b/outdb index ebc049e..c5aad1a 100644 Binary files a/outdb and b/outdb differ diff --git a/src/main.rs b/src/main.rs index 402c957..d33f391 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use std::{fs::File, io::{Read, Write}}; use env_logger::Builder; use log::{error, info, LevelFilter}; use rand::Rng; -use xobjects::{XArgument, XSomeList}; +use xobjects::{XArgument, XPlArgument, XSomeList}; mod objects; mod xobjects; @@ -22,7 +22,7 @@ fn main() { .init(); // /Users/michael/Documents/ipod/iTunes/iTunesDB - let mut f = File::open("D:\\Documents\\iTunes\\iTunesDB").unwrap(); // D:\\Documents\\iTunes\\iTunesDB + let mut f = File::open("/Users/michael/Documents/ipod/iTunes/iTunesDB").unwrap(); // D:\\Documents\\iTunes\\iTunesDB let mut buf = Vec::new(); match f.read_to_end(&mut buf) { Ok(n) => { @@ -30,15 +30,10 @@ fn main() { let mut xdb = deserializer::parse_bytes(data); //info!("XDB: {:#?}", xdb); - - let json = serde_json::to_string_pretty(&xdb).unwrap(); - let mut f1 = File::create("output.json").unwrap(); - f1.write(json.as_bytes()); - - /* let unique_id = rand::thread_rng().gen_range(10..99); + let unique_id = rand::thread_rng().gen_range(10..999); if let XSomeList::TrackList(tracks) = &mut xdb.find_dataset(1).child { - /*let mut item = (*tracks.last().unwrap()).clone(); + let mut item = (*tracks.last().unwrap()).clone(); let mut xargs = Vec::new(); xargs.push(XArgument { arg_type: 1, val: String::from("They beat you") }); xargs.push(XArgument { arg_type: 6, val: String::from("MPEG audio file")}); @@ -48,21 +43,40 @@ fn main() { item.data.unique_id = unique_id; item.data.dbid = rand::thread_rng().gen_range(0..10000); item.data.dbid2 = rand::thread_rng().gen_range(0..10000); - tracks.push(item);*/ - let mut item = tracks.last_mut().unwrap(); - item.args.first_mut().unwrap().val = String::from("Goy next door"); - } */ + tracks.push(item); + } - /*if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(3).child { + if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(2).child { let playlist = playlists.last_mut().unwrap(); let elem = playlist.elems.last().unwrap(); let mut pl_item = elem.0.clone(); pl_item.track_id = unique_id; - playlist.elems.push((pl_item, elem.1.clone())); - }*/ + + pl_item.group_id = rand::thread_rng().gen_range(10..255); + let mut args = elem.1.clone(); + if let XPlArgument::RawArgument(raw) = args.last_mut().unwrap() { + raw[24] = pl_item.group_id as u8; + } + + playlist.elems.push((pl_item, args)); + } + + if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(3).child { + let playlist = playlists.last_mut().unwrap(); + let elem = playlist.elems.last().unwrap(); + let mut pl_item = elem.0.clone(); + pl_item.track_id = unique_id; + pl_item.group_id = rand::thread_rng().gen_range(10..255); + let mut args = elem.1.clone(); + if let XPlArgument::RawArgument(raw) = args.last_mut().unwrap() { + raw[24] = pl_item.group_id as u8; + } + + playlist.elems.push((pl_item, args)); + } let mut op = File::create("outdb").unwrap(); - info!("Write res: {:?}", op.write(&serializer::to_bytes(xdb))); + info!("Write res: {:?}", op.write(&serializer::to_bytes(xdb))); }, Err(e) => { error!("Error: {}",e); diff --git a/src/objects.rs b/src/objects.rs index 05f6fb5..2365cf1 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -230,7 +230,7 @@ pub struct PlaylistItem { data_object_child_count: u32, podcast_grouping_flag: u16, unk4: u16, - group_id: u32, + pub group_id: u32, pub track_id: u32, timestamp: u32, podcast_grouping_reference: u32,