diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-11 20:49:39 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-11 20:49:39 +0100 |
commit | 0f944c90380b28e010211f3c8d57423e38bb2c11 (patch) | |
tree | e8b674763e4b3210efc7bd26eadd34eff90b0389 /tools/src/bin/gen_meta.rs | |
parent | 0737008c5c649f0ce33719fb9126b284d76c9807 (diff) | |
download | jellything-0f944c90380b28e010211f3c8d57423e38bb2c11.tar jellything-0f944c90380b28e010211f3c8d57423e38bb2c11.tar.bz2 jellything-0f944c90380b28e010211f3c8d57423e38bb2c11.tar.zst |
tool for generating metadata
Diffstat (limited to 'tools/src/bin/gen_meta.rs')
-rw-r--r-- | tools/src/bin/gen_meta.rs | 112 |
1 files changed, 110 insertions, 2 deletions
diff --git a/tools/src/bin/gen_meta.rs b/tools/src/bin/gen_meta.rs index 3783460..b09f4a1 100644 --- a/tools/src/bin/gen_meta.rs +++ b/tools/src/bin/gen_meta.rs @@ -1,4 +1,112 @@ +use anyhow::{anyhow, bail}; +use clap::Parser; +use jellycommon::{ItemInfo, Source, SourceTrack}; +use std::{collections::BTreeMap, fs::File, io::Write, path::PathBuf}; +use webm_iterable::{ + matroska_spec::{Master, MatroskaSpec}, + WebmIterator, +}; -fn main() { - +#[derive(Parser)] +struct Args { + #[clap(short = 'I', long)] + identifier: String, + #[clap(short = 'O', long)] + write_json: bool, + #[clap(short, long)] + title: String, + #[clap(short = 'i', long)] + inputs: Vec<PathBuf>, +} + +fn main() -> anyhow::Result<()> { + let args = Args::parse(); + + let mut source = vec![]; + for fname in args.inputs { + let mut tracks = BTreeMap::new(); + let mut input = File::open(fname.clone()).unwrap(); + for tag in WebmIterator::new(&mut input, &[MatroskaSpec::TrackEntry(Master::Start)]) { + let tag = tag?; + match tag { + MatroskaSpec::TrackEntry(master) => { + let ( + mut index, + mut language, + mut codec, + mut kind, + mut sample_rate, + mut channels, + mut width, + mut height, + ) = (None, None, None, None, None, None, None, None); + for c in master.get_children() { + match c { + MatroskaSpec::CodecID(b) => codec = Some(b), + MatroskaSpec::Language(v) => language = Some(v), + MatroskaSpec::TrackNumber(v) => index = Some(v), + MatroskaSpec::TrackType(v) => kind = Some(v), + MatroskaSpec::Audio(master) => { + for c in master.get_children() { + match c { + MatroskaSpec::Channels(v) => channels = Some(v as usize), + MatroskaSpec::SamplingFrequency(v) => sample_rate = Some(v), + _ => (), + } + } + } + MatroskaSpec::Video(master) => { + for c in master.get_children() { + match c { + MatroskaSpec::PixelWidth(v) => width = Some(v as usize), + MatroskaSpec::PixelHeight(v) => height = Some(v as usize), + _ => (), + } + } + } + _ => (), + } + } + tracks.insert( + index.unwrap(), + match kind.ok_or(anyhow!("track type required"))? { + 1 => SourceTrack::Video { + language: language.unwrap(), + codec: codec.unwrap(), + width: width.unwrap(), + height: height.unwrap(), + }, + 2 => SourceTrack::Audio { + channels: channels.unwrap(), + codec: codec.unwrap(), + sample_rate: sample_rate.unwrap(), + language: language.unwrap(), + }, + _ => bail!("invalid track type"), + }, + ); + } + MatroskaSpec::Tags(Master::End) => break, + _ => (), + } + } + source.push(Source { + file: fname.clone(), + tracks, + }) + } + + let k = serde_json::to_string_pretty(&ItemInfo { + title: args.title, + source, + })?; + + if args.write_json { + let mut f = File::create(format!("{}.json", args.identifier))?; + f.write_all(k.as_bytes())?; + } else { + println!("{k}") + } + + Ok(()) } |