From 7285436f7e4cb3133a31d897a0746c1f94084174 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 27 Oct 2019 16:51:09 -0700 Subject: [PATCH] Initial commit. Walks over all movie directories, pulls some metadata into a hashmap and then pretty prints it. --- .gitignore | 2 + Cargo.lock | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 13 +++++++ src/main.rs | 80 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 198 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53eaa21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +**/*.rs.bk diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..47a7c33 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,103 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "human_format" +version = "1.0.2" +source = "git+https://github.com/wathiede/human-format-rs#c5f59f0b0e4d92e649d415a8509bc46e92413356" + +[[package]] +name = "itoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ryu" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_json" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "superdeduper" +version = "0.1.0" +dependencies = [ + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "human_format 1.0.2 (git+https://github.com/wathiede/human-format-rs)", + "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syn" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +"checksum human_format 1.0.2 (git+https://github.com/wathiede/human-format-rs)" = "" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" +"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +"checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0" +"checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8" +"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +"checksum syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7bedb3320d0f3035594b0b723c8a28d7d336a3eda3881db79e61d676fb644c" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..69379e7 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "superdeduper" +version = "0.1.0" +authors = ["Bill Thiede "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +glob = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1" +human_format = { git ="https://github.com/wathiede/human-format-rs" } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..0e10399 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,80 @@ +use std::collections::HashMap; +use std::error::Error; +use std::fmt; +use std::fs::File; +use std::io::BufReader; +use std::path::Path; + +use glob::glob; +use human_format::Formatter; +use human_format::Scales; +use serde::Deserialize; + +const MOVIE_DIR: &str = "/home/wathiede/Movies"; + +#[derive(Deserialize, Debug)] +struct Resolution(usize, usize); +impl fmt::Display for Resolution { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let v = format!("{}x{}", self.0, self.1); + f.pad(&v) + } +} + +#[derive(Deserialize, Debug)] +struct Metadata { + size: usize, + dimension: Resolution, + duration_text: String, + duration: f32, +} + +#[derive(Deserialize, Debug)] +struct MetadataFile { + #[serde(flatten)] + metadata: HashMap, +} + +fn read_metadata_from_file>(path: P) -> Result> { + // Open the file in read-only mode with buffer. + let file = File::open(path)?; + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `User`. + let md = serde_json::from_reader(reader)?; + + // Return the `User`. + Ok(md) +} + +fn main() -> Result<(), Box> { + let mut movies = HashMap::new(); + for md in glob(&format!("{}/*/metadata.json", MOVIE_DIR))? { + match md { + Ok(path) => { + let mdf = read_metadata_from_file(&path)?; + for (name, md) in mdf.metadata { + movies.insert(name, md); + } + } + Err(e) => eprintln!("{:?}", e), + } + } + + let mut names = movies.keys().collect::>(); + names.sort(); + let mut fmtr = Formatter::new(); + fmtr.with_separator(""); + fmtr.with_scales(Scales::Binary()); + for name in names { + let md = &movies[name]; + println!( + "{:>9} {:>8} {} {}", + md.dimension, + fmtr.format(md.size as f64), + md.duration_text, + &name[MOVIE_DIR.len() + 1..] + ); + } + Ok(()) +}