From c9135b64ddcbb6f424927fd57400a4ddec306485 Mon Sep 17 00:00:00 2001 From: "alterwain@protonmail.com" Date: Mon, 17 Feb 2025 03:01:08 +0300 Subject: [PATCH] small fix --- src/artworkdb.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/artworkdb.rs b/src/artworkdb.rs index 84f2261..e31295e 100644 --- a/src/artworkdb.rs +++ b/src/artworkdb.rs @@ -100,6 +100,66 @@ pub mod deserializer { } } +pub mod serializer { + use crate::artworkdb::aobjects::ADatabase; + use crate::artworkdb::objects::{ChunkHeader, ChunkType}; + + pub fn to_bytes(adb: ADatabase) -> Vec { + let mut bytes: Vec = Vec::new(); + for i in 0..(adb.children.len()) { + let data_set = adb.children.get(i).unwrap(); + for img in data_set.child.iter() { + let mut args = Vec::new(); + for arg in img.args.iter() { + let mut argv = Vec::new(); + match arg.data.tag_type { + 3 => { + let mut str_b = string_to_ipod16(arg.str.as_ref().unwrap()); + str_b = [3u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), (str_b.len() as u32).to_le_bytes().to_vec(), 2u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), str_b ].concat(); + argv.append(&mut generate_header(ChunkType::LocationTag, 12, str_b.len())); + argv.append(&mut str_b); + }, + _ => { // 2 + let mut data = [2u32.to_le_bytes(), 0u32.to_le_bytes(), 0u32.to_le_bytes()].concat(); + argv.append(&mut generate_header(ChunkType::LocationTag, 12, 0)); + argv.append(&mut data); + } + } + + if let Some(name) = &arg.child { + args.append(&mut generate_header(ChunkType::ImageName, 76, argv.len())); + args.append(&mut bincode::serialize(name).unwrap()); + } + + args.append(&mut argv); + } + + if img.data.is_some() { + let mut item = Vec::new(); + item.append(&mut generate_header(ChunkType::ImageItem, 40, args.len())); + item.append(&mut bincode::serialize(img.data.as_ref().unwrap()).unwrap()); + } + + if img.file.is_some() { + + } + } + } + + bytes + } + + fn string_to_ipod16(str: &str) -> Vec { + str.encode_utf16().flat_map(|f| [f as u8, (f >> 8) as u8]).collect() + } + + fn generate_header(ct: ChunkType, header_size: usize, data_len: usize) -> Vec { + let header_size = 12 + header_size as u32; + let header = ChunkHeader{ chunk_type: ct.into(), end_of_chunk: header_size, children_count: header_size + data_len as u32}; + bincode::serialize(&header).unwrap() + } +} + pub mod aobjects { use crate::artworkdb::objects::{ChunkHeader, DataSet, Database, ImageFile, ImageItem, ImageName, LocationTag};