diff --git a/Cargo.lock b/Cargo.lock index 5360c76..37aac15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,7 +577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -1284,8 +1284,8 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "itunesdb" -version = "0.1.96" -source = "git+https://gitea.awain.net/alterwain/ITunesDB.git#d4dc6e4a65a675cabbb8c251de38b7a4c3e6a32d" +version = "0.1.99" +source = "git+https://gitea.awain.net/alterwain/ITunesDB.git#80106beeb00d9e882bf08857304c44a5c93e52a6" dependencies = [ "bincode", "env_logger", @@ -2105,7 +2105,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2494,7 +2494,7 @@ dependencies = [ "getrandom 0.3.1", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3025,7 +3025,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/src/sync.rs b/src/sync.rs index ac02f1e..e3452bb 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -10,6 +10,7 @@ use ratatui::style::Color; use soundcloud::sobjects::{CloudPlaylist, CloudPlaylists, CloudTrack}; use std::io::Read; use std::io::{Cursor, Write}; +use std::os::unix::fs::MetadataExt; use std::path::{Path, PathBuf}; use tokio::{ fs::File, @@ -68,11 +69,17 @@ async fn track_from_soundcloud( .await .unwrap(); let audio_info = &audio_file.audio_file.tracks.track; - let song_dbid = util::hash_from_path(track_path); + let song_dbid = util::hash_from_path(track_path.clone()); let mut track = XTrackItem::new( value.id as u32, - audio_info.audio_bytes as u32, + File::open(track_path) + .await + .unwrap() + .metadata() + .await + .unwrap() + .size() as u32, (audio_info.duration * 1000.0) as u32, 0, (audio_info.bit_rate / 1000) as u32, @@ -197,7 +204,12 @@ pub fn initialize_async_service( AppEvent::DownloadPlaylist(playlist) => { download_playlist(playlist, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await; }, AppEvent::DownloadTrack(track) => { download_track(track, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await; }, AppEvent::SwitchScreen(state) => { let _ = sender.send(AppEvent::SwitchScreen(state)).await;}, - AppEvent::LoadFromFS(path) => { load_from_fs(path, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await; }, + AppEvent::LoadFromFS(path) => { + load_from_fs(path, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await; + let _ = sender + .send(AppEvent::SwitchScreen(AppState::FileSystem)) + .await; + }, AppEvent::LoadFromFSVec(files) => load_files_from_fs(files, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await, AppEvent::LoadFromFSPL((files, title)) => load_files_from_fs_as_playlist(files, title, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await, AppEvent::RemoveTrack(id) => remove_track(id, database.as_mut().unwrap(), &sender, ipod_db.clone().unwrap()).await, @@ -343,7 +355,7 @@ async fn load_files_from_fs_as_playlist( database.add_playlist(new_playlist); let _ = sender - .send(AppEvent::SwitchScreen(AppState::MainScreen)) + .send(AppEvent::SwitchScreen(AppState::FileSystem)) .await; let _ = sender @@ -369,6 +381,10 @@ async fn load_files_from_fs( .await; load_from_fs(file.clone(), database, sender, ipod_path.clone()).await; } + + let _ = sender + .send(AppEvent::SwitchScreen(AppState::FileSystem)) + .await; } async fn load_from_fs( @@ -377,7 +393,7 @@ async fn load_from_fs( sender: &Sender, ipod_path: String, ) -> u32 { - let tag = Tag::new().read_from_path(&path).unwrap(); + let tag = Tag::new().read_from_path(&path); let mut id = database.get_unique_id(); @@ -389,11 +405,33 @@ async fn load_from_fs( let song_dbid = util::hash_from_path(path.clone()); if !database.if_track_in_library(song_dbid) { + let mut year = None; + let mut title = None; + let mut genre = None; + let mut artist = None; + let mut cover = None; + let mut album = None; + + if let Ok(tag) = tag { + year = tag.year(); + title = tag.title().map_or(None, |s| Some(s.to_string())); + genre = tag.genre().map_or(None, |s| Some(s.to_string())); + artist = tag.artist().map_or(None, |s| Some(s.to_string())); + cover = tag.album_cover().map_or(None, |a| Some(a.data.to_vec())); + album = tag.album_title().map_or(None, |a| Some(a.to_string())); + } + let mut track = XTrackItem::new( id, - audio_info.audio_bytes as u32, + File::open(path.clone()) + .await + .unwrap() + .metadata() + .await + .unwrap() + .size() as u32, (audio_info.duration * 1000.0) as u32, - tag.year().unwrap_or(0) as u32, + year.unwrap_or(0) as u32, (audio_info.bit_rate / 1000) as u32, audio_info.sample_rate as u32, song_dbid, @@ -402,37 +440,37 @@ async fn load_from_fs( audio_file.modify_xtrack(&mut track); - if let Some(title) = tag.title() { + if let Some(title) = title { track.set_title(title.to_string()); } else { track.set_title(path.file_name().unwrap().to_str().unwrap().to_string()); } - if let Some(genre) = tag.genre() { + if let Some(genre) = genre { track.set_genre(genre.to_string()); } - if let Some(artist) = tag.artist() { + if let Some(artist) = artist { track.set_artist(artist.to_string()); } - if let Some(cover) = tag.album_cover() { + if let Some(cover) = cover { let _ = sender.send(AppEvent::ArtworkProgress((0, 2))).await; let mut adb = get_artwork_db(&ipod_path); - let cover_hash = util::hash(cover.data); + let cover_hash = util::hash(&cover); let if_cover_present = adb.if_cover_present(cover_hash); let (small_img_name, large_img_name) = adb.add_images(song_dbid, cover_hash); - let size = cover.data.len(); + let size = cover.len(); if !if_cover_present { - make_cover_image(cover.data, &ipod_path, &small_img_name, (100, 100)); + make_cover_image(&cover, &ipod_path, &small_img_name, (100, 100)); let _ = sender.send(AppEvent::ArtworkProgress((1, 2))).await; - make_cover_image(cover.data, &ipod_path, &large_img_name, (200, 200)); + make_cover_image(&cover, &ipod_path, &large_img_name, (200, 200)); } write_artwork_db(adb, &ipod_path); @@ -445,8 +483,8 @@ async fn load_from_fs( let _ = sender.send(AppEvent::ArtworkProgress((2, 2))).await; } - if let Some(album) = tag.album() { - track.set_album(album.title.to_string()); + if let Some(album) = album { + track.set_album(album); // TODO: Add new album into iTunesDB } @@ -464,20 +502,16 @@ async fn load_from_fs( let _ = std::fs::copy(path.to_str().unwrap(), dest.to_str().unwrap()); database.add_track(track); + + overwrite_database(database, &ipod_path); } else if let Some(unique_id) = database.get_unique_id_by_dbid(song_dbid) { id = unique_id; } - let _ = sender - .send(AppEvent::SwitchScreen(AppState::MainScreen)) - .await; - let _ = sender .send(AppEvent::ITunesParsed(get_playlists(database))) .await; - overwrite_database(database, &ipod_path); - id } @@ -795,7 +829,7 @@ mod audio_file_info { } .as_bytes(); - let file_type = u32::from_le_bytes(if bytes.len() == 4 { + let file_type = u32::from_be_bytes(if bytes.len() == 4 { [bytes[0], bytes[1], bytes[2], bytes[3]] } else { [bytes[0], bytes[1], bytes[2], 0u8]