From fe66ff977ac694a6aa1f5cfd6b24d5030dedfded Mon Sep 17 00:00:00 2001 From: Adriel Sand Date: Sun, 16 Jun 2024 16:36:32 -0700 Subject: [PATCH] Added existing file checking and other fixes --- src/main.rs | 106 +++++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 47 deletions(-) mode change 100644 => 100755 src/main.rs diff --git a/src/main.rs b/src/main.rs old mode 100644 new mode 100755 index 48c3ced..da664e2 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ use librespot_core::authentication::Credentials; use librespot_core::config::SessionConfig; use librespot_core::session::Session; use librespot_core::spotify_id::SpotifyId; -use librespot_metadata::{Artist, FileFormat, Metadata, Track, Album}; +use librespot_metadata::{Artist, FileFormat, Metadata, Track}; use regex::Regex; use scoped_threadpool::Pool; use tokio_core::reactor::Core; @@ -55,55 +55,67 @@ fn main() { .and_then(|capture|SpotifyId::from_base62(&capture[1]).ok()))) .for_each(|id|{ info!("Getting track {}...", id.to_base62()); - let mut track = core.run(Track::get(&session, id)).expect("Cannot get track metadata"); - if !track.available { - warn!("Track {} is not available, finding alternative...", id.to_base62()); - let alt_track = track.alternatives.iter().find_map(|id|{ - let alt_track = core.run(Track::get(&session, *id)).expect("Cannot get track metadata"); - match alt_track.available { - true => Some(alt_track), - false => None + let fname = format!("{}.ogg", id.to_base62()); + let pathexists = std::path::Path::new(&fname).exists(); + use std::path::Path; + if !Path::new(&fname).exists() { + info!("File {} already exists... Skipping...", id.to_base62()); + } else { + info!("File does not exist, continuing. Errors {}", Path::new(&fname).exists()); + let mut track = core.run(Track::get(&session, id)).expect("Cannot get track metadata"); + if !track.available { + warn!("Track {} is not available, finding alternative...", id.to_base62()); + let alt_track = track.alternatives.iter().find_map(|id|{ + let alt_track = core.run(Track::get(&session, *id)).expect("Cannot get track metadata"); + match alt_track.available { + true => Some(alt_track), + false => None + } + }); + track = alt_track.expect(&format!("Could not find alternative for track {}", id.to_base62())); + warn!("Found track alternative {} -> {}", id.to_base62(), track.id.to_base62()); + } + let artists_strs: Vec<_> = track.artists.iter().map(|id|core.run(Artist::get(&session, *id)).expect("Cannot get artist metadata").name).collect(); + debug!("File formats: {}", track.files.keys().map(|filetype|format!("{:?}", filetype)).collect::>().join(" ")); + let file_id = track.files.get(&FileFormat::OGG_VORBIS_160) + .or(track.files.get(&FileFormat::OGG_VORBIS_96)) + .or(track.files.get(&FileFormat::OGG_VORBIS_320)) + .expect("Could not find a OGG_VORBIS format for the track."); + let key = core.run(session.audio_key().request(track.id, *file_id)).expect("Cannot get audio key"); + let mut encrypted_file = core.run(AudioFile::open(&session, *file_id)).unwrap(); + let mut buffer = Vec::new(); + let mut read_all: Result = Ok(0); + let fetched = AtomicBool::new(false); + threadpool.scoped(|scope|{ + scope.execute(||{ + read_all = encrypted_file.read_to_end(&mut buffer); + fetched.store(true, Ordering::Release); + }); + while !fetched.load(Ordering::Acquire) { + core.turn(Some(Duration::from_millis(100))); } }); - track = alt_track.expect(&format!("Could not find alternative for track {}", id.to_base62())); - warn!("Found track alternative {} -> {}", id.to_base62(), track.id.to_base62()); - } - let artists_strs: Vec<_> = track.artists.iter().map(|id|core.run(Artist::get(&session, *id)).expect("Cannot get artist metadata").name).collect(); - debug!("File formats: {}", track.files.keys().map(|filetype|format!("{:?}", filetype)).collect::>().join(" ")); - let file_id = track.files.get(&FileFormat::OGG_VORBIS_320) - .or(track.files.get(&FileFormat::OGG_VORBIS_160)) - .or(track.files.get(&FileFormat::OGG_VORBIS_96)) - .expect("Could not find a OGG_VORBIS format for the track."); - let key = core.run(session.audio_key().request(track.id, *file_id)).expect("Cannot get audio key"); - let mut encrypted_file = core.run(AudioFile::open(&session, *file_id)).unwrap(); - let mut buffer = Vec::new(); - let mut read_all: Result = Ok(0); - let fetched = AtomicBool::new(false); - threadpool.scoped(|scope|{ - scope.execute(||{ - read_all = encrypted_file.read_to_end(&mut buffer); - fetched.store(true, Ordering::Release); - }); - while !fetched.load(Ordering::Acquire) { - core.turn(Some(Duration::from_millis(100))); + read_all.expect("Cannot read file stream"); + let mut decrypted_buffer = Vec::new(); + AudioDecrypt::new(key, &buffer[..]).read_to_end(&mut decrypted_buffer).expect("Cannot decrypt stream"); + if args.len() == 3 { + let fname = format!("{}.ogg", id.to_base62()); + std::fs::write(&fname, &decrypted_buffer[0xa7..]).expect("Cannot write decrypted track"); + info!("Filename: {}", fname); + } else { + // let album = core.run(Album::get(&session, track.album)).expect("Cannot get album metadata"); + let fname = format!("{}.ogg", id.to_base62()); + std::fs::write(&fname, &decrypted_buffer[0xa7..]).expect("Cannot write decrypted track"); + info!("Filename: {}", fname); + let mut cmd = Command::new(args[3].to_owned()); + cmd.stdin(Stdio::piped()); + cmd.arg(id.to_base62()).arg(track.name).args(artists_strs.iter()); + info!("Running Helper"); + cmd.spawn().expect("Could not run helper program"); + // let pipe = child.stdin.as_mut().expect("Could not open helper stdin"); + // pipe.write_all(&decrypted_buffer[0xa7..]).expect("Failed to write to stdin"); + // assert!(child.wait().expect("Out of ideas for error messages").success(), "Helper script returned an error"); } - }); - read_all.expect("Cannot read file stream"); - let mut decrypted_buffer = Vec::new(); - AudioDecrypt::new(key, &buffer[..]).read_to_end(&mut decrypted_buffer).expect("Cannot decrypt stream"); - if args.len() == 3 { - let fname = format!("{} - {}.ogg", artists_strs.join(", "), track.name); - std::fs::write(&fname, &decrypted_buffer[0xa7..]).expect("Cannot write decrypted track"); - info!("Filename: {}", fname); - } else { - let album = core.run(Album::get(&session, track.album)).expect("Cannot get album metadata"); - let mut cmd = Command::new(args[3].to_owned()); - cmd.stdin(Stdio::piped()); - cmd.arg(id.to_base62()).arg(track.name).arg(album.name).args(artists_strs.iter()); - let mut child = cmd.spawn().expect("Could not run helper program"); - let pipe = child.stdin.as_mut().expect("Could not open helper stdin"); - pipe.write_all(&decrypted_buffer[0xa7..]).expect("Failed to write to stdin"); - assert!(child.wait().expect("Out of ideas for error messages").success(), "Helper script returned an error"); } }); }