Merge branch 'master' into pr/1

This commit is contained in:
Niklas 2024-01-17 10:57:33 +01:00 committed by GitHub
commit e0338b221f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 51 additions and 16 deletions

View file

@ -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<i32>,
metadata: Option<TrackMetadata>
metadata: Option<TrackMetadata>,
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<String>, _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(())

View file

@ -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<u32>,
}
#[derive(Clone)]
@ -79,6 +86,7 @@ async fn download_tracks(
destination: PathBuf,
tracks: Vec<SpotifyId>,
ordered: bool,
compression: Option<u32>,
) {
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;
}