From 9a6dfa7ae64544554a970c5ff78e26f739f2b994 Mon Sep 17 00:00:00 2001 From: "alterwain@protonmail.com" Date: Fri, 21 Feb 2025 01:36:46 +0300 Subject: [PATCH] 0.1.67 upd --- Cargo.toml | 2 +- src/xobjects.rs | 47 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 879e0cf..c049294 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "itunesdb" -version = "0.1.66" +version = "0.1.67" edition = "2021" authors = ["alterwain"] diff --git a/src/xobjects.rs b/src/xobjects.rs index c7b850b..357b7f4 100644 --- a/src/xobjects.rs +++ b/src/xobjects.rs @@ -1,7 +1,6 @@ use rand::Rng; use crate::objects::{AlbumItem, ChunkHeader, DataSet, Database, JumpTable, LetterJumpEntry, ListSortOrder, Playlist, PlaylistIndexEntry, PlaylistItem, TrackItem}; -use crate::xobjects::XPlArgument::RawArgument; #[derive(Debug, serde::Serialize)] pub struct XDatabase { @@ -183,6 +182,37 @@ impl XTrackItem { } } +fn get_ipods_name(args: Vec ) -> String { + let mut s = String::from("iPod"); + for arg in args { + if let XPlArgument::String(a) = arg { + if a.arg_type == 1 { + s = a.val; + break; + } + } + } + s +} + +fn rebuild_quick_sort(playlist: &mut XPlaylist) { + //playlist.data.data_object_child_count all 52/53 args + raw args + str args + //playlist.data.string_mhod_count only str args count (1) + let ipod_name = get_ipods_name(playlist.args.clone()); + + let mut args = Vec::new(); + args.push(XPlArgument::String(XArgument { + arg_type: 1, + val: ipod_name, + })); + args.push(XPlArgument::RawArgument(vec![109,104,111,100,24,0,0,0,136,2,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])); + args.push(XPlArgument::RawArgument(vec![109,104,111,100,24,0,0,0,100,1,0,0,102,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])); + + playlist.data.string_mhod_count = 1; + playlist.data.data_object_child_count = args.len() as u32; + playlist.args = args; +} + 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() @@ -211,7 +241,7 @@ impl XDatabase { } } } - + pub fn remove_track(&mut self, unique_id: u32, playlist_id: u64) { if let XSomeList::Playlists(playlists) = &mut self.find_dataset(2).child { for playlist in playlists.iter_mut() { @@ -254,7 +284,7 @@ impl XDatabase { return n + 1; } } - if let XSomeList::Playlists(playlists) = &mut self.find_dataset(2).child { + /*if let XSomeList::Playlists(playlists) = &mut self.find_dataset(2).child { for playlist in playlists { if playlist.data.is_master_playlist_flag != 0 { let a = playlist.args.iter().filter(|s| matches!(s, RawArgument(b))).last().unwrap(); @@ -263,8 +293,8 @@ impl XDatabase { } } } - } - 1 + }*/ + 102 } pub fn get_track(&mut self, id: u32) -> Option { @@ -282,12 +312,12 @@ impl XDatabase { tracks.push(track); } } - + pub fn remove_track_from_playlist(&mut self, track_id: u32, pl_id: u64) { self.remove_track_from_playlist_(track_id, pl_id, 2); self.remove_track_from_playlist_(track_id, pl_id, 3); } - + fn remove_track_from_playlist_(&mut self, track_id: u32, pl_id: u64, n: u32) { if let XSomeList::Playlists(playlists ) = &mut self.find_dataset(n).child { let playlist = playlists.iter_mut().find(|t| t.data.persistent_playlist_id == pl_id); @@ -311,6 +341,7 @@ impl XDatabase { let raw: Vec = vec![ 109,104,111,100,24,0,0,0,44,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,gr[0],gr[1],gr[2],gr[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]; pl_item.data_object_child_count = 1; playlist.elems.push((pl_item, vec![RawArgument(raw)])); + rebuild_quick_sort(playlist); } /*if let XSomeList::Playlists(playlists) = &mut self.find_dataset(n).child { @@ -344,7 +375,7 @@ impl XDatabase { playlists.push(playlist); } } - + pub fn remove_playlist(&mut self, pl_id: u64) { if let XSomeList::Playlists(playlists) = &mut self.find_dataset(2).child { playlists.retain_mut(|p| p.data.persistent_playlist_id != pl_id);