aboutsummaryrefslogtreecommitdiffstats
path: root/crates/yt_dlp/src
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-02-16 09:48:08 +0100
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-02-16 09:48:08 +0100
commitfc5771e35b459af6210cbd9a2e7c33b6c462d337 (patch)
tree569796a790daf9df4f12479182a78d9795bccda1 /crates/yt_dlp/src
parentfeat(crates/yt_dlp/lib): Wrap `process_ie_result` function (diff)
downloadyt-fc5771e35b459af6210cbd9a2e7c33b6c462d337.zip
fix(crates/yt_dlp/wrappers/info_json): Don't serialize `None` values
This keeps the jsons, which we internally parse, shorter.
Diffstat (limited to 'crates/yt_dlp/src')
-rw-r--r--crates/yt_dlp/src/wrapper/info_json.rs253
1 files changed, 253 insertions, 0 deletions
diff --git a/crates/yt_dlp/src/wrapper/info_json.rs b/crates/yt_dlp/src/wrapper/info_json.rs
index bffc133..9d63ee6 100644
--- a/crates/yt_dlp/src/wrapper/info_json.rs
+++ b/crates/yt_dlp/src/wrapper/info_json.rs
@@ -29,132 +29,385 @@ type ExtractorKey = String;
#[derive(Debug, Deserialize, Serialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct InfoJson {
+ #[serde(skip_serializing_if = "Option::is_none")]
pub __files_to_move: Option<FilesToMove>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub __last_playlist_index: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub __post_extractor: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub __x_forwarded_for_ip: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub _filename: Option<PathBuf>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub _format_sort_fields: Option<Vec<String>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub _has_drm: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub _type: Option<InfoType>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub _version: Option<Version>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub abr: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub acodec: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub age_limit: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub artists: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub aspect_ratio: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub asr: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub audio_channels: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub audio_ext: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub automatic_captions: Option<HashMap<String, Vec<Caption>>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub availability: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub average_rating: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub categories: Option<Vec<String>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub channel: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub channel_follower_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub channel_id: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub channel_is_verified: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub channel_url: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub chapters: Option<Vec<Chapter>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub comment_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<Vec<Comment>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub concurrent_view_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub container: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub direct: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub display_id: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub downloader_options: Option<DownloaderOptions>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub duration_string: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_range: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<InfoJson>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub episode: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub episode_number: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub epoch: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub ext: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub extractor: Option<Extractor>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub extractor_key: Option<ExtractorKey>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub filename: Option<PathBuf>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub filesize: Option<u64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub filesize_approx: Option<u64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub format_id: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub format_index: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub format_note: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub formats: Option<Vec<Format>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub fps: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub fulltitle: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub genre: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub genres: Option<Vec<String>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub has_drm: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub heatmap: Option<Vec<HeatMapEntry>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub hls_aes: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub http_headers: Option<HttpHeader>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub ie_key: Option<ExtractorKey>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub is_live: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub language_preference: Option<i32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub like_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub live_status: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub manifest_url: Option<Url>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub media_type: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub modified_date: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub n_entries: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub original_url: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playable_in_embed: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_autonumber: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_channel: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_channel_id: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_id: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_index: Option<u64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_title: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_uploader: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_uploader_id: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub playlist_webpage_url: Option<Url>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub preference: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub protocol: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub release_timestamp: Option<u64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub release_year: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub repost_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub requested_downloads: Option<Vec<RequestedDownloads>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub requested_entries: Option<Vec<u32>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub requested_formats: Option<Vec<Format>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub requested_subtitles: Option<HashMap<String, Subtitle>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub resolution: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub season: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub season_number: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub series: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub source_preference: Option<i32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub sponsorblock_chapters: Option<Vec<SponsorblockChapter>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub stretched_ratio: Option<Todo>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub subtitles: Option<HashMap<String, Vec<Caption>>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub tbr: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<Url>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub thumbnails: Option<Vec<ThumbNail>>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub upload_date: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub uploader: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub uploader_id: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub uploader_url: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub vbr: Option<f64>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub vcodec: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub video_ext: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub view_count: Option<u32>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub was_live: Option<bool>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub webpage_url: Option<Url>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub webpage_url_basename: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub webpage_url_domain: Option<String>,
+
+ #[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u32>,
}