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)]
9pub struct Format {
11 pub filename: String,
13 pub nb_streams: u64,
15 pub nb_programs: u64,
17 pub nb_stream_groups: u64,
19 pub format_name: String,
21 pub format_long_name: String,
23 #[serde(deserialize_with = "option_string_to_duration", default)]
24 pub start_time: Option<Duration>,
25 #[serde(deserialize_with = "option_string_to_duration", default)]
27 pub duration: Option<Duration>,
28 #[serde(default)]
30 #[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 pub probe_score: u64,
37 pub tags: Option<FormatTags>,
39}
40
41#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
42pub 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}