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"
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]]

View File

@ -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<AppEvent>,
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]