easy_ffprobe/
format.rs

1use std::time::Duration;
2
3use crate::{
4    option_string_to_duration,
5    streams::{option_string_to_int, string_to_int},
6};
7
8#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
9/// Parsed Format
10pub struct Format {
11    /// Filename
12    pub filename: String,
13    /// Number of streams
14    pub nb_streams: u64,
15    /// Number of programs
16    pub nb_programs: u64,
17    // Number of stream groups
18    pub nb_stream_groups: u64,
19    /// eg. matroska,webm
20    pub format_name: String,
21    /// eg. Matroska / WebM
22    pub format_long_name: String,
23    #[serde(deserialize_with = "option_string_to_duration", default)]
24    pub start_time: Option<Duration>,
25    /// Length in seconds
26    #[serde(deserialize_with = "option_string_to_duration", default)]
27    pub duration: Option<Duration>,
28    // FIXME: wrap with Option<_> on next semver breaking release.
29    #[serde(default)]
30    /// Size in bytes
31    #[serde(deserialize_with = "string_to_int")]
32    pub size: i64,
33    #[serde(deserialize_with = "option_string_to_int", default)]
34    pub bit_rate: Option<i64>,
35    ///value from 0-100
36    pub probe_score: u64,
37    /// File Metadata
38    pub tags: Option<FormatTags>,
39}
40
41#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
42/// Metadata Tags of format
43pub struct FormatTags {
44    #[serde(rename = "WMFSDKNeeded")]
45    pub wmfsdkneeded: Option<String>,
46    #[serde(rename = "DeviceConformanceTemplate")]
47    pub device_conformance_template: Option<String>,
48    #[serde(rename = "WMFSDKVersion")]
49    pub wmfsdkversion: Option<String>,
50    #[serde(rename = "IsVBR")]
51    pub is_vbr: Option<String>,
52    #[serde(alias = "MAJOR_BRAND")]
53    pub major_brand: Option<String>,
54    #[serde(alias = "MINOR_VERSION")]
55    pub minor_version: Option<String>,
56    #[serde(alias = "COMPATIBLE_BRANDS")]
57    pub compatible_brands: Option<String>,
58    #[serde(alias = "ENCODER")]
59    pub encoder: Option<String>,
60    #[serde(alias = "MOVIE/ENCODER")]
61    pub encoder_: Option<String>,
62    #[serde(alias = "ARTIST")]
63    pub artist: Option<String>,
64    #[serde(alias = "COMMENT")]
65    pub comment: Option<String>,
66    #[serde(rename = "SUBJECT")]
67    pub subject: Option<String>,
68    #[serde(rename = "PRODUCT")]
69    pub product: Option<String>,
70    #[serde(rename = "IRTD")]
71    pub irtd: Option<String>,
72    pub title: Option<String>,
73    #[serde(rename = "COPYRIGHT")]
74    pub copyright: Option<String>,
75    #[serde(rename = "SOFTWARE")]
76    pub software: Option<String>,
77    #[serde(rename = "LANGUAGE")]
78    pub language: Option<String>,
79    pub track: Option<String>,
80    #[serde(rename = "TDTG")]
81    pub tdtg: Option<String>,
82    #[serde(alias = "ENCODED_BY")]
83    pub encoded_by: Option<String>,
84    pub date: Option<String>,
85    #[serde(rename = "TLEN")]
86    pub tlen: Option<String>,
87    #[serde(rename = "Encoded by")]
88    pub encoded_by_: Option<String>,
89    #[serde(rename = "DESCRIPTION")]
90    pub description: Option<String>,
91    #[serde(rename = "Source")]
92    pub source: Option<String>,
93    #[serde(rename = "IMDB")]
94    pub imdb: Option<String>,
95    #[serde(alias = "CREATION_TIME")]
96    pub creation_time: Option<String>,
97    #[serde(rename = "TMDB")]
98    pub tmdb: Option<String>,
99    pub genre: Option<String>,
100    pub album: Option<String>,
101    #[serde(flatten)]
102    sony_xdcam: SonyXDCAM,
103    #[serde(flatten)]
104    pub extra: std::collections::HashMap<String, serde_json::Value>,
105}
106
107#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
108struct SonyXDCAM {
109    pub operational_pattern_ul: Option<String>,
110    pub uid: Option<String>,
111    pub generation_uid: Option<String>,
112    pub company_name: Option<String>,
113    pub product_name: Option<String>,
114    pub product_version: Option<String>,
115    pub product_uid: Option<String>,
116    pub modification_date: Option<String>,
117    pub material_package_umid: Option<String>,
118    pub timecode: Option<String>,
119}