youtubei_rs/types/
misc.rs

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>, // None if there is no likes on the comment
327    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), // Shorts are stored in here
400    SearchPyvRenderer(Value), // TODO FIND OUT WHAT IT IS
401    CommentsEntryPointHeaderRenderer(Value),
402    RadioRenderer(RadioRenderer), // Wrapper for CompactRadioRenderer
403    ChannelAboutFullMetadataRenderer(ChannelAboutFullMetadataRenderer),
404    RecognitionShelfRenderer(Value), // Channel members but needs more investigation
405}
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), // Contains only ads which we dont need lol
416    CompactRadioRenderer(CompactRadioRenderer), // Holds mixes? Aka autogenerated playlists
417    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), // Hashtags are stored in there
440    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}