From 48f04a25b02b392d7b198f8a8c187f4dab28ad45 Mon Sep 17 00:00:00 2001 From: "alterwain@protonmail.com" Date: Sat, 8 Feb 2025 22:44:41 +0300 Subject: [PATCH] modified: Cargo.lock modified: Cargo.toml modified: outdb modified: src/main.rs modified: src/objects.rs modified: src/xobjects.rs new file: two_tracks --- Cargo.lock | 92 +++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 +- outdb | Bin 15758 -> 15722 bytes src/main.rs | 31 +++++++++++----- src/objects.rs | 14 ++++---- src/xobjects.rs | 6 ++-- two_tracks | Bin 0 -> 16964 bytes 7 files changed, 126 insertions(+), 20 deletions(-) create mode 100755 two_tracks diff --git a/Cargo.lock b/Cargo.lock index aedf2a4..4b2925b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" @@ -31,6 +31,18 @@ dependencies = [ "serde", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "env_logger" version = "0.9.3" @@ -44,6 +56,17 @@ dependencies = [ "termcolor", ] +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -72,6 +95,7 @@ dependencies = [ "bincode", "env_logger", "log", + "rand", "serde", "serde_json", ] @@ -94,6 +118,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -112,6 +145,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "regex" version = "1.11.1" @@ -205,6 +268,12 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "winapi" version = "0.3.9" @@ -308,3 +377,24 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 8e88f1c..077f818 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,5 @@ env_logger = "0.9" log = "0.4.20" bincode = "1.3.3" serde = { version = "1.0.217", features = ["derive"] } -serde_json = "1.0.138" \ No newline at end of file +serde_json = "1.0.138" +rand = "0.8" \ No newline at end of file diff --git a/outdb b/outdb index ebc049e5073c72e6c15e185cdc52086185fa52b8..4b484ca01bd819300d44023a8b640bc364714255 100644 GIT binary patch delta 567 zcmeCHepRKAn~{|Ag@J(~%a(zG5lEK+F)I+K+a9pra$>IgLDf=s(P6POtofQTV&@>M4Li3cPm>o99G zGEP3gA~HFLnTwHWayfG@W7g!S%q5cr%-JT#>kCahV9b~?(NLH%bK*wv$ro61ES-S* zL2iKo5L*g}VPftK`3#i|3JiG+sSFiB7b`HN07dc{iYCuwoylv+V9H>{5XBJ25Y7-a z*`Dn#4_o1x$J5TP?mDRPWa{JuK@%1ypupsdEHRTm@NsPZBN)NKnhi8QZL*?(GRLXy z{!eCAODazG5l~>v2D%IAxhs?#!7=%O)ETfbsg4<`o@e}ffiBVEVFd>^0|Us3a2J`# z7_cz|MJA^!*|H$ZOs+Fm*sP<>0g*M=v_^pf0&D=|Kd}@5 delta 564 zcmaD=)mN>Mn~{|Ag@J*g&z6CK5lEK+F)I-J@0elMX>lcGqJjno`>kC^ZXZs&GI^uE z=)?y0jX5EVJTgEv$*v1MSMbmOJ~>d&W^#-G2cyGeL8jfDEzArIK*S(B`6`qBN`xiZ)tiWtO(O7Wu1s0acIm}#)jFZcma~WkOKV>eN+#uu4C_m9qm{D$WqLSp~ ztqMt#1GqRC(3ZT0c7+e_gfv|`n znjx2=l%W`?BAG#(p$sUN%#a9FTg(tUxs-J#uQ7uKgB3#*gBL?6L*Qg-w!1tFeTp74 ztvBB;7v3Z|d7qiyLa*~BXtIBhU6>V_3V>6n1F83nY=)ngBj>BupbhZJAFu)`N}Mp_#?B*+FCr { let data = &buf[..n]; let mut xdb = deserializer::parse_bytes(data); //info!("XDB: {:#?}", xdb); + + let unique_id = rand::thread_rng().gen_range(10..99); + 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: 3, val: String::from("IC3PEAK EP") }); - xargs.push(XArgument { arg_type: 4, val: String::from("IC3PEAK") }); xargs.push(XArgument { arg_type: 6, val: String::from("MPEG audio file")}); - xargs.push(XArgument { arg_type: 2, val: String::from(":iPod_Control:Music:F38:ZJUQ.mp3") }); + xargs.push(XArgument { arg_type: 2, val: String::from(":iPod_Control:Music:F38:ZXXX.mp3") }); item.args = xargs; - item.data.number_of_strings = 5; - item.data.unique_id = 99; - tracks.push(item); + 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); + tracks.push(item);*/ + let mut item = tracks.last_mut().unwrap(); + item.args.first_mut().unwrap().val = String::from("Goy next door"); } + + /*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; + playlist.elems.push((pl_item, elem.1.clone())); + }*/ + let mut op = File::create("outdb").unwrap(); info!("Write res: {:?}", op.write(&serializer::to_bytes(xdb))); }, diff --git a/src/objects.rs b/src/objects.rs index d913a9a..05f6fb5 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -116,7 +116,7 @@ pub struct TrackItem { userid: u32, date_added: u32, bookmark_time: u32, - dbid: u64, + pub dbid: u64, checked: u8, application_rating: u8, bpm: u16, @@ -135,7 +135,7 @@ pub struct TrackItem { skip_when_shuffling: u8, remember_playback_position: u8, flag4: u8, - dbid2: u64, + pub dbid2: u64, lyrics_flag: u8, movie_file_flag: u8, played_mark: u8, @@ -178,7 +178,7 @@ pub struct StringEntry { // mhod pub unk4: u32 } -#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct PlaylistIndexEntry { // mhod entry_type: u32, unk1: u32, @@ -192,7 +192,7 @@ pub struct PlaylistIndexEntry { // mhod null_padding4: u64 } -#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct LetterJumpEntry { entry_type: u32, unk1: u32, @@ -202,7 +202,7 @@ pub struct LetterJumpEntry { null_padding: u64 } -#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct JumpTable { letter: u32, // UTF-16 LE Uppercase with two padding null bytes entry_num: u32, // the number of the first entry in the corresponding MHOD52 index starting with this letter. Zero-based and incremented by one for each entry, not 4. @@ -225,13 +225,13 @@ pub struct Playlist { unk2: [u8; 22], } -#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct PlaylistItem { data_object_child_count: u32, podcast_grouping_flag: u16, unk4: u16, group_id: u32, - track_id: u32, + pub track_id: u32, timestamp: u32, podcast_grouping_reference: u32, unk: [u8; 30], diff --git a/src/xobjects.rs b/src/xobjects.rs index 829c8fb..6f76889 100644 --- a/src/xobjects.rs +++ b/src/xobjects.rs @@ -37,7 +37,7 @@ pub struct XPlaylist { pub elems: Vec<(PlaylistItem, Vec)> } -#[derive(Debug, serde::Serialize)] +#[derive(Debug, serde::Serialize, Clone)] pub enum XPlArgument { String(XArgument), IndexEntry(XPlaylistIndexEntry), @@ -45,13 +45,13 @@ pub enum XPlArgument { RawArgument(Vec) } -#[derive(Debug, serde::Serialize)] +#[derive(Debug, serde::Serialize, Clone)] pub struct XPlaylistIndexEntry { pub data: PlaylistIndexEntry, pub v: Vec } -#[derive(Debug, serde::Serialize)] +#[derive(Debug, serde::Serialize, Clone)] pub struct XLetterJump { pub data: LetterJumpEntry, pub v: Vec diff --git a/two_tracks b/two_tracks new file mode 100755 index 0000000000000000000000000000000000000000..ac348649a5f35d0740c4090b4f8a739a6554cd76 GIT binary patch literal 16964 zcmeHNU1(fI6h7J9{;0u5En=y$TlJx|vBoCRu-1~lHdvE1X{FYm>L%Hg4esVYv4tWb zR*>2vh>9SH4+RCK;DaLC2YpY(hpKrKjTXUbA8MYg#_!yFPj>cZXaDX^OwAl}Gjq?J zbLPyMIdjg;-DJEw_9qcFHxiYg9L2K+Py6^^Bi+rz2TQ0Ybm_Oq_g$0wUjteLz5Q(^ zb9)b*c=0Kgp@XXJx)wct9627m!L2E%wF+%=;r4eO>iPKvu8D_R zxL%gQggovPpJRn`6rcCMxxoG)-l1VA-*q#QIBE0dqUSXtKFoGtn6SaF=KU{MKWTyr zB2MF6^wPfwLo|>9$0*0Ln#O?8$@oC*4#+x&M;#{D_b9k3s-`ftP#+CrO@^tRdg(ZJ z*f2Fi{{dj1rX-Eg2q=1J2aN;QLtUU9p`#?d?1RL$cm%kYyYO(y&_*4!7rlhRIYu$a z8bJLR$^`loDREG$wqfpiJR&6m`VMf$=s9Xa*$+L3Q6?yY9z@3o?V}ouigAbO3G}-Y zBNzlmd~h5Kn7wS+l`TGa?c(OyBlVs1%Q{sH=wK_*{1M3Wf|j$>whvCdQ&)H8!mi&P zCdCJvE3^7wiqFx5eem*2PcHO*>W0F6uxWFr%`0|X5ag+-KFD@pxZZt`bA?QhKEs(P z{NrR@a~xD{&-E$=cZ=0z)mrsdl@+n>qpen>U2j0yYK19cKTW{ZT8~(DR=Xu~SDM#7 z0KbdC-x}eior>2vnam6lB=)+X0h!F;(q%Fy20w$scS85uQ1Ytb*;_j_HT%}|ho`^V z_Ol%t8K=%LUbDip?hcWa$Va2B5OtNYIM#8!Tk^Z?r$YY<1{mW8EtC{APOTWz@V~IY znSe(j>oA6e%9)FR_?DD{FQ)W+nmS%grz?m@Y}^5zY81VAZ!RP%%3O#%mR0MKCp3)a zy@-MP5FW1%e5wyp2bQPmfL9x`>A>qFNF7*Sp*rAz8>kK}uTULs4Oj=3SEvs6_|(C> zzU~cJUWHG2UY}ukh1!VES$@{5*G5~4me)7f3SQnHWeh{8C-BIv1gbWqZW)~SZ!0VA z4_%qN*==6fA1Z-}2@)mC^8!wFi~1b{5ufhlBqltmla+&MKUa6|%jkJd@obQN$=ff> z^Mc$)ab8=9{k?K@?xv!nU z$0$`k-`Dmw#Cso|I&hZzX(#IDc?bCa&hY3r;z2Wiu|{+@l-3+hgwHQ zv0?Idv=mnzN>4ef*djTTEeM)jYQ7>+K|+8IuhMdTcc|FD!|!>OcKX)gJv~cY`zAwN z+ji5nf3{2xN126%%AojN2O)PFmn*LEJ*TP{*UJ=K8)DfwzDD+%c&3{&gU?|B6VGxO zXazP)yoo|L6VLLVAUB>_-dOBzu{!)B`Tu!5`#M8B`{S{(3v)HoFSE8hpnP%}%Zeq;}!t*(upK=?Fd7Iv|56f`E9 zWieEGlM~I#w|<|%y!c6Gz;5550EH||oM=#Y;) zm%6``U9QtvovWJ+i*+nlaF646^kF(gah%d#FefxIlPL?dfW)){*|g-c-OCB?{p;`^az8O`>24ff-M^t?=g~`_u(CWL8I)J~^mm79xnf$b z8^^=AZH(c*alpj0^l370d0W85v%F2UVhBw2CcxyocJ?8O>ij`xlLw B7|H+u literal 0 HcmV?d00001