pile-audio refactor
All checks were successful
CI / Typos (push) Successful in 20s
CI / Clippy (push) Successful in 2m3s
CI / Build and test (push) Successful in 3m31s

This commit is contained in:
2026-02-21 19:19:41 -08:00
parent 5aab61bd1b
commit bf1241e0a5
136 changed files with 1991 additions and 3390 deletions

View File

@@ -9,8 +9,9 @@ workspace = true
[dependencies]
pile-config = { workspace = true }
pile-audio = { workspace = true }
pile-toolbox = { workspace = true }
pile-flac = { workspace = true }
serde_json = { workspace = true }
itertools = { workspace = true }

View File

@@ -1,12 +1,7 @@
use std::{
fmt::Debug,
fs::File,
io::{Read, Seek},
path::PathBuf,
};
use std::{fmt::Debug, fs::File, io::BufReader, path::PathBuf};
use pile_audio::flac::blockread::{FlacBlock, FlacBlockReader, FlacBlockSelector};
use pile_config::Label;
use pile_flac::{FlacBlock, FlacReader};
use serde_json::{Map, Value};
use crate::Item;
@@ -36,56 +31,34 @@ impl Item for FlacItem {
}
fn json(&self) -> Result<serde_json::Value, std::io::Error> {
let mut block_reader = FlacBlockReader::new(FlacBlockSelector {
pick_vorbiscomment: true,
..Default::default()
});
let mut file = File::open(&self.path)?;
// TODO: do not read the whole file
file.rewind()?;
let mut data = Vec::new();
file.read_to_end(&mut data)?;
block_reader
.push_data(&data)
.map_err(std::io::Error::other)?;
block_reader.finish().map_err(std::io::Error::other)?;
//
// Return tags
//
let file = File::open(&self.path)?;
let reader = FlacReader::new(BufReader::new(file));
let mut output = Map::new();
while let Some(block) = block_reader.pop_block() {
match block {
FlacBlock::VorbisComment(comment) => {
for (k, v) in comment.comment.comments {
let k = k.to_string();
let v = Value::String(v.into());
let e = output.get_mut(&k);
for block in reader {
if let FlacBlock::VorbisComment(comment) = block.unwrap() {
for (k, v) in comment.comment.comments {
let k = k.to_string();
let v = Value::String(v.into());
let e = output.get_mut(&k);
match e {
None => {
output.insert(k.clone(), Value::Array(vec![v]));
}
Some(e) => {
// We always insert an array
#[expect(clippy::unwrap_used)]
e.as_array_mut().unwrap().push(v);
}
match e {
None => {
output.insert(k.clone(), Value::Array(vec![v]));
}
Some(e) => {
// We always insert an array
#[expect(clippy::unwrap_used)]
e.as_array_mut().unwrap().push(v);
}
}
}
// `reader` filters blocks for us
_ => unreachable!(),
// We should only have one comment block,
// stop reading when we find it
break;
}
// We should only have one comment block
assert!(!block_reader.has_block());
}
return Ok(serde_json::Value::Object(output));