about summary refs log tree commit diff stats
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
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.
-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>,
 }