small upd x4

This commit is contained in:
Michael Wain 2025-02-25 04:09:28 +03:00
parent a8fab2b721
commit d6db006412
2 changed files with 64 additions and 30 deletions

12
Cargo.lock generated
View File

@ -577,7 +577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -1284,8 +1284,8 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]] [[package]]
name = "itunesdb" name = "itunesdb"
version = "0.1.96" version = "0.1.99"
source = "git+https://gitea.awain.net/alterwain/ITunesDB.git#d4dc6e4a65a675cabbb8c251de38b7a4c3e6a32d" source = "git+https://gitea.awain.net/alterwain/ITunesDB.git#80106beeb00d9e882bf08857304c44a5c93e52a6"
dependencies = [ dependencies = [
"bincode", "bincode",
"env_logger", "env_logger",
@ -2105,7 +2105,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -2494,7 +2494,7 @@ dependencies = [
"getrandom 0.3.1", "getrandom 0.3.1",
"once_cell", "once_cell",
"rustix", "rustix",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -3025,7 +3025,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]

View File

@ -10,6 +10,7 @@ use ratatui::style::Color;
use soundcloud::sobjects::{CloudPlaylist, CloudPlaylists, CloudTrack}; use soundcloud::sobjects::{CloudPlaylist, CloudPlaylists, CloudTrack};
use std::io::Read; use std::io::Read;
use std::io::{Cursor, Write}; use std::io::{Cursor, Write};
use std::os::unix::fs::MetadataExt;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use tokio::{ use tokio::{
fs::File, fs::File,
@ -68,11 +69,17 @@ async fn track_from_soundcloud(
.await .await
.unwrap(); .unwrap();
let audio_info = &audio_file.audio_file.tracks.track; 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( let mut track = XTrackItem::new(
value.id as u32, 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, (audio_info.duration * 1000.0) as u32,
0, 0,
(audio_info.bit_rate / 1000) as u32, (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::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::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::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::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::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, 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); database.add_playlist(new_playlist);
let _ = sender let _ = sender
.send(AppEvent::SwitchScreen(AppState::MainScreen)) .send(AppEvent::SwitchScreen(AppState::FileSystem))
.await; .await;
let _ = sender let _ = sender
@ -369,6 +381,10 @@ async fn load_files_from_fs(
.await; .await;
load_from_fs(file.clone(), database, sender, ipod_path.clone()).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( async fn load_from_fs(
@ -377,7 +393,7 @@ async fn load_from_fs(
sender: &Sender<AppEvent>, sender: &Sender<AppEvent>,
ipod_path: String, ipod_path: String,
) -> u32 { ) -> 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(); 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()); let song_dbid = util::hash_from_path(path.clone());
if !database.if_track_in_library(song_dbid) { 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( let mut track = XTrackItem::new(
id, 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, (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.bit_rate / 1000) as u32,
audio_info.sample_rate as u32, audio_info.sample_rate as u32,
song_dbid, song_dbid,
@ -402,37 +440,37 @@ async fn load_from_fs(
audio_file.modify_xtrack(&mut track); audio_file.modify_xtrack(&mut track);
if let Some(title) = tag.title() { if let Some(title) = title {
track.set_title(title.to_string()); track.set_title(title.to_string());
} else { } else {
track.set_title(path.file_name().unwrap().to_str().unwrap().to_string()); 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()); track.set_genre(genre.to_string());
} }
if let Some(artist) = tag.artist() { if let Some(artist) = artist {
track.set_artist(artist.to_string()); 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 _ = sender.send(AppEvent::ArtworkProgress((0, 2))).await;
let mut adb = get_artwork_db(&ipod_path); 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 if_cover_present = adb.if_cover_present(cover_hash);
let (small_img_name, large_img_name) = adb.add_images(song_dbid, 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 { 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; 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); write_artwork_db(adb, &ipod_path);
@ -445,8 +483,8 @@ async fn load_from_fs(
let _ = sender.send(AppEvent::ArtworkProgress((2, 2))).await; let _ = sender.send(AppEvent::ArtworkProgress((2, 2))).await;
} }
if let Some(album) = tag.album() { if let Some(album) = album {
track.set_album(album.title.to_string()); track.set_album(album);
// TODO: Add new album into iTunesDB // 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()); let _ = std::fs::copy(path.to_str().unwrap(), dest.to_str().unwrap());
database.add_track(track); database.add_track(track);
overwrite_database(database, &ipod_path);
} else if let Some(unique_id) = database.get_unique_id_by_dbid(song_dbid) { } else if let Some(unique_id) = database.get_unique_id_by_dbid(song_dbid) {
id = unique_id; id = unique_id;
} }
let _ = sender
.send(AppEvent::SwitchScreen(AppState::MainScreen))
.await;
let _ = sender let _ = sender
.send(AppEvent::ITunesParsed(get_playlists(database))) .send(AppEvent::ITunesParsed(get_playlists(database)))
.await; .await;
overwrite_database(database, &ipod_path);
id id
} }
@ -795,7 +829,7 @@ mod audio_file_info {
} }
.as_bytes(); .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]] [bytes[0], bytes[1], bytes[2], bytes[3]]
} else { } else {
[bytes[0], bytes[1], bytes[2], 0u8] [bytes[0], bytes[1], bytes[2], 0u8]