1use serde::Deserialize;
2use serde_json::Value;
3
4use super::{video::{VideoRenderer, VideoPrimaryInfoRenderer, VideoSecondaryInfoRenderer, CompactVideoRenderer, GridVideoRenderer, CommentThreadRenderer, ReelItemRenderer}, playlist::{GridPlaylistRenderer, PlaylistRenderer, CompactRadioRenderer, NextPlaylistWrapper, RadioRenderer}, channel::{BackstagePostThreadRenderer, TabRenderer, ChannelRenderer, ChannelMetadataRenderer, ChannelVideoPlayerRenderer, GridChannelRenderer, ChannelAboutFullMetadataRenderer}};
5
6#[derive(Debug, Clone, Deserialize)]
7pub struct Thumbnails{
8 pub thumbnails: Vec<Thumbnail>
9}
10#[derive(Debug, Clone, Deserialize)]
11pub struct Thumbnail{
12 pub url: String,
13 pub width: u32,
14 pub height: u32,
15}
16#[derive(Debug, Clone, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct Title{
19 pub runs: Option<Vec<Run>>,
20 pub accessibility:Option<Accessibility>,
21 pub simple_text: Option<String>,
22}
23#[derive(Debug, Clone, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct RunsOption{
26 pub runs: Option<Vec<Run>>,
27}
28#[derive(Debug, Clone, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct RunsOptionAccessibilitySimpleText{
31 pub runs: Option<Vec<Run>>,
32 pub accessibility: Option<Accessibility>,
33 pub simple_text: Option<String>,
34}
35#[derive(Debug, Clone, Deserialize)]
36pub struct Runs{
37 pub runs: Vec<Run>,
38 pub accessibility: Option<Accessibility>,
39}
40#[derive(Debug, Clone, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct Run{
43 pub text: String,
44 pub navigation_endpoint: Option<NavigationEndpoint>
45}
46#[derive(Debug, Clone, Deserialize)]
47#[serde(rename_all = "camelCase")]
48pub struct AccessibilitySimpleText {
49 pub accessibility: Option<Accessibility>,
50 pub simple_text: String,
51}
52#[derive(Debug, Clone, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct SimpleText {
55 pub simple_text: String,
56}
57
58#[derive(Debug, Clone, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct Accessibility {
61 pub accessibility_data: AccessibilityData,
62}
63
64#[derive(Debug, Clone, Deserialize)]
65pub struct AccessibilityData {
66 pub label: String,
67}
68#[derive(Debug, Clone, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct NavigationEndpoint {
71 pub browse_endpoint: Option<BrowseEndpoint>,
72 pub watch_endpoint: Option<WatchEndpoint>,
73 pub continuation_endpoint: Option<ContinuationEndpoint>,
74 pub reel_watch_endpoint: Option<ReelWatchEndpoint>
75}
76#[derive(Debug, Clone, Deserialize)]
77#[serde(rename_all = "camelCase")]
78pub struct ReelWatchEndpoint{
79 pub video_id: String,
80 pub params: String
81}
82#[derive(Debug, Clone, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct WatchEndpoint {
85 pub video_id: String,
86 pub playlist_id: Option<String>,
87 pub params: Option<String>,
88}
89#[derive(Debug, Clone, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct BrowseEndpoint {
92 pub browse_id: String,
93 pub canonical_base_url: Option<String>,
94 pub params: Option<String>,
95}
96#[derive(Debug, Clone, Deserialize)]
97#[serde(rename_all = "camelCase")]
98pub struct BadgeRendererVec{
99 pub metadata_badge_renderer: MetadataBadgeRenderer
100}
101#[derive(Debug, Clone, Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct MetadataBadgeRenderer{
104 pub icon: Option<IconType>,
105 pub style: String,
106 pub label: Option<String>,
107 pub tooltip: Option<String>,
108 pub accessibility_data: Option<AccessibilityData>,
109}
110#[derive(Debug, Clone, Deserialize)]
111#[serde(rename_all = "camelCase")]
112pub struct IconType{
113 pub icon_type: String
114}
115#[derive(Debug, Clone, Deserialize)]
116#[serde(rename_all = "camelCase")]
117pub struct MenuRendererWrapper{
118 pub menu_renderer: Option<MenuRenderer>
119}
120#[derive(Debug, Clone, Deserialize)]
121#[serde(rename_all = "camelCase")]
122pub struct MenuRenderer{
123 pub accessibility: Accessibility,
124 pub top_level_buttons: Option<Vec<TopLevelButtons>>
125}
126#[derive(Debug, Clone, Deserialize)]
127#[serde(rename_all = "camelCase")]
128pub enum TopLevelButtons{
129 ButtonRenderer(ButtonRenderer),
130 ToggleButtonRenderer(ToggleButtonRenderer)
131}
132#[derive(Debug, Clone, Deserialize)]
133#[serde(rename_all = "camelCase")]
134pub struct ButtonRenderer{
135 pub navigation_endpoint: Option<NavigationEndpoint>,
136 pub text: Runs,
137}
138#[derive(Debug, Clone, Deserialize)]
139#[serde(rename_all = "camelCase")]
140pub struct ToggleButtonRenderer{
141 pub style: Value,
142 pub is_toggled: bool,
143 pub is_disabled: bool,
144 pub default_icon: IconType,
145 pub default_text: AccessibilitySimpleText,
146 pub toggled_text: AccessibilitySimpleText,
147 pub accessibility: AccessibilityData,
148}
149
150#[derive(Debug, Clone, Deserialize)]
151#[serde(rename_all = "camelCase")]
152pub struct VideoViewCountRenderer{
153 pub view_count: SimpleText,
154 pub short_view_count: SimpleText,
155}
156#[derive(Debug, Clone, Deserialize)]
157#[serde(rename_all = "camelCase")]
158pub struct VideoViewCountRendererWrapper{
159 pub video_view_count_renderer: VideoViewCountRenderer,
160}
161
162#[derive(Debug, Clone, Deserialize)]
163#[serde(rename_all = "camelCase")]
164pub struct VideoOwnerRenderer{
165 pub thumbnail: Thumbnails,
166 pub title: Runs,
167 pub navigation_endpoint: NavigationEndpoint,
168 pub subscriber_count_text: Option<AccessibilitySimpleText>,
169 pub badges: Option<Vec<BadgeRendererVec>>,
170}
171#[derive(Debug, Clone, Deserialize)]
172#[serde(rename_all = "camelCase")]
173pub struct Owner{
174 pub video_owner_renderer: VideoOwnerRenderer,
175}
176
177#[derive(Debug, Clone, Deserialize)]
178#[serde(rename_all = "camelCase")]
179pub struct ContinuationEndpoint{
180 pub continuation_command: Option<ContinuationCommand>,
181 pub get_transcript: Option<GetTranscriptEndpoint>
182}
183#[derive(Debug, Clone, Deserialize)]
184pub struct ContinuationCommand{
185 pub token: String
186}
187#[derive(Debug, Clone, Deserialize)]
188pub struct GetTranscriptEndpoint{
189 pub params: String
190}
191#[derive(Debug, Clone, Deserialize)]
192#[serde(rename_all = "camelCase")]
193pub struct ContinuationItemRendererWrapper{
194 pub continuation_item_renderer:NavigationEndpoint
195}
196#[derive(Debug, Clone, Deserialize)]
197#[serde(rename_all = "camelCase")]
198pub struct ContinuationItemRenderer{
199 pub continuation_endpoint:ContinuationEndpoint,
200}
201#[derive(Debug, Clone, Deserialize)]
202#[serde(rename_all = "camelCase")]
203pub struct PlayerMicroformatRenderer{
204 pub player_microformat_renderer: PlayerMicroformat
205}
206#[derive(Debug, Clone, Deserialize)]
207#[serde(rename_all = "camelCase")]
208pub struct PlayerMicroformat{
209 pub thumbnail: Thumbnails,
210 pub title: SimpleText,
211 pub description: SimpleText,
212 pub external_channel_id:String,
213 pub is_family_safe: bool,
214 pub view_count: String,
215 pub category: String,
216 pub publish_date: String,
217 pub owner_channel_name: String,
218 pub available_countries: Vec<String>,
219 pub live_broadcast_details: Option<LiveBroadcastDetails>,
220 pub upload_date: String,
221
222}
223#[derive(Debug, Clone, Deserialize)]
224#[serde(rename_all = "camelCase")]
225pub struct LiveBroadcastDetails{
226 pub is_live_now: bool,
227 pub start_timestamp: String
228}
229#[derive(Debug, Clone, Deserialize)]
230#[serde(rename_all = "camelCase")]
231pub struct VideoDetails{
232 pub video_id: String,
233 pub title: String,
234 pub length_seconds: String,
235 pub keywords: Option<Vec<String>>,
236 pub channel_id: String,
237 pub short_description: String,
238 pub thumbnail: Thumbnails,
239 pub view_count: String,
240 pub author: String,
241 pub is_private: bool,
242 pub is_live_content: bool,
243 pub is_upcoming: Option<bool>
244}
245#[derive(Debug, Clone, Deserialize)]
246#[serde(rename_all = "camelCase")]
247pub struct PlayerStoryboardSpecRenderer{
248 pub spec: String,
249}
250#[derive(Debug, Clone, Deserialize)]
251#[serde(rename_all = "camelCase")]
252pub struct StorybordWrapper{
253 pub player_storyboard_spec_renderer: PlayerStoryboardSpecRenderer,
254}
255#[derive(Debug, Clone, Deserialize)]
256#[serde(rename_all = "camelCase")]
257pub struct StreamingData {
258 pub expires_in_seconds: String,
259 pub formats: Vec<Format>,
260 pub adaptive_formats: Vec<Format>,
261}
262
263#[derive(Debug, Clone, Deserialize)]
264#[serde(rename_all = "camelCase")]
265pub struct Format {
266 pub itag: i64,
267 pub mime_type: String,
268 pub bitrate: i64,
269 pub width: Option<i64>,
270 pub height: Option<i64>,
271 pub init_range: Option<Range>,
272 pub index_range: Option<Range>,
273 pub last_modified: String,
274 pub content_length: Option<String>,
275 pub quality: String,
276 pub fps: Option<i64>,
277 pub quality_label: Option<String>,
278 pub projection_type: ProjectionType,
279 pub approx_duration_ms: Option<String>,
280 pub audio_quality: Option<String>,
281 pub audio_sample_rate: Option<String>,
282 pub audio_channels: Option<i64>,
283}
284
285#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
286#[serde(rename_all = "lowercase")]
287pub enum VideoQuality {
288 Small,
289 Medium,
290 Large
291}
292
293#[derive(Debug, Clone, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
294pub enum AudioQuality {
295 #[serde(rename = "AUDIO_QUALITY_LOW")]
296 Low,
297 #[serde(rename = "AUDIO_QUALITY_MEDIUM")]
298 Medium
299}
300
301#[derive(Debug, Clone, Deserialize)]
302pub struct Range {
303 pub start: String,
304 pub end: String,
305}
306
307#[derive(Debug, Clone, Deserialize)]
308#[serde(rename_all = "UPPERCASE")]
309pub enum ProjectionType {
310 Rectangular,
311}
312#[derive(Debug, Clone, Deserialize)]
313#[serde(rename_all = "camelCase")]
314pub struct CommentRendererWrapper{
315 pub comment_renderer: CommentRenderer,
316}
317#[derive(Debug, Clone, Deserialize)]
318#[serde(rename_all = "camelCase")]
319pub struct CommentRenderer{
320 pub author_text: SimpleText,
321 pub author_thumbnail: Thumbnails,
322 pub author_endpoint: NavigationEndpoint,
323 pub content_text: Runs,
324 pub published_time_text: Runs,
325 pub comment_id: String,
326 pub vote_count: Option<AccessibilitySimpleText>, pub reply_count: Option<i16>,
328 pub author_comment_badge: Option<AuthorCommentBadgeRendererWrapper>
329}
330#[derive(Debug, Clone, Deserialize)]
331#[serde(rename_all = "camelCase")]
332pub struct AuthorCommentBadgeRendererWrapper{
333 pub author_comment_badge_renderer: AuthorCommentBadgeRenderer,
334}
335#[derive(Debug, Clone, Deserialize)]
336#[serde(rename_all = "camelCase")]
337pub struct AuthorCommentBadgeRenderer{
338 pub icon: IconType,
339 pub icon_tooltip: String,
340}
341#[derive(Debug, Clone, Deserialize)]
342#[serde(rename_all = "camelCase")]
343pub struct CommentRepliesRendererWrapper{
344 pub comment_replies_renderer: CommentRepliesRenderer
345}
346#[derive(Debug, Clone, Deserialize)]
347pub struct CommentRepliesRenderer{
348 pub contents: Vec<ContinuationItemRendererWrapper>
349}
350#[derive(Debug, Clone, Deserialize)]
351#[serde(rename_all = "camelCase")]
352pub struct ShelfContent{
353 pub vertical_list_renderer: Option<VerticalListRenderer>,
354 pub horizontal_list_renderer: Option<HorizontalListRenderer>,
355 pub play_all_button: Option<PlayAllButton>,
356}
357#[derive(Debug, Clone, Deserialize)]
358#[serde(rename_all = "camelCase")]
359pub struct PlayAllButton{
360 pub button_renderer: ButtonRenderer
361}
362#[derive(Debug, Clone, Deserialize)]
363#[serde(rename_all = "camelCase")]
364pub struct HorizontalListRenderer{
365 pub items: Vec<ItemSectionRendererContents>,
366}
367#[derive(Debug, Clone, Deserialize)]
368#[serde(rename_all = "camelCase")]
369pub struct VerticalListRenderer{
370 pub items: Vec<ItemSectionRendererContents>,
371 pub collapsed_item_count: usize,
372 pub collapsed_state_button_text: Runs,
373}
374#[derive(Debug, Clone, Deserialize)]
375#[serde(rename_all = "camelCase")]
376pub struct SectionListRendererWrapper{
377 pub section_list_renderer: SectionListRenderer
378}
379#[derive(Debug, Clone, Deserialize)]
380#[serde(rename_all = "camelCase")]
381pub struct SectionListRenderer{
382 pub contents: Vec<ItemSectionRendererContents>
383}
384#[derive(Debug, Clone, Deserialize)]
385#[serde(rename_all = "camelCase")]
386pub enum ItemSectionRendererContents{
387 ContinuationItemRenderer(ContinuationItemRenderer),
388 GridRenderer(GridRenderer),
389 GridVideoRenderer(GridVideoRenderer),
390 BackstagePostThreadRenderer(BackstagePostThreadRenderer),
391 ItemSectionRenderer(ItemSectionRenderer),
392 PlaylistRenderer(PlaylistRenderer),
393 VideoRenderer(VideoRenderer),
394 ChannelRenderer(ChannelRenderer),
395 GridChannelRenderer(GridChannelRenderer),
396 GridPlaylistRenderer(GridPlaylistRenderer),
397 ShelfRenderer(ShelfRenderer),
398 ChannelVideoPlayerRenderer(ChannelVideoPlayerRenderer),
399 ReelShelfRenderer(ReelShelfRenderer), SearchPyvRenderer(Value), CommentsEntryPointHeaderRenderer(Value),
402 RadioRenderer(RadioRenderer), ChannelAboutFullMetadataRenderer(ChannelAboutFullMetadataRenderer),
404 RecognitionShelfRenderer(Value), }
406#[derive(Debug, Clone, Deserialize)]
407#[serde(rename_all = "camelCase")]
408pub enum HeaderContents{
409 C4TabbedHeaderRenderer(C4TabbedHeaderRenderer),
410 HashtagHeaderRenderer(HashtagHeaderRenderer),
411}
412#[derive(Debug, Clone, Deserialize)]
413#[serde(rename_all = "camelCase")]
414pub enum NextContents{
415 CompactPromotedVideoRenderer(Value), CompactRadioRenderer(CompactRadioRenderer), CompactVideoRenderer(CompactVideoRenderer),
418 CommentsEntryPointHeaderRenderer(Value),
419 CommentRenderer(CommentRenderer),
420 CommentThreadRenderer(CommentThreadRenderer),
421 CommentsHeaderRenderer(Value),
422 VideoPrimaryInfoRenderer(VideoPrimaryInfoRenderer),
423 VideoSecondaryInfoRenderer(VideoSecondaryInfoRenderer),
424 ContinuationItemRenderer(ContinuationItemRenderer),
425 ItemSectionRenderer(ItemSectionRenderer),
426 PromotedSparklesWebRenderer(Value),
427}
428#[derive(Debug, Clone, Deserialize)]
429#[serde(rename_all = "camelCase")]
430pub struct HashtagHeaderRenderer{
431 pub hashtag: SimpleText,
432 pub hashtag_info_text: SimpleText,
433 pub avatar_facepile: Vec<Thumbnails>,
434 pub background_color: u64,
435}
436#[derive(Debug, Clone, Deserialize)]
437#[serde(rename_all = "camelCase")]
438pub enum TabRendererContent{
439 RichGridRenderer(RichGridRenderer), SectionListRenderer(SectionListRenderer),
441}
442
443#[derive(Debug, Clone, Deserialize)]
444#[serde(rename_all = "camelCase")]
445pub enum RichGridRendererContent{
446 RichItemRenderer(RichItemRenderer),
447 ContinuationItemRenderer(ContinuationItemRenderer),
448}
449#[derive(Debug, Clone, Deserialize)]
450pub struct RichGridRenderer{
451 pub contents: Vec<RichGridRendererContent>,
452}
453#[derive(Debug, Clone, Deserialize)]
454pub struct RichItemRenderer{
455 pub content: VideoRendererWrapper
456}
457#[derive(Debug, Clone, Deserialize)]
458#[serde(rename_all = "camelCase")]
459pub struct VideoRendererWrapper{
460 pub video_renderer: VideoRenderer
461}
462#[derive(Debug, Clone, Deserialize)]
463#[serde(rename_all = "camelCase")]
464pub struct ItemSectionRendererWrapper{
465 pub item_section_renderer:ItemSectionRenderer,
466}
467#[derive(Debug, Clone, Deserialize)]
468#[serde(rename_all = "camelCase")]
469pub struct ItemSectionRenderer{
470 pub contents: Vec<ItemSectionRendererContents>,
471 pub section_identifier: Option<String>,
472}
473#[derive(Debug, Clone, Deserialize)]
474#[serde(rename_all = "camelCase")]
475pub struct GridRenderer{
476 pub items: Vec<ItemSectionRendererContents>,
477}
478#[derive(Debug, Clone, Deserialize)]
479#[serde(rename_all = "camelCase")]
480pub struct BackstagePostRenderer{
481 pub post_id: String,
482 pub author_text: Runs,
483 pub author_thumbnail: Thumbnails,
484 pub author_endpoint: NavigationEndpoint,
485 pub content_text: RunsOption,
486 pub backstage_attachment: BackstageImageRenderer,
487 pub published_time_text: Title,
488 pub vote_count: AccessibilitySimpleText,
489}
490#[derive(Debug, Clone, Deserialize)]
491#[serde(rename_all = "camelCase")]
492pub struct BackstageImageRenderer{
493 pub backstage_image_renderer: Option<CommunityPostAttachmentImage>,
494}
495
496#[derive(Debug, Clone, Deserialize)]
497pub struct CommunityPostAttachmentImage{
498 pub image: Thumbnails,
499 pub command: NavigationEndpoint,
500}
501#[derive(Debug, Clone, Deserialize)]
502#[serde(rename_all = "camelCase")]
503pub struct TwoColumnWatchNextResults{
504 pub results: ResultsWrapper,
505 pub secondary_results: SecondaryResultsWrapper,
506 pub playlist: Option<NextPlaylistWrapper>
507}
508
509#[derive(Debug, Clone, Deserialize)]
510pub struct ResultsWrapper{
511 pub results: Results
512}
513#[derive(Debug, Clone, Deserialize)]
514#[serde(rename_all = "camelCase")]
515pub struct SecondaryResultsWrapper{
516 pub secondary_results: SecondaryResults
517}
518#[derive(Debug, Clone, Deserialize)]
519pub struct Results{
520 pub contents: Vec<NextContents>
521}
522#[derive(Debug, Clone, Deserialize)]
523pub struct SecondaryResults{
524 pub results: Vec<NextContents>
525}
526#[derive(Debug, Clone, Deserialize)]
527pub struct TwoColumnBrowseResultsRenderer{
528 pub tabs: Vec<TabRendererWrapper>
529}
530#[derive(Debug, Clone, Deserialize)]
531#[serde(rename_all = "camelCase")]
532pub struct TabRendererWrapper{
533 pub tab_renderer: Option<TabRenderer>,
534 pub expandable_tab_renderer: Option<TabRenderer>
535}
536#[derive(Debug, Clone, Deserialize)]
537#[serde(rename_all = "camelCase")]
538pub struct TwoColumnSearchResultsRenderer{
539 pub primary_contents: SectionListRendererWrapper,
540}
541
542#[derive(Debug, Clone, Deserialize)]
543#[serde(rename_all = "camelCase")]
544pub struct TwoColumnWrapper{
545 pub two_column_browse_results_renderer: Option<TwoColumnBrowseResultsRenderer>,
546 pub two_column_watch_next_results: Option<TwoColumnWatchNextResults>,
547 pub two_column_search_results_renderer: Option<TwoColumnSearchResultsRenderer>,
548}
549
550#[derive(Debug, Clone, Deserialize)]
551#[serde(rename_all = "camelCase")]
552pub struct PlayerOverlayRendererWrapper{
553 pub player_overlay_renderer: PlayerOverlayRenderer,
554}
555#[derive(Debug, Clone, Deserialize)]
556#[serde(rename_all = "camelCase")]
557pub struct PlayerOverlayRenderer{
558 pub decorated_player_bar_renderer: Option<DecoratedPlayerBarRendererWrapper>,
559}
560#[derive(Debug, Clone, Deserialize)]
561#[serde(rename_all = "camelCase")]
562pub struct DecoratedPlayerBarRendererWrapper{
563 pub decorated_player_bar_renderer: DecoratedPlayerBarRenderer
564}
565#[derive(Debug, Clone, Deserialize)]
566#[serde(rename_all = "camelCase")]
567pub struct DecoratedPlayerBarRenderer{
568 pub player_bar: PlayerBar,
569}
570
571#[derive(Debug, Clone, Deserialize)]
572#[serde(rename_all = "camelCase")]
573pub struct PlayerBar{
574 pub multi_markers_player_bar_renderer: MultiMarkersPlayerBarRenderer
575}
576#[derive(Debug, Clone, Deserialize)]
577#[serde(rename_all = "camelCase")]
578pub struct MultiMarkersPlayerBarRenderer{
579 pub markers_map: Vec<MarkersMap>
580}
581#[derive(Debug, Clone, Deserialize)]
582pub struct MarkersMap{
583 pub key: String,
584 pub value: MarkersMapValues
585}
586#[derive(Debug, Clone, Deserialize)]
587pub struct MarkersMapValues{
588 pub chapters: Option<Vec<Chapter>>,
589 pub heatmap: Option<HeatMap>
590}
591
592#[derive(Debug, Clone, Deserialize)]
593#[serde(rename_all = "camelCase")]
594pub struct Chapter{
595 pub chapter_renderer: ChapterRenderer
596}
597#[derive(Debug, Clone, Deserialize)]
598#[serde(rename_all = "camelCase")]
599pub struct ChapterRenderer{
600 pub title: SimpleText,
601 pub time_range_start_millis: u32,
602 pub on_active_command: OnActiveCommand,
603 pub thumbnail: Thumbnails
604}
605#[derive(Debug, Clone, Deserialize)]
606#[serde(rename_all = "camelCase")]
607pub struct OnActiveCommand{
608 pub set_active_panel_item_action: SetActivePanelItemAction
609}
610#[derive(Debug, Clone, Deserialize)]
611#[serde(rename_all = "camelCase")]
612pub struct SetActivePanelItemAction{
613 pub item_index: u16
614}
615#[derive(Debug, Clone, Deserialize)]
616#[serde(rename_all = "camelCase")]
617pub struct HeatMap{
618 pub heatmap_renderer: HeatMapRenderer
619}
620#[derive(Debug, Clone, Deserialize)]
621#[serde(rename_all = "camelCase")]
622pub struct HeatMapRenderer{
623 pub max_height_dp: u16,
624 pub min_height_dp: u16,
625 pub show_hide_animation_duration_millis: u16,
626 pub heat_markers_decorations: Vec<HeatMarkersDecorations>,
627 pub heat_markers: Vec<HeatMarkers>
628}
629#[derive(Debug, Clone, Deserialize)]
630#[serde(rename_all = "camelCase")]
631pub struct HeatMarkersDecorations{
632 pub timed_marker_decoration_renderer: TimedMarkerDecorationRenderer
633}
634#[derive(Debug, Clone, Deserialize)]
635#[serde(rename_all = "camelCase")]
636pub struct TimedMarkerDecorationRenderer{
637 pub visible_time_range_start_millis: u32,
638 pub visible_time_range_end_millis: u32,
639 pub decoration_time_millis: u32,
640 pub label: Runs,
641}
642#[derive(Debug, Clone, Deserialize)]
643#[serde(rename_all = "camelCase")]
644pub struct HeatMarkers{
645 pub heat_marker_renderer: HeatMarkerRenderer,
646}
647#[derive(Debug, Clone, Deserialize)]
648#[serde(rename_all = "camelCase")]
649pub struct HeatMarkerRenderer{
650 pub time_range_start_millis: u32,
651 pub marker_duration_millis: u32,
652 pub heat_marker_intensity_score_normalized: f32
653}
654#[derive(Debug, Clone, Deserialize)]
655pub struct PlayabilityStatus{
656 pub status: String,
657 pub reason: Option<String>,
658}
659#[derive(Debug, Clone, Deserialize)]
660#[serde(rename_all = "camelCase")]
661pub struct PlayerCaptionsTracklistRenderer{
662 pub player_captions_tracklist_renderer: PlayerCaptionsTracklist,
663}
664#[derive(Debug, Clone, Deserialize)]
665#[serde(rename_all = "camelCase")]
666pub struct PlayerCaptionsTracklist{
667 pub caption_tracks: Vec<CaptionTrack>,
668 pub audio_tracks: Vec<AudioTrack>,
669 pub translation_languages: Vec<TranslationLanguages>,
670 pub default_audio_track_index: u16
671}
672#[derive(Debug, Clone, Deserialize)]
673#[serde(rename_all = "camelCase")]
674pub struct CaptionTrack{
675 pub base_url: String,
676 pub name: SimpleText,
677 pub vss_id: String,
678 pub language_code: String,
679 pub kind: Option<String>,
680 pub is_translatable: bool
681}
682#[derive(Debug, Clone, Deserialize)]
683#[serde(rename_all = "camelCase")]
684pub struct AudioTrack{
685 pub caption_track_indices: Vec<u16>
686}
687#[derive(Debug, Clone, Deserialize)]
688#[serde(rename_all = "camelCase")]
689pub struct TranslationLanguages{
690 pub language_code: String,
691 pub language_name: SimpleText,
692}
693
694#[derive(Debug, Clone, Deserialize)]
695#[serde(rename_all = "camelCase")]
696pub struct ShelfRenderer{
697 pub title: Title,
698 pub content: ShelfContent,
699}
700#[derive(Debug, Clone, Deserialize)]
701#[serde(rename_all = "camelCase")]
702pub struct ReelShelfRenderer{
703 pub title: Runs,
704 pub items: Vec<ReelShelfContent>
705}
706#[derive(Debug, Clone, Deserialize)]
707#[serde(rename_all = "camelCase")]
708pub struct ReelShelfContent{
709 pub reel_item_renderer:ReelItemRenderer
710}
711#[derive(Debug, Clone, Deserialize)]
712#[serde(rename_all = "camelCase")]
713pub struct C4TabbedHeaderRendererWrapper{
714 pub c4_tabbed_header_renderer: C4TabbedHeaderRenderer,
715}
716#[derive(Debug, Clone, Deserialize)]
717#[serde(rename_all = "camelCase")]
718pub struct ChannelMetadataRendererWrapper{
719 pub channel_metadata_renderer: ChannelMetadataRenderer,
720}
721#[derive(Debug, Clone, Deserialize)]
722#[serde(rename_all = "camelCase")]
723pub struct C4TabbedHeaderRenderer{
724 pub channel_id: String,
725 pub title: String,
726 pub navigation_endpoint: NavigationEndpoint,
727 pub avatar: Thumbnails,
728 pub banner: Option<Thumbnails>,
729 pub tv_banner: Option<Thumbnails>,
730 pub mobile_banner: Option<Thumbnails>,
731 pub badges: Option<Vec<BadgeRendererVec>>,
732 pub subscriber_count_text: Option<AccessibilitySimpleText>,
733
734}
735#[derive(Debug, Clone, Deserialize)]
736#[serde(rename_all = "camelCase")]
737pub struct OnResponseReceivedEndpoints{
738 pub reload_continuation_items_command: Option<ReloadContinuationItemsCommand>,
739}
740#[derive(Debug, Clone, Deserialize)]
741#[serde(rename_all = "camelCase")]
742pub struct ReloadContinuationItemsCommand{
743 pub continuation_items: Vec<NextContents>
744}
745#[derive(Debug, Clone, Deserialize)]
746#[serde(rename_all = "camelCase")]
747pub struct OnResponseReceivedActions{
748 pub append_continuation_items_action: AppendContinuationItemsAction
749}
750#[derive(Debug, Clone, Deserialize)]
751#[serde(rename_all = "camelCase")]
752pub struct AppendContinuationItemsAction{
753 pub continuation_items: Vec<ItemSectionRendererContents>,
754}
755#[derive(Debug, Clone, Deserialize)]
756#[serde(rename_all = "camelCase")]
757pub struct MetadataRowContainer{
758 pub metadata_row_container_renderer: MetadataRowContainerRenderer
759}
760#[derive(Debug, Clone, Deserialize)]
761pub struct MetadataRowContainerRenderer{
762 pub rows: Option<Vec<MetadataRowContents>>,
763}
764#[derive(Debug, Clone, Deserialize)]
765#[serde(rename_all = "camelCase")]
766pub enum MetadataRowContents{
767 MetadataRowRenderer(MetadataRowRenderer),
768 MetadataRowHeaderRenderer(Value)
769}
770#[derive(Debug, Clone, Deserialize)]
771#[serde(rename_all = "camelCase")]
772pub struct MetadataRowRenderer{
773 pub title: SimpleText,
774 pub contents: Vec<Title>,
775
776}
777#[derive(Debug, Clone, Deserialize)]
778#[serde(rename_all = "camelCase")]
779pub struct UpcomingEventData{
780 pub start_time: String,
781 pub upcoming_event_text:Runs,
782}
783#[derive(Debug, Clone, Deserialize)]
784#[serde(rename_all = "camelCase")]
785pub struct NextContinuationDataWrapper{
786 pub next_continuation_data: NextContinuationData,
787}
788#[derive(Debug, Clone, Deserialize)]
789pub struct NextContinuationData{
790 pub continuation: String,
791}