0.1.67 upd

This commit is contained in:
Michael Wain 2025-02-21 01:36:46 +03:00
parent 4d44f8b3e5
commit 9a6dfa7ae6
2 changed files with 40 additions and 9 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "itunesdb"
version = "0.1.66"
version = "0.1.67"
edition = "2021"
authors = ["alterwain"]

View File

@ -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<XPlArgument> ) -> 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<XTrackItem> {
@ -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<u8> = 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);