diff options
Diffstat (limited to 'tools/src/bin')
-rw-r--r-- | tools/src/bin/create_item.rs | 33 | ||||
-rw-r--r-- | tools/src/bin/gen_meta.rs | 133 | ||||
-rw-r--r-- | tools/src/bin/import.rs | 38 |
3 files changed, 71 insertions, 133 deletions
diff --git a/tools/src/bin/create_item.rs b/tools/src/bin/create_item.rs new file mode 100644 index 0000000..4827e74 --- /dev/null +++ b/tools/src/bin/create_item.rs @@ -0,0 +1,33 @@ +use std::{fs::File, io::Write, path::PathBuf}; + +use clap::Parser; +use jellycommon::ItemInfo; + +#[derive(Parser)] +struct Args { + #[clap(short = 'I', long)] + item: PathBuf, + #[clap(short = 'd', long)] + dry: bool, + #[clap(short, long)] + title: String, +} + +fn main() -> anyhow::Result<()> { + let args = Args::parse(); + + let iteminfo = ItemInfo { + title: args.title, + duration: 0.0, + tracks: Default::default(), + }; + + let k = serde_json::to_string_pretty(&iteminfo)?; + if args.dry { + println!("{k}") + } else { + let mut f = File::create(args.item)?; + f.write_all(k.as_bytes())?; + } + Ok(()) +} diff --git a/tools/src/bin/gen_meta.rs b/tools/src/bin/gen_meta.rs deleted file mode 100644 index 4abbb8b..0000000 --- a/tools/src/bin/gen_meta.rs +++ /dev/null @@ -1,133 +0,0 @@ -use anyhow::{anyhow, bail}; -use clap::Parser; -use jellycommon::{ItemInfo, Source, SourceTrack, SourceTrackKind}; -use jellyebml::{ - matroska::MatroskaTag, - read::EbmlReader, - unflatten::{Unflat, Unflatten}, - Master, -}; -use log::error; -use std::{collections::BTreeMap, fs::File, io::Write, path::PathBuf}; - -#[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)] - input: PathBuf, -} - -fn main() -> anyhow::Result<()> { - env_logger::init_from_env("LOG"); - let args = Args::parse(); - - let mut tracks = BTreeMap::new(); - let input = File::open(args.input.clone()).unwrap(); - let mut input = EbmlReader::new(input); - - // TODO dont traverse the entire file, if the tracks are listed at the end - while let Some(item) = input.next() { - let item = item?; - match item { - MatroskaTag::Tracks(_) => { - let mut iter = Unflatten::new(&mut input); - while let Some(Ok(Unflat { children, item })) = iter.next() { - if !matches!(item, MatroskaTag::TrackEntry(_)) { - panic!("no") - } - let mut children = children.unwrap(); - let ( - mut index, - mut language, - mut codec, - mut kind, - mut sample_rate, - mut channels, - mut width, - mut height, - mut name, - ) = (None, None, None, None, None, None, None, None, None); - while let Some(Ok(Unflat { children, item })) = children.next() { - match item { - MatroskaTag::CodecID(b) => codec = Some(b), - MatroskaTag::Language(v) => language = Some(v), - MatroskaTag::TrackNumber(v) => index = Some(v), - MatroskaTag::TrackType(v) => kind = Some(v), - MatroskaTag::Name(v) => name = Some(v), - MatroskaTag::Audio(_) => { - let mut children = children.unwrap(); - while let Some(Ok(Unflat { item, .. })) = children.next() { - match item { - MatroskaTag::Channels(v) => channels = Some(v as usize), - MatroskaTag::SamplingFrequency(v) => sample_rate = Some(v), - _ => (), - } - } - } - MatroskaTag::Video(_) => { - let mut children = children.unwrap(); - while let Some(Ok(Unflat { item, .. })) = children.next() { - match item { - MatroskaTag::PixelWidth(v) => width = Some(v), - MatroskaTag::PixelHeight(v) => height = Some(v), - _ => (), - } - } - } - _ => (), - } - } - tracks.insert( - index.unwrap(), - SourceTrack { - name: name.unwrap_or_else(|| "unnamed".to_string()), - codec: codec.unwrap(), - language: language.unwrap_or_else(|| "none".to_string()), - kind: match kind.ok_or(anyhow!("track type required"))? { - 1 => SourceTrackKind::Video { - fps: 0.0, // TODO - width: width.unwrap(), - height: height.unwrap(), - }, - 2 => SourceTrackKind::Audio { - bit_depth: 0, // TODO - channels: channels.unwrap(), - sample_rate: sample_rate.unwrap(), - }, - 17 => SourceTrackKind::Subtitles, - _ => bail!("invalid track type"), - }, - }, - ); - } - error!("break!"); - drop(iter); - error!("break done!"); - break; - } - _ => (), - } - } - - let k = serde_json::to_string_pretty(&ItemInfo { - title: args.title, - source: Source { - path: args.input.clone(), - tracks, - }, - })?; - - if args.write_json { - let mut f = File::create(format!("{}.json", args.identifier))?; - f.write_all(k.as_bytes())?; - } else { - println!("{k}") - } - - Ok(()) -} diff --git a/tools/src/bin/import.rs b/tools/src/bin/import.rs new file mode 100644 index 0000000..eeb09e7 --- /dev/null +++ b/tools/src/bin/import.rs @@ -0,0 +1,38 @@ +use clap::Parser; +use jellycommon::ItemInfo; +use jellymatroska::read::EbmlReader; +use jellyremuxer::import::import_read; +use std::{fs::File, io::Write, path::PathBuf}; + +#[derive(Parser)] +struct Args { + #[clap(short = 'I', long)] + item: PathBuf, + #[clap(short = 'd', long)] + dry: bool, + #[clap(short = 'i', long)] + input: PathBuf, +} + +fn main() -> anyhow::Result<()> { + env_logger::init_from_env("LOG"); + let args = Args::parse(); + + let mut iteminfo: ItemInfo = serde_json::from_reader(File::open(&args.item)?)?; + // let iteminfo_orig = iteminfo.clone(); + + let input = File::open(args.input.clone()).unwrap(); + let mut input = EbmlReader::new(input); + + import_read(&mut input, &mut iteminfo)?; + + let k = serde_json::to_string_pretty(&iteminfo)?; + if args.dry { + println!("{k}") + } else { + let mut f = File::create(args.item)?; + f.write_all(k.as_bytes())?; + } + + Ok(()) +} |