Move code to lib.rs, update testdata.
This commit is contained in:
parent
30b91e0323
commit
86fbf78a73
140
src/lib.rs
Normal file
140
src/lib.rs
Normal file
@ -0,0 +1,140 @@
|
||||
use std::collections::HashMap;
|
||||
use std::env;
|
||||
use std::error::Error;
|
||||
use std::fmt;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use glob::glob;
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Clone, Deserialize, Debug)]
|
||||
pub 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(Clone, Deserialize, Debug)]
|
||||
pub struct Metadata {
|
||||
pub size: usize,
|
||||
pub dimension: Resolution,
|
||||
pub duration_text: String,
|
||||
pub duration: f32,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
pub struct MetadataFile {
|
||||
#[serde(flatten)]
|
||||
pub metadata: HashMap<String, Metadata>,
|
||||
}
|
||||
|
||||
pub struct MovieLibrary {
|
||||
root: String,
|
||||
}
|
||||
|
||||
impl MovieLibrary {
|
||||
pub fn new<S: Into<String>>(root: S) -> MovieLibrary {
|
||||
MovieLibrary { root: root.into() }
|
||||
}
|
||||
|
||||
pub fn movies(
|
||||
&self,
|
||||
include_stale: bool,
|
||||
) -> Result<(HashMap<String, Metadata>), Box<dyn Error>> {
|
||||
let mut movies = HashMap::new();
|
||||
for md in glob(&format!("{}/*/metadata.json", self.root))? {
|
||||
match md {
|
||||
Ok(path) => {
|
||||
let mdf = read_metadata_from_file(&path)?;
|
||||
for (name, md) in mdf.metadata {
|
||||
if include_stale {
|
||||
movies.insert(name, md);
|
||||
} else {
|
||||
// Filter out files that don't exist
|
||||
dbg!(&self.root, &name);
|
||||
let mut p = PathBuf::from(&self.root);
|
||||
p.push(&name);
|
||||
dbg!(&p);
|
||||
if p.is_file() {
|
||||
movies.insert(name, md);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
return Err(e.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(movies)
|
||||
}
|
||||
}
|
||||
|
||||
fn read_metadata_from_file<P: AsRef<Path>>(path: P) -> Result<MetadataFile, Box<dyn Error>> {
|
||||
// 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)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn testdata_dir() -> String {
|
||||
format!("{}/testdata", env::var("CARGO_MANIFEST_DIR").unwrap())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_movies() {
|
||||
let lib = MovieLibrary::new(format!("{}/Movies", testdata_dir()));
|
||||
let movies = lib.movies(true).expect("failed to get movies");
|
||||
let mut got = movies.keys().collect::<Vec<_>>();
|
||||
got.sort();
|
||||
let want = [
|
||||
"Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4",
|
||||
"Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv",
|
||||
"Higher Learning/Higher Learning CD1.avi",
|
||||
"Higher Learning/Higher Learning CD2.avi",
|
||||
"J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v",
|
||||
"J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v",
|
||||
"Stale Sample (2019)/Stale Sample (2019) m720p x264 aac.sample.m4v",
|
||||
"The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv",
|
||||
"The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi",
|
||||
"The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi",
|
||||
];
|
||||
|
||||
assert_eq!(got, want);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_filter_stale() {
|
||||
let lib = MovieLibrary::new(format!("{}/Movies", testdata_dir()));
|
||||
let movies = lib.movies(false).expect("failed to get movies");
|
||||
let mut got = movies.keys().collect::<Vec<_>>();
|
||||
got.sort();
|
||||
let want = [
|
||||
"Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4",
|
||||
"Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv",
|
||||
"Higher Learning/Higher Learning CD1.avi",
|
||||
"Higher Learning/Higher Learning CD2.avi",
|
||||
"J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v",
|
||||
"J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v",
|
||||
"The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv",
|
||||
"The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi",
|
||||
"The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi",
|
||||
];
|
||||
|
||||
assert_eq!(got, want);
|
||||
}
|
||||
}
|
||||
85
src/main.rs
85
src/main.rs
@ -1,68 +1,41 @@
|
||||
use std::collections::HashMap;
|
||||
use std::error::Error;
|
||||
use std::fmt;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use glob::glob;
|
||||
use human_format::Formatter;
|
||||
use human_format::Scales;
|
||||
use log::info;
|
||||
use regex::Regex;
|
||||
use serde::Deserialize;
|
||||
use structopt::StructOpt;
|
||||
|
||||
use superdeduper::Metadata;
|
||||
use superdeduper::MovieLibrary;
|
||||
|
||||
const MOVIE_DIR: &str = "/home/wathiede/Movies";
|
||||
const TO_BE_REMOVED_DIR: &str = "/storage/media/to-be-deleted/";
|
||||
|
||||
#[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<String, Metadata>,
|
||||
}
|
||||
|
||||
fn read_metadata_from_file<P: AsRef<Path>>(path: P) -> Result<MetadataFile, Box<dyn Error>> {
|
||||
// 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 clean_path_parent<P: AsRef<Path>>(path: P) -> PathBuf {
|
||||
let path: &Path = path.as_ref();
|
||||
path.parent().unwrap().into()
|
||||
let path = path.as_ref();
|
||||
let path = path.parent().unwrap();
|
||||
let mut path = path.to_str().unwrap();
|
||||
if path.ends_with(')') {
|
||||
path = &path[..path.len() - 7];
|
||||
}
|
||||
PathBuf::from(path)
|
||||
}
|
||||
|
||||
fn print_movie_groups(movie_groups: &HashMap<PathBuf, Vec<String>>) {
|
||||
for (name, paths) in movie_groups {
|
||||
let mut names = movie_groups.keys().collect::<Vec<_>>();
|
||||
names.sort();
|
||||
|
||||
for name in names {
|
||||
let paths = &movie_groups[name];
|
||||
if paths.len() < 2 {
|
||||
continue;
|
||||
}
|
||||
println!("{}:", name.display());
|
||||
let dir = name.to_str().unwrap();
|
||||
println!("{}:", &dir[MOVIE_DIR.len() + 1..]);
|
||||
for p in paths {
|
||||
println!(" {}", &p[p.rfind("/").unwrap() + 1..]);
|
||||
}
|
||||
@ -117,24 +90,6 @@ struct SuperDeduper {
|
||||
cmd: Command,
|
||||
}
|
||||
|
||||
fn get_movies() -> Result<(HashMap<String, Metadata>), Box<dyn Error>> {
|
||||
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 {
|
||||
if Path::new(&name).is_file() {
|
||||
movies.insert(name, md);
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => return Err(e.into()),
|
||||
}
|
||||
}
|
||||
Ok(movies)
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let app = SuperDeduper::from_args();
|
||||
stderrlog::new()
|
||||
@ -145,13 +100,15 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||
|
||||
match app.cmd {
|
||||
Command::Samples => {
|
||||
let movies = get_movies()?;
|
||||
let lib = MovieLibrary::new(MOVIE_DIR);
|
||||
let movies = lib.movies(false)?;
|
||||
|
||||
let samples_re = Regex::new(r"(?i).*sample.*").unwrap();
|
||||
print_movies(&movies, Some(&samples_re));
|
||||
}
|
||||
Command::Groups => {
|
||||
let movies = get_movies()?;
|
||||
let lib = MovieLibrary::new(MOVIE_DIR);
|
||||
let movies = lib.movies(false)?;
|
||||
|
||||
let mut movie_groups: HashMap<PathBuf, Vec<String>> = HashMap::new();
|
||||
for name in movies.keys() {
|
||||
|
||||
1
testdata/Aladdin (1992)/metadata.json
vendored
1
testdata/Aladdin (1992)/metadata.json
vendored
@ -1 +0,0 @@
|
||||
{"testdata/Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4": {"size": 681829239, "bit_rate_text": "1048 kb/s", "dar_text": "16:9", "format": "MPEG-4 Part 14 (MP4)", "frame_rate": 25.0, "title": null, "size_text": "651MiB", "scan_type": "Progressive scan", "duration_text": "01:26:42.72", "dimension_text": "1280x720", "bit_rate": 1048419.0, "dar": 1.7777777777777777, "path": "testdata/Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4", "duration": 5202.72, "frame_rate_text": "25 fps", "filename": "Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4", "dimension": [1280, 720], "sha1sum": null}}
|
||||
1
testdata/Aladdin (2019)/metadata.json
vendored
1
testdata/Aladdin (2019)/metadata.json
vendored
@ -1 +0,0 @@
|
||||
{"testdata/Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv": {"size": 4150055637, "bit_rate_text": "4324 kb/s", "dar_text": "16:9", "format": "Matroska", "frame_rate": 23.976023976023978, "title": null, "size_text": "3.87GiB", "scan_type": "Progressive scan", "duration_text": "02:07:58.12", "dimension_text": "1280x720", "bit_rate": 4324031.0, "dar": 1.7777777777777777, "path": "testdata/Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv", "duration": 7678.122, "frame_rate_text": "23.98 fps", "filename": "4fe12adfdf4b4e9daa4f1366452d3431.mkv", "dimension": [1280, 720], "sha1sum": null}}
|
||||
1
testdata/Higher Learning/metadata.json
vendored
1
testdata/Higher Learning/metadata.json
vendored
@ -1 +0,0 @@
|
||||
{"testdata/Higher Learning/Higher Learning CD1.avi": {"size": 732073984, "bit_rate_text": "1549 kb/s", "dar_text": "20:11", "format": "Audio Video Interleaved", "frame_rate": 23.976, "title": null, "size_text": "699MiB", "scan_type": "Progressive scan", "duration_text": "01:02:59.70", "dimension_text": "640x352", "bit_rate": 1549487.0, "dar": 1.8181818181818181, "path": "testdata/Higher Learning/Higher Learning CD1.avi", "duration": 3779.696363, "frame_rate_text": "23.98 fps", "filename": "Higher Learning CD1.avi", "dimension": [640, 352], "sha1sum": null}, "testdata/Higher Learning/Higher Learning CD2.avi": {"size": 726925312, "bit_rate_text": "1492 kb/s", "dar_text": "20:11", "format": "Audio Video Interleaved", "frame_rate": 23.976, "title": null, "size_text": "694MiB", "scan_type": "Progressive scan", "duration_text": "01:04:57.94", "dimension_text": "640x352", "bit_rate": 1491917.0, "dar": 1.8181818181818181, "path": "testdata/Higher Learning/Higher Learning CD2.avi", "duration": 3897.939606, "frame_rate_text": "23.98 fps", "filename": "Higher Learning CD2.avi", "dimension": [640, 352], "sha1sum": null}}
|
||||
1
testdata/J0hn W1ck (2014)/metadata.json
vendored
1
testdata/J0hn W1ck (2014)/metadata.json
vendored
@ -1 +0,0 @@
|
||||
{"testdata/J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v": {"size": 3486430, "bit_rate_text": "443 kb/s", "dar_text": "128:53", "format": "MPEG-4 Part 14 (M4V)", "frame_rate": 23.976023976023978, "title": "John Wick", "size_text": "3.33MiB", "scan_type": "Progressive scan", "duration_text": "00:01:02.95", "dimension_text": "1280x530", "bit_rate": 443049.0, "dar": 2.4150943396226414, "path": "testdata/J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v", "duration": 62.953333, "frame_rate_text": "23.98 fps", "filename": "J0hn W1ck (2014) m720p x264 aac.sample.m4v", "dimension": [1280, 530], "sha1sum": null}, "testdata/J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v": {"size": 529494697, "bit_rate_text": "698 kb/s", "dar_text": "128:53", "format": "MPEG-4 Part 14 (M4V)", "frame_rate": 23.976023976023978, "title": "John Wick", "size_text": "505MiB", "scan_type": "Progressive scan", "duration_text": "01:41:12.81", "dimension_text": "1280x530", "bit_rate": 697528.0, "dar": 2.4150943396226414, "path": "testdata/J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v", "duration": 6072.810667, "frame_rate_text": "23.98 fps", "filename": "J0hn W1ck (2014) m720p x264 aac.m4v", "dimension": [1280, 530], "sha1sum": null}}
|
||||
1
testdata/Movies/Aladdin (1992)/metadata.json
vendored
Normal file
1
testdata/Movies/Aladdin (1992)/metadata.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4": {"size": 681829239, "bit_rate_text": "1048 kb/s", "dar_text": "16:9", "format": "MPEG-4 Part 14 (MP4)", "frame_rate": 25.0, "title": null, "size_text": "651MiB", "scan_type": "Progressive scan", "duration_text": "01:26:42.72", "dimension_text": "1280x720", "bit_rate": 1048419.0, "dar": 1.7777777777777777, "path": "Aladdin (1992)/Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4", "duration": 5202.72, "frame_rate_text": "25 fps", "filename": "Aladdin.1992.720p.BRrip.x264.GAZ.YIFY.mp4", "dimension": [1280, 720], "sha1sum": null}}
|
||||
1
testdata/Movies/Aladdin (2019)/metadata.json
vendored
Normal file
1
testdata/Movies/Aladdin (2019)/metadata.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv": {"size": 4150055637, "bit_rate_text": "4324 kb/s", "dar_text": "16:9", "format": "Matroska", "frame_rate": 23.976023976023978, "title": null, "size_text": "3.87GiB", "scan_type": "Progressive scan", "duration_text": "02:07:58.12", "dimension_text": "1280x720", "bit_rate": 4324031.0, "dar": 1.7777777777777777, "path": "Aladdin (2019)/4fe12adfdf4b4e9daa4f1366452d3431.mkv", "duration": 7678.122, "frame_rate_text": "23.98 fps", "filename": "4fe12adfdf4b4e9daa4f1366452d3431.mkv", "dimension": [1280, 720], "sha1sum": null}}
|
||||
1
testdata/Movies/Higher Learning/metadata.json
vendored
Normal file
1
testdata/Movies/Higher Learning/metadata.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"Higher Learning/Higher Learning CD1.avi": {"size": 732073984, "bit_rate_text": "1549 kb/s", "dar_text": "20:11", "format": "Audio Video Interleaved", "frame_rate": 23.976, "title": null, "size_text": "699MiB", "scan_type": "Progressive scan", "duration_text": "01:02:59.70", "dimension_text": "640x352", "bit_rate": 1549487.0, "dar": 1.8181818181818181, "path": "Higher Learning/Higher Learning CD1.avi", "duration": 3779.696363, "frame_rate_text": "23.98 fps", "filename": "Higher Learning CD1.avi", "dimension": [640, 352], "sha1sum": null}, "Higher Learning/Higher Learning CD2.avi": {"size": 726925312, "bit_rate_text": "1492 kb/s", "dar_text": "20:11", "format": "Audio Video Interleaved", "frame_rate": 23.976, "title": null, "size_text": "694MiB", "scan_type": "Progressive scan", "duration_text": "01:04:57.94", "dimension_text": "640x352", "bit_rate": 1491917.0, "dar": 1.8181818181818181, "path": "Higher Learning/Higher Learning CD2.avi", "duration": 3897.939606, "frame_rate_text": "23.98 fps", "filename": "Higher Learning CD2.avi", "dimension": [640, 352], "sha1sum": null}}
|
||||
1
testdata/Movies/J0hn W1ck (2014)/metadata.json
vendored
Normal file
1
testdata/Movies/J0hn W1ck (2014)/metadata.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v": {"size": 3486430, "bit_rate_text": "443 kb/s", "dar_text": "128:53", "format": "MPEG-4 Part 14 (M4V)", "frame_rate": 23.976023976023978, "title": "John Wick", "size_text": "3.33MiB", "scan_type": "Progressive scan", "duration_text": "00:01:02.95", "dimension_text": "1280x530", "bit_rate": 443049.0, "dar": 2.4150943396226414, "path": "J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.sample.m4v", "duration": 62.953333, "frame_rate_text": "23.98 fps", "filename": "J0hn W1ck (2014) m720p x264 aac.sample.m4v", "dimension": [1280, 530], "sha1sum": null}, "J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v": {"size": 529494697, "bit_rate_text": "698 kb/s", "dar_text": "128:53", "format": "MPEG-4 Part 14 (M4V)", "frame_rate": 23.976023976023978, "title": "John Wick", "size_text": "505MiB", "scan_type": "Progressive scan", "duration_text": "01:41:12.81", "dimension_text": "1280x530", "bit_rate": 697528.0, "dar": 2.4150943396226414, "path": "J0hn W1ck (2014)/J0hn W1ck (2014) m720p x264 aac.m4v", "duration": 6072.810667, "frame_rate_text": "23.98 fps", "filename": "J0hn W1ck (2014) m720p x264 aac.m4v", "dimension": [1280, 530], "sha1sum": null}}
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"testdata/Stale Sample (2019)/Stale Sample (2019) m720p x264 aac.sample.m4v": {
|
||||
"Stale Sample (2019)/Stale Sample (2019) m720p x264 aac.sample.m4v": {
|
||||
"size": 3486430,
|
||||
"bit_rate_text": "443 kb/s",
|
||||
"dar_text": "128:53",
|
||||
@ -12,7 +12,7 @@
|
||||
"dimension_text": "1280x530",
|
||||
"bit_rate": 443049,
|
||||
"dar": 2.4150943396226414,
|
||||
"path": "testdata/Stale Sample (2019)/Stale Sample (2019) m720p x264 aac.sample.m4v",
|
||||
"path": "Stale Sample (2019)/Stale Sample (2019) m720p x264 aac.sample.m4v",
|
||||
"duration": 62.953333,
|
||||
"frame_rate_text": "23.98 fps",
|
||||
"filename": "Stale Sample (2019) m720p x264 aac.sample.m4v",
|
||||
1
testdata/Movies/The Hudsucker Proxy (1994)/metadata.json
vendored
Normal file
1
testdata/Movies/The Hudsucker Proxy (1994)/metadata.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi": {"size": 736493444, "bit_rate_text": "1635 kb/s", "dar_text": "45:26", "format": "Audio Video Interleaved", "frame_rate": 23.976023976023978, "title": "The Hudsucker Proxy (AC3-2ch) (1of2)", "size_text": "703MiB", "scan_type": "Progressive scan", "duration_text": "01:00:03.68", "dimension_text": "720x416", "bit_rate": 1634979.0, "dar": 1.7307692307692308, "path": "The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi", "duration": 3603.683417, "frame_rate_text": "23.98 fps", "filename": "The Hudsucker Proxy CD2.avi", "dimension": [720, 416], "sha1sum": null}, "The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi": {"size": 736508354, "bit_rate_text": "1938 kb/s", "dar_text": "45:26", "format": "Audio Video Interleaved", "frame_rate": 23.976023976023978, "title": "The Hudsucker Proxy (AC3-2ch) (2of2)", "size_text": "703MiB", "scan_type": "Progressive scan", "duration_text": "00:50:40.45", "dimension_text": "720x416", "bit_rate": 1937890.0, "dar": 1.7307692307692308, "path": "The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi", "duration": 3040.454083, "frame_rate_text": "23.98 fps", "filename": "The Hudsucker Proxy CD1.avi", "dimension": [720, 416], "sha1sum": null}, "The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv": {"size": 4778774000, "bit_rate_text": "5753 kb/s", "dar_text": "16:9", "format": "Matroska", "frame_rate": 23.976023976023978, "title": null, "size_text": "4.46GiB", "scan_type": "Progressive scan", "duration_text": "01:50:45.02", "dimension_text": "1920x1080", "bit_rate": 5753206.0, "dar": 1.7777777777777777, "path": "The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv", "duration": 6645.024, "frame_rate_text": "23.98 fps", "filename": "54151c3b9a2a4773958f848efecefc3b.mkv", "dimension": [1920, 1080], "sha1sum": null}}
|
||||
@ -1 +0,0 @@
|
||||
{"testdata/The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi": {"size": 736493444, "bit_rate_text": "1635 kb/s", "dar_text": "45:26", "format": "Audio Video Interleaved", "frame_rate": 23.976023976023978, "title": "The Hudsucker Proxy (AC3-2ch) (1of2)", "size_text": "703MiB", "scan_type": "Progressive scan", "duration_text": "01:00:03.68", "dimension_text": "720x416", "bit_rate": 1634979.0, "dar": 1.7307692307692308, "path": "testdata/The Hudsucker Proxy (1994)/The Hudsucker Proxy CD2.avi", "duration": 3603.683417, "frame_rate_text": "23.98 fps", "filename": "The Hudsucker Proxy CD2.avi", "dimension": [720, 416], "sha1sum": null}, "testdata/The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi": {"size": 736508354, "bit_rate_text": "1938 kb/s", "dar_text": "45:26", "format": "Audio Video Interleaved", "frame_rate": 23.976023976023978, "title": "The Hudsucker Proxy (AC3-2ch) (2of2)", "size_text": "703MiB", "scan_type": "Progressive scan", "duration_text": "00:50:40.45", "dimension_text": "720x416", "bit_rate": 1937890.0, "dar": 1.7307692307692308, "path": "testdata/The Hudsucker Proxy (1994)/The Hudsucker Proxy CD1.avi", "duration": 3040.454083, "frame_rate_text": "23.98 fps", "filename": "The Hudsucker Proxy CD1.avi", "dimension": [720, 416], "sha1sum": null}, "testdata/The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv": {"size": 4778774000, "bit_rate_text": "5753 kb/s", "dar_text": "16:9", "format": "Matroska", "frame_rate": 23.976023976023978, "title": null, "size_text": "4.46GiB", "scan_type": "Progressive scan", "duration_text": "01:50:45.02", "dimension_text": "1920x1080", "bit_rate": 5753206.0, "dar": 1.7777777777777777, "path": "testdata/The Hudsucker Proxy (1994)/54151c3b9a2a4773958f848efecefc3b.mkv", "duration": 6645.024, "frame_rate_text": "23.98 fps", "filename": "54151c3b9a2a4773958f848efecefc3b.mkv", "dimension": [1920, 1080], "sha1sum": null}}
|
||||
Loading…
x
Reference in New Issue
Block a user