pile-audio refactor
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user