use anyhow::Result; use clap::Args; use std::fs::File; use std::io::{Read, Write}; use std::path::PathBuf; use crate::Cli; /// Decrypt a QMCv1 file #[derive(Args)] pub struct ArgsQMCv1 { /// Path to output file, e.g. /export/Music/song.flac #[clap(short, long)] output: PathBuf, /// Path to input file, e.g. /export/Music/song.qmcflac #[arg(name = "input")] input: PathBuf, } impl ArgsQMCv1 { pub fn run(&self, cli: &Cli) -> Result { let mut file_input = File::open(&self.input)?; let mut file_output = File::create(&self.output)?; let mut offset = 0usize; let mut buffer = vec![0u8; cli.buffer_size].into_boxed_slice(); while let Ok(n) = file_input.read(&mut buffer) { if n == 0 { break; } umc_qmc::v1::decrypt(&mut buffer[..n], offset); file_output.write_all(&buffer[..n])?; offset += n; } Ok(0) } }