From db6b1ab8a77a648855c7527e6b1eeacc0e9de34d Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Mon, 17 Oct 2022 11:04:18 +0200 Subject: [PATCH 1/2] refactor: update trends response model --- codegen/src/download_testfiles.rs | 10 +- src/client/pagination.rs | 68 +- src/client/response/mod.rs | 1 - src/client/response/trends.rs | 64 +- src/client/response/video_item.rs | 32 +- ...agination__tests__map_cont_startpage.snap} | 320 ++--- ..._client__trends__tests__map_startpage.snap | 241 ++-- ...__client__trends__tests__map_trending.snap | 1078 +++++++++-------- src/client/trends.rs | 166 +-- 9 files changed, 936 insertions(+), 1044 deletions(-) rename src/client/snapshots/{rustypipe__client__trends__tests__map_startpage_cont.snap => rustypipe__client__pagination__tests__map_cont_startpage.snap} (76%) diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 658fce3..9bf9995 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -280,10 +280,7 @@ async fn channel_videos_cont(testfiles: &Path) { .unwrap(); let rp = rp_testfile(&json_path); - rp.query() - .channel_videos_continuation(&videos.content.ctoken.unwrap()) - .await - .unwrap(); + videos.content.next(rp.query()).await.unwrap().unwrap(); } async fn channel_playlists_cont(testfiles: &Path) { @@ -302,10 +299,7 @@ async fn channel_playlists_cont(testfiles: &Path) { .unwrap(); let rp = rp_testfile(&json_path); - rp.query() - .channel_playlists_continuation(&playlists.content.ctoken.unwrap()) - .await - .unwrap(); + playlists.content.next(rp.query()).await.unwrap().unwrap(); } async fn search(testfiles: &Path) { diff --git a/src/client/pagination.rs b/src/client/pagination.rs index cc573c8..59f49e2 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -1,7 +1,6 @@ use crate::error::{Error, ExtractionError}; use crate::model::{ - Comment, ContinuationEndpoint, Paginator, PlaylistVideo, RecommendedVideo, SearchVideo, - YouTubeItem, + Comment, ContinuationEndpoint, Paginator, PlaylistVideo, RecommendedVideo, YouTubeItem, }; use crate::serializer::MapResult; use crate::util::TryRemove; @@ -13,8 +12,10 @@ impl RustyPipeQuery { self, ctoken: &str, endpoint: ContinuationEndpoint, + visitor_data: Option<&str>, ) -> Result, Error> { - let context = self.get_context(ClientType::Desktop, true).await; + let mut context = self.get_context(ClientType::Desktop, true).await; + context.client.visitor_data = visitor_data.map(str::to_owned); let request_body = QContinuation { context, continuation: ctoken, @@ -140,64 +141,14 @@ paginator!(Comment, RustyPipeQuery::video_comments); paginator!(PlaylistVideo, RustyPipeQuery::playlist_continuation); paginator!(RecommendedVideo, RustyPipeQuery::video_recommendations); -impl Paginator { - pub async fn next(&self, query: RustyPipeQuery) -> Result, Error> { - Ok(match (&self.ctoken, &self.visitor_data) { - (Some(ctoken), Some(visitor_data)) => { - Some(query.startpage_continuation(ctoken, visitor_data).await?) - } - _ => None, - }) - } - - pub async fn extend(&mut self, query: RustyPipeQuery) -> Result { - match self.next(query).await { - Ok(Some(paginator)) => { - let mut items = paginator.items; - self.items.append(&mut items); - self.ctoken = paginator.ctoken; - Ok(true) - } - Ok(None) => Ok(false), - Err(e) => Err(e), - } - } - - pub async fn extend_pages( - &mut self, - query: RustyPipeQuery, - n_pages: usize, - ) -> Result<(), Error> { - for _ in 0..n_pages { - match self.extend(query.clone()).await { - Ok(false) => break, - Err(e) => return Err(e), - _ => {} - } - } - Ok(()) - } - - pub async fn extend_limit( - &mut self, - query: RustyPipeQuery, - n_items: usize, - ) -> Result<(), Error> { - while self.items.len() < n_items { - match self.extend(query.clone()).await { - Ok(false) => break, - Err(e) => return Err(e), - _ => {} - } - } - Ok(()) - } -} - impl> Paginator { pub async fn next(&self, query: RustyPipeQuery) -> Result, Error> { Ok(match &self.ctoken { - Some(ctoken) => Some(query.continuation(ctoken, self.endpoint).await?), + Some(ctoken) => Some( + query + .continuation(ctoken, self.endpoint, self.visitor_data.as_deref()) + .await?, + ), _ => None, }) } @@ -261,6 +212,7 @@ mod tests { #[rstest] #[case("search", "search/cont")] + #[case("startpage", "trends/startpage_cont")] fn map_continuation_items(#[case] name: &str, #[case] path: &str) { let filename = format!("testfiles/{}.json", path); let json_path = Path::new(&filename); diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 3cc57a7..80574de 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -17,7 +17,6 @@ pub use playlist_music::PlaylistMusic; pub use search::Search; pub use search::SearchCont; pub use trends::Startpage; -pub use trends::StartpageCont; pub use trends::Trending; pub use url_endpoint::ResolvedUrl; pub use video_details::VideoComments; diff --git a/src/client/response/trends.rs b/src/client/response/trends.rs index ab9deac..53ee54a 100644 --- a/src/client/response/trends.rs +++ b/src/client/response/trends.rs @@ -1,9 +1,9 @@ use serde::Deserialize; use serde_with::{serde_as, VecSkipError}; -use crate::serializer::{ignore_any, MapResult, VecLogError}; +use crate::serializer::{MapResult, VecLogError}; -use super::{ContentRenderer, ContentsRenderer, VideoListItem, VideoRenderer}; +use super::{ContentRenderer, YouTubeListItem}; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] @@ -12,15 +12,6 @@ pub struct Startpage { pub response_context: ResponseContext, } -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct StartpageCont { - #[serde(default)] - #[serde_as(as = "VecSkipError<_>")] - pub on_response_received_actions: Vec, -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Contents { @@ -60,7 +51,7 @@ pub struct StartpageTabContent { #[serde(rename_all = "camelCase")] pub struct RichGridRenderer { #[serde_as(as = "VecLogError<_>")] - pub contents: MapResult>, + pub contents: MapResult>, } #[derive(Debug, Deserialize)] @@ -72,33 +63,15 @@ pub struct Trending { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TrendingTabContent { - pub section_list_renderer: ContentsRenderer, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ItemSectionRenderer { - pub item_section_renderer: ContentsRenderer, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ShelfRenderer { - pub shelf_renderer: ContentRenderer, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ShelfContents { - pub expanded_shelf_contents_renderer: Option, + pub section_list_renderer: SectionListRenderer, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct ShelfContentsRenderer { +pub struct SectionListRenderer { #[serde_as(as = "VecLogError<_>")] - pub items: MapResult>, + pub contents: MapResult>, } #[derive(Debug, Deserialize)] @@ -106,28 +79,3 @@ pub struct ShelfContentsRenderer { pub struct ResponseContext { pub visitor_data: Option, } - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -#[allow(clippy::large_enum_variant)] -pub enum TrendingListItem { - VideoRenderer(VideoRenderer), - - #[serde(other, deserialize_with = "ignore_any")] - None, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct OnResponseReceivedAction { - pub append_continuation_items_action: AppendAction, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct AppendAction { - #[serde_as(as = "VecLogError<_>")] - pub continuation_items: MapResult>, -} diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index 87d5fd4..7600fbe 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -49,6 +49,7 @@ pub enum YouTubeListItem { /// /// Seems to be currently A/B tested on the channel page, /// as of 11.10.2022 + #[serde(alias = "shelfRenderer")] RichItemRenderer { content: Box, }, @@ -57,7 +58,9 @@ pub enum YouTubeListItem { /// /// Seems to be currently A/B tested on the video details page, /// as of 11.10.2022 + #[serde(alias = "expandedShelfContentsRenderer")] ItemSectionRenderer { + #[serde(alias = "items")] #[serde_as(as = "VecLogError<_>")] contents: MapResult>, }, @@ -375,32 +378,3 @@ impl YouTubeListMapper { res.c.into_iter().for_each(|item| self.map_item(item)); } } - -impl YouTubeListMapper { - fn map_item(&mut self, item: YouTubeListItem) { - match item { - YouTubeListItem::ChannelRenderer(channel) => { - self.items.push(Self::map_channel(channel)); - } - YouTubeListItem::ContinuationItemRenderer { - continuation_endpoint, - } => self.ctoken = Some(continuation_endpoint.continuation_command.token), - YouTubeListItem::ShowingResultsForRenderer { corrected_query } => { - self.corrected_query = Some(corrected_query); - } - YouTubeListItem::RichItemRenderer { content } => { - self.map_item(*content); - } - YouTubeListItem::ItemSectionRenderer { mut contents } => { - self.warnings.append(&mut contents.warnings); - contents.c.into_iter().for_each(|it| self.map_item(it)); - } - _ => {} - } - } - - pub fn map_response(&mut self, mut res: MapResult>) { - self.warnings.append(&mut res.warnings); - res.c.into_iter().for_each(|item| self.map_item(item)); - } -} diff --git a/src/client/snapshots/rustypipe__client__trends__tests__map_startpage_cont.snap b/src/client/snapshots/rustypipe__client__pagination__tests__map_cont_startpage.snap similarity index 76% rename from src/client/snapshots/rustypipe__client__trends__tests__map_startpage_cont.snap rename to src/client/snapshots/rustypipe__client__pagination__tests__map_cont_startpage.snap index c248a26..bdd5699 100644 --- a/src/client/snapshots/rustypipe__client__trends__tests__map_startpage_cont.snap +++ b/src/client/snapshots/rustypipe__client__pagination__tests__map_cont_startpage.snap @@ -1,11 +1,11 @@ --- -source: src/client/trends.rs +source: src/client/pagination.rs expression: map_res.c --- Paginator( count: None, items: [ - SearchVideo( + Video(VideoItem( id: "mRmlXh7Hams", title: "Extra 3 vom 12.10.2022 im NDR | extra 3 | NDR", length: Some(1839), @@ -16,7 +16,7 @@ Paginator( height: 270, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCjhkuC_Pi85wGjnB0I1ydxw", name: "extra 3", avatar: [ @@ -28,15 +28,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 585257, + view_count: Some(585257), is_live: false, is_short: false, - short_description: "Niedersachsen nach der Wahl: Schuld ist immer die Ampel | Die Grünen: Partei der erneuerbaren Prinzipien | Verhütung? Ist Frauensache! | Youtube: Handwerk mit goldenem Boden - Christian Ehring...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Niedersachsen nach der Wahl: Schuld ist immer die Ampel | Die Grünen: Partei der erneuerbaren Prinzipien | Verhütung? Ist Frauensache! | Youtube: Handwerk mit goldenem Boden - Christian Ehring..."), + )), + Video(VideoItem( id: "LsXC5r64Pvc", title: "Most Rarest Plays In Baseball History", length: Some(1975), @@ -47,7 +48,7 @@ Paginator( height: 270, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCRfKJZ7LHueFudiDgAJDr9Q", name: "Top All Sports", avatar: [ @@ -59,15 +60,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 weeks ago"), - view_count: 985521, + view_count: Some(985521), is_live: false, is_short: false, - short_description: "#baseball #mlb #mlbb", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("#baseball #mlb #mlbb"), + )), + Video(VideoItem( id: "dwPmd1GqQHE", title: "90S RAP & HIPHOP MIX - Notorious B I G , Dr Dre, 50 Cent, Snoop Dogg, 2Pac, DMX, Lil Jon and more", length: Some(5457), @@ -78,7 +80,7 @@ Paginator( height: 270, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCKICAAGtBLJJ5zRdIxn_B4g", name: "#Hip Hop 2022", avatar: [ @@ -90,15 +92,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 months ago"), - view_count: 1654055, + view_count: Some(1654055), is_live: false, is_short: false, - short_description: "", - ), - SearchVideo( + is_upcoming: false, + short_description: None, + )), + Video(VideoItem( id: "qxI-Ob8lpLE", title: "Schlatt\'s Chips Tier List", length: Some(1071), @@ -114,7 +117,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC2mP7il3YV7TxM_3m6U0bwA", name: "jschlattLIVE", avatar: [ @@ -126,15 +129,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 year ago"), - view_count: 9029628, + view_count: Some(9029628), is_live: false, is_short: false, - short_description: "Schlatt ranks every chip ever made.\nCREATE YOUR OWN TIER LIST: https://tiermaker.com/create/chips-for-big-guy-1146620\n\nSubscribe to me on Twitch:\nhttps://twitch.tv/jschlatt\n\nFollow me on Twitter:...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Schlatt ranks every chip ever made.\nCREATE YOUR OWN TIER LIST: https://tiermaker.com/create/chips-for-big-guy-1146620\n\nSubscribe to me on Twitch:\nhttps://twitch.tv/jschlatt\n\nFollow me on Twitter:..."), + )), + Video(VideoItem( id: "qmrzTUmZ4UU", title: "850€ für den Verrat am System - UCS AT-AT LEGO® Star Wars 75313", length: Some(2043), @@ -150,7 +154,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC_EZd3lsmxudu3IQzpTzOgw", name: "Held der Steine Inh. Thomas Panke", avatar: [ @@ -162,15 +166,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 days ago"), - view_count: 600516, + view_count: Some(600516), is_live: false, is_short: false, - short_description: "Star Wars - erschienen 2021 - 6749 Teile\n\nDieses Set bei Amazon*:\nhttps://amzn.to/3yu9dHX\n\nErwähnt im Video*:\nTassen https://bit.ly/HdSBausteinecke\nBig Boy https://bit.ly/BBLokBigBoy\nBurg...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Star Wars - erschienen 2021 - 6749 Teile\n\nDieses Set bei Amazon*:\nhttps://amzn.to/3yu9dHX\n\nErwähnt im Video*:\nTassen https://bit.ly/HdSBausteinecke\nBig Boy https://bit.ly/BBLokBigBoy\nBurg..."), + )), + Video(VideoItem( id: "4q4vpQCIZ6w", title: "🌉 Manhattan Jazz 💖 l Relaxing Jazz Piano Music l Background Music", length: Some(23229), @@ -186,7 +191,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCBnMxlW70f0SB4ZTJx124lw", name: "몽키비지엠 MONKEYBGM", avatar: [ @@ -198,15 +203,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 months ago"), - view_count: 2343407, + view_count: Some(2343407), is_live: false, is_short: false, - short_description: "- Please Subscribe!\n\n🔺Disney OST Collection part 1 \n ➡\u{fe0f} https://youtu.be/lrzKFu85nhE\n\n🔺Disney OST Collection part 2 \n ➡\u{fe0f} https://youtu.be/EtE09lowIbk\n\n🔺Studio Ghibli...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("- Please Subscribe!\n\n🔺Disney OST Collection part 1 \n ➡\u{fe0f} https://youtu.be/lrzKFu85nhE\n\n🔺Disney OST Collection part 2 \n ➡\u{fe0f} https://youtu.be/EtE09lowIbk\n\n🔺Studio Ghibli..."), + )), + Video(VideoItem( id: "Z_k31kqZxaE", title: "1 in 1,000,000 NBA Moments", length: Some(567), @@ -222,7 +228,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCpyoYVlp67N16Lg1_N4VnVw", name: "dime", avatar: [ @@ -234,15 +240,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 month ago"), - view_count: 4334298, + view_count: Some(4334298), is_live: false, is_short: false, - short_description: "• Instagram - https://instagram.com/dime_nba\n• TikTok - https://tiktok.com/@dime_nba\n\ndime is a Swedish brand, founded in 2022. We produce some of the most entertaining NBA content on YouTube...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("• Instagram - https://instagram.com/dime_nba\n• TikTok - https://tiktok.com/@dime_nba\n\ndime is a Swedish brand, founded in 2022. We produce some of the most entertaining NBA content on YouTube..."), + )), + Video(VideoItem( id: "zE-a5eqvlv8", title: "Dua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me", length: None, @@ -258,7 +265,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCX-USfenzQlhrEJR1zD5IYw", name: "Deep Mood.", avatar: [ @@ -270,15 +277,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 889, - is_live: false, + view_count: Some(889), + is_live: true, is_short: false, - short_description: "#Summermix #DeepHouse #DeepHouseSummerMix\nDua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me\n\n🎵 All songs in this spotify playlist: https://spoti.fi/2TJ4Dyj\nSubmit...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("#Summermix #DeepHouse #DeepHouseSummerMix\nDua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me\n\n🎵 All songs in this spotify playlist: https://spoti.fi/2TJ4Dyj\nSubmit..."), + )), + Video(VideoItem( id: "gNlOk0LXi5M", title: "Soll ich dir 1g GOLD schenken? oder JEMAND anderen DOPPELT?", length: Some(704), @@ -294,7 +302,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqcWNPTUVATZt0Dlr2jV0Wg", name: "Mois", avatar: [ @@ -306,15 +314,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("8 days ago"), - view_count: 463834, + view_count: Some(463834), is_live: false, is_short: false, - short_description: "Je mehr Menschen mich abonnieren desto mehr Menschen werde ich glücklich machen \n\n24 std ab, viel Glück \n\nhttps://I-Clip.com/?sPartner=Mois", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Je mehr Menschen mich abonnieren desto mehr Menschen werde ich glücklich machen \n\n24 std ab, viel Glück \n\nhttps://I-Clip.com/?sPartner=Mois"), + )), + Video(VideoItem( id: "dbMvZjs8Yc8", title: "Brad Pitt- Die Revanche eines Sexsymbols | Doku HD | ARTE", length: Some(3137), @@ -330,7 +339,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCsygZtQQSplGF6JA3XWvsdg", name: "Irgendwas mit ARTE und Kultur", avatar: [ @@ -342,15 +351,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 293878, + view_count: Some(293878), is_live: false, is_short: false, - short_description: "Vom „People“-Magazin wurde er mehrfach zum „Sexiest Man Alive“ gekrönt. Aber sein Aussehen ist nicht alles: In 30 Jahren Karriere drehte Brad Pitt eine Vielzahl herausragender Filme....", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Vom „People“-Magazin wurde er mehrfach zum „Sexiest Man Alive“ gekrönt. Aber sein Aussehen ist nicht alles: In 30 Jahren Karriere drehte Brad Pitt eine Vielzahl herausragender Filme...."), + )), + Video(VideoItem( id: "mFxi3lOAcFs", title: "Craziest Soviet Machines You Won\'t Believe Exist - Part 1", length: Some(1569), @@ -366,7 +376,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCkQO3QsgTpNTsOw6ujimT5Q", name: "BE AMAZED", avatar: [ @@ -378,15 +388,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 year ago"), - view_count: 14056843, + view_count: Some(14056843), is_live: false, is_short: false, - short_description: "Coming up are some crazy Soviet-era machines you won\'t believe exist!\nPart 2: https://youtu.be/MBZVOJrhuHY\nSuggest a topic here to be turned into a video: http://bit.ly/2kwqhuh\nSubscribe for...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Coming up are some crazy Soviet-era machines you won\'t believe exist!\nPart 2: https://youtu.be/MBZVOJrhuHY\nSuggest a topic here to be turned into a video: http://bit.ly/2kwqhuh\nSubscribe for..."), + )), + Video(VideoItem( id: "eu7ubm7g59E", title: "People Hated Me For Using This Slab", length: Some(1264), @@ -402,7 +413,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC6I0KzAD7uFTL1qzxyunkvA", name: "Blacktail Studio", avatar: [ @@ -414,15 +425,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 months ago"), - view_count: 2845035, + view_count: Some(2845035), is_live: false, is_short: false, - short_description: "Some people were furious I used this slab, and I actually understand why. \nBlacktail bow tie jig (limited first run): https://www.blacktailstudio.com/bowtie-jig\nBlacktail epoxy table workshop:...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Some people were furious I used this slab, and I actually understand why. \nBlacktail bow tie jig (limited first run): https://www.blacktailstudio.com/bowtie-jig\nBlacktail epoxy table workshop:..."), + )), + Video(VideoItem( id: "TRGHIN2PGIA", title: "Christian Bale Breaks Down His Most Iconic Characters | GQ", length: Some(1381), @@ -438,7 +450,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCsEukrAd64fqA7FjwkmZ_Dw", name: "GQ", avatar: [ @@ -450,15 +462,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("9 days ago"), - view_count: 8044465, + view_count: Some(8044465), is_live: false, is_short: false, - short_description: "Christian Bale breaks down a few of his most iconic characters from \'American Psycho,\' \'The Dark Knight\' Trilogy, \'The Fighter,\' \'The Machinist,\' \'The Big Short,\' \'Vice,\' \'Empire of the Sun,\'...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Christian Bale breaks down a few of his most iconic characters from \'American Psycho,\' \'The Dark Knight\' Trilogy, \'The Fighter,\' \'The Machinist,\' \'The Big Short,\' \'Vice,\' \'Empire of the Sun,\'..."), + )), + Video(VideoItem( id: "w3tENzcssDU", title: "NFL Trick Plays But They Get Increasingly Higher IQ", length: Some(599), @@ -474,7 +487,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCJka5SDh36_N4pjJd69efkg", name: "Savage Brick Sports", avatar: [ @@ -486,15 +499,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 months ago"), - view_count: 1172372, + view_count: Some(1172372), is_live: false, is_short: false, - short_description: "NFL Trick Plays But They Get Increasingly Higher IQ\nCredit to CoshReport for starting this trend.\n\n(if any of the links don\'t work, check most recent video)\nTalkSports Discord: https://discord.gg/n...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("NFL Trick Plays But They Get Increasingly Higher IQ\nCredit to CoshReport for starting this trend.\n\n(if any of the links don\'t work, check most recent video)\nTalkSports Discord: https://discord.gg/n..."), + )), + Video(VideoItem( id: "gUAd2XXzH7w", title: "⚓\u{fe0f}Found ABANDONED SHIP!!! Big CRUISE SHIP on a desert island☠\u{fe0f} Where did the people go?!?", length: Some(2949), @@ -510,7 +524,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UClUZos7yKYtrmr0-azaD8pw", name: "Kreosan English", avatar: [ @@ -522,15 +536,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 month ago"), - view_count: 1883533, + view_count: Some(1883533), is_live: false, is_short: false, - short_description: "We are preparing a continuation of the cruise ship for you! Very soon you will be able to see the next part. If you would like to help us make a video:\n\n► Support us - https://www.patreon.com/k...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("We are preparing a continuation of the cruise ship for you! Very soon you will be able to see the next part. If you would like to help us make a video:\n\n► Support us - https://www.patreon.com/k..."), + )), + Video(VideoItem( id: "YpGjaJ1ettI", title: "[Working BGM] Comfortable music that makes you feel positive -- Morning Mood -- Daily Routine", length: Some(3651), @@ -546,7 +561,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCpxY9-3iB5Hyho31uBgzh7w", name: "Daily Routine", avatar: [ @@ -558,15 +573,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 months ago"), - view_count: 1465389, + view_count: Some(1465389), is_live: false, is_short: false, - short_description: "Hello everyone. It\'s me again. I will stay at home and study . It\'s full of fun energy today, so it\'s ready to spread to everyone with hilarious music. 🔥🔥🔥\nHave fun together 😊😊😊...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Hello everyone. It\'s me again. I will stay at home and study . It\'s full of fun energy today, so it\'s ready to spread to everyone with hilarious music. 🔥🔥🔥\nHave fun together 😊😊😊..."), + )), + Video(VideoItem( id: "rPAhFD8hKxQ", title: "Survival Camping 9ft/3m Under Snow - Giant Winter Bushcraft Shelter and Quinzee", length: Some(1301), @@ -582,7 +598,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCfpCQ89W9wjkHc8J_6eTbBg", name: "Outdoor Boys", avatar: [ @@ -594,15 +610,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 months ago"), - view_count: 20488431, + view_count: Some(20488431), is_live: false, is_short: false, - short_description: "Solo winter camping and bushcraft 9 feet (3 meters) under the snow. I hiked high up into the mountains during a snow storm with 30 mph/48 kmh winds to build a deep snow bushcraft survival shelter...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Solo winter camping and bushcraft 9 feet (3 meters) under the snow. I hiked high up into the mountains during a snow storm with 30 mph/48 kmh winds to build a deep snow bushcraft survival shelter..."), + )), + Video(VideoItem( id: "2rye4u-cCNk", title: "Pink Panther Fights Off Pests | 54 Minute Compilation | The Pink Panther Show", length: Some(3158), @@ -618,7 +635,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCFeUyPY6W8qX8w2o6oSiRmw", name: "Official Pink Panther", avatar: [ @@ -630,15 +647,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("11 months ago"), - view_count: 27357653, + view_count: Some(27357653), is_live: false, is_short: false, - short_description: "(1) Pink Pest Control\n(2) Pink-a-Boo\n(3) Little Beaux Pink\n(4) The Pink Package Plot\n(5) Come On In! The Water\'s Pink\n(6) Psychedelic Pink\n(7) Pink Posies\n(8) G.I. Pink\n\nThe Pink Panther is...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("(1) Pink Pest Control\n(2) Pink-a-Boo\n(3) Little Beaux Pink\n(4) The Pink Package Plot\n(5) Come On In! The Water\'s Pink\n(6) Psychedelic Pink\n(7) Pink Posies\n(8) G.I. Pink\n\nThe Pink Panther is..."), + )), + Video(VideoItem( id: "O0xAlfSaBNQ", title: "FC Nantes vs. SC Freiburg – Highlights & Tore | UEFA Europa League", length: Some(326), @@ -654,7 +672,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC8WYi3XQXsf-6FNvqoEvxag", name: "RTL Sport", avatar: [ @@ -666,15 +684,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("11 hours ago"), - view_count: 117395, + view_count: Some(117395), is_live: false, is_short: false, - short_description: "UEFA Europa League: https://www.rtlplus.com/shows/uefa-europa-league-19818?utm_source=youtube&utm_medium=editorial&utm_campaign=beschreibung&utm_term=rtlsport \nFC Nantes vs. SC Freiburg –...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("UEFA Europa League: https://www.rtlplus.com/shows/uefa-europa-league-19818?utm_source=youtube&utm_medium=editorial&utm_campaign=beschreibung&utm_term=rtlsport \nFC Nantes vs. SC Freiburg –..."), + )), + Video(VideoItem( id: "Mhs9Sbnw19o", title: "Dramatisches Duell: 400 Jahre altes Kästchen erzielt zig-fachen Wunschpreis! | Bares für Rares XXL", length: Some(744), @@ -690,7 +709,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC53bIpnef1pwAx69ERmmOLA", name: "Bares für Rares", avatar: [ @@ -702,15 +721,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("11 days ago"), - view_count: 836333, + view_count: Some(836333), is_live: false, is_short: false, - short_description: "Du hast Schätze im Keller, die du unseren Expert*innen präsentieren möchtest? Hier geht\'s zum Bewerbungsformular: kurz.zdf.de/lSJ/\n\nEin einmaliges Bieterduell treibt den Preis für dieses...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Du hast Schätze im Keller, die du unseren Expert*innen präsentieren möchtest? Hier geht\'s zum Bewerbungsformular: kurz.zdf.de/lSJ/\n\nEin einmaliges Bieterduell treibt den Preis für dieses..."), + )), + Video(VideoItem( id: "Bzzp5Cay7DI", title: "Sweet Jazz - Cool autumn Bossa Nova & October Jazz Positive Mood", length: None, @@ -726,7 +746,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCoGlllJE7aYe_VzIGP3s_wA", name: "Smooth Jazz Music", avatar: [ @@ -738,15 +758,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 1216, - is_live: false, + view_count: Some(1216), + is_live: true, is_short: false, - short_description: "Sweet Jazz - Cool autumn Bossa Nova & October Jazz Positive Mood\nhttps://youtu.be/Bzzp5Cay7DI\n********************************************\nSounds available on: Jazz Bossa Nova\nOFFICIAL VIDEO:...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Sweet Jazz - Cool autumn Bossa Nova & October Jazz Positive Mood\nhttps://youtu.be/Bzzp5Cay7DI\n********************************************\nSounds available on: Jazz Bossa Nova\nOFFICIAL VIDEO:..."), + )), + Video(VideoItem( id: "SlskTqc9CEc", title: "The Chick-Fil-A Full Menu Challenge", length: Some(613), @@ -762,7 +783,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCd1fLoVFooPeWqCEYVUJZqg", name: "Matt Stonie", avatar: [ @@ -774,15 +795,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 years ago"), - view_count: 39286403, + view_count: Some(39286403), is_live: false, is_short: false, - short_description: "Good Video? Like/Fav & Share!!\n\nTBH this is really my 1st time trying Chick-Fil-A, legitimately. My verdict is torn, but that sauce is BOMB!\n\nChallenge\n+ Chick-Fil-A Deluxe\n+ Spicy Deluxe\n+...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("Good Video? Like/Fav & Share!!\n\nTBH this is really my 1st time trying Chick-Fil-A, legitimately. My verdict is torn, but that sauce is BOMB!\n\nChallenge\n+ Chick-Fil-A Deluxe\n+ Spicy Deluxe\n+..."), + )), + Video(VideoItem( id: "CwRvM2TfYbs", title: "Gentle healing music of health and to calm the nervous system, deep relaxation! Say Life Yes", length: None, @@ -798,7 +820,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC6jH5GNi0iOR17opA1Vowhw", name: "Lucid Dream", avatar: [ @@ -810,15 +832,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 1416, - is_live: false, + view_count: Some(1416), + is_live: true, is_short: false, - short_description: "🌿 Music for relaxation, meditation, study, reading, massage, spa or sleep. This music is ideal for dealing with anxiety, stress or insomnia as it promotes relaxation and helps eliminate...", - ), - SearchVideo( + is_upcoming: false, + short_description: Some("🌿 Music for relaxation, meditation, study, reading, massage, spa or sleep. This music is ideal for dealing with anxiety, stress or insomnia as it promotes relaxation and helps eliminate..."), + )), + Video(VideoItem( id: "7jz0pXSe_kI", title: "Craziest \"Fine...I\'ll Do it Myself\" Moments in Sports History (PART 2)", length: Some(1822), @@ -834,7 +857,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCd5hdemikI6GxwGKhJCwzww", name: "Highlight Reel", avatar: [ @@ -846,14 +869,15 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 months ago"), - view_count: 11601863, + view_count: Some(11601863), is_live: false, is_short: false, - short_description: "(PART 2) of 👉🏼 Craziest \"Fine...I\'ll Do It Myself\" Moments in Sports History \n\nBIBLE VERSE OF THE DAY: Luke 12:40", - ), + is_upcoming: false, + short_description: Some("(PART 2) of 👉🏼 Craziest \"Fine...I\'ll Do It Myself\" Moments in Sports History \n\nBIBLE VERSE OF THE DAY: Luke 12:40"), + )), ], ctoken: Some("4qmFsgKxAxIPRkV3aGF0X3RvX3dhdGNoGoADQ0RCNmxnSkhUWFpRYzJOVU1UUm1iME5OWjNOSmQzWjZOM0JPWlZWMldqZDFRVlp3ZEVOdGMwdEhXR3d3V0ROQ2FGb3lWbVpqTWpWb1kwaE9iMkl6VW1aamJWWnVZVmM1ZFZsWGQxTklNVlUwVDFSU1dXUXhUbXhXTTBaeVdsaGtSRkpGYkZCWk0yaDZWbXMxTlV4VmVGbE1XRnBSVlcxallVeFJRVUZhVnpSQlFWWldWRUZCUmtWU1VVRkNRVVZhUm1ReWFHaGtSamt3WWpFNU0xbFlVbXBoUVVGQ1FVRkZRa0ZCUVVKQlFVVkJRVUZGUWtGSFNrSkRRVUZUUlROQ2FGb3lWbVpqTWpWb1kwaE9iMkl6VW1aa1J6bHlXbGMwWVVWM2Ftb3hPRkJGT1dWSU5rRm9WVlpZWlVGTFNGaHVSMEp2ZDJsRmQycERObkZmUlRsbFNEWkJhRmRIZG1RMFMwaGxaMGhDTlZnMmJrMWxPVU5SU1VsTlVRJTNEJTNEmgIaYnJvd3NlLWZlZWRGRXdoYXRfdG9fd2F0Y2g%3D"), endpoint: browse, diff --git a/src/client/snapshots/rustypipe__client__trends__tests__map_startpage.snap b/src/client/snapshots/rustypipe__client__trends__tests__map_startpage.snap index 6891917..e80b146 100644 --- a/src/client/snapshots/rustypipe__client__trends__tests__map_startpage.snap +++ b/src/client/snapshots/rustypipe__client__trends__tests__map_startpage.snap @@ -5,7 +5,7 @@ expression: map_res.c Paginator( count: None, items: [ - SearchVideo( + VideoItem( id: "_cyJhGsXDDM", title: "Ultimate Criminal Canal Found Magnet Fishing! Police on the Hunt", length: Some(1096), @@ -21,7 +21,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCMLXec9-wpON8tZegnDsYLw", name: "Bondi Treasure Hunter", avatar: [ @@ -33,15 +33,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 700385, + view_count: Some(700385), is_live: false, is_short: false, - short_description: "Subscribe for more Treasure Hunting videos: https://tinyurl.com/yyl3zerk\n\nMy Magnet! (Use Discount code \'BONDI\'): https://magnetarmagnets.com/\nMy Dive System! (Use Bonus code \'BONDI\'): https://lddy...", + is_upcoming: false, + short_description: Some("Subscribe for more Treasure Hunting videos: https://tinyurl.com/yyl3zerk\n\nMy Magnet! (Use Discount code \'BONDI\'): https://magnetarmagnets.com/\nMy Dive System! (Use Bonus code \'BONDI\'): https://lddy..."), ), - SearchVideo( + VideoItem( id: "36YnV9STBqc", title: "The Good Life Radio\u{a0}•\u{a0}24/7 Live Radio | Best Relax House, Chillout, Study, Running, Gym, Happy Music", length: None, @@ -57,7 +58,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UChs0pSaEoNLV4mevBFGaoKA", name: "The Good Life Radio x Sensual Musique", avatar: [ @@ -69,15 +70,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 7202, - is_live: false, + view_count: Some(7202), + is_live: true, is_short: false, - short_description: "The Good Life is live streaming the best of Relaxing & Chill House Music, Deep House, Tropical House, EDM, Dance & Pop as well as Music for Sleep, Focus, Study, Workout, Gym, Running etc. in...", + is_upcoming: false, + short_description: Some("The Good Life is live streaming the best of Relaxing & Chill House Music, Deep House, Tropical House, EDM, Dance & Pop as well as Music for Sleep, Focus, Study, Workout, Gym, Running etc. in..."), ), - SearchVideo( + VideoItem( id: "YYD1qgH5qC4", title: "چند شنبه با سینــا | فصل چهـارم | قسمت 5 | با حضور نازنین انصاری مدیر روزنامه کیهان لندن", length: Some(3261), @@ -93,7 +95,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCzH_7hfL6Jd1H0WpNO_eryQ", name: "MBC PERSIA", avatar: [ @@ -105,15 +107,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("14 hours ago"), - view_count: 104344, + view_count: Some(104344), is_live: false, is_short: false, - short_description: "#mbcpersia\n#chandshanbeh\n#چندشنبه\n\nشبكه ام بى سى پرشيا را از حساب هاى مختلف در شبكه هاى اجتماعى دنبال كنيد\n►MBCPERSIA on Facebook:...", + is_upcoming: false, + short_description: Some("#mbcpersia\n#chandshanbeh\n#چندشنبه\n\nشبكه ام بى سى پرشيا را از حساب هاى مختلف در شبكه هاى اجتماعى دنبال كنيد\n►MBCPERSIA on Facebook:..."), ), - SearchVideo( + VideoItem( id: "BeJqgI6rw9k", title: "your city is full of fake buildings, here\'s why", length: Some(725), @@ -129,7 +132,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqVEHtQoXHmUCfJ-9smpTSg", name: "Answer in Progress", avatar: [ @@ -141,15 +144,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 1447008, + view_count: Some(1447008), is_live: false, is_short: false, - short_description: "Save 33% on your first Native Deodorant Pack - normally $39, you’ll get it for $26! Click here https://bit.ly/nativeanswer1 and use my code ANSWER #AD\n\nSomewhere on your street there may...", + is_upcoming: false, + short_description: Some("Save 33% on your first Native Deodorant Pack - normally $39, you’ll get it for $26! Click here https://bit.ly/nativeanswer1 and use my code ANSWER #AD\n\nSomewhere on your street there may..."), ), - SearchVideo( + VideoItem( id: "ma28eWd1oyA", title: "Post Malone, Maroon 5, Adele, Taylor Swift, Ed Sheeran, Shawn Mendes, Pop Hits 2020 Part 6", length: Some(29989), @@ -160,7 +164,7 @@ Paginator( height: 270, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCldQuUMYTUGrjvcU2vaPSFQ", name: "Music Library", avatar: [ @@ -172,15 +176,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("Streamed 2 years ago"), - view_count: 1861814, + view_count: Some(1861814), is_live: false, is_short: false, - short_description: "Post Malone, Maroon 5, Adele, Taylor Swift, Ed Sheeran, Shawn Mendes, Charlie Puth Pop Hits 2020\nPost Malone, Maroon 5, Adele, Taylor Swift, Ed Sheeran, Shawn Mendes, Charlie Puth Pop Hits...", + is_upcoming: false, + short_description: Some("Post Malone, Maroon 5, Adele, Taylor Swift, Ed Sheeran, Shawn Mendes, Charlie Puth Pop Hits 2020\nPost Malone, Maroon 5, Adele, Taylor Swift, Ed Sheeran, Shawn Mendes, Charlie Puth Pop Hits..."), ), - SearchVideo( + VideoItem( id: "mL2LBRM5GBI", title: "Salahs 6-Minuten-Hattrick & Firmino-Gala: Rangers - FC Liverpool 1:7 | UEFA Champions League | DAZN", length: Some(355), @@ -196,7 +201,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCB-GdMjyokO9lZkKU_oIK6g", name: "DAZN UEFA Champions League", avatar: [ @@ -208,15 +213,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 1471667, + view_count: Some(1471667), is_live: false, is_short: false, - short_description: "In der Liga läuft es für die Reds weiterhin nicht rund. Am vergangenen Spieltag gab es gegen Arsenal eine 2:3-Niederlage, am Sonntag trifft man auf Man City. Die Champions League soll für...", + is_upcoming: false, + short_description: Some("In der Liga läuft es für die Reds weiterhin nicht rund. Am vergangenen Spieltag gab es gegen Arsenal eine 2:3-Niederlage, am Sonntag trifft man auf Man City. Die Champions League soll für..."), ), - SearchVideo( + VideoItem( id: "Ang18qz2IeQ", title: "Satisfying Videos of Workers Doing Their Job Perfectly", length: Some(1186), @@ -232,7 +238,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCYenDLnIHsoqQ6smwKXQ7Hg", name: "#Mind Warehouse", avatar: [ @@ -244,15 +250,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 173121, + view_count: Some(173121), is_live: false, is_short: false, - short_description: "TechZone ► https://goo.gl/Gj3wZs \n\n #incrediblemoments #mindwarehouse #IncredibleMoments #CaughtOnCamera #InterestingFacts \n\nYou can endlessly watch how others work, but in this selection,...", + is_upcoming: false, + short_description: Some("TechZone ► https://goo.gl/Gj3wZs \n\n #incrediblemoments #mindwarehouse #IncredibleMoments #CaughtOnCamera #InterestingFacts \n\nYou can endlessly watch how others work, but in this selection,..."), ), - SearchVideo( + VideoItem( id: "fjHN4jsJnEU", title: "I Made 200 Players Simulate Survival Island in Minecraft...", length: Some(2361), @@ -268,7 +275,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqt4mmAqLmH-AwXz31URJsw", name: "Sword4000", avatar: [ @@ -280,15 +287,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 751909, + view_count: Some(751909), is_live: false, is_short: false, - short_description: "200 Players Simulate Survival Island Civilizations in Minecraft...\n-------------------------------------------------------------------\nI invited 200 Players to a Survival Island and let them...", + is_upcoming: false, + short_description: Some("200 Players Simulate Survival Island Civilizations in Minecraft...\n-------------------------------------------------------------------\nI invited 200 Players to a Survival Island and let them..."), ), - SearchVideo( + VideoItem( id: "FI1XrdBJIUI", title: "Epic Construction Fails | Expensive Fails Compilation | FailArmy", length: Some(631), @@ -304,7 +312,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCPDis9pjXuqyI7RYLJ-TTSA", name: "FailArmy", avatar: [ @@ -316,15 +324,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 2226471, + view_count: Some(2226471), is_live: false, is_short: false, - short_description: "I don\'t think so, Tim. ►►► Submit your videos for the chance to be featured 🔗 https://www.failarmy.com/pages/submit-video ▼ Follow us for more fails! https://linktr.ee/failarmy\n#fails...", + is_upcoming: false, + short_description: Some("I don\'t think so, Tim. ►►► Submit your videos for the chance to be featured 🔗 https://www.failarmy.com/pages/submit-video ▼ Follow us for more fails! https://linktr.ee/failarmy\n#fails..."), ), - SearchVideo( + VideoItem( id: "MXdplejK8vU", title: "Chilly autumn Jazz ☕ Smooth September Jazz & Bossa Nova for a great relaxing weekend", length: Some(86403), @@ -340,7 +349,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCeGJ6v6KQt0s88hGKMfybuw", name: "Cozy Jazz Music", avatar: [ @@ -352,15 +361,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 month ago"), - view_count: 148743, + view_count: Some(148743), is_live: false, is_short: false, - short_description: "Chilly autumn Jazz ☕ Smooth September Jazz & Bossa Nova for a great relaxing weekend\nhttps://youtu.be/MXdplejK8vU\n*******************************************\nSounds available on: Jazz Bossa...", + is_upcoming: false, + short_description: Some("Chilly autumn Jazz ☕ Smooth September Jazz & Bossa Nova for a great relaxing weekend\nhttps://youtu.be/MXdplejK8vU\n*******************************************\nSounds available on: Jazz Bossa..."), ), - SearchVideo( + VideoItem( id: "Jri4_9vBFiQ", title: "Top 100 Best Classic Rock Songs Of All Time 🔥 R.E.M, Queen, Metallica,Guns N’ Roses,Bon Jovi, U2,CCR", length: None, @@ -376,7 +386,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCiIWdzEVNH8okhlapR9a-xA", name: "Rock Music", avatar: [ @@ -388,15 +398,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 192, - is_live: false, + view_count: Some(192), + is_live: true, is_short: false, - short_description: "Top 100 Best Classic Rock Songs Of All Time 🔥 R.E.M, Queen, Metallica,Guns N’ Roses,Bon Jovi, U2,CCR\nTop 100 Best Classic Rock Songs Of All Time 🔥 R.E.M, Queen, Metallica,Guns N’...", + is_upcoming: false, + short_description: Some("Top 100 Best Classic Rock Songs Of All Time 🔥 R.E.M, Queen, Metallica,Guns N’ Roses,Bon Jovi, U2,CCR\nTop 100 Best Classic Rock Songs Of All Time 🔥 R.E.M, Queen, Metallica,Guns N’..."), ), - SearchVideo( + VideoItem( id: "ll4d5Lt-Ie8", title: "Relaxing Music Healing Stress, Anxiety and Depressive States Heal Mind, Body and Soul | Sleep music", length: Some(42896), @@ -412,7 +423,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCNS3dqFGBPhxHmOigehpBeg", name: "Love YourSelf", avatar: [ @@ -424,15 +435,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("Streamed 5 months ago"), - view_count: 5363904, + view_count: Some(5363904), is_live: false, is_short: false, - short_description: "The study found that listening to relaxing music of the patient\'s choice resulted in \"significant pain relief and increased mobility.\" Researchers believe that music relieves pain because listening...", + is_upcoming: false, + short_description: Some("The study found that listening to relaxing music of the patient\'s choice resulted in \"significant pain relief and increased mobility.\" Researchers believe that music relieves pain because listening..."), ), - SearchVideo( + VideoItem( id: "Dx2wbKLokuQ", title: "W. Putin: Die Sehnsucht nach dem Imperium | Mit offenen Karten | ARTE", length: Some(729), @@ -448,7 +460,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCLLibJTCy3sXjHLVaDimnpQ", name: "ARTEde", avatar: [ @@ -460,15 +472,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 weeks ago"), - view_count: 539838, + view_count: Some(539838), is_live: false, is_short: false, - short_description: "Jede Woche untersucht „Mit offenen Karten“ die politischen Kräfteverhältnisse in der ganzen Welt anhand detaillierter geografischer Karten \n\nIm Februar 2022 rechtfertigte Wladimir Putin...", + is_upcoming: false, + short_description: Some("Jede Woche untersucht „Mit offenen Karten“ die politischen Kräfteverhältnisse in der ganzen Welt anhand detaillierter geografischer Karten \n\nIm Februar 2022 rechtfertigte Wladimir Putin..."), ), - SearchVideo( + VideoItem( id: "jfKfPfyJRdk", title: "lofi hip hop radio - beats to relax/study to", length: None, @@ -484,7 +497,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCSJ4gkVC6NrvII8umztf0Ow", name: "Lofi Girl", avatar: [ @@ -496,15 +509,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 21262, - is_live: false, + view_count: Some(21262), + is_live: true, is_short: false, - short_description: "🤗 Thank you for listening, I hope you will have a good time here\n\n💽 | Get the latest vinyl (limited edition)\n→ https://vinyl-lofirecords.com/\n\n🎼 | Listen on Spotify, Apple music...", + is_upcoming: false, + short_description: Some("🤗 Thank you for listening, I hope you will have a good time here\n\n💽 | Get the latest vinyl (limited edition)\n→ https://vinyl-lofirecords.com/\n\n🎼 | Listen on Spotify, Apple music..."), ), - SearchVideo( + VideoItem( id: "qmrzTUmZ4UU", title: "850€ für den Verrat am System - UCS AT-AT LEGO® Star Wars 75313", length: Some(2043), @@ -520,7 +534,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC_EZd3lsmxudu3IQzpTzOgw", name: "Held der Steine Inh. Thomas Panke", avatar: [ @@ -532,15 +546,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 days ago"), - view_count: 600150, + view_count: Some(600150), is_live: false, is_short: false, - short_description: "Star Wars - erschienen 2021 - 6749 Teile\n\nDieses Set bei Amazon*:\nhttps://amzn.to/3yu9dHX\n\nErwähnt im Video*:\nTassen https://bit.ly/HdSBausteinecke\nBig Boy https://bit.ly/BBLokBigBoy\nBurg...", + is_upcoming: false, + short_description: Some("Star Wars - erschienen 2021 - 6749 Teile\n\nDieses Set bei Amazon*:\nhttps://amzn.to/3yu9dHX\n\nErwähnt im Video*:\nTassen https://bit.ly/HdSBausteinecke\nBig Boy https://bit.ly/BBLokBigBoy\nBurg..."), ), - SearchVideo( + VideoItem( id: "t0Q2otsqC4I", title: "Tom & Jerry | Tom & Jerry in Full Screen | Classic Cartoon Compilation | WB Kids", length: Some(1298), @@ -556,7 +571,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC9trsD1jCTXXtN3xIOIU8gg", name: "WB Kids", avatar: [ @@ -568,15 +583,16 @@ Paginator( ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 months ago"), - view_count: 252381571, + view_count: Some(252381571), is_live: false, is_short: false, - short_description: "Did you know that there are only 25 classic Tom & Jerry episodes that were displayed in a widescreen CinemaScope from the 1950s? Enjoy a compilation filled with some of the best moments from...", + is_upcoming: false, + short_description: Some("Did you know that there are only 25 classic Tom & Jerry episodes that were displayed in a widescreen CinemaScope from the 1950s? Enjoy a compilation filled with some of the best moments from..."), ), - SearchVideo( + VideoItem( id: "zE-a5eqvlv8", title: "Dua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me", length: None, @@ -592,7 +608,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCX-USfenzQlhrEJR1zD5IYw", name: "Deep Mood.", avatar: [ @@ -604,15 +620,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 955, - is_live: false, + view_count: Some(955), + is_live: true, is_short: false, - short_description: "#Summermix #DeepHouse #DeepHouseSummerMix\nDua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me\n\n🎵 All songs in this spotify playlist: https://spoti.fi/2TJ4Dyj\nSubmit...", + is_upcoming: false, + short_description: Some("#Summermix #DeepHouse #DeepHouseSummerMix\nDua Lipa, Coldplay, Martin Garrix & Kygo, The Chainsmokers Style - Feeling Me\n\n🎵 All songs in this spotify playlist: https://spoti.fi/2TJ4Dyj\nSubmit..."), ), - SearchVideo( + VideoItem( id: "HxCcKzRAGWk", title: "(Music for Man ) Relaxing Whiskey Blues Music - Modern Electric Guitar Blues - JAZZ & BLUES", length: Some(42899), @@ -628,7 +645,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCGr-rTYtP1m-r_-ncspdVQQ", name: "JAZZ & BLUES", avatar: [ @@ -640,15 +657,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("Streamed 3 months ago"), - view_count: 3156236, + view_count: Some(3156236), is_live: false, is_short: false, - short_description: "-----------------------------------------------------------------------------------\n✔Thanks for watching! Have a nice day!\n✔Don\'t forget LIKE - SHARE - COMMENT\n#bluesmusic#slowblues#bluesrock...", + is_upcoming: false, + short_description: Some("-----------------------------------------------------------------------------------\n✔Thanks for watching! Have a nice day!\n✔Don\'t forget LIKE - SHARE - COMMENT\n#bluesmusic#slowblues#bluesrock..."), ), - SearchVideo( + VideoItem( id: "HlHYOdZePSE", title: "Healing Music for Anxiety Disorders, Fears, Depression and Eliminate Negative Thoughts", length: None, @@ -664,7 +682,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqNYK5QArQRZSIR8v6_FCfA", name: "Tranquil Music", avatar: [ @@ -676,15 +694,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: None, - view_count: 1585, - is_live: false, + view_count: Some(1585), + is_live: true, is_short: false, - short_description: "Healing Music for Anxiety Disorders, Fears, Depression and Eliminate Negative Thoughts\n#HealingMusic #RelaxingMusic #TranquilMusic\n__________________________________\nMusic for:\nChakra healing....", + is_upcoming: false, + short_description: Some("Healing Music for Anxiety Disorders, Fears, Depression and Eliminate Negative Thoughts\n#HealingMusic #RelaxingMusic #TranquilMusic\n__________________________________\nMusic for:\nChakra healing...."), ), - SearchVideo( + VideoItem( id: "CJ2AH3LJeic", title: "Coldplay Greatest Hits Full Album 2022 New Songs of Coldplay 2022", length: Some(7781), @@ -700,7 +719,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCdK2lzwelugXGhR9SCWuEew", name: "PLAY MUSIC", avatar: [ @@ -712,15 +731,16 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 months ago"), - view_count: 5595965, + view_count: Some(5595965), is_live: false, is_short: false, - short_description: "▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\nSubscribe channel for more videos:\n🔔Subscribe: https://bit.ly/2UbIZFv\n⚡Facebook: https://bitly.com.vn/gXDsC...", + is_upcoming: false, + short_description: Some("▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\nSubscribe channel for more videos:\n🔔Subscribe: https://bit.ly/2UbIZFv\n⚡Facebook: https://bitly.com.vn/gXDsC..."), ), - SearchVideo( + VideoItem( id: "KJwzKxQ81iA", title: "Handmade Candy Making Collection / 수제 사탕 만들기 모음 / Korean Candy Store", length: Some(3152), @@ -736,7 +756,7 @@ Paginator( height: 404, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCdGwDjTgbSwQDZ8dYOdrplg", name: "Soon Films 순필름", avatar: [ @@ -748,13 +768,14 @@ Paginator( ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 month ago"), - view_count: 3127238, + view_count: Some(3127238), is_live: false, is_short: false, - short_description: "00:00 Handmade Candy Making\n13:43 Delicate Handmade Candy Making\n28:33 Rainbow Lollipop Handmade Candy Making\n39:10 Cute Handmade Candy Making", + is_upcoming: false, + short_description: Some("00:00 Handmade Candy Making\n13:43 Delicate Handmade Candy Making\n28:33 Rainbow Lollipop Handmade Candy Making\n39:10 Cute Handmade Candy Making"), ), ], ctoken: Some("4qmFsgKbAxIPRkV3aGF0X3RvX3dhdGNoGuoCQ0JoNmlBSk5aMjlKYjB0NmVtOWlTR3hxVFRSdlYyMHdTMkYzYjFwbFdGSm1ZMGRHYmxwV09YcGliVVozWXpKb2RtUkdPWGxhVjJSd1lqSTFhR0pDU1daWFZFSXhUbFpuZDFSV09YSldNRlp0WkRCT1JWTlZPV3BsU0U1WFZHNWtiRXhWY0ZSa1ZrSlRXbmh2ZEVGQlFteGlaMEZDVmxaTlFVRlZVa1pCUVVWQlVtdFdNMkZIUmpCWU0xSjJXRE5rYUdSSFRtOUJRVVZCUVZGRlFVRkJSVUZCVVVGQlFWRkZRVmxyUlVsQlFrbFVZMGRHYmxwV09YcGliVVozWXpKb2RtUkdPVEJpTW5Sc1ltaHZWRU5MVDNJeFpuSjROR1p2UTBaU1YwSm1RVzlrVkZWSlN6RnBTVlJEUzA5eU1XWnllRFJtYjBOR1VsZENaa0Z2WkZSVlNVc3hkbkZqZURjd1NrRm5aMW8lM0SaAhpicm93c2UtZmVlZEZFd2hhdF90b193YXRjaA%3D%3D"), diff --git a/src/client/snapshots/rustypipe__client__trends__tests__map_trending.snap b/src/client/snapshots/rustypipe__client__trends__tests__map_trending.snap index 7d3166b..28d0443 100644 --- a/src/client/snapshots/rustypipe__client__trends__tests__map_trending.snap +++ b/src/client/snapshots/rustypipe__client__trends__tests__map_trending.snap @@ -3,7 +3,7 @@ source: src/client/trends.rs expression: map_res.c --- [ - SearchVideo( + VideoItem( id: "6T67I2w1G2U", title: "Extreme $1,000,000 Minecraft Challenge!", length: Some(643), @@ -24,7 +24,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCIPPMRA040LQr5QPyJEbmXA", name: "MrBeast Gaming", avatar: [ @@ -36,15 +36,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 2873209, + view_count: Some(2873209), is_live: false, is_short: false, - short_description: "Thank you to Undeniably Dairy for sponsoring this video! Check them out! http://www.bit.ly/UDMrBeast\n\nI challenged six YouTubers to compete for $1,000,000!\n\nSUBSCRIBE OR YOU\'LL HAVE BAD LUCK...", + is_upcoming: false, + short_description: Some("Thank you to Undeniably Dairy for sponsoring this video! Check them out! http://www.bit.ly/UDMrBeast\n\nI challenged six YouTubers to compete for $1,000,000!\n\nSUBSCRIBE OR YOU\'LL HAVE BAD LUCK..."), ), - SearchVideo( + VideoItem( id: "8TzH0ayIcdo", title: "The Darkest Story I\'ve Ever Read", length: Some(4383), @@ -65,7 +66,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC3cpN6gcJQqcCM6mxRUo_dA", name: "Wendigoon", avatar: [ @@ -77,15 +78,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 777753, + view_count: Some(777753), is_live: false, is_short: false, - short_description: "Get Honey for FREE today ▸ https://joinhoney.com/wendigoon\nHoney finds coupons with one click. Thanks to Honey for sponsoring!\n\nMy Links\n\nSecond channel/ Wendigang: https://www.youtube.com/channe...", + is_upcoming: false, + short_description: Some("Get Honey for FREE today ▸ https://joinhoney.com/wendigoon\nHoney finds coupons with one click. Thanks to Honey for sponsoring!\n\nMy Links\n\nSecond channel/ Wendigang: https://www.youtube.com/channe..."), ), - SearchVideo( + VideoItem( id: "s9PzYuVwCSE", title: "Lil Yachty - Poland (Directed by Cole Bennett)", length: Some(89), @@ -106,7 +108,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCtylTUUVIGY_i5afsQYeBZA", name: "Lyrical Lemonade", avatar: [ @@ -118,15 +120,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 4245789, + view_count: Some(4245789), is_live: false, is_short: false, - short_description: "Lyrical Lemonade Presents\nLil Yachty - Poland (Official Music Video)\n\nDirected & Edited by Cole Bennett\nSong Produced by F1LTHY\n\nDirector of Photography - Franklin Ricart\nColorist - Loren White...", + is_upcoming: false, + short_description: Some("Lyrical Lemonade Presents\nLil Yachty - Poland (Official Music Video)\n\nDirected & Edited by Cole Bennett\nSong Produced by F1LTHY\n\nDirector of Photography - Franklin Ricart\nColorist - Loren White..."), ), - SearchVideo( + VideoItem( id: "y8qhSduN6sk", title: "PC Games on Console - Scott The Woz", length: Some(1912), @@ -147,7 +150,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC4rqhyiTs7XyuODcECvuiiQ", name: "Scott The Woz", avatar: [ @@ -159,15 +162,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("20 hours ago"), - view_count: 528686, + view_count: Some(528686), is_live: false, is_short: false, - short_description: "Scott plays The Sims 2 Pets without a caps lock key.\n\nTwitter: https://www.twitter.com/ScottTheWoz\r\nFacebook: https://www.facebook.com/ScottTheWoz/\r\nInstagram: https://www.instagram.com/scottthewoz...", + is_upcoming: false, + short_description: Some("Scott plays The Sims 2 Pets without a caps lock key.\n\nTwitter: https://www.twitter.com/ScottTheWoz\r\nFacebook: https://www.facebook.com/ScottTheWoz/\r\nInstagram: https://www.instagram.com/scottthewoz..."), ), - SearchVideo( + VideoItem( id: "U9HAaHc3wnc", title: "Guess Iono’s Partner Pokémon! 🤔 | Pokémon Scarlet and Pokémon Violet", length: Some(211), @@ -188,7 +192,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCFctpiB_Hnlk3ejWfHqSm6Q", name: "The Official Pokémon YouTube channel", avatar: [ @@ -200,15 +204,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 1157471, + view_count: Some(1157471), is_live: false, is_short: false, - short_description: "Meet Iono, an influencer, streamer, and Gym Leader who specializes in Electric-type Pokémon ⚡\u{fe0f}\n\nCan you guess Iono’s partner Pokémon? 🤔\n\nPre-order Pokémon Scarlet & Pokémon Violet...", + is_upcoming: false, + short_description: Some("Meet Iono, an influencer, streamer, and Gym Leader who specializes in Electric-type Pokémon ⚡\u{fe0f}\n\nCan you guess Iono’s partner Pokémon? 🤔\n\nPre-order Pokémon Scarlet & Pokémon Violet..."), ), - SearchVideo( + VideoItem( id: "MBzi6hRrkww", title: "Celebrating Tito Puente", length: Some(65), @@ -229,7 +234,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCdq61m8s_48EhJ5OM_MCeGw", name: "GoogleDoodles", avatar: [ @@ -241,15 +246,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 19579375, + view_count: Some(19579375), is_live: false, is_short: false, - short_description: "In honor of US Hispanic Heritage Month, today’s animated video Doodle celebrates the life and legacy of American “Nuyorican” musician and internationally-renowned entertainer, Tito Puente....", + is_upcoming: false, + short_description: Some("In honor of US Hispanic Heritage Month, today’s animated video Doodle celebrates the life and legacy of American “Nuyorican” musician and internationally-renowned entertainer, Tito Puente...."), ), - SearchVideo( + VideoItem( id: "DvkTX-AquQo", title: "Impossible 0.00001% Odds!", length: Some(481), @@ -270,7 +276,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCUaT_39o1x6qWjz7K2pWcgw", name: "Beast Reacts", avatar: [ @@ -282,15 +288,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 4850190, + view_count: Some(4850190), is_live: false, is_short: false, - short_description: "SUBSCRIBE OR YOU\'LL HAVE BAD LUCK\n\nCHECK OUT THESE CHANNELS OR ELSE\n\nFA 92\nhttps://www.youtube.com/watch?v=oaUH-nAg6UU\n\nRM Media\nhttps://www.youtube.com/watch?v=DFG-vaT0qgk\n\nThe Dodo\nhttps://cdn.jw...", + is_upcoming: false, + short_description: Some("SUBSCRIBE OR YOU\'LL HAVE BAD LUCK\n\nCHECK OUT THESE CHANNELS OR ELSE\n\nFA 92\nhttps://www.youtube.com/watch?v=oaUH-nAg6UU\n\nRM Media\nhttps://www.youtube.com/watch?v=DFG-vaT0qgk\n\nThe Dodo\nhttps://cdn.jw..."), ), - SearchVideo( + VideoItem( id: "T-8fCPT-ZKI", title: "DDG - Bulletproof Maybach (Official Music Video) ft. Offset", length: Some(189), @@ -311,7 +318,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCKqqDlf6lfo3ChRA4-gzusQ", name: "DDG", avatar: [ @@ -323,15 +330,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 440722, + view_count: Some(440722), is_live: false, is_short: false, - short_description: "DDG ft. Offset - Bulletproof Maybach (Official Music Video)\n\n\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou \n\nFollow DDG:\nhttps://twitter.com/pontiacmadeddg \nhttps://www.fac...", + is_upcoming: false, + short_description: Some("DDG ft. Offset - Bulletproof Maybach (Official Music Video)\n\n\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou \n\nFollow DDG:\nhttps://twitter.com/pontiacmadeddg \nhttps://www.fac..."), ), - SearchVideo( + VideoItem( id: "dFlDRhvM4L0", title: "『チェンソーマン』ノンクレジットオープニング / CHAINSAW MAN Opening│米津玄師 「KICK BACK」", length: Some(90), @@ -352,7 +360,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCjfAEJZdfbIjVHdo5yODfyQ", name: "MAPPA CHANNEL", avatar: [ @@ -364,15 +372,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 10285052, + view_count: Some(10285052), is_live: false, is_short: false, - short_description: "オープニング・テーマ\n米津玄師\u{3000}「KICK BACK」 Kenshi Yonezu – KICK BACK\n作詞・作曲\u{3000}米津玄師\n\u{3000}\u{3000}\u{3000}編曲\u{3000}米津玄師\u{3000}常田大希 (King Gnu / millennium...", + is_upcoming: false, + short_description: Some("オープニング・テーマ\n米津玄師\u{3000}「KICK BACK」 Kenshi Yonezu – KICK BACK\n作詞・作曲\u{3000}米津玄師\n\u{3000}\u{3000}\u{3000}編曲\u{3000}米津玄師\u{3000}常田大希 (King Gnu / millennium..."), ), - SearchVideo( + VideoItem( id: "G9W8CSckzAc", title: "why I disappeared", length: Some(461), @@ -393,7 +402,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCgTaH6nm8sby0hpb2DSKNhg", name: "Boffy", avatar: [ @@ -405,15 +414,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("17 hours ago"), - view_count: 207145, + view_count: Some(207145), is_live: false, is_short: false, - short_description: "", + is_upcoming: false, + short_description: None, ), - SearchVideo( + VideoItem( id: "PuOUI2kwftA", title: "Brooklyn\'s Wedding Day Vlog | Behind the Scenes", length: Some(1265), @@ -434,7 +444,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC6QWhGQqf0YDYdRb0n6ojWw", name: "Brooklyn and Bailey", avatar: [ @@ -446,15 +456,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("23 hours ago"), - view_count: 395113, + view_count: Some(395113), is_live: false, is_short: false, - short_description: "The video you have all been waiting for is here! Our wedding vlog! We had so many people who filmed and helped make this video happen. Dakota and I were so excited to spend the weekend in Californi...", + is_upcoming: false, + short_description: Some("The video you have all been waiting for is here! Our wedding vlog! We had so many people who filmed and helped make this video happen. Dakota and I were so excited to spend the weekend in Californi..."), ), - SearchVideo( + VideoItem( id: "lkOGhJX6LKU", title: "Social Security payments set for big increase; here’s what you need to know", length: Some(120), @@ -475,7 +486,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCnwI-VN5jXWIGQKOI9PMDMw", name: "WPRI", avatar: [ @@ -487,15 +498,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("22 hours ago"), - view_count: 227728, + view_count: Some(227728), is_live: false, is_short: false, - short_description: "Tens of millions of older Americans are about to get what may be the biggest raise of their lifetimes.\n\nStay in the know with WPRI 12 News. Local news, weather, sports, and award winning investigat...", + is_upcoming: false, + short_description: Some("Tens of millions of older Americans are about to get what may be the biggest raise of their lifetimes.\n\nStay in the know with WPRI 12 News. Local news, weather, sports, and award winning investigat..."), ), - SearchVideo( + VideoItem( id: "zkvIzKwzYNc", title: "Kep1er 케플러 | ‘We Fresh\' M/V", length: Some(225), @@ -516,7 +528,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC8whlOg70m2Yr3qSMjUhh0g", name: "Kep1er", avatar: [ @@ -528,15 +540,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("11 hours ago"), - view_count: 1875402, + view_count: Some(1875402), is_live: false, is_short: false, - short_description: "Kep1er 3rd Mini Album ‘TROUBLESHOOTER\' \n2022.10.13 THU 6PM (KST)\n\nKep1er Official \nInstagram : https://www.instagram.com/official.kep1er/\nTwitter : https://twitter.com/official_kep1er\nFacebook...", + is_upcoming: false, + short_description: Some("Kep1er 3rd Mini Album ‘TROUBLESHOOTER\' \n2022.10.13 THU 6PM (KST)\n\nKep1er Official \nInstagram : https://www.instagram.com/official.kep1er/\nTwitter : https://twitter.com/official_kep1er\nFacebook..."), ), - SearchVideo( + VideoItem( id: "foMQG_Bpcag", title: "*After 4* DESTROYED my last brain cell", length: Some(2169), @@ -557,7 +570,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCF_votze88WRDSEREe9s3aQ", name: "Dylan Is In Trouble", avatar: [ @@ -569,15 +582,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 449633, + view_count: Some(449633), is_live: false, is_short: false, - short_description: "Go to http://audible.com/dylanisintrouble or text \'dylanisintrouble\' to 500 500 to get your free 30 day trial!\n\nTwitter: https://twitter.com/theDMatthews\nInstagram: https://www.instagram.com/neat_d...", + is_upcoming: false, + short_description: Some("Go to http://audible.com/dylanisintrouble or text \'dylanisintrouble\' to 500 500 to get your free 30 day trial!\n\nTwitter: https://twitter.com/theDMatthews\nInstagram: https://www.instagram.com/neat_d..."), ), - SearchVideo( + VideoItem( id: "iquXFFSEKyE", title: "NLE Choppa - Do It Again (ft. 2Rare) [HipHop Dance Musical] MEMPHIS EDITION", length: Some(239), @@ -598,7 +612,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCWICXNlSLc7eeNazpzUZcLg", name: "NLE CHOPPA", avatar: [ @@ -610,15 +624,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("22 hours ago"), - view_count: 311006, + view_count: Some(311006), is_live: false, is_short: false, - short_description: "Stream \"Do It Again\" now: https://nlechoppax2rare.lnk.to/doitagain\n\nWEBSITE: HERBS \nhttps://www.nlehealthandwellness.com 💜\nWEBSITE: MERCH\nhttps://www.nlehealthandwellness.com/new-collection...", + is_upcoming: false, + short_description: Some("Stream \"Do It Again\" now: https://nlechoppax2rare.lnk.to/doitagain\n\nWEBSITE: HERBS \nhttps://www.nlehealthandwellness.com 💜\nWEBSITE: MERCH\nhttps://www.nlehealthandwellness.com/new-collection..."), ), - SearchVideo( + VideoItem( id: "ijj_hheGEi0", title: "Queen - Face It Alone (Official Lyric Video)", length: Some(257), @@ -639,7 +654,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCiMhD4jzUqG-IgPzUmmytRQ", name: "Queen Official", avatar: [ @@ -651,15 +666,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 hours ago"), - view_count: 1016314, + view_count: Some(1016314), is_live: false, is_short: false, - short_description: "QUEEN rediscovered track featuring Freddie Mercury ‘FACE IT ALONE’ arrives as digital single release Thursday October 13\nPrecedes arrival of Queen ‘The Miracle Collector’s Edition’...", + is_upcoming: false, + short_description: Some("QUEEN rediscovered track featuring Freddie Mercury ‘FACE IT ALONE’ arrives as digital single release Thursday October 13\nPrecedes arrival of Queen ‘The Miracle Collector’s Edition’..."), ), - SearchVideo( + VideoItem( id: "nwMxp7mRbx4", title: "Dimension 20: Neverafter Trailer", length: Some(154), @@ -680,7 +696,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCC8zWIx8aBQme-x1nX9iZ0A", name: "Dimension 20", avatar: [ @@ -692,15 +708,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 205272, + view_count: Some(205272), is_live: false, is_short: false, - short_description: "Not all fairy tales end with a happily ever after. Premieres November 30th on Dropout. FAQ here: https://bit.ly/D20NeverafterFAQ\n\nWelcome to Dimension 20, Dropout.tv\'s anthology actualplay...", + is_upcoming: false, + short_description: Some("Not all fairy tales end with a happily ever after. Premieres November 30th on Dropout. FAQ here: https://bit.ly/D20NeverafterFAQ\n\nWelcome to Dimension 20, Dropout.tv\'s anthology actualplay..."), ), - SearchVideo( + VideoItem( id: "7IGD5URBGZ8", title: "We Got Engaged", length: Some(1325), @@ -721,7 +738,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCkDG7yPqJBi_V2qGPRZHI_w", name: "Jayco & Val", avatar: [ @@ -733,15 +750,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 254375, + view_count: Some(254375), is_live: false, is_short: false, - short_description: "Valentina @Basic Valentina \n\nInstagram: https://www.instagram.com/basicvalent...\nTikTok: https://vm.tiktok.com/ZM8Gsmm4B/\nYouTube: https://youtube.com/channel/UCQxnOdDS...\n\nJayco @Jaycoset...", + is_upcoming: false, + short_description: Some("Valentina @Basic Valentina \n\nInstagram: https://www.instagram.com/basicvalent...\nTikTok: https://vm.tiktok.com/ZM8Gsmm4B/\nYouTube: https://youtube.com/channel/UCQxnOdDS...\n\nJayco @Jaycoset..."), ), - SearchVideo( + VideoItem( id: "eKAIQDxai9Y", title: "I remade every mob into Rainbow Friends in Minecraft", length: Some(811), @@ -762,7 +780,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCoRDf_M8ljQq5V_rR8CSzww", name: "Kipper", avatar: [ @@ -774,15 +792,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 337002, + view_count: Some(337002), is_live: false, is_short: false, - short_description: "I remade these Minecraft mobs into Rainbow Friends characters! Check them out and let us know which one was your favorite! \n\n✅ SUBSCRIBE TO Kipper ► https://www.youtube.com/channel/UCoRDf_M8ljQ...", + is_upcoming: false, + short_description: Some("I remade these Minecraft mobs into Rainbow Friends characters! Check them out and let us know which one was your favorite! \n\n✅ SUBSCRIBE TO Kipper ► https://www.youtube.com/channel/UCoRDf_M8ljQ..."), ), - SearchVideo( + VideoItem( id: "5sRVxb2wkGM", title: "We Bought Every Weird Ad We Saw", length: Some(1602), @@ -803,7 +822,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCfbnTUxUech4P1XgYUwYuKA", name: "Cold Ones", avatar: [ @@ -815,15 +834,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 1170050, + view_count: Some(1170050), is_live: false, is_short: false, - short_description: "We See It? We Buy It! NO EXCEPTIONS\n💃 GET OUR NEW LIMITED WAIFU CUPS 👉🏻 https://bit.ly/coldoneswaifu\n🌈 Get 10% OFF OUR CLOTHES with code \"COLDONES\" 👉🏻 https://bit.ly/coolshirtzz...", + is_upcoming: false, + short_description: Some("We See It? We Buy It! NO EXCEPTIONS\n💃 GET OUR NEW LIMITED WAIFU CUPS 👉🏻 https://bit.ly/coldoneswaifu\n🌈 Get 10% OFF OUR CLOTHES with code \"COLDONES\" 👉🏻 https://bit.ly/coolshirtzz..."), ), - SearchVideo( + VideoItem( id: "9gbScp1JVN4", title: "Making Renaissance Costumes IN ONE DAY[ish]", length: Some(1317), @@ -844,7 +864,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCONTNY-QxA-UVtpR7vWW6Pg", name: "Micarah Tewers", avatar: [ @@ -856,15 +876,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 213453, + view_count: Some(213453), is_live: false, is_short: false, - short_description: "At least watch the last 5 minutes :) Btw You can thrift my picks at https://thredup.com/x/micarah and use my code MICARAH for an extra 30% off and free shipping on your first order(Offer expires...", + is_upcoming: false, + short_description: Some("At least watch the last 5 minutes :) Btw You can thrift my picks at https://thredup.com/x/micarah and use my code MICARAH for an extra 30% off and free shipping on your first order(Offer expires..."), ), - SearchVideo( + VideoItem( id: "qRao6FARFRo", title: "TURN THE TIDES - Harbor Agent Trailer // VALORANT", length: Some(228), @@ -885,7 +906,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC8CX0LD98EDXl4UYX1MDCXg", name: "VALORANT", avatar: [ @@ -897,15 +918,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 2530745, + view_count: Some(2530745), is_live: false, is_short: false, - short_description: "Welcome to the team, Harbor.\n\nHailing from the coast of India, this new Controller Agent commands a mix of tide and torrent to shield allies and pummel opponents.\n\nMade in partnership with...", + is_upcoming: false, + short_description: Some("Welcome to the team, Harbor.\n\nHailing from the coast of India, this new Controller Agent commands a mix of tide and torrent to shield allies and pummel opponents.\n\nMade in partnership with..."), ), - SearchVideo( + VideoItem( id: "F8sGGKxSYNM", title: "Chares Oliveira: I’ll shock the world vs. Islam Makhachev at UFC 280 | ESPN MMA", length: Some(231), @@ -926,7 +948,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCO4AcsPKEkIqDmbeiZLfd1A", name: "ESPN MMA", avatar: [ @@ -938,15 +960,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 552568, + view_count: Some(552568), is_live: false, is_short: false, - short_description: "ESPN MMA’s Brett Okamoto speaks with Charles Oliveira about his lightweight title fight against Islam Makhachev at UFC 280 in Abu Dhabi.\n\n#UFC #UFC280 #Oliveira\n✔ For more UFC, sign up...", + is_upcoming: false, + short_description: Some("ESPN MMA’s Brett Okamoto speaks with Charles Oliveira about his lightweight title fight against Islam Makhachev at UFC 280 in Abu Dhabi.\n\n#UFC #UFC280 #Oliveira\n✔ For more UFC, sign up..."), ), - SearchVideo( + VideoItem( id: "ZnQP13rYpUY", title: "Rochy RD, Tivi Gunz , Harryson, Onguito Wa, El Perrote Wz - Lokisla (Video Oficial) @Izy Music", length: Some(265), @@ -967,7 +990,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCLCCG11dS-HyB3up3OCRV_w", name: "Tivi Gunz", avatar: [ @@ -979,15 +1002,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 1028903, + view_count: Some(1028903), is_live: false, is_short: false, - short_description: "Lokisla By Tivi Gunz, Rochy RD, Harryson, Onguito Wa, El Perrote Wz\nDisponible Ya: https://lnk.to/Lokisla\nProd By Zunna / Directed By Izy Films, R14 Films\n\nSubscribete: \nhttps://lnk.to/TiviGunz...", + is_upcoming: false, + short_description: Some("Lokisla By Tivi Gunz, Rochy RD, Harryson, Onguito Wa, El Perrote Wz\nDisponible Ya: https://lnk.to/Lokisla\nProd By Zunna / Directed By Izy Films, R14 Films\n\nSubscribete: \nhttps://lnk.to/TiviGunz..."), ), - SearchVideo( + VideoItem( id: "WArWsWRmdJw", title: "I made GeoGuessr in Among Us to challenge my friends...", length: Some(1340), @@ -1008,7 +1032,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCUT8RoNBTJvwW1iErP6-b-A", name: "Disguised Toast", avatar: [ @@ -1020,15 +1044,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 493539, + view_count: Some(493539), is_live: false, is_short: false, - short_description: "Toast, Sykkuno and Valkyrae test their Among Us knowledge in a brand new way to play Among Us, Among Us GeoGuessr.\n\nSubscribe to Disguised Toast! ►http://bit.ly/1cRxhZa\n\nWatch me Live on...", + is_upcoming: false, + short_description: Some("Toast, Sykkuno and Valkyrae test their Among Us knowledge in a brand new way to play Among Us, Among Us GeoGuessr.\n\nSubscribe to Disguised Toast! ►http://bit.ly/1cRxhZa\n\nWatch me Live on..."), ), - SearchVideo( + VideoItem( id: "wP9zsx04fWY", title: "WE ARE COMING! to a city near you!", length: Some(59), @@ -1049,7 +1074,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCdvlHk5SZWwr9HjUcwtu8ng", name: "blink-182", avatar: [ @@ -1061,15 +1086,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 966225, + view_count: Some(966225), is_live: false, is_short: false, - short_description: "We’re coming. Tour’s coming. Album’s coming. Tom’s coming. \nTickets for the world tour go on sale starting Monday, 10/17 at 10am local\nNew Single EDGING out on 10/14\nEverything coming...", + is_upcoming: false, + short_description: Some("We’re coming. Tour’s coming. Album’s coming. Tom’s coming. \nTickets for the world tour go on sale starting Monday, 10/17 at 10am local\nNew Single EDGING out on 10/14\nEverything coming..."), ), - SearchVideo( + VideoItem( id: "Wz0Gb4_Q5rM", title: "Mariners vs. Astros ALDS Game 1 Highlights (10/11/22) | MLB Highlights", length: Some(584), @@ -1090,7 +1116,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC3RPfeyaEIPosC4eIcNr4Gw", name: "Houston Astros", avatar: [ @@ -1102,15 +1128,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 185196, + view_count: Some(185196), is_live: false, is_short: false, - short_description: "Mariners vs. Astros full game highlights from 10/11/22, presented by @Chevrolet \r\n\r\nCheck out http://MLB.com/video for more!\r\n\r\nAbout MLB.com: About MLB.com: Baseball Commissioner Allan H....", + is_upcoming: false, + short_description: Some("Mariners vs. Astros full game highlights from 10/11/22, presented by @Chevrolet \r\n\r\nCheck out http://MLB.com/video for more!\r\n\r\nAbout MLB.com: About MLB.com: Baseball Commissioner Allan H...."), ), - SearchVideo( + VideoItem( id: "ICULY_gTngs", title: "The MCU Has Been Taking Us For Granted.", length: Some(1025), @@ -1131,7 +1158,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC5UYMeKfZbFYnLHzoTJB1xA", name: "Schaffrillas Productions", avatar: [ @@ -1143,15 +1170,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 973046, + view_count: Some(973046), is_live: false, is_short: false, - short_description: "Head to http://squarespace.com/schaffrillas to save 10% off your first purchase of a website or domain. Thanks to Squarespace for sponsoring this video!\n\nSchaff and the MCU are drifting apart....", + is_upcoming: false, + short_description: Some("Head to http://squarespace.com/schaffrillas to save 10% off your first purchase of a website or domain. Thanks to Squarespace for sponsoring this video!\n\nSchaff and the MCU are drifting apart...."), ), - SearchVideo( + VideoItem( id: "bunhaERjxmE", title: "Frog Slime 🐸✨ | Ep. 11 | Minecraft Empires S2 1.19", length: Some(608), @@ -1172,7 +1200,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCzTlXb7ivVzuFlugVCv3Kvg", name: "LDShadowLady", avatar: [ @@ -1184,15 +1212,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 649096, + view_count: Some(649096), is_live: false, is_short: false, - short_description: "Please *boop* the like button if you enjoy the video! :)\nEmpires SMP is a 1.19 vanilla Minecraft server with some other fun Minecraft Youtubers! Each player chooses a biome to rule over and...", + is_upcoming: false, + short_description: Some("Please *boop* the like button if you enjoy the video! :)\nEmpires SMP is a 1.19 vanilla Minecraft server with some other fun Minecraft Youtubers! Each player chooses a biome to rule over and..."), ), - SearchVideo( + VideoItem( id: "tDhfNCUqZDs", title: "Bandmanrill x Sha Ek - “Jiggy In Jersey Pt2” (Shot by @RARI DIGITAL)", length: Some(110), @@ -1213,7 +1242,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCQxF0u3RdN0v46EwkQChW7w", name: "RARI DIGITAL", avatar: [ @@ -1225,15 +1254,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 163557, + view_count: Some(163557), is_live: false, is_short: false, - short_description: "Produced by EMRLD\nhttps://instagram.com/emrldbeats?igshid=YmMyMTA2M2Y=\n\nPre-Save “The Club Godfather” now: https://bandmanrill.lnk.to/ClubGodfather\n\nFollow BandmanRill & Sha Ek\nhttps://www.inst...", + is_upcoming: false, + short_description: Some("Produced by EMRLD\nhttps://instagram.com/emrldbeats?igshid=YmMyMTA2M2Y=\n\nPre-Save “The Club Godfather” now: https://bandmanrill.lnk.to/ClubGodfather\n\nFollow BandmanRill & Sha Ek\nhttps://www.inst..."), ), - SearchVideo( + VideoItem( id: "MEZe4chAeZA", title: "Dog and Chainsaw | Chainsawman Ep 1 Reaction", length: Some(1077), @@ -1254,7 +1284,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UChJ73nb9I4Xq1bzc0a-j-pQ", name: "YaBoyRoshi", avatar: [ @@ -1266,15 +1296,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 265018, + view_count: Some(265018), is_live: false, is_short: false, - short_description: "PATREON📺: http://Patreon.com/Yaboyroshi\nCHECK OUT OUR MERCH 👕: http://www.yaboyroshi.com\nGAMING CHANNEL: http://youtube.com/ybrszn\nJOIN THE DISCORD! https://discord.gg/6gAg8Vh\nFOLLOW...", + is_upcoming: false, + short_description: Some("PATREON📺: http://Patreon.com/Yaboyroshi\nCHECK OUT OUR MERCH 👕: http://www.yaboyroshi.com\nGAMING CHANNEL: http://youtube.com/ybrszn\nJOIN THE DISCORD! https://discord.gg/6gAg8Vh\nFOLLOW..."), ), - SearchVideo( + VideoItem( id: "NMA_isZYsYQ", title: "KICK BACK", length: Some(194), @@ -1295,7 +1326,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCUCeZaZeJbEYAAzvMgrKOPQ", name: "Kenshi Yonezu 米津玄師", avatar: [ @@ -1307,15 +1338,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 934820, + view_count: Some(934820), is_live: false, is_short: false, - short_description: "Provided to YouTube by Sony Music Labels Inc.\n\nKICK BACK · Kenshi Yonezu\n\nKICK BACK\n\n℗ 2022 Sony Music Labels Inc.\n\nReleased on: 2022-10-12\n\nArranger: Daiki Tsuneta\nComposer, Lyricist: Tsunku...", + is_upcoming: false, + short_description: Some("Provided to YouTube by Sony Music Labels Inc.\n\nKICK BACK · Kenshi Yonezu\n\nKICK BACK\n\n℗ 2022 Sony Music Labels Inc.\n\nReleased on: 2022-10-12\n\nArranger: Daiki Tsuneta\nComposer, Lyricist: Tsunku..."), ), - SearchVideo( + VideoItem( id: "qe6Oy8oEOhI", title: "Top 50 Amazon Prime Day October 2022 Deals (DAY 2!) 🔥 Better Deals Than Yesterday?!", length: Some(752), @@ -1336,7 +1368,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC5Qbo0AR3CwpmEq751BIy0g", name: "The Deal Guy", avatar: [ @@ -1348,15 +1380,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 390286, + view_count: Some(390286), is_live: false, is_short: false, - short_description: "It’s Day 2 of October Amazon Prime Day Early Access 2022!! Here are the best deals on Laptops, TV’s, Smart Home & Apple Deals!\n👇🏼 ALL DEAL LINKS ARE FEATURED IN THE DESCRIPTION BELOW...", + is_upcoming: false, + short_description: Some("It’s Day 2 of October Amazon Prime Day Early Access 2022!! Here are the best deals on Laptops, TV’s, Smart Home & Apple Deals!\n👇🏼 ALL DEAL LINKS ARE FEATURED IN THE DESCRIPTION BELOW..."), ), - SearchVideo( + VideoItem( id: "odWKEfp2QMY", title: "Måneskin - THE LONELIEST (Official Video)", length: Some(288), @@ -1377,7 +1410,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCgQna2EqpzqzfBjlSmzT72w", name: "Måneskin Official", avatar: [ @@ -1389,15 +1422,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 1273458, + view_count: Some(1273458), is_live: false, is_short: false, - short_description: "“THE LONELIEST” – New single by Måneskin \nListen & Download THE LONELIEST: https://maneskinofficial.lnk.to/THELONELIEST\n\nFollow Måneskin:\nInstagram - https://www.instagram.com/maneskinoffic...", + is_upcoming: false, + short_description: Some("“THE LONELIEST” – New single by Måneskin \nListen & Download THE LONELIEST: https://maneskinofficial.lnk.to/THELONELIEST\n\nFollow Måneskin:\nInstagram - https://www.instagram.com/maneskinoffic..."), ), - SearchVideo( + VideoItem( id: "BRb4U99OU80", title: "M3GAN - official trailer", length: Some(148), @@ -1418,7 +1452,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCq0OueAsdxH6b8nyAspwViw", name: "Universal Pictures", avatar: [ @@ -1430,15 +1464,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 4502416, + view_count: Some(4502416), is_live: false, is_short: false, - short_description: "meet M3GAN. your new best friend.\n\nM3GAN - official trailer\nonly in theaters january 13\n\nFrom the most prolific minds in horror—James Wan, the filmmaker behind the Saw, Insidious and The...", + is_upcoming: false, + short_description: Some("meet M3GAN. your new best friend.\n\nM3GAN - official trailer\nonly in theaters january 13\n\nFrom the most prolific minds in horror—James Wan, the filmmaker behind the Saw, Insidious and The..."), ), - SearchVideo( + VideoItem( id: "F-7rQBY8uIQ", title: "Lil Baby - Heyy (Official Video)", length: Some(193), @@ -1459,7 +1494,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCVS88tG_NYgxF6Udnx2815Q", name: "Lil Baby Official 4PF", avatar: [ @@ -1471,15 +1506,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 2540238, + view_count: Some(2540238), is_live: false, is_short: false, - short_description: "Music video by Lil Baby performing Heyy. Quality Control Music/Motown Records; © 2022 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc.\n\nhttp://vevo.ly/IFLIVM", + is_upcoming: false, + short_description: Some("Music video by Lil Baby performing Heyy. Quality Control Music/Motown Records; © 2022 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc.\n\nhttp://vevo.ly/IFLIVM"), ), - SearchVideo( + VideoItem( id: "3sPxvgrKwEg", title: "Overwatch 2 - SEASON 1 HERO TIER LIST", length: Some(1183), @@ -1500,7 +1536,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCQH4V9PiY_eLo4Ihr1tWCwQ", name: "KarQ", avatar: [ @@ -1512,15 +1548,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 655275, + view_count: Some(655275), is_live: false, is_short: false, - short_description: "🤖 Install Mech Arena for FREE here on Mobile and PC ✅ https://clik.cc/87hRz and get a special starter pack to help kickstart your game! ⭐\n\nThis Hero Tier list is based on my competitive...", + is_upcoming: false, + short_description: Some("🤖 Install Mech Arena for FREE here on Mobile and PC ✅ https://clik.cc/87hRz and get a special starter pack to help kickstart your game! ⭐\n\nThis Hero Tier list is based on my competitive..."), ), - SearchVideo( + VideoItem( id: "_akEYecFdyM", title: "Overwatch 2 is free but I still feel scammed", length: Some(904), @@ -1541,7 +1578,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCd9TUql8V7J-Xy1RNgA7MlQ", name: "zanny", avatar: [ @@ -1553,15 +1590,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 1122910, + view_count: Some(1122910), is_live: false, is_short: false, - short_description: "Ashe main\n\n\n►zan clan meme merch\nhttps://crowdmade.com/collections/zanny\n►Kirin & Miro shirts and hoodies\nhttps://projectorochi.com/collections/originals\n\n►My things\nTwitch: https://www.twitc...", + is_upcoming: false, + short_description: Some("Ashe main\n\n\n►zan clan meme merch\nhttps://crowdmade.com/collections/zanny\n►Kirin & Miro shirts and hoodies\nhttps://projectorochi.com/collections/originals\n\n►My things\nTwitch: https://www.twitc..."), ), - SearchVideo( + VideoItem( id: "6MKcY5wTcpY", title: "LEE CHAE YEON (이채연) - HUSH RUSH MV", length: Some(221), @@ -1582,7 +1620,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC_pwIXKXNm5KGhdEVzmY60A", name: "Stone Music Entertainment", avatar: [ @@ -1594,15 +1632,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 1974306, + view_count: Some(1974306), is_live: false, is_short: false, - short_description: "LEE CHAE YEON (이채연) - HUSH RUSH MV\n\nLEE CHAE YEON(이채연) 1st Mini Album \"HUSH RUSH\" has been released.\n\n이채연의 첫 미니 앨범 \'HUSH RUSH\'는 고성에 갇힌 뱀파이어가...", + is_upcoming: false, + short_description: Some("LEE CHAE YEON (이채연) - HUSH RUSH MV\n\nLEE CHAE YEON(이채연) 1st Mini Album \"HUSH RUSH\" has been released.\n\n이채연의 첫 미니 앨범 \'HUSH RUSH\'는 고성에 갇힌 뱀파이어가..."), ), - SearchVideo( + VideoItem( id: "xIeYK9w03i4", title: "『チェンソーマン』第1話スペシャルエンディング / CHAINSAW MAN #1 Ending│Vaundy 「CHAINSAW BLOOD」", length: Some(92), @@ -1623,7 +1662,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCjfAEJZdfbIjVHdo5yODfyQ", name: "MAPPA CHANNEL", avatar: [ @@ -1635,15 +1674,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 2730322, + view_count: Some(2730322), is_live: false, is_short: false, - short_description: "第1話 エンディング・テーマ\nVaundy 「CHAINSAW BLOOD」\n作詞・作曲・編曲 Vaundy\n(SDR / Sony Music Labels Inc.)\n\n楽曲配信リンク:https://lnk.to/CHAINSAW_BLOOD\n\n2022年10...", + is_upcoming: false, + short_description: Some("第1話 エンディング・テーマ\nVaundy 「CHAINSAW BLOOD」\n作詞・作曲・編曲 Vaundy\n(SDR / Sony Music Labels Inc.)\n\n楽曲配信リンク:https://lnk.to/CHAINSAW_BLOOD\n\n2022年10..."), ), - SearchVideo( + VideoItem( id: "s4y_kzpCthQ", title: "Blaqbonez - Back In Uni (Official Music Video)", length: Some(209), @@ -1664,7 +1704,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC0iZ_gqCk22K0jWscf75lhg", name: "Blaqbonez", avatar: [ @@ -1676,15 +1716,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 923909, + view_count: Some(923909), is_live: false, is_short: false, - short_description: "Get \"Back In Uni\" by BLAQBONEZ here: https://Blaqbonez.lnk.to/BackInUniOM\n\n#Blaqbonez #BackInUni #YoungPreacher\n\nFollow Blaqbonez On: \nFacebook: https://bit.ly/2GuhhPj \nTwitter: http://twitter.com...", + is_upcoming: false, + short_description: Some("Get \"Back In Uni\" by BLAQBONEZ here: https://Blaqbonez.lnk.to/BackInUniOM\n\n#Blaqbonez #BackInUni #YoungPreacher\n\nFollow Blaqbonez On: \nFacebook: https://bit.ly/2GuhhPj \nTwitter: http://twitter.com..."), ), - SearchVideo( + VideoItem( id: "_SKVFtLtJws", title: "Charli D\'Amelio and Mark Ballas Jazz (Week 4) | Dancing With The Stars on Disney+", length: Some(92), @@ -1705,7 +1746,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCi3OE-aN09WOcN9d2stCvPg", name: "charli d\'amelio", avatar: [ @@ -1717,15 +1758,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 164574, + view_count: Some(164574), is_live: false, is_short: false, - short_description: "Charli D\'Amelio and Mark Ballas Jazz (Week 4) | Dancing With The Stars on Disney+\nSubscribe: @charli d\'amelio \nWatch next: Charli D\'Amelio and Mark Ballas Rumba (Week 3) | Dancing With The...", + is_upcoming: false, + short_description: Some("Charli D\'Amelio and Mark Ballas Jazz (Week 4) | Dancing With The Stars on Disney+\nSubscribe: @charli d\'amelio \nWatch next: Charli D\'Amelio and Mark Ballas Rumba (Week 3) | Dancing With The..."), ), - SearchVideo( + VideoItem( id: "BtJPMqyhj_M", title: "Money Man - Armed & Dangerous (Official Video)", length: Some(110), @@ -1746,7 +1788,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCSHVQ3lgpeSbETMqKl8kcug", name: "Money Man", avatar: [ @@ -1758,15 +1800,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 337315, + view_count: Some(337315), is_live: false, is_short: false, - short_description: "#MoneyMan #ArmedNDangerous #EMPIRE\n\n\n\nOfficial Video by Money Man - \"Armed & Dangerous\" © 2022 Black Circle / EMPIRE", + is_upcoming: false, + short_description: Some("#MoneyMan #ArmedNDangerous #EMPIRE\n\n\n\nOfficial Video by Money Man - \"Armed & Dangerous\" © 2022 Black Circle / EMPIRE"), ), - SearchVideo( + VideoItem( id: "rge0deYBVv0", title: "Top 50 Amazon Prime Day October 2022 Deals 🤑 (Updated Hourly!!)", length: Some(780), @@ -1787,7 +1830,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC5Qbo0AR3CwpmEq751BIy0g", name: "The Deal Guy", avatar: [ @@ -1799,15 +1842,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 648769, + view_count: Some(648769), is_live: false, is_short: false, - short_description: "It’s October Amazon Prime Day Early Access 2022!! Here are the best deals on Laptops, TV’s, Smart Home & Apple Deals!\n👇🏼 ALL DEAL LINKS ARE FEATURED IN THE DESCRIPTION BELOW 👇🏼...", + is_upcoming: false, + short_description: Some("It’s October Amazon Prime Day Early Access 2022!! Here are the best deals on Laptops, TV’s, Smart Home & Apple Deals!\n👇🏼 ALL DEAL LINKS ARE FEATURED IN THE DESCRIPTION BELOW 👇🏼..."), ), - SearchVideo( + VideoItem( id: "luXUJ9LJcy0", title: "Sounds from the Sideline: Week 5 at LAR | 2022", length: Some(432), @@ -1828,7 +1872,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCC0BPKJxAyxjQoRTYbpW0FQ", name: "Dallas Cowboys", avatar: [ @@ -1840,15 +1884,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 194246, + view_count: Some(194246), is_live: false, is_short: false, - short_description: "Sights and sounds from the sideline of the Dallas Cowboys game vs the Los Angele Rams, at SoFi Stadium.\n\nSubscribe to the Dallas Cowboys YouTube Channel: https://bit.ly/2L07gMO\nFor more Cowboys...", + is_upcoming: false, + short_description: Some("Sights and sounds from the sideline of the Dallas Cowboys game vs the Los Angele Rams, at SoFi Stadium.\n\nSubscribe to the Dallas Cowboys YouTube Channel: https://bit.ly/2L07gMO\nFor more Cowboys..."), ), - SearchVideo( + VideoItem( id: "avUEfUTGbhM", title: "Welding an excavator bucket and digging pond", length: Some(1756), @@ -1869,7 +1914,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCUujfNBK9uv3cIW-P5PX7vA", name: "Andrew Camarata", avatar: [ @@ -1881,15 +1926,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 402574, + view_count: Some(402574), is_live: false, is_short: false, - short_description: "Welding a set of quick change ears on an excavator bucket, then using that bucket to dig a pond and do some tree work.", + is_upcoming: false, + short_description: Some("Welding a set of quick change ears on an excavator bucket, then using that bucket to dig a pond and do some tree work."), ), - SearchVideo( + VideoItem( id: "bqEgXmTU2SI", title: "NEW 5-5-5 ACE PARAGON - The Goliath Doomship! (Bloons TD 6)", length: Some(950), @@ -1910,7 +1956,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC7WQH4kpgxXJYHp8r9IAO-Q", name: "ISAB", avatar: [ @@ -1922,15 +1968,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 335274, + view_count: Some(335274), is_live: false, is_short: false, - short_description: "NEW 5-5-5 ACE PARAGON - The Goliath Doomship! BTD6 / Bloons TD 6 - update 33.0 is out for real, and here is my first look at the new paragon on the new map(s)! The goliath doomship has lots...", + is_upcoming: false, + short_description: Some("NEW 5-5-5 ACE PARAGON - The Goliath Doomship! BTD6 / Bloons TD 6 - update 33.0 is out for real, and here is my first look at the new paragon on the new map(s)! The goliath doomship has lots..."), ), - SearchVideo( + VideoItem( id: "xhYj9JJnLHM", title: "DDG 25th SURPRISE BIRTHDAY PARTY!!", length: Some(3252), @@ -1951,7 +1998,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCDDgfKQE3eaD1H08VHRAfig", name: "PontiacMadeDDG VLOGS", avatar: [ @@ -1963,15 +2010,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 678135, + view_count: Some(678135), is_live: false, is_short: false, - short_description: "\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou\n\nFollow My Social Media:\nInstagram: https://instagram.com/ddg\nTwitter: https://twitter.com/pontiacmadeddg\nSnapChat: https://sn...", + is_upcoming: false, + short_description: Some("\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou\n\nFollow My Social Media:\nInstagram: https://instagram.com/ddg\nTwitter: https://twitter.com/pontiacmadeddg\nSnapChat: https://sn..."), ), - SearchVideo( + VideoItem( id: "RlbajBvxR0M", title: "Werewolf by Night - The MCU Tries to Be Creative Again", length: Some(366), @@ -1992,7 +2040,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqTYHSnBUXZamsVcOlQf-fg", name: "The Cosmonaut Variety Hour", avatar: [ @@ -2004,15 +2052,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 255765, + view_count: Some(255765), is_live: false, is_short: false, - short_description: "Patreon: https://www.patreon.com/cosmonautvarietyhour\r\n\r\nBUY A SHIRT: https://teespring.com/stores/cosmonaut-variety-merch-store\r\n\r\nTwitter: https://twitter.com/cosmovarietyhr", + is_upcoming: false, + short_description: Some("Patreon: https://www.patreon.com/cosmonautvarietyhour\r\n\r\nBUY A SHIRT: https://teespring.com/stores/cosmonaut-variety-merch-store\r\n\r\nTwitter: https://twitter.com/cosmovarietyhr"), ), - SearchVideo( + VideoItem( id: "yX_DwPnkycc", title: "THE BEST RESULTS I\'VE SEEN YET! (PROGRESS UPDATE)", length: Some(906), @@ -2033,7 +2082,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC6jgzx2g3nlbaYkd8EMweKA", name: "Jaclyn Hill", avatar: [ @@ -2045,15 +2094,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 259996, + view_count: Some(259996), is_live: false, is_short: false, - short_description: "SUBSCRIBE! \nhttp://goo.gl/3Awmn8\n\nSHOP MY COSMETICS BRAND HERE!\nhttps://jaclyncosmetics.com\n\nSHOP MY JEWELRY BRAND HERE!\nhttps://jaclynroxanne.com\n\nSHOP MY PALETTES & BRUSHES HERE!!\nhttp://morpheb...", + is_upcoming: false, + short_description: Some("SUBSCRIBE! \nhttp://goo.gl/3Awmn8\n\nSHOP MY COSMETICS BRAND HERE!\nhttps://jaclyncosmetics.com\n\nSHOP MY JEWELRY BRAND HERE!\nhttps://jaclynroxanne.com\n\nSHOP MY PALETTES & BRUSHES HERE!!\nhttp://morpheb..."), ), - SearchVideo( + VideoItem( id: "CtpdMkKvB6U", title: "hi, I\'m Dream.", length: Some(342), @@ -2074,7 +2124,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCTkXRDQl0luXxVQrRQvWS6w", name: "Dream", avatar: [ @@ -2086,15 +2136,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 days ago"), - view_count: 40299696, + view_count: Some(40299696), is_live: false, is_short: false, - short_description: "hi, I\'m Dream, and this is what I look like.\n\nAfter years of being completely faceless online, I finally decided to do a face reveal.\n\nFollow my socials:\n➽ Twitter - @dream\n➽ Instagram...", + is_upcoming: false, + short_description: Some("hi, I\'m Dream, and this is what I look like.\n\nAfter years of being completely faceless online, I finally decided to do a face reveal.\n\nFollow my socials:\n➽ Twitter - @dream\n➽ Instagram..."), ), - SearchVideo( + VideoItem( id: "t6fIp7mMJ90", title: "what happened.", length: Some(332), @@ -2115,7 +2166,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCpi8TJfiA4lKGkaXs__YdBA", name: "The Try Guys", avatar: [ @@ -2127,15 +2178,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("9 days ago"), - view_count: 10499110, + view_count: Some(10499110), is_live: false, is_short: false, - short_description: "", + is_upcoming: false, + short_description: None, ), - SearchVideo( + VideoItem( id: "dFlDRhvM4L0", title: "『チェンソーマン』ノンクレジットオープニング / CHAINSAW MAN Opening│米津玄師 「KICK BACK」", length: Some(90), @@ -2156,7 +2208,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCjfAEJZdfbIjVHdo5yODfyQ", name: "MAPPA CHANNEL", avatar: [ @@ -2168,15 +2220,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 10285052, + view_count: Some(10285052), is_live: false, is_short: false, - short_description: "オープニング・テーマ\n米津玄師\u{3000}「KICK BACK」 Kenshi Yonezu – KICK BACK\n作詞・作曲\u{3000}米津玄師\n\u{3000}\u{3000}\u{3000}編曲\u{3000}米津玄師\u{3000}常田大希 (King Gnu / millennium...", + is_upcoming: false, + short_description: Some("オープニング・テーマ\n米津玄師\u{3000}「KICK BACK」 Kenshi Yonezu – KICK BACK\n作詞・作曲\u{3000}米津玄師\n\u{3000}\u{3000}\u{3000}編曲\u{3000}米津玄師\u{3000}常田大希 (King Gnu / millennium..."), ), - SearchVideo( + VideoItem( id: "6T67I2w1G2U", title: "Extreme $1,000,000 Minecraft Challenge!", length: Some(643), @@ -2197,7 +2250,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCIPPMRA040LQr5QPyJEbmXA", name: "MrBeast Gaming", avatar: [ @@ -2209,15 +2262,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 2873209, + view_count: Some(2873209), is_live: false, is_short: false, - short_description: "Thank you to Undeniably Dairy for sponsoring this video! Check them out! http://www.bit.ly/UDMrBeast\n\nI challenged six YouTubers to compete for $1,000,000!\n\nSUBSCRIBE OR YOU\'LL HAVE BAD LUCK...", + is_upcoming: false, + short_description: Some("Thank you to Undeniably Dairy for sponsoring this video! Check them out! http://www.bit.ly/UDMrBeast\n\nI challenged six YouTubers to compete for $1,000,000!\n\nSUBSCRIBE OR YOU\'LL HAVE BAD LUCK..."), ), - SearchVideo( + VideoItem( id: "DvkTX-AquQo", title: "Impossible 0.00001% Odds!", length: Some(481), @@ -2238,7 +2292,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCUaT_39o1x6qWjz7K2pWcgw", name: "Beast Reacts", avatar: [ @@ -2250,15 +2304,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 4850190, + view_count: Some(4850190), is_live: false, is_short: false, - short_description: "SUBSCRIBE OR YOU\'LL HAVE BAD LUCK\n\nCHECK OUT THESE CHANNELS OR ELSE\n\nFA 92\nhttps://www.youtube.com/watch?v=oaUH-nAg6UU\n\nRM Media\nhttps://www.youtube.com/watch?v=DFG-vaT0qgk\n\nThe Dodo\nhttps://cdn.jw...", + is_upcoming: false, + short_description: Some("SUBSCRIBE OR YOU\'LL HAVE BAD LUCK\n\nCHECK OUT THESE CHANNELS OR ELSE\n\nFA 92\nhttps://www.youtube.com/watch?v=oaUH-nAg6UU\n\nRM Media\nhttps://www.youtube.com/watch?v=DFG-vaT0qgk\n\nThe Dodo\nhttps://cdn.jw..."), ), - SearchVideo( + VideoItem( id: "F-7rQBY8uIQ", title: "Lil Baby - Heyy (Official Video)", length: Some(193), @@ -2279,7 +2334,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCVS88tG_NYgxF6Udnx2815Q", name: "Lil Baby Official 4PF", avatar: [ @@ -2291,15 +2346,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 2540238, + view_count: Some(2540238), is_live: false, is_short: false, - short_description: "Music video by Lil Baby performing Heyy. Quality Control Music/Motown Records; © 2022 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc.\n\nhttp://vevo.ly/IFLIVM", + is_upcoming: false, + short_description: Some("Music video by Lil Baby performing Heyy. Quality Control Music/Motown Records; © 2022 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc.\n\nhttp://vevo.ly/IFLIVM"), ), - SearchVideo( + VideoItem( id: "atwHMKZ0SLU", title: "Boosie in the trap!", length: Some(9879), @@ -2320,7 +2376,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC4m46pCBkMEyy8gk26WKqbA", name: "The 85 South Comedy Show", avatar: [ @@ -2332,15 +2388,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 2019404, + view_count: Some(2019404), is_live: false, is_short: false, - short_description: "Hit Our Website for more info: https://www.85southshow.com/\nGet our custom merchandise: https://85apparelco.com/\nSubscribe To our Channel: bitly.com/85tube \nWATCH KARLOUS\' MILLER\'s COMEDY SPECIAL!...", + is_upcoming: false, + short_description: Some("Hit Our Website for more info: https://www.85southshow.com/\nGet our custom merchandise: https://85apparelco.com/\nSubscribe To our Channel: bitly.com/85tube \nWATCH KARLOUS\' MILLER\'s COMEDY SPECIAL!..."), ), - SearchVideo( + VideoItem( id: "Ut68FBnWbAI", title: "ok, let\'s talk about it. - The TryPod Ep. 181", length: Some(4226), @@ -2361,7 +2418,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCRrigpc864fw8ZNsJ2AnEJA", name: "TryPods", avatar: [ @@ -2373,15 +2430,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 5591480, + view_count: Some(5591480), is_live: false, is_short: false, - short_description: "This episode is sponsored by BetterHelp. Take charge of your mental health with 10% off your first month of online therapy at https://betterhelp.com/trypod\nSupport local restaurants from the...", + is_upcoming: false, + short_description: Some("This episode is sponsored by BetterHelp. Take charge of your mental health with 10% off your first month of online therapy at https://betterhelp.com/trypod\nSupport local restaurants from the..."), ), - SearchVideo( + VideoItem( id: "_Z3QKkl1WyM", title: "Marvel Studios’ Black Panther: Wakanda Forever | Official Trailer", length: Some(131), @@ -2402,7 +2460,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCvC4D8onUfXzvjTOM-dBfEA", name: "Marvel Entertainment", avatar: [ @@ -2414,15 +2472,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 days ago"), - view_count: 24540193, + view_count: Some(24540193), is_live: false, is_short: false, - short_description: "“Show them who we are.” Watch the brand-new trailer for Marvel Studios’ Black Panther: Wakanda Forever, only in theaters November 11.\nGet tickets now: fandango.com/wakandaforever \n\n►...", + is_upcoming: false, + short_description: Some("“Show them who we are.” Watch the brand-new trailer for Marvel Studios’ Black Panther: Wakanda Forever, only in theaters November 11.\nGet tickets now: fandango.com/wakandaforever \n\n►..."), ), - SearchVideo( + VideoItem( id: "nMPCXuvL8EM", title: "The Super Mario Bros. Movie Direct", length: Some(482), @@ -2443,7 +2502,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCGIY_O-8vW4rfX98KlMkvRg", name: "Nintendo of America", avatar: [ @@ -2455,15 +2514,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("Streamed 7 days ago"), - view_count: 5869928, + view_count: Some(5869928), is_live: false, is_short: false, - short_description: "Watch this Nintendo Direct: The Super Mario Bros. Movie presentation introducing the world premiere trailer for the upcoming film (no game information will be featured).\n\nSubscribe for more...", + is_upcoming: false, + short_description: Some("Watch this Nintendo Direct: The Super Mario Bros. Movie presentation introducing the world premiere trailer for the upcoming film (no game information will be featured).\n\nSubscribe for more..."), ), - SearchVideo( + VideoItem( id: "SS7HXxy3_2c", title: "Try Guys - SNL", length: Some(352), @@ -2484,7 +2544,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCqFzWxSCi39LnW1JKFR3efg", name: "Saturday Night Live", avatar: [ @@ -2496,15 +2556,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("4 days ago"), - view_count: 2106221, + view_count: Some(2106221), is_live: false, is_short: false, - short_description: "A CNN broadcast is interrupted by breaking news of the Try Guys\' (Mikey Day, Bowen Yang, Andrew Dismukes) response video to Ned Fulmer.\n\nSaturday Night Live. Stream now on Peacock: https://pck.tv/3...", + is_upcoming: false, + short_description: Some("A CNN broadcast is interrupted by breaking news of the Try Guys\' (Mikey Day, Bowen Yang, Andrew Dismukes) response video to Ned Fulmer.\n\nSaturday Night Live. Stream now on Peacock: https://pck.tv/3..."), ), - SearchVideo( + VideoItem( id: "rvInpw0WGLc", title: "Town Hall 15 Is Here! Clash of Clans New Update Available Now!", length: Some(71), @@ -2525,7 +2586,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCD1Em4q90ZUK2R5HKesszJg", name: "Clash of Clans", avatar: [ @@ -2537,15 +2598,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 5259742, + view_count: Some(5259742), is_live: false, is_short: false, - short_description: "Town Hall 15 Is Here! Clash of Clans New Update Available Now!\n\n#clashofclans #townhall15 #newupdate #th15\n\n\nIntroducing Town Hall 15, the most magical Town Hall yet!\n\n● Power up your village...", + is_upcoming: false, + short_description: Some("Town Hall 15 Is Here! Clash of Clans New Update Available Now!\n\n#clashofclans #townhall15 #newupdate #th15\n\n\nIntroducing Town Hall 15, the most magical Town Hall yet!\n\n● Power up your village..."), ), - SearchVideo( + VideoItem( id: "etV_nxVU6l8", title: "Wedding Stereotypes", length: Some(676), @@ -2566,7 +2628,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCRijo3ddMTht_IHyNSNXpNQ", name: "Dude Perfect", avatar: [ @@ -2578,15 +2640,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 5931342, + view_count: Some(5931342), is_live: false, is_short: false, - short_description: "Love \'em or Hate \'em, we all know \'em! Check out all the Wedding Stereotypes!\n► Thanks for subscribing! - http://bit.ly/SubDudePerfect\n► Sail to the Bahamas w/ us on the DUDE PERFECT CRUISE:...", + is_upcoming: false, + short_description: Some("Love \'em or Hate \'em, we all know \'em! Check out all the Wedding Stereotypes!\n► Thanks for subscribing! - http://bit.ly/SubDudePerfect\n► Sail to the Bahamas w/ us on the DUDE PERFECT CRUISE:..."), ), - SearchVideo( + VideoItem( id: "i7ytY9Onf9o", title: "I Met Dream In Real Life", length: Some(569), @@ -2607,7 +2670,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCA2tt9GSU2sl8rAqjlLR3mQ", name: "GeorgeNotFound", avatar: [ @@ -2619,15 +2682,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("9 days ago"), - view_count: 9843693, + view_count: Some(9843693), is_live: false, is_short: false, - short_description: "I met Dream in real life finally... We\'ve been online friends for what feels like my whole life and this is our first time meeting in peson. This was one of the best weeks of my life.\n\nFollow...", + is_upcoming: false, + short_description: Some("I met Dream in real life finally... We\'ve been online friends for what feels like my whole life and this is our first time meeting in peson. This was one of the best weeks of my life.\n\nFollow..."), ), - SearchVideo( + VideoItem( id: "jYSlpC6Ud2A", title: "Stray Kids \"CASE 143\" M/V", length: Some(221), @@ -2648,7 +2712,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCaO6TYtlC8U5ttz62hTrZgg", name: "JYP Entertainment", avatar: [ @@ -2660,15 +2724,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 days ago"), - view_count: 34630241, + view_count: Some(34630241), is_live: false, is_short: false, - short_description: "Stray Kids(스트레이 키즈) \"CASE 143\" M/V \n\n💗Listen to <MAXIDENT> now!\n⚡http://Stray-Kids.lnk.to/MAXIDENT \n\nStray Kids \"MAXIDENT\"\niTunes & Apple Music: https://stray-kids.lnk.to/MAXID...", + is_upcoming: false, + short_description: Some("Stray Kids(스트레이 키즈) \"CASE 143\" M/V \n\n💗Listen to <MAXIDENT> now!\n⚡http://Stray-Kids.lnk.to/MAXIDENT \n\nStray Kids \"MAXIDENT\"\niTunes & Apple Music: https://stray-kids.lnk.to/MAXID..."), ), - SearchVideo( + VideoItem( id: "XKRW1zgkCVc", title: "Where Animals\' Scientific Names Come From", length: Some(581), @@ -2689,7 +2754,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC1DTYW241WD64ah5BFWn4JA", name: "Sam O\'Nella Academy", avatar: [ @@ -2701,15 +2766,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("9 days ago"), - view_count: 5579025, + view_count: Some(5579025), is_live: false, is_short: false, - short_description: "sup\n____________________\nCheck out my other channel, Sam O\'Nella Vlog!\nhttps://www.youtube.com/channel/UCvayZDkq6wTj5EQtulrpgZA\n\nFollow me on twitter!\nhttps://twitter.com/Sam_ONella\n\nWant a...", + is_upcoming: false, + short_description: Some("sup\n____________________\nCheck out my other channel, Sam O\'Nella Vlog!\nhttps://www.youtube.com/channel/UCvayZDkq6wTj5EQtulrpgZA\n\nFollow me on twitter!\nhttps://twitter.com/Sam_ONella\n\nWant a..."), ), - SearchVideo( + VideoItem( id: "Th_O5kayAM0", title: "Que Vas A Hacer - Nivel Codiciado X Jose Mejia (Video Oficial)", length: Some(189), @@ -2730,7 +2796,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCZ64C0y5Lc1x11SdQFeDbYg", name: "Nivel Codiciado", avatar: [ @@ -2742,15 +2808,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 1322409, + view_count: Some(1322409), is_live: false, is_short: false, - short_description: "Muchas Gracias A Todos Ustedes!\n\nQue Vas A Hacer - Nivel Codiciado X Jose Mejia (Video Oficial)\n\n\nLIKE, COMMENT, SUBSCRIBE!\n\n\nNivel Codiciado IG : https://www.instagram.com/nivelcodiciadooficial/?h...", + is_upcoming: false, + short_description: Some("Muchas Gracias A Todos Ustedes!\n\nQue Vas A Hacer - Nivel Codiciado X Jose Mejia (Video Oficial)\n\n\nLIKE, COMMENT, SUBSCRIBE!\n\n\nNivel Codiciado IG : https://www.instagram.com/nivelcodiciadooficial/?h..."), ), - SearchVideo( + VideoItem( id: "O-mtWoF8umw", title: "Yahritza Y Su Esencia & Ivan Cornejo - Inseparables (Official Video)", length: Some(178), @@ -2771,7 +2838,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC7ptwo_0Npl5Bji31j868fA", name: "Yahritza Y Su Esencia", avatar: [ @@ -2783,15 +2850,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 days ago"), - view_count: 2246200, + view_count: Some(2246200), is_live: false, is_short: false, - short_description: "Official video for “Inseparables” by Yahritza Y Su Esencia & Ivan Cornejo\n\nListen & Download “Inseparables” out now: https://yahritza.lnk.to/Inseparables\nAmazon Music - https://yahritza.lnk...", + is_upcoming: false, + short_description: Some("Official video for “Inseparables” by Yahritza Y Su Esencia & Ivan Cornejo\n\nListen & Download “Inseparables” out now: https://yahritza.lnk.to/Inseparables\nAmazon Music - https://yahritza.lnk..."), ), - SearchVideo( + VideoItem( id: "rFO1iqDpMZU", title: "I Collected Every Illegal Item In Minecraft Hardcore", length: Some(1402), @@ -2812,7 +2880,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC_GDu2QH3kp6vJlgEYyqjUA", name: "Kolanii", avatar: [ @@ -2824,15 +2892,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 3926322, + view_count: Some(3926322), is_live: false, is_short: false, - short_description: "In this video we go back in time through Minecrafts versions to collect the most illegal items in the game in 100% hardcore! If you enjoyed this video remember to leave a like, it helps ya...", + is_upcoming: false, + short_description: Some("In this video we go back in time through Minecrafts versions to collect the most illegal items in the game in 100% hardcore! If you enjoyed this video remember to leave a like, it helps ya..."), ), - SearchVideo( + VideoItem( id: "-1vsm5bhoyE", title: "Grupo Frontera - No Se Va (Letra Oficial)", length: Some(192), @@ -2853,7 +2922,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCKsN6xyJ2w8g7p4p9apXkYQ", name: "Grupo Frontera", avatar: [ @@ -2865,15 +2934,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("8 days ago"), - view_count: 6793645, + view_count: Some(6793645), is_live: false, is_short: false, - short_description: "Escucha \"No Se Va\" en tu plataforma favorita: https://bfan.link/no-se-va\nDescubre más de Grupo Frontera aquí: https://bit.ly/GrupoFrontera\nSuscríbete a nuestro canal: https://bit.ly/GrupoFronter...", + is_upcoming: false, + short_description: Some("Escucha \"No Se Va\" en tu plataforma favorita: https://bfan.link/no-se-va\nDescubre más de Grupo Frontera aquí: https://bit.ly/GrupoFrontera\nSuscríbete a nuestro canal: https://bit.ly/GrupoFronter..."), ), - SearchVideo( + VideoItem( id: "XQUiabixHzo", title: "I Speedran the $0.01 Challenge", length: Some(933), @@ -2894,7 +2964,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCnmGIkw-KdI0W5siakKPKog", name: "Ryan Trahan", avatar: [ @@ -2906,15 +2976,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("4 days ago"), - view_count: 5401331, + view_count: Some(5401331), is_live: false, is_short: false, - short_description: "60 minutes. 1 penny. 0 social skills\nGet Honey for FREE today ▸ https://joinhoney.com/ryan\nHoney finds coupons with one click. Thanks to Honey for sponsoring!", + is_upcoming: false, + short_description: Some("60 minutes. 1 penny. 0 social skills\nGet Honey for FREE today ▸ https://joinhoney.com/ryan\nHoney finds coupons with one click. Thanks to Honey for sponsoring!"), ), - SearchVideo( + VideoItem( id: "8TzH0ayIcdo", title: "The Darkest Story I\'ve Ever Read", length: Some(4383), @@ -2935,7 +3006,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC3cpN6gcJQqcCM6mxRUo_dA", name: "Wendigoon", avatar: [ @@ -2947,15 +3018,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 777753, + view_count: Some(777753), is_live: false, is_short: false, - short_description: "Get Honey for FREE today ▸ https://joinhoney.com/wendigoon\nHoney finds coupons with one click. Thanks to Honey for sponsoring!\n\nMy Links\n\nSecond channel/ Wendigang: https://www.youtube.com/channe...", + is_upcoming: false, + short_description: Some("Get Honey for FREE today ▸ https://joinhoney.com/wendigoon\nHoney finds coupons with one click. Thanks to Honey for sponsoring!\n\nMy Links\n\nSecond channel/ Wendigang: https://www.youtube.com/channe..."), ), - SearchVideo( + VideoItem( id: "xkwc5TZmdIs", title: "GloRilla Glows Up In Every Way With Performance Of \"Tomorrow!\" & \"F.N.F.\" | Hip Hop Awards \'22", length: Some(146), @@ -2976,7 +3048,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCcVqCJ_9owb1zM43vqswMNQ", name: "BETNetworks", avatar: [ @@ -2988,15 +3060,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("8 days ago"), - view_count: 3400062, + view_count: Some(3400062), is_live: false, is_short: false, - short_description: "Watch GloRilla\'s performance of \"F.N.F.\" & \"Tomorrow\" from the 2022 Hip Hop Awards. #HipHopAwards22 #HipHopAwards #GloRilla #BET @theofficialGloRilla @GloRillaVEVO \n\nSUBSCRIBE to #BET! ►►...", + is_upcoming: false, + short_description: Some("Watch GloRilla\'s performance of \"F.N.F.\" & \"Tomorrow\" from the 2022 Hip Hop Awards. #HipHopAwards22 #HipHopAwards #GloRilla #BET @theofficialGloRilla @GloRillaVEVO \n\nSUBSCRIBE to #BET! ►►..."), ), - SearchVideo( + VideoItem( id: "eJPLiT1kCSM", title: "Museums: Last Week Tonight with John Oliver (HBO)", length: Some(2049), @@ -3017,7 +3090,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC3XTzVzaHQEd30rQbuvCtTQ", name: "LastWeekTonight", avatar: [ @@ -3029,15 +3102,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("10 days ago"), - view_count: 4315677, + view_count: Some(4315677), is_live: false, is_short: false, - short_description: "John Oliver discusses some of the world’s most prestigious museums, why they contain so many stolen goods, the market that continues to illegally trade antiquities, and a pretty solid blueprint...", + is_upcoming: false, + short_description: Some("John Oliver discusses some of the world’s most prestigious museums, why they contain so many stolen goods, the market that continues to illegally trade antiquities, and a pretty solid blueprint..."), ), - SearchVideo( + VideoItem( id: "zwa7NzNBQig", title: "GloRilla, Cardi B - Tomorrow 2 (Official Music Video)", length: Some(214), @@ -3058,7 +3132,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC9bZ9eWvF0eXVqrxK9ve7Nw", name: "theofficialGloRilla", avatar: [ @@ -3070,15 +3144,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 weeks ago"), - view_count: 20551404, + view_count: Some(20551404), is_live: false, is_short: false, - short_description: "Stream #Tomorrow2\' here: https://GloRilla.lnk.to/Tomorrow2\nPre-save Glorilla’s debut EP out everywhere 11/11: https://GloRilla.lnk.to/ALG\n\nFollow #GloRilla:\nInstagram: https://www.instagram.com/g...", + is_upcoming: false, + short_description: Some("Stream #Tomorrow2\' here: https://GloRilla.lnk.to/Tomorrow2\nPre-save Glorilla’s debut EP out everywhere 11/11: https://GloRilla.lnk.to/ALG\n\nFollow #GloRilla:\nInstagram: https://www.instagram.com/g..."), ), - SearchVideo( + VideoItem( id: "BHFcF0zcCgA", title: "Hurricane Ian Destroyed My Hometown!", length: Some(647), @@ -3099,7 +3174,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC94lW_-Hr_uA7RcJ3D-WPOg", name: "Danny Duncan", avatar: [ @@ -3111,15 +3186,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 3545884, + view_count: Some(3545884), is_live: false, is_short: false, - short_description: "On September 28, Hurricane Ian hit Englewood, Florida, causing heavy flooding, ripping roofs off residents\' houses and leveling buildings, forcing thousands to evacuate.\n\nMerchandise ▶ http://dan...", + is_upcoming: false, + short_description: Some("On September 28, Hurricane Ian hit Englewood, Florida, causing heavy flooding, ripping roofs off residents\' houses and leveling buildings, forcing thousands to evacuate.\n\nMerchandise ▶ http://dan..."), ), - SearchVideo( + VideoItem( id: "xhYj9JJnLHM", title: "DDG 25th SURPRISE BIRTHDAY PARTY!!", length: Some(3252), @@ -3140,7 +3216,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCDDgfKQE3eaD1H08VHRAfig", name: "PontiacMadeDDG VLOGS", avatar: [ @@ -3152,15 +3228,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 678135, + view_count: Some(678135), is_live: false, is_short: false, - short_description: "\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou\n\nFollow My Social Media:\nInstagram: https://instagram.com/ddg\nTwitter: https://twitter.com/pontiacmadeddg\nSnapChat: https://sn...", + is_upcoming: false, + short_description: Some("\"It\'s Not Me It\'s You\" available at: https://DDG.lnk.to/ItsNotMeItsYou\n\nFollow My Social Media:\nInstagram: https://instagram.com/ddg\nTwitter: https://twitter.com/pontiacmadeddg\nSnapChat: https://sn..."), ), - SearchVideo( + VideoItem( id: "9YsEQaW0f2c", title: "Eddie Robinson Jr. goes off on Deion Sanders and Coach Prime responds", length: Some(439), @@ -3181,7 +3258,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCoMv284iYWxL3JSY-9agY2w", name: "HBCUGameday", avatar: [ @@ -3193,15 +3270,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("4 days ago"), - view_count: 1504982, + view_count: Some(1504982), is_live: false, is_short: false, - short_description: "It was a highly tense and awkward postgame handshake between Alabama State head coach Eddie Robinson Jr. and Jackson State coach Deion Sanders. And that was just the beginning.", + is_upcoming: false, + short_description: Some("It was a highly tense and awkward postgame handshake between Alabama State head coach Eddie Robinson Jr. and Jackson State coach Deion Sanders. And that was just the beginning."), ), - SearchVideo( + VideoItem( id: "m-SB3cpzLUU", title: "i\'m sorry.", length: Some(322), @@ -3222,7 +3300,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCGD1IitV7_EXXEcLUc0D9sQ", name: "Dominic Brack", avatar: [ @@ -3234,15 +3312,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 1468515, + view_count: Some(1468515), is_live: false, is_short: false, - short_description: "I wanted to share my side of the story...\nJust an explanation/apology I’m sorry for anyone this effected. \nim going to take a break from social media for a bit but I will be back soon!", + is_upcoming: false, + short_description: Some("I wanted to share my side of the story...\nJust an explanation/apology I’m sorry for anyone this effected. \nim going to take a break from social media for a bit but I will be back soon!"), ), - SearchVideo( + VideoItem( id: "TRGHIN2PGIA", title: "Christian Bale Breaks Down His Most Iconic Characters | GQ", length: Some(1381), @@ -3263,7 +3342,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCsEukrAd64fqA7FjwkmZ_Dw", name: "GQ", avatar: [ @@ -3275,15 +3354,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("8 days ago"), - view_count: 7814218, + view_count: Some(7814218), is_live: false, is_short: false, - short_description: "Christian Bale breaks down a few of his most iconic characters from \'American Psycho,\' \'The Dark Knight\' Trilogy, \'The Fighter,\' \'The Machinist,\' \'The Big Short,\' \'Vice,\' \'Empire of the Sun,\'...", + is_upcoming: false, + short_description: Some("Christian Bale breaks down a few of his most iconic characters from \'American Psycho,\' \'The Dark Knight\' Trilogy, \'The Fighter,\' \'The Machinist,\' \'The Big Short,\' \'Vice,\' \'Empire of the Sun,\'..."), ), - SearchVideo( + VideoItem( id: "U9HAaHc3wnc", title: "Guess Iono’s Partner Pokémon! 🤔 | Pokémon Scarlet and Pokémon Violet", length: Some(211), @@ -3304,7 +3384,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCFctpiB_Hnlk3ejWfHqSm6Q", name: "The Official Pokémon YouTube channel", avatar: [ @@ -3316,15 +3396,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("1 day ago"), - view_count: 1157471, + view_count: Some(1157471), is_live: false, is_short: false, - short_description: "Meet Iono, an influencer, streamer, and Gym Leader who specializes in Electric-type Pokémon ⚡\u{fe0f}\n\nCan you guess Iono’s partner Pokémon? 🤔\n\nPre-order Pokémon Scarlet & Pokémon Violet...", + is_upcoming: false, + short_description: Some("Meet Iono, an influencer, streamer, and Gym Leader who specializes in Electric-type Pokémon ⚡\u{fe0f}\n\nCan you guess Iono’s partner Pokémon? 🤔\n\nPre-order Pokémon Scarlet & Pokémon Violet..."), ), - SearchVideo( + VideoItem( id: "4ywb2pXRYZI", title: "Quavo & Takeoff - To The Bone feat. YoungBoy Never Broke Again (Official visualizer)", length: Some(284), @@ -3345,7 +3426,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCU_xT0uVi5cku7cg9hDgkMA", name: "Quavo Huncho", avatar: [ @@ -3357,15 +3438,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("6 days ago"), - view_count: 1355588, + view_count: Some(1355588), is_live: false, is_short: false, - short_description: "#NowPlaying Quavo & Takeoff \"To The Bone\" Official Visualizer.\n\nStream & Download \"To The Bone\" on \'Only Built for Infinity Links\' Here: http://www.QualityControl.lnk.to/InfinityLinks\n \nShot...", + is_upcoming: false, + short_description: Some("#NowPlaying Quavo & Takeoff \"To The Bone\" Official Visualizer.\n\nStream & Download \"To The Bone\" on \'Only Built for Infinity Links\' Here: http://www.QualityControl.lnk.to/InfinityLinks\n \nShot..."), ), - SearchVideo( + VideoItem( id: "wP9zsx04fWY", title: "WE ARE COMING! to a city near you!", length: Some(59), @@ -3386,7 +3468,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCdvlHk5SZWwr9HjUcwtu8ng", name: "blink-182", avatar: [ @@ -3398,15 +3480,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 966225, + view_count: Some(966225), is_live: false, is_short: false, - short_description: "We’re coming. Tour’s coming. Album’s coming. Tom’s coming. \nTickets for the world tour go on sale starting Monday, 10/17 at 10am local\nNew Single EDGING out on 10/14\nEverything coming...", + is_upcoming: false, + short_description: Some("We’re coming. Tour’s coming. Album’s coming. Tom’s coming. \nTickets for the world tour go on sale starting Monday, 10/17 at 10am local\nNew Single EDGING out on 10/14\nEverything coming..."), ), - SearchVideo( + VideoItem( id: "9acxn7qAST4", title: "Overwatch 2 Animated Short | “Kiriko”", length: Some(587), @@ -3427,7 +3510,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UClOf1XXinvZsy4wKPAkro2A", name: "PlayOverwatch", avatar: [ @@ -3439,15 +3522,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 5352181, + view_count: Some(5352181), is_live: false, is_short: false, - short_description: "The protector of Kanezaka strikes again. Discover the two sides of Kiriko, the loving daughter and the deadly protector.\n\nPlay #Overwatch2 for free today on Windows® PC and Xbox Series X|S,...", + is_upcoming: false, + short_description: Some("The protector of Kanezaka strikes again. Discover the two sides of Kiriko, the loving daughter and the deadly protector.\n\nPlay #Overwatch2 for free today on Windows® PC and Xbox Series X|S,..."), ), - SearchVideo( + VideoItem( id: "8-tQKwB3RKw", title: "Big Boogie - Backend (Remix) Shot by @Camera Gawd", length: Some(164), @@ -3468,7 +3552,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCVlaJdpaJiT3Tpr8JZI-DnA", name: "BIG BOOGIE MUSIC", avatar: [ @@ -3480,15 +3564,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 778550, + view_count: Some(778550), is_live: false, is_short: false, - short_description: "Big Boogie - Backend (Remix) \n\nFind Big Boogie on His Social Media Below\n\nInstagram | https://www.instagram.com/big_boogie_music\nFacebook | https://www.facebook.com/https://www.facebook.com/profile...", + is_upcoming: false, + short_description: Some("Big Boogie - Backend (Remix) \n\nFind Big Boogie on His Social Media Below\n\nInstagram | https://www.instagram.com/big_boogie_music\nFacebook | https://www.facebook.com/https://www.facebook.com/profile..."), ), - SearchVideo( + VideoItem( id: "5HNy7b6bz4g", title: "I Tried Out for an NBA Team and This Happened…", length: Some(805), @@ -3509,7 +3594,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCQIUhhcmXsu6cN6n3y9-Pww", name: "Jesser", avatar: [ @@ -3521,15 +3606,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("8 days ago"), - view_count: 4354695, + view_count: Some(4354695), is_live: false, is_short: false, - short_description: "I tried out for the NBA G League... and this is how it went! \n\nDownload the brand NEW NBA app and check it out the behind the scenes as I follow my dreams to make it to the league (https://app.link...", + is_upcoming: false, + short_description: Some("I tried out for the NBA G League... and this is how it went! \n\nDownload the brand NEW NBA app and check it out the behind the scenes as I follow my dreams to make it to the league (https://app.link..."), ), - SearchVideo( + VideoItem( id: "Uq9gPaIzbe8", title: "Sam Smith, Kim Petras - Unholy", length: Some(276), @@ -3550,7 +3636,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCvpDeGlR5wLP9Z3Tb6K0Xfg", name: "SAM SMITH", avatar: [ @@ -3562,15 +3648,16 @@ expression: map_res.c ], verification: artist, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("13 days ago"), - view_count: 15055156, + view_count: Some(15055156), is_live: false, is_short: false, - short_description: "Sam Smith \'Unholy\' featuring Kim Petras out now: http://samsmith.world/UnholyID\n\nDirected by Floria Sigismondi\n\nLabel: Capitol Records\nCommissioner: James Hackett\n\nProduction Company: Scheme...", + is_upcoming: false, + short_description: Some("Sam Smith \'Unholy\' featuring Kim Petras out now: http://samsmith.world/UnholyID\n\nDirected by Floria Sigismondi\n\nLabel: Capitol Records\nCommissioner: James Hackett\n\nProduction Company: Scheme..."), ), - SearchVideo( + VideoItem( id: "78sCR9mwBV4", title: "How Draymond Green Was after hitting Jordan Poole in practice", length: Some(76), @@ -3591,7 +3678,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC4G10tk3AHFuyMIuD3rHOBA", name: "RDCworld1", avatar: [ @@ -3603,15 +3690,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 2892907, + view_count: Some(2892907), is_live: false, is_short: false, - short_description: "Man why did Draymond Green hit Jordan Poole that hard 😂😂😂 that man out of control I wonder what happened\n\n\nFOLLOW @SUPREMEDREAMS_1 AND @RDCWORLD1 FOR MORE CONTENT/UPDATES \n\n~RDC Social...", + is_upcoming: false, + short_description: Some("Man why did Draymond Green hit Jordan Poole that hard 😂😂😂 that man out of control I wonder what happened\n\n\nFOLLOW @SUPREMEDREAMS_1 AND @RDCWORLD1 FOR MORE CONTENT/UPDATES \n\n~RDC Social..."), ), - SearchVideo( + VideoItem( id: "2U9kNnHvE8o", title: "LAKERS at WARRIORS | NBA PRESEASON FULL GAME HIGHLIGHTS | October 9, 2022", length: Some(585), @@ -3632,7 +3720,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCWJ2lWNubArHWmf3FIHbfcQ", name: "NBA", avatar: [ @@ -3644,15 +3732,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("3 days ago"), - view_count: 3353247, + view_count: Some(3353247), is_live: false, is_short: false, - short_description: "Never miss a moment with the latest news, trending stories and highlights to bring you closer to your favorite players and teams.\n\nDownload now: https://app.link.nba.com/APP22\n\nThe Los Angeles...", + is_upcoming: false, + short_description: Some("Never miss a moment with the latest news, trending stories and highlights to bring you closer to your favorite players and teams.\n\nDownload now: https://app.link.nba.com/APP22\n\nThe Los Angeles..."), ), - SearchVideo( + VideoItem( id: "xXGFb19rLtE", title: "Bray Wyatt returns to WWE: WWE Extreme Rules 2022 (WWE Network Exclusive)", length: Some(106), @@ -3673,7 +3762,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCJ5v_MCY6GNUBTO8-D3XoAg", name: "WWE", avatar: [ @@ -3685,15 +3774,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("4 days ago"), - view_count: 2745645, + view_count: Some(2745645), is_live: false, is_short: false, - short_description: "After weeks of mysterious vignettes, Bray Wyatt returns in jaw-dropping fashion at the end of WWE Extreme Rules 2022. Catch WWE action on Peacock, WWE Network, FOX, USA Network, Sony India...", + is_upcoming: false, + short_description: Some("After weeks of mysterious vignettes, Bray Wyatt returns in jaw-dropping fashion at the end of WWE Extreme Rules 2022. Catch WWE action on Peacock, WWE Network, FOX, USA Network, Sony India..."), ), - SearchVideo( + VideoItem( id: "7IGD5URBGZ8", title: "We Got Engaged", length: Some(1325), @@ -3714,7 +3804,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCkDG7yPqJBi_V2qGPRZHI_w", name: "Jayco & Val", avatar: [ @@ -3726,15 +3816,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 254375, + view_count: Some(254375), is_live: false, is_short: false, - short_description: "Valentina @Basic Valentina \n\nInstagram: https://www.instagram.com/basicvalent...\nTikTok: https://vm.tiktok.com/ZM8Gsmm4B/\nYouTube: https://youtube.com/channel/UCQxnOdDS...\n\nJayco @Jaycoset...", + is_upcoming: false, + short_description: Some("Valentina @Basic Valentina \n\nInstagram: https://www.instagram.com/basicvalent...\nTikTok: https://vm.tiktok.com/ZM8Gsmm4B/\nYouTube: https://youtube.com/channel/UCQxnOdDS...\n\nJayco @Jaycoset..."), ), - SearchVideo( + VideoItem( id: "5sRVxb2wkGM", title: "We Bought Every Weird Ad We Saw", length: Some(1602), @@ -3755,7 +3846,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCfbnTUxUech4P1XgYUwYuKA", name: "Cold Ones", avatar: [ @@ -3767,15 +3858,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("2 days ago"), - view_count: 1170050, + view_count: Some(1170050), is_live: false, is_short: false, - short_description: "We See It? We Buy It! NO EXCEPTIONS\n💃 GET OUR NEW LIMITED WAIFU CUPS 👉🏻 https://bit.ly/coldoneswaifu\n🌈 Get 10% OFF OUR CLOTHES with code \"COLDONES\" 👉🏻 https://bit.ly/coolshirtzz...", + is_upcoming: false, + short_description: Some("We See It? We Buy It! NO EXCEPTIONS\n💃 GET OUR NEW LIMITED WAIFU CUPS 👉🏻 https://bit.ly/coldoneswaifu\n🌈 Get 10% OFF OUR CLOTHES with code \"COLDONES\" 👉🏻 https://bit.ly/coolshirtzz..."), ), - SearchVideo( + VideoItem( id: "4YEEDqke-D0", title: "Jump into a Paldean Journey | Pokémon Scarlet and Pokémon Violet", length: Some(847), @@ -3796,7 +3888,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCFctpiB_Hnlk3ejWfHqSm6Q", name: "The Official Pokémon YouTube channel", avatar: [ @@ -3808,15 +3900,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 2287355, + view_count: Some(2287355), is_live: false, is_short: false, - short_description: "Every big journey begins with a single step! 🌄 Take a peek at some of the adventure you\'ll find through the open world of Paldea!\n\nWhere will you go? What will you discover? Find your treasure...", + is_upcoming: false, + short_description: Some("Every big journey begins with a single step! 🌄 Take a peek at some of the adventure you\'ll find through the open world of Paldea!\n\nWhere will you go? What will you discover? Find your treasure..."), ), - SearchVideo( + VideoItem( id: "rYjmxcV1se4", title: "Film Theory: Dora is CURSED! (Dora The Explorer)", length: Some(1085), @@ -3837,7 +3930,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC3sznuotAs2ohg_U__Jzj_Q", name: "The Film Theorists", avatar: [ @@ -3849,15 +3942,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 2404696, + view_count: Some(2404696), is_live: false, is_short: false, - short_description: "Special thanks to Raycon for sponsoring this episode!\nGet 15% off your order! ► https://buyraycon.com/filmtheory\n \nIt\'s time, Theorists. Time to talk about Dora the Explorer. I\'ve wanted...", + is_upcoming: false, + short_description: Some("Special thanks to Raycon for sponsoring this episode!\nGet 15% off your order! ► https://buyraycon.com/filmtheory\n \nIt\'s time, Theorists. Time to talk about Dora the Explorer. I\'ve wanted..."), ), - SearchVideo( + VideoItem( id: "y8qhSduN6sk", title: "PC Games on Console - Scott The Woz", length: Some(1912), @@ -3878,7 +3972,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UC4rqhyiTs7XyuODcECvuiiQ", name: "Scott The Woz", avatar: [ @@ -3890,15 +3984,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("20 hours ago"), - view_count: 528686, + view_count: Some(528686), is_live: false, is_short: false, - short_description: "Scott plays The Sims 2 Pets without a caps lock key.\n\nTwitter: https://www.twitter.com/ScottTheWoz\r\nFacebook: https://www.facebook.com/ScottTheWoz/\r\nInstagram: https://www.instagram.com/scottthewoz...", + is_upcoming: false, + short_description: Some("Scott plays The Sims 2 Pets without a caps lock key.\n\nTwitter: https://www.twitter.com/ScottTheWoz\r\nFacebook: https://www.facebook.com/ScottTheWoz/\r\nInstagram: https://www.instagram.com/scottthewoz..."), ), - SearchVideo( + VideoItem( id: "yTLzGSJJ5ts", title: "I Spent 50 Hours Customizing The World\'s Largest Xbox!", length: Some(886), @@ -3919,7 +4014,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UClQubH2NeMmGLTLgNdLBwXg", name: "ZHC", avatar: [ @@ -3931,15 +4026,16 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("5 days ago"), - view_count: 2638910, + view_count: Some(2638910), is_live: false, is_short: false, - short_description: "50 hours to customize the world\'s largest Xbox Series X!\n\nHuge shoutout to The Casual Engineer for building the world\'s largest xbox! Watch the behind the scenes video here!\nhttps://www.youtube.com...", + is_upcoming: false, + short_description: Some("50 hours to customize the world\'s largest Xbox Series X!\n\nHuge shoutout to The Casual Engineer for building the world\'s largest xbox! Watch the behind the scenes video here!\nhttps://www.youtube.com..."), ), - SearchVideo( + VideoItem( id: "x1u8-i2pWg0", title: "Witness Hurricane Ian As It Hits My Home In Cape Coral, FL And View The Aftermath", length: Some(855), @@ -3960,7 +4056,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCtY0HB5bLpuWOpZofTxkkxg", name: "Ruby (aka Adventure Mom)", avatar: [ @@ -3972,15 +4068,16 @@ expression: map_res.c ], verification: none, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("7 days ago"), - view_count: 1687151, + view_count: Some(1687151), is_live: false, is_short: false, - short_description: "In this video, I show you videos of what I experienced as Hurricane Ian hit my home in Cape Coral, FL. I then travel down the streets of Cape Coral including the Yacht Club, Cape Harbor, and...", + is_upcoming: false, + short_description: Some("In this video, I show you videos of what I experienced as Hurricane Ian hit my home in Cape Coral, FL. I then travel down the streets of Cape Coral including the Yacht Club, Cape Harbor, and..."), ), - SearchVideo( + VideoItem( id: "FfWtIaDtfYk", title: "Let’s Travel to The Most Extreme Place in The Universe", length: Some(766), @@ -4001,7 +4098,7 @@ expression: map_res.c height: 188, ), ], - channel: ChannelTag( + channel: Some(ChannelTag( id: "UCsXVk37bltHxD1rDPwtNM8Q", name: "Kurzgesagt – In a Nutshell", avatar: [ @@ -4013,12 +4110,13 @@ expression: map_res.c ], verification: verified, subscriber_count: None, - ), + )), publish_date: "[date]", publish_date_txt: Some("9 days ago"), - view_count: 5546987, + view_count: Some(5546987), is_live: false, is_short: false, - short_description: "The new 12,023 Human Era Calendar is here!\nhttps://kgs.link/calendar\nWORLDWIDE SHIPPING AVAILABLE.\nThis time you can join us on a journey through the microcosm. Curious? Head over to our shop...", + is_upcoming: false, + short_description: Some("The new 12,023 Human Era Calendar is here!\nhttps://kgs.link/calendar\nWORLDWIDE SHIPPING AVAILABLE.\nThis time you can join us on a journey through the microcosm. Curious? Head over to our shop..."), ), ] diff --git a/src/client/trends.rs b/src/client/trends.rs index 1d08adf..178c01c 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -1,18 +1,15 @@ use crate::{ error::{Error, ExtractionError}, - model::{Paginator, SearchVideo}, + model::{Paginator, VideoItem}, param::Language, serializer::MapResult, util::TryRemove, }; -use super::{ - response::{self, TryFromWLang}, - ClientType, MapResponse, QBrowse, QContinuation, RustyPipeQuery, -}; +use super::{response, ClientType, MapResponse, QBrowse, RustyPipeQuery}; impl RustyPipeQuery { - pub async fn startpage(self) -> Result, Error> { + pub async fn startpage(self) -> Result, Error> { let context = self.get_context(ClientType::Desktop, true).await; let request_body = QBrowse { context, @@ -29,33 +26,7 @@ impl RustyPipeQuery { .await } - pub async fn startpage_continuation( - self, - ctoken: &str, - visitor_data: &str, - ) -> Result, Error> { - let mut context = self.get_context(ClientType::Desktop, true).await; - context.client.visitor_data = Some(visitor_data.to_owned()); - let request_body = QContinuation { - context, - continuation: ctoken, - }; - - self.execute_request::( - ClientType::Desktop, - "startpage_continuation", - ctoken, - "browse", - &request_body, - ) - .await - .map(|res| Paginator { - visitor_data: Some(visitor_data.to_owned()), - ..res - }) - } - - pub async fn trending(self) -> Result, Error> { + pub async fn trending(self) -> Result, Error> { let context = self.get_context(ClientType::Desktop, true).await; let request_body = QBrowse { context, @@ -73,13 +44,13 @@ impl RustyPipeQuery { } } -impl MapResponse> for response::Startpage { +impl MapResponse> for response::Startpage { fn map_response( self, _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::Deobfuscator>, - ) -> Result>, ExtractionError> { + ) -> Result>, ExtractionError> { let mut contents = self.contents.two_column_browse_results_renderer.tabs; let grid = contents .try_swap_remove(0) @@ -97,33 +68,15 @@ impl MapResponse> for response::Startpage { } } -impl MapResponse> for response::StartpageCont { +impl MapResponse> for response::Trending { fn map_response( self, _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::Deobfuscator>, - ) -> Result>, ExtractionError> { - let mut received_actions = self.on_response_received_actions; - let items = received_actions - .try_swap_remove(0) - .ok_or_else(|| ExtractionError::InvalidData("no contents".into()))? - .append_continuation_items_action - .continuation_items; - - Ok(map_startpage_videos(items, lang, None)) - } -} - -impl MapResponse> for response::Trending { - fn map_response( - self, - _id: &str, - lang: crate::param::Language, - _deobf: Option<&crate::deobfuscate::Deobfuscator>, - ) -> Result>, ExtractionError> { + ) -> Result>, ExtractionError> { let mut contents = self.contents.two_column_browse_results_renderer.tabs; - let sections = contents + let items = contents .try_swap_remove(0) .ok_or_else(|| ExtractionError::InvalidData("no contents".into()))? .tab_renderer @@ -131,76 +84,27 @@ impl MapResponse> for response::Trending { .section_list_renderer .contents; - let mut items = Vec::new(); - let mut warnings = Vec::new(); + let mut mapper = response::YouTubeListMapper::::new(lang); + mapper.map_response(items); - for mut section in sections { - let shelf = section - .item_section_renderer - .contents - .try_swap_remove(0) - .and_then(|shelf| { - shelf - .shelf_renderer - .content - .expanded_shelf_contents_renderer - }); - - if let Some(mut shelf) = shelf { - warnings.append(&mut shelf.items.warnings); - - for item in shelf.items.c { - if let response::trends::TrendingListItem::VideoRenderer(video) = item { - match SearchVideo::from_w_lang(video, lang) { - Ok(video) => { - items.push(video); - } - Err(e) => { - warnings.push(e.to_string()); - } - } - } - } - } - } - - Ok(MapResult { c: items, warnings }) + Ok(MapResult { + c: mapper.items, + warnings: mapper.warnings, + }) } } fn map_startpage_videos( - videos: MapResult>, + videos: MapResult>, lang: Language, visitor_data: Option, -) -> MapResult> { - let mut warnings = videos.warnings; - let mut ctoken = None; - let items = videos - .c - .into_iter() - .filter_map(|item| match item { - response::VideoListItem::RichItemRenderer { - content: response::RichItem::VideoRenderer(video), - } => match SearchVideo::from_w_lang(video, lang) { - Ok(video) => Some(video), - Err(e) => { - warnings.push(e.to_string()); - None - } - }, - response::VideoListItem::ContinuationItemRenderer { - continuation_endpoint, - } => { - ctoken = Some(continuation_endpoint.continuation_command.token); - None - } - _ => None, - }) - .collect(); +) -> MapResult> { + let mut mapper = response::YouTubeListMapper::::new(lang); + mapper.map_response(videos); MapResult { - c: Paginator::new_with_vdata(None, items, ctoken, visitor_data), - warnings, + c: Paginator::new_with_vdata(None, mapper.items, mapper.ctoken, visitor_data), + warnings: mapper.warnings, } } @@ -210,7 +114,7 @@ mod tests { use crate::{ client::{response, MapResponse}, - model::{Paginator, SearchVideo}, + model::{Paginator, VideoItem}, param::Language, serializer::MapResult, }; @@ -223,7 +127,7 @@ mod tests { let startpage: response::Startpage = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = startpage.map_response("", Language::En, None).unwrap(); assert!( @@ -237,28 +141,6 @@ mod tests { }); } - #[test] - fn map_startpage_cont() { - let filename = "testfiles/trends/startpage_cont.json"; - let json_path = Path::new(&filename); - let json_file = File::open(json_path).unwrap(); - - let startpage: response::StartpageCont = - serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = - startpage.map_response("", Language::En, None).unwrap(); - - assert!( - map_res.warnings.is_empty(), - "deserialization/mapping warnings: {:?}", - map_res.warnings - ); - - insta::assert_ron_snapshot!("map_startpage_cont", map_res.c, { - ".items[].publish_date" => "[date]", - }); - } - #[test] fn map_trending() { let filename = "testfiles/trends/trending.json"; @@ -267,7 +149,7 @@ mod tests { let startpage: response::Trending = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = startpage.map_response("", Language::En, None).unwrap(); assert!( From 999ebf7c3688a07fb66a851cd0018c9b1a3dfb7f Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Mon, 17 Oct 2022 11:26:00 +0200 Subject: [PATCH 2/2] refactor: clean up response models --- src/client/response/channel.rs | 23 --------- src/client/response/mod.rs | 2 - src/client/response/search.rs | 82 ++----------------------------- src/client/response/trends.rs | 62 +++++------------------ src/client/response/video_item.rs | 15 ++++++ src/client/search.rs | 32 +----------- src/client/trends.rs | 2 +- 7 files changed, 33 insertions(+), 185 deletions(-) diff --git a/src/client/response/channel.rs b/src/client/response/channel.rs index c48660a..b6872bd 100644 --- a/src/client/response/channel.rs +++ b/src/client/response/channel.rs @@ -23,15 +23,6 @@ pub struct Channel { pub alerts: Option>, } -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ChannelCont { - #[serde(default)] - #[serde_as(as = "VecSkipError<_>")] - pub on_response_received_actions: Vec, -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Contents { @@ -205,17 +196,3 @@ pub struct PrimaryLink { pub title: String, pub navigation_endpoint: NavigationEndpoint, } - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct OnResponseReceivedAction { - pub append_continuation_items_action: AppendAction, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct AppendAction { - #[serde_as(as = "VecLogError<_>")] - pub continuation_items: MapResult>, -} diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 80574de..df967db 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -9,13 +9,11 @@ pub mod video_details; pub mod video_item; pub use channel::Channel; -pub use channel::ChannelCont; pub use player::Player; pub use playlist::Playlist; pub use playlist::PlaylistCont; pub use playlist_music::PlaylistMusic; pub use search::Search; -pub use search::SearchCont; pub use trends::Startpage; pub use trends::Trending; pub use url_endpoint::ResolvedUrl; diff --git a/src/client/response/search.rs b/src/client/response/search.rs index c9b9fa9..d185ad3 100644 --- a/src/client/response/search.rs +++ b/src/client/response/search.rs @@ -1,14 +1,7 @@ use serde::Deserialize; -use serde_with::json::JsonString; -use serde_with::{serde_as, VecSkipError}; +use serde_with::{json::JsonString, serde_as}; -use crate::serializer::ignore_any; -use crate::serializer::{text::Text, MapResult, VecLogError}; - -use super::video_item::YouTubeListItem; -use super::{ - ChannelRenderer, ContentsRenderer, ContinuationEndpoint, PlaylistRenderer, VideoRenderer, -}; +use super::video_item::YouTubeListRendererWrap; #[serde_as] #[derive(Debug, Deserialize)] @@ -19,28 +12,6 @@ pub struct Search { pub contents: Contents, } -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SearchCont { - #[serde_as(as = "Option")] - pub estimated_results: Option, - #[serde_as(as = "VecSkipError<_>")] - pub on_response_received_commands: Vec, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SearchContCommand { - pub append_continuation_items_action: SearchContAction, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SearchContAction { - pub continuation_items: Vec, -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Contents { @@ -50,52 +21,5 @@ pub struct Contents { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TwoColumnSearchResultsRenderer { - pub primary_contents: PrimaryContents, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct PrimaryContents { - pub section_list_renderer: ContentsRenderer, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum SectionListItem { - #[serde(rename_all = "camelCase")] - ItemSectionRenderer { - #[serde_as(as = "VecLogError<_>")] - contents: MapResult>, - }, - /// Continuation token to fetch more search results - #[serde(rename_all = "camelCase")] - ContinuationItemRenderer { - continuation_endpoint: ContinuationEndpoint, - }, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum SearchItem { - /// Video in search results - VideoRenderer(VideoRenderer), - /// Playlist in search results - PlaylistRenderer(PlaylistRenderer), - /// Channel displayed in search results - ChannelRenderer(ChannelRenderer), - - /// Corrected search query - #[serde(rename_all = "camelCase")] - ShowingResultsForRenderer { - #[serde_as(as = "Text")] - corrected_query: String, - }, - /// No search result item (e.g. ad) or unimplemented item - /// - /// Unimplemented: - /// - shelfRenderer (e.g. Latest from channel, For you) - #[serde(other, deserialize_with = "ignore_any")] - None, + pub primary_contents: YouTubeListRendererWrap, } diff --git a/src/client/response/trends.rs b/src/client/response/trends.rs index 53ee54a..a807083 100644 --- a/src/client/response/trends.rs +++ b/src/client/response/trends.rs @@ -1,37 +1,33 @@ use serde::Deserialize; use serde_with::{serde_as, VecSkipError}; -use crate::serializer::{MapResult, VecLogError}; - -use super::{ContentRenderer, YouTubeListItem}; +use super::{video_item::YouTubeListRendererWrap, ContentRenderer}; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Startpage { - pub contents: Contents, + pub contents: Contents, pub response_context: ResponseContext, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct Contents { - pub two_column_browse_results_renderer: T, +pub struct Trending { + pub contents: Contents, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Contents { + pub two_column_browse_results_renderer: BrowseResults, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct BrowseResultsStartpage { +pub struct BrowseResults { #[serde_as(as = "VecSkipError<_>")] - pub tabs: Vec>, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct BrowseResultsTrends { - #[serde_as(as = "VecSkipError<_>")] - pub tabs: Vec>, + pub tabs: Vec>, } #[derive(Debug, Deserialize)] @@ -40,40 +36,6 @@ pub struct Tab { pub tab_renderer: ContentRenderer, } -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct StartpageTabContent { - pub rich_grid_renderer: RichGridRenderer, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RichGridRenderer { - #[serde_as(as = "VecLogError<_>")] - pub contents: MapResult>, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct Trending { - pub contents: Contents, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct TrendingTabContent { - pub section_list_renderer: SectionListRenderer, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SectionListRenderer { - #[serde_as(as = "VecLogError<_>")] - pub contents: MapResult>, -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResponseContext { diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index 7600fbe..5da3974 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -165,6 +165,21 @@ pub struct ChannelRenderer { pub owner_badges: Vec, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct YouTubeListRendererWrap { + #[serde(alias = "richGridRenderer")] + pub section_list_renderer: YouTubeListRenderer, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct YouTubeListRenderer { + #[serde_as(as = "VecLogError<_>")] + pub contents: MapResult>, +} + /// Result of mapping a list of different YouTube enities /// (videos, channels, playlists) #[derive(Debug)] diff --git a/src/client/search.rs b/src/client/search.rs index f306c40..8d93883 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -93,21 +93,19 @@ impl MapResponse for response::Search { lang: Language, _deobf: Option<&Deobfuscator>, ) -> Result, ExtractionError> { - let section_list_items = self + let items = self .contents .two_column_search_results_renderer .primary_contents .section_list_renderer .contents; - let (items, ctoken) = map_section_list_items(section_list_items)?; - let mut mapper = response::YouTubeListMapper::::new(lang); mapper.map_response(items); Ok(MapResult { c: SearchResult { - items: Paginator::new(self.estimated_results, mapper.items, ctoken), + items: Paginator::new(self.estimated_results, mapper.items, mapper.ctoken), corrected_query: mapper.corrected_query, }, warnings: mapper.warnings, @@ -115,32 +113,6 @@ impl MapResponse for response::Search { } } -fn map_section_list_items( - section_list_items: Vec, -) -> Result<(MapResult>, Option), ExtractionError> { - let mut items = None; - let mut ctoken = None; - section_list_items.into_iter().for_each(|item| match item { - response::search::SectionListItem::ItemSectionRenderer { contents } => { - items = Some(contents); - } - response::search::SectionListItem::ContinuationItemRenderer { - continuation_endpoint, - } => { - ctoken = Some(continuation_endpoint.continuation_command.token); - } - }); - - let items = some_or_bail!( - items, - Err(ExtractionError::InvalidData( - "no item section renderer".into() - )) - ); - - Ok((items, ctoken)) -} - #[cfg(test)] mod tests { use std::{fs::File, io::BufReader, path::Path}; diff --git a/src/client/trends.rs b/src/client/trends.rs index 178c01c..9926181 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -57,7 +57,7 @@ impl MapResponse> for response::Startpage { .ok_or_else(|| ExtractionError::InvalidData("no contents".into()))? .tab_renderer .content - .rich_grid_renderer + .section_list_renderer .contents; Ok(map_startpage_videos(