diff --git a/outdb b/outdb index c5aad1a..98c84f9 100644 Binary files a/outdb and b/outdb differ diff --git a/src/main.rs b/src/main.rs index d33f391..1c4b790 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,13 +41,14 @@ fn main() { item.args = xargs; item.data.number_of_strings = 3; 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); + item.data.dbid = rand::thread_rng().gen_range(10000..100000); + item.data.dbid2 = item.data.dbid; tracks.push(item); } if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(2).child { let playlist = playlists.last_mut().unwrap(); + playlist.data.playlist_item_count = playlist.data.playlist_item_count + 1; let elem = playlist.elems.last().unwrap(); let mut pl_item = elem.0.clone(); pl_item.track_id = unique_id; @@ -63,6 +64,7 @@ fn main() { if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(3).child { let playlist = playlists.last_mut().unwrap(); + playlist.data.playlist_item_count = playlist.data.playlist_item_count + 1; let elem = playlist.elems.last().unwrap(); let mut pl_item = elem.0.clone(); pl_item.track_id = unique_id; diff --git a/src/objects.rs b/src/objects.rs index 2365cf1..b07517d 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -212,7 +212,7 @@ pub struct JumpTable { #[derive(Serialize, Deserialize, PartialEq, Debug)] pub struct Playlist { data_object_child_count: u32, - playlist_item_count: u32, + pub playlist_item_count: u32, is_master_playlist_flag: u8, unk: [u8; 3], timestamp: u32, diff --git a/src/xobjects.rs b/src/xobjects.rs index 6f76889..9169549 100644 --- a/src/xobjects.rs +++ b/src/xobjects.rs @@ -1,3 +1,5 @@ +use rand::Rng; + use crate::objects::{AlbumItem, ChunkHeader, DataSet, Database, JumpTable, LetterJumpEntry, Playlist, PlaylistIndexEntry, PlaylistItem, TrackItem}; @@ -74,4 +76,32 @@ impl XDatabase { pub fn find_dataset(&mut self, data_type: u32) -> &mut XDataSet { self.children.iter_mut().find(|d| d.data.data_type == data_type).unwrap() } + + pub fn add_track(&mut self, track: XTrackItem) { + self.add_track_to_playlists(2, &track); + self.add_track_to_playlists(3, &track); + + if let XSomeList::TrackList(tracks) = &mut self.find_dataset(1).child { + tracks.push(track); + } + } + + fn add_track_to_playlists(&mut self, n: u32, track: &XTrackItem) { + if let XSomeList::Playlists(playlists) = &mut self.find_dataset(n).child { + let playlist = playlists.last_mut().unwrap(); + playlist.data.playlist_item_count = playlist.data.playlist_item_count + 1; + + let elem = playlist.elems.last().unwrap(); + let mut pl_item = elem.0.clone(); + pl_item.track_id = track.data.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)); + } + } } \ No newline at end of file