feat: No native dependencies

This commit is contained in:
Guillem Castro 2024-05-13 21:41:10 +02:00
parent a041136986
commit ad9288d243
4 changed files with 135 additions and 497 deletions

View file

@ -2,11 +2,12 @@ use std::path::Path;
use audiotags::Tag;
use audiotags::TagType;
use flacenc::component::BitRepr;
use flacenc::error::Verify;
use librespot::playback::audio_backend::Sink;
use librespot::playback::audio_backend::SinkError;
use librespot::playback::convert::Converter;
use librespot::playback::decoder::AudioPacket;
use flac_bound::FlacEncoder;
use crate::track::TrackMetadata;
@ -65,23 +66,19 @@ impl Sink for FileSink {
fn stop(&mut self) -> Result<(), SinkError> {
tracing::info!("Writing to file: {:?}", &self.sink);
let mut encoder = FlacEncoder::new()
.ok_or(SinkError::OnWrite(
"Failed to create flac encoder".to_string(),
))?
.channels(2)
.bits_per_sample(16)
.compression_level(self.compression)
.init_file(&self.sink)
.map_err(|e| {
SinkError::OnWrite(format!("Failed to init flac encoder: {:?}", e).to_string())
})?;
encoder
.process_interleaved(self.content.as_slice(), (self.content.len() / 2) as u32)
.map_err(|_| SinkError::OnWrite("Failed to write flac".to_string()))?;
encoder
.finish()
.map_err(|_| SinkError::OnWrite("Failed to finish encondig".to_string()))?;
let config = flacenc::config::Encoder::default()
.into_verified()
.map_err(|_| SinkError::OnWrite("Failed to create flac encoder".to_string()))?;
let source = flacenc::source::MemSource::from_samples(&self.content, 2, 16, 44100);
let flac_stream = flacenc::encode_with_fixed_block_size(&config, source, config.block_size)
.map_err(|_| SinkError::OnWrite("Failed to encode flac".to_string()))?;
let mut sink = flacenc::bitsink::ByteSink::new();
flac_stream
.write(&mut sink)
.map_err(|_| SinkError::OnWrite("Failed to write flac to sink".to_string()))?;
std::fs::write(&self.sink, sink.as_slice())
.map_err(|_| SinkError::OnWrite("Failed to write flac to file".to_string()))?;
let mut tag = Tag::new()
.with_tag_type(TagType::Flac)

View file

@ -31,7 +31,7 @@ struct Opt {
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."
8 (slowest, most compression). A value larger than 8 will be Treated as 8. Default is 4. NOT USED."
)]
compression: Option<u32>,
#[structopt(
@ -72,6 +72,10 @@ async fn main() -> anyhow::Result<()> {
std::process::exit(1);
}
if opt.compression.is_some() {
eprintln!("Compression level is not supported yet. It will be ignored.");
}
let session = create_session(opt.username, opt.password).await?;
let track = get_tracks(opt.tracks, &session).await?;