diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78a12b5..393034f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: build: runs-on: ${{ matrix.platform }} - + needs: create_release strategy: fail-fast: false matrix: diff --git a/.gitignore b/.gitignore index 6c6fd4a..f8d4e5d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ target/ # These are backup files generated by rustfmt **/*.rs.bk + +.DS_Store diff --git a/Cargo.lock b/Cargo.lock index f1682f8..68f4071 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1916,7 +1916,7 @@ dependencies = [ [[package]] name = "spotify-dl" -version = "0.1.0" +version = "0.1.1" dependencies = [ "audiotags", "flac-bound", diff --git a/Cargo.toml b/Cargo.toml index 46ab953..396755d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spotify-dl" -version = "0.1.0" +version = "0.1.1" authors = ["Guillem Castro "] edition = "2018" #links = "FLAC" diff --git a/README.md b/README.md index be0e129..d11273b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ brew install flac ## Usage ``` -spotify-dl 0.1.0 +spotify-dl 0.1.1 A commandline utility to download music directly from Spotify USAGE: @@ -36,17 +36,19 @@ USAGE: FLAGS: -h, --help Prints help information - -o, --ordered Download songs in the order they are in the playlist, prfixing the filename with the track number + -o, --ordered Prefixing the filename with its index in the playlist -V, --version Prints version information OPTIONS: + -c, --compression Setting the flac compression level from 0 (fastest, least compression) to + 8 (slowest, most compression). A value larger than 8 will be Treated as 8. + Default is 4. -d, --destination The directory where the songs will be downloaded [default: .] -p, --password Your Spotify password -u, --username Your Spotify username ARGS: - ... A list of Spotify URIs (songs, podcasts or playlists) -``` + ... A list of Spotify URIs (songs, podcasts or playlists)``` Songs and playlists must be passed as Spotify URIs or URLs (e.g. `spotify:track:123456789abcdefghABCDEF` for songs and `spotify:playlist:123456789abcdefghABCDEF` for playlists or `https://open.spotify.com/playlist/123456789abcdefghABCDEF?si=1234567890`). @@ -56,4 +58,4 @@ The usage of this software may infringe Spotify's ToS and/or your local legislat ## License -spotify-dl is licensed under the MIT license. See [LICENSE](LICENSE). +spotify-dl is lic:ewensed under the MIT license. See [LICENSE](LICENSE). diff --git a/src/file_sink.rs b/src/file_sink.rs index 3253273..ea6422f 100644 --- a/src/file_sink.rs +++ b/src/file_sink.rs @@ -1,28 +1,38 @@ use std::path::Path; use audiotags::{Tag, TagType}; -use librespot::{playback::{audio_backend::{Open, Sink, SinkError}, config::AudioFormat, decoder::AudioPacket, convert::Converter}}; +use librespot::playback::{ + audio_backend::{Open, Sink, SinkError}, + config::AudioFormat, + convert::Converter, + decoder::AudioPacket, +}; // extern crate flac_bound; -use flac_bound::{FlacEncoder}; +use flac_bound::FlacEncoder; use crate::TrackMetadata; pub struct FileSink { sink: String, content: Vec, - metadata: Option + metadata: Option, + compression: u32, } impl FileSink { pub fn add_metadata(&mut self, meta: TrackMetadata) { self.metadata = Some(meta); } + pub fn set_compression(&mut self, compression: u32) { + self.compression = compression; + } } impl Open for FileSink { fn open(path: Option, _audio_format: AudioFormat) -> Self { + let file_path = path.unwrap_or_else(|| panic!()); FileSink { sink: file_path, @@ -38,21 +48,33 @@ impl Sink for FileSink { } fn stop(&mut self) -> Result<(), SinkError> { - let mut encoder = FlacEncoder::new().unwrap().channels(2).bits_per_sample(16).compression_level(4).init_file(&self.sink).unwrap(); - encoder.process_interleaved(self.content.as_slice(), (self.content.len()/2) as u32).unwrap(); + let mut encoder = FlacEncoder::new() + .unwrap() + .channels(2) + .bits_per_sample(16) + .compression_level(*&self.compression) + .init_file(&self.sink) + .unwrap(); + encoder + .process_interleaved(self.content.as_slice(), (self.content.len() / 2) as u32) + .unwrap(); encoder.finish().unwrap(); match &self.metadata { Some(meta) => { - let mut tag = Tag::new().with_tag_type(TagType::Flac).read_from_path(Path::new(&self.sink)).unwrap(); + let mut tag = Tag::new() + .with_tag_type(TagType::Flac) + .read_from_path(Path::new(&self.sink)) + .unwrap(); tag.set_album_title(&meta.album); for artist in &meta.artists { tag.add_artist(artist); } tag.set_title(&meta.track_name); - tag.write_to_path(&self.sink).expect("Failed to write metadata"); - }, + tag.write_to_path(&self.sink) + .expect("Failed to write metadata"); + } None => (), } Ok(()) diff --git a/src/main.rs b/src/main.rs index a2daee3..8319d65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,6 +46,13 @@ struct Opt { help = "Prefixing the filename with its index in the playlist" )] ordered: bool, + #[structopt( + short = "c", + long = "compression", + help = "Setting the flac compression level from 0 (fastest, least compression) to +8 (slowest, most compression). A value larger than 8 will be Treated as 8. Default is 4." + )] + compression: Option, } #[derive(Clone)] @@ -79,6 +86,7 @@ async fn download_tracks( destination: PathBuf, tracks: Vec, ordered: bool, + compression: Option, ) { let player_config = PlayerConfig::default(); let bar_style = ProgressStyle::default_bar() @@ -225,6 +233,7 @@ async fn main() { PathBuf::from(opt.destination), tracks, opt.ordered, + opt.compression, ) .await; }