From 7e5cff719a5da6ce99ed08411374a8aaf41a5004 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 8 May 2023 21:24:09 +0200 Subject: [PATCH 1/6] refaactor: small cleanup --- src/client/mod.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 251157e..d76f5b5 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -389,21 +389,17 @@ impl RustyPipeBuilder { Box::new(FileStorage::new(cache_file)) }); - let cdata = if let Some(storage) = &storage { - if let Some(data) = storage.read() { - match serde_json::from_str::(&data) { - Ok(data) => data, - Err(e) => { - log::error!("Could not deserialize cache. Error: {}", e); - CacheData::default() - } + let cdata = storage + .as_ref() + .and_then(|storage| storage.read()) + .and_then(|data| match serde_json::from_str::(&data) { + Ok(data) => Some(data), + Err(e) => { + log::error!("Could not deserialize cache. Error: {}", e); + None } - } else { - CacheData::default() - } - } else { - CacheData::default() - }; + }) + .unwrap_or_default(); RustyPipe { inner: Arc::new(RustyPipeRef { From 3a75ed8610a95e7f833e832bc8b235eebedea2a3 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 11 May 2023 14:13:54 +0200 Subject: [PATCH 2/6] feat!: add channel_videos_tab, channel_videos_order, remove channel_shorts, channel_livestreams fix: parsing video types and short durations --- cli/src/main.rs | 36 ++-- codegen/src/download_testfiles.rs | 6 +- notes/channel_order.md | 69 +++++++ src/client/channel.rs | 169 ++++++++++++++---- src/client/mod.rs | 37 ++-- src/client/music_artist.rs | 2 +- src/client/music_details.rs | 2 +- src/client/pagination.rs | 6 +- src/client/player.rs | 20 +-- src/client/response/mod.rs | 1 + src/client/response/video_item.rs | 25 +-- ...annel__tests__map_channel_videos_live.snap | 8 +- ...nel__tests__map_channel_videos_shorts.snap | 48 ++--- src/model/mod.rs | 2 +- src/model/paginator.rs | 2 +- src/param/mod.rs | 31 ++++ src/param/search_filter.rs | 5 +- src/util/mod.rs | 12 ++ src/util/protobuf.rs | 18 +- tests/youtube.rs | 97 ++++++++-- 20 files changed, 444 insertions(+), 152 deletions(-) create mode 100644 notes/channel_order.md diff --git a/cli/src/main.rs b/cli/src/main.rs index 44c94eb..d205933 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -8,7 +8,7 @@ use reqwest::{Client, ClientBuilder}; use rustypipe::{ client::RustyPipe, model::{UrlTarget, VideoId}, - param::{search_filter, StreamFilter}, + param::{search_filter, ChannelVideoTab, StreamFilter}, }; use serde::Serialize; @@ -113,6 +113,7 @@ enum ChannelTab { Videos, Shorts, Live, + Playlists, Info, } @@ -564,27 +565,16 @@ async fn main() { print_data(&artist, format, pretty); } else { match tab { - ChannelTab::Videos => { - let mut channel = rp.query().channel_videos(&id).await.unwrap(); - channel - .content - .extend_limit(rp.query(), limit) - .await - .unwrap(); - print_data(&channel, format, pretty); - } - ChannelTab::Shorts => { - let mut channel = rp.query().channel_shorts(&id).await.unwrap(); - channel - .content - .extend_limit(rp.query(), limit) - .await - .unwrap(); - print_data(&channel, format, pretty); - } - ChannelTab::Live => { + ChannelTab::Videos | ChannelTab::Shorts | ChannelTab::Live => { + let video_tab = match tab { + ChannelTab::Videos => ChannelVideoTab::Videos, + ChannelTab::Shorts => ChannelVideoTab::Shorts, + ChannelTab::Live => ChannelVideoTab::Live, + _ => unreachable!(), + }; let mut channel = - rp.query().channel_livestreams(&id).await.unwrap(); + rp.query().channel_videos_tab(&id, video_tab).await.unwrap(); + channel .content .extend_limit(rp.query(), limit) @@ -592,6 +582,10 @@ async fn main() { .unwrap(); print_data(&channel, format, pretty); } + ChannelTab::Playlists => { + let channel = rp.query().channel_playlists(&id).await.unwrap(); + print_data(&channel, format, pretty); + } ChannelTab::Info => { let channel = rp.query().channel_info(&id).await.unwrap(); print_data(&channel, format, pretty); diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index ad18b7c..0e72d08 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -10,7 +10,7 @@ use rustypipe::{ client::{ClientType, RustyPipe}, param::{ search_filter::{self, ItemType, SearchFilter}, - Country, + ChannelVideoTab, Country, }, report::{Report, Reporter}, }; @@ -305,7 +305,7 @@ async fn channel_shorts() { let rp = rp_testfile(&json_path); rp.query() - .channel_shorts("UCh8gHdtzO2tXd593_bjErWg") + .channel_videos_tab("UCh8gHdtzO2tXd593_bjErWg", ChannelVideoTab::Shorts) .await .unwrap(); } @@ -318,7 +318,7 @@ async fn channel_livestreams() { let rp = rp_testfile(&json_path); rp.query() - .channel_livestreams("UC2DjFE7Xf11URZqWBigcVOQ") + .channel_videos_tab("UC2DjFE7Xf11URZqWBigcVOQ", ChannelVideoTab::Live) .await .unwrap(); } diff --git a/notes/channel_order.md b/notes/channel_order.md new file mode 100644 index 0000000..1c9b699 --- /dev/null +++ b/notes/channel_order.md @@ -0,0 +1,69 @@ +# Channel order + +Fields: + +- `2:0:string` Channel ID +- `15:0:embedded` Videos tab +- `10:0:embedded` Shorts tab +- `14:0:embedded` Livestreams tab +- `2:0:string`: targetId for YouTube's web framework (`"\n$"` + any UUID) +- `3:1:varint` Sort order (1: Latest, 2: Popular) + +Popular videos + +```json +{ + "80226972:0:embedded": { + "2:0:string": "UCXuqSBlHAE6Xw-yeJA0Tunw", + "3:1:base64": { + "110:0:embedded": { + "3:0:embedded": { + "15:0:embedded": { + "2:0:string": "\n$6461d7c8-0000-2040-87aa-089e0827e420", + "3:1:varint": 2 + } + } + } + } + } +} +``` + +Popular shorts +```json +{ + "80226972:0:embedded": { + "2:0:string": "UCXuqSBlHAE6Xw-yeJA0Tunw", + "3:1:base64": { + "110:0:embedded": { + "3:0:embedded": { + "10:0:embedded": { + "2:0:string": "\n$64679ffb-0000-26b3-a1bd-582429d2c794", + "3:1:varint": 2 + } + } + } + } + } +} +``` + +Popular streams + +```json +{ + "80226972:0:embedded": { + "2:0:string": "UCXuqSBlHAE6Xw-yeJA0Tunw", + "3:1:base64": { + "110:0:embedded": { + "3:0:embedded": { + "14:0:embedded": { + "2:0:string": "\n$64693069-0000-2a1e-8c7d-582429bd5ba8", + "3:1:varint": 2 + } + } + } + } + } +} +``` diff --git a/src/client/channel.rs b/src/client/channel.rs index 0580f2f..0044f3a 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -1,14 +1,15 @@ -use std::borrow::Cow; - use serde::Serialize; use url::Url; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, Channel, ChannelInfo, PlaylistItem, VideoItem, YouTubeItem}, - param::Language, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + Channel, ChannelInfo, PlaylistItem, VideoItem, YouTubeItem, + }, + param::{ChannelOrder, ChannelVideoTab, Language}, serializer::MapResult, - util, + util::{self, ProtoBuilder}, }; use super::{response, ClientType, MapResponse, RustyPipeQuery, YTContext}; @@ -18,13 +19,13 @@ use super::{response, ClientType, MapResponse, RustyPipeQuery, YTContext}; struct QChannel<'a> { context: YTContext<'a>, browse_id: &'a str, - params: Params, + params: ChannelTab, #[serde(skip_serializing_if = "Option::is_none")] query: Option<&'a str>, } #[derive(Debug, Serialize)] -enum Params { +enum ChannelTab { #[serde(rename = "EgZ2aWRlb3PyBgQKAjoA")] Videos, #[serde(rename = "EgZzaG9ydHPyBgUKA5oBAA%3D%3D")] @@ -39,11 +40,21 @@ enum Params { Search, } +impl From for ChannelTab { + fn from(value: ChannelVideoTab) -> Self { + match value { + ChannelVideoTab::Videos => Self::Videos, + ChannelVideoTab::Shorts => Self::Shorts, + ChannelVideoTab::Live => Self::Live, + } + } +} + impl RustyPipeQuery { async fn _channel_videos>( &self, channel_id: S, - params: Params, + params: ChannelTab, query: Option<&str>, operation: &str, ) -> Result>, Error> { @@ -71,28 +82,54 @@ impl RustyPipeQuery { &self, channel_id: S, ) -> Result>, Error> { - self._channel_videos(channel_id, Params::Videos, None, "channel_videos") + self._channel_videos(channel_id, ChannelTab::Videos, None, "channel_videos") .await } - /// Get the short videos from a YouTube channel - pub async fn channel_shorts>( + /// Get a ordered list of videos from a YouTube channel + /// + /// This function does not return channel metadata. + pub async fn channel_videos_order>( &self, channel_id: S, - ) -> Result>, Error> { - self._channel_videos(channel_id, Params::Shorts, None, "channel_shorts") + order: ChannelOrder, + ) -> Result, Error> { + self.channel_videos_tab_order(channel_id, ChannelVideoTab::Videos, order) .await } - /// Get the livestreams from a YouTube channel - pub async fn channel_livestreams>( + /// Get the specified video tab from a YouTube channel + pub async fn channel_videos_tab>( &self, channel_id: S, + tab: ChannelVideoTab, ) -> Result>, Error> { - self._channel_videos(channel_id, Params::Live, None, "channel_livestreams") + self._channel_videos(channel_id, tab.into(), None, "channel_videos") .await } + /// Get a ordered list of videos from the specified tab of a YouTube channel + /// + /// This function does not return channel metadata. + pub async fn channel_videos_tab_order>( + &self, + channel_id: S, + tab: ChannelVideoTab, + order: ChannelOrder, + ) -> Result, Error> { + let visitor_data = match tab { + ChannelVideoTab::Shorts => Some(self.get_visitor_data().await?), + _ => None, + }; + + self.continuation( + order_ctoken(channel_id.as_ref(), tab, order), + ContinuationEndpoint::Browse, + visitor_data.as_deref(), + ) + .await + } + /// Search the videos of a channel pub async fn channel_search, S2: AsRef>( &self, @@ -101,7 +138,7 @@ impl RustyPipeQuery { ) -> Result>, Error> { self._channel_videos( channel_id, - Params::Search, + ChannelTab::Search, Some(query.as_ref()), "channel_search", ) @@ -118,7 +155,7 @@ impl RustyPipeQuery { let request_body = QChannel { context, browse_id: channel_id, - params: Params::Playlists, + params: ChannelTab::Playlists, query: None, }; @@ -142,7 +179,7 @@ impl RustyPipeQuery { let request_body = QChannel { context, browse_id: channel_id, - params: Params::Info, + params: ChannelTab::Info, query: None, }; @@ -451,16 +488,16 @@ fn map_channel_content( .or(tab.tab_renderer.content.section_list_renderer) }); - let content = match channel_content { - Some(list) => list.contents, - None => { - // YouTube may show the "Featured" tab if the requested tab is empty/does not exist - if featured_tab { - MapResult::default() - } else { - return Err(ExtractionError::InvalidData(Cow::Borrowed( - "could not extract content", - ))); + // YouTube may show the "Featured" tab if the requested tab is empty/does not exist + let content = if featured_tab { + MapResult::default() + } else { + match channel_content { + Some(list) => list.contents, + None => { + return Err(ExtractionError::InvalidData( + "could not extract content".into(), + )) } } }; @@ -495,6 +532,47 @@ fn combine_channel_data(channel_data: Channel<()>, content: T) -> Channel } } +/// Get the continuation token to fetch channel videos in the given order +fn order_ctoken(channel_id: &str, tab: ChannelVideoTab, order: ChannelOrder) -> String { + _order_ctoken( + channel_id, + tab, + order, + &format!("\n${}", util::random_uuid()), + ) +} + +/// Get the continuation token to fetch channel videos in the given order +/// (fixed targetId for testing) +fn _order_ctoken( + channel_id: &str, + tab: ChannelVideoTab, + order: ChannelOrder, + target_id: &str, +) -> String { + let mut pb_tab = ProtoBuilder::new(); + pb_tab.string(2, target_id); + pb_tab.varint(3, order as u64); + + let mut pb_3 = ProtoBuilder::new(); + pb_3.embedded(tab.order_ctoken_id(), pb_tab); + + let mut pb_110 = ProtoBuilder::new(); + pb_110.embedded(3, pb_3); + + let mut pbi = ProtoBuilder::new(); + pbi.embedded(110, pb_110); + + let mut pb_80226972 = ProtoBuilder::new(); + pb_80226972.string(2, channel_id); + pb_80226972.string(3, &pbi.to_base64()); + + let mut pb = ProtoBuilder::new(); + pb.embedded(80226972, pb_80226972); + + pb.to_base64() +} + #[cfg(test)] mod tests { use std::{fs::File, io::BufReader}; @@ -505,11 +583,13 @@ mod tests { use crate::{ client::{response, MapResponse}, model::{paginator::Paginator, Channel, ChannelInfo, PlaylistItem, VideoItem}, - param::Language, + param::{ChannelOrder, ChannelVideoTab, Language}, serializer::MapResult, util::tests::TESTFILES, }; + use super::_order_ctoken; + #[rstest] #[case::base("videos_base", "UC2DjFE7Xf11URZqWBigcVOQ")] #[case::music("videos_music", "UC_vmjW5e1xEHhYjY2a0kK1A")] @@ -585,4 +665,33 @@ mod tests { ); insta::assert_ron_snapshot!("map_channel_info", map_res.c); } + + #[test] + fn order_ctoken() { + let channel_id = "UCXuqSBlHAE6Xw-yeJA0Tunw"; + + let videos_popular_token = _order_ctoken( + channel_id, + ChannelVideoTab::Videos, + ChannelOrder::Popular, + "\n$6461d7c8-0000-2040-87aa-089e0827e420", + ); + assert_eq!(videos_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXg2S2hJbUNpUTJORFl4WkRkak9DMHdNREF3TFRJd05EQXRPRGRoWVMwd09EbGxNRGd5TjJVME1qQVlBZyUzRCUzRA%3D%3D"); + + let shorts_popular_token = _order_ctoken( + channel_id, + ChannelVideoTab::Shorts, + ChannelOrder::Popular, + "\n$64679ffb-0000-26b3-a1bd-582429d2c794", + ); + assert_eq!(shorts_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXhTS2hJbUNpUTJORFkzT1dabVlpMHdNREF3TFRJMllqTXRZVEZpWkMwMU9ESTBNamxrTW1NM09UUVlBZyUzRCUzRA%3D%3D"); + + let live_popular_token = _order_ctoken( + channel_id, + ChannelVideoTab::Live, + ChannelOrder::Popular, + "\n$64693069-0000-2a1e-8c7d-582429bd5ba8", + ); + assert_eq!(live_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXh5S2hJbUNpUTJORFk1TXpBMk9TMHdNREF3TFRKaE1XVXRPR00zWkMwMU9ESTBNamxpWkRWaVlUZ1lBZyUzRCUzRA%3D%3D"); + } } diff --git a/src/client/mod.rs b/src/client/mod.rs index d76f5b5..edc130e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -191,6 +191,7 @@ const CONSENT_COOKIE_YES: &str = "YES+yt.462272069.de+FX+"; const YOUTUBEI_V1_URL: &str = "https://www.youtube.com/youtubei/v1/"; const YOUTUBEI_V1_GAPIS_URL: &str = "https://youtubei.googleapis.com/youtubei/v1/"; const YOUTUBE_MUSIC_V1_URL: &str = "https://music.youtube.com/youtubei/v1/"; +const YOUTUBE_HOME_URL: &str = "https://www.youtube.com/"; const YOUTUBE_MUSIC_HOME_URL: &str = "https://music.youtube.com/"; const DISABLE_PRETTY_PRINT_PARAMETER: &str = "&prettyPrint=false"; @@ -644,7 +645,7 @@ impl RustyPipe { self.extract_client_version( Some("https://www.youtube.com/sw.js"), "https://www.youtube.com/results?search_query=", - "https://www.youtube.com", + YOUTUBE_HOME_URL, None, ) .await @@ -654,8 +655,8 @@ impl RustyPipe { async fn extract_music_client_version(&self) -> Result { self.extract_client_version( Some("https://music.youtube.com/sw.js"), - "https://music.youtube.com", - "https://music.youtube.com", + YOUTUBE_MUSIC_HOME_URL, + YOUTUBE_MUSIC_HOME_URL, None, ) .await @@ -812,7 +813,7 @@ impl RustyPipe { } } - async fn get_ytm_visitor_data(&self) -> Result { + async fn get_visitor_data(&self) -> Result { log::debug!("getting YTM visitor data"); let resp = self.inner.http.get(YOUTUBE_MUSIC_HOME_URL).send().await?; @@ -903,7 +904,7 @@ impl RustyPipeQuery { client_name: "WEB", client_version: Cow::Owned(self.client.get_desktop_client_version().await), platform: "DESKTOP", - original_url: Some("https://www.youtube.com/"), + original_url: Some(YOUTUBE_HOME_URL), visitor_data, hl, gl, @@ -918,7 +919,7 @@ impl RustyPipeQuery { client_name: "WEB_REMIX", client_version: Cow::Owned(self.client.get_music_client_version().await), platform: "DESKTOP", - original_url: Some("https://music.youtube.com/"), + original_url: Some(YOUTUBE_MUSIC_HOME_URL), visitor_data, hl, gl, @@ -942,7 +943,7 @@ impl RustyPipeQuery { request: Some(RequestYT::default()), user: User::default(), third_party: Some(ThirdParty { - embed_url: "https://www.youtube.com/", + embed_url: YOUTUBE_HOME_URL, }), }, ClientType::Android => YTContext { @@ -993,8 +994,8 @@ impl RustyPipeQuery { .post(format!( "{YOUTUBEI_V1_URL}{endpoint}?key={DESKTOP_API_KEY}{DISABLE_PRETTY_PRINT_PARAMETER}" )) - .header(header::ORIGIN, "https://www.youtube.com") - .header(header::REFERER, "https://www.youtube.com") + .header(header::ORIGIN, YOUTUBE_HOME_URL) + .header(header::REFERER, YOUTUBE_HOME_URL) .header(header::COOKIE, self.client.inner.consent_cookie.to_owned()) .header("X-YouTube-Client-Name", "1") .header( @@ -1008,8 +1009,8 @@ impl RustyPipeQuery { .post(format!( "{YOUTUBE_MUSIC_V1_URL}{endpoint}?key={DESKTOP_MUSIC_API_KEY}{DISABLE_PRETTY_PRINT_PARAMETER}" )) - .header(header::ORIGIN, "https://music.youtube.com") - .header(header::REFERER, "https://music.youtube.com") + .header(header::ORIGIN, YOUTUBE_MUSIC_HOME_URL) + .header(header::REFERER, YOUTUBE_MUSIC_HOME_URL) .header(header::COOKIE, self.client.inner.consent_cookie.to_owned()) .header("X-YouTube-Client-Name", "67") .header( @@ -1023,8 +1024,8 @@ impl RustyPipeQuery { .post(format!( "{YOUTUBEI_V1_URL}{endpoint}?key={DESKTOP_API_KEY}{DISABLE_PRETTY_PRINT_PARAMETER}" )) - .header(header::ORIGIN, "https://www.youtube.com") - .header(header::REFERER, "https://www.youtube.com") + .header(header::ORIGIN, YOUTUBE_HOME_URL) + .header(header::REFERER, YOUTUBE_HOME_URL) .header("X-YouTube-Client-Name", "1") .header("X-YouTube-Client-Version", TVHTML5_CLIENT_VERSION), ClientType::Android => self @@ -1060,11 +1061,11 @@ impl RustyPipeQuery { } } - /// Get a YouTube Music visitor data cookie, which is necessary for certain requests - async fn get_ytm_visitor_data(&self) -> Result { + /// Get a YouTube visitor data cookie, which is necessary for certain requests + async fn get_visitor_data(&self) -> Result { match &self.opts.visitor_data { Some(vd) => Ok(vd.to_owned()), - None => self.client.get_ytm_visitor_data().await, + None => self.client.get_visitor_data().await, } } @@ -1304,9 +1305,9 @@ mod tests { } #[test] - fn t_get_ytm_visitor_data() { + fn t_get_visitor_data() { let rp = RustyPipe::new(); - let visitor_data = tokio_test::block_on(rp.get_ytm_visitor_data()).unwrap(); + let visitor_data = tokio_test::block_on(rp.get_visitor_data()).unwrap(); assert!(visitor_data.ends_with("%3D")); assert_eq!(visitor_data.len(), 32) } diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index 2c8ae8a..8724dd0 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -27,7 +27,7 @@ impl RustyPipeQuery { ) -> Result { let artist_id = artist_id.as_ref(); let visitor_data = match all_albums { - true => Some(self.get_ytm_visitor_data().await?), + true => Some(self.get_visitor_data().await?), false => None, }; diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 0d35eae..342675c 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -109,7 +109,7 @@ impl RustyPipeQuery { radio_id: S, ) -> Result, Error> { let radio_id = radio_id.as_ref(); - let visitor_data = self.get_ytm_visitor_data().await?; + let visitor_data = self.get_visitor_data().await?; let context = self .get_context(ClientType::DesktopMusic, true, Some(&visitor_data)) .await; diff --git a/src/client/pagination.rs b/src/client/pagination.rs index bfb07cd..6874a21 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -102,8 +102,12 @@ impl MapResponse> for response::Continuation { .and_then(|actions| { actions .into_iter() - .next() .map(|action| action.append_continuation_items_action.continuation_items) + .reduce(|mut acc, mut items| { + acc.c.append(&mut items.c); + acc.warnings.append(&mut items.warnings); + acc + }) }) .or_else(|| { self.continuation_contents diff --git a/src/client/player.rs b/src/client/player.rs index 367821b..da1bc0d 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -492,8 +492,6 @@ fn map_audio_stream( deobf: &Deobfuscator, last_nsig: &mut [String; 2], ) -> MapResult> { - static LANG_PATTERN: Lazy = Lazy::new(|| Regex::new(r#"^([a-z]{2,3})\."#).unwrap()); - let (mtype, codecs) = match parse_mime(&f.mime_type) { Some(x) => x, None => { @@ -535,18 +533,12 @@ fn map_audio_stream( loudness_db: f.loudness_db, throttled, track: match f.audio_track { - Some(t) => { - let lang = LANG_PATTERN - .captures(&t.id) - .map(|m| m.get(1).unwrap().as_str().to_owned()); - - Some(AudioTrack { - id: t.id, - lang, - lang_name: t.display_name, - is_default: t.audio_is_default, - }) - } + Some(t) => Some(AudioTrack { + lang: t.id.split('.').next().map(str::to_owned), + id: t.id, + lang_name: t.display_name, + is_default: t.audio_is_default, + }), None => None, }, }), diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index b321dcc..a682f95 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -219,6 +219,7 @@ pub(crate) struct Continuation { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct ContinuationActionWrap { + #[serde(alias = "reloadContinuationItemsCommand")] pub append_continuation_items_action: ContinuationAction, } diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index b812f2d..dba27be 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -1,5 +1,3 @@ -use once_cell::sync::Lazy; -use regex::Regex; use serde::Deserialize; use serde_with::{ json::JsonString, rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError, @@ -430,11 +428,17 @@ impl YouTubeListMapper { } fn map_video(&mut self, video: VideoRenderer) -> VideoItem { - let mut tn_overlays = video.thumbnail_overlays; + let is_live = video.thumbnail_overlays.is_live() || video.badges.is_live(); + let is_short = video.thumbnail_overlays.is_short(); + let length_text = video.length_text.or_else(|| { - tn_overlays - .try_swap_remove(0) - .map(|overlay| overlay.thumbnail_overlay_time_status_renderer.text) + video + .thumbnail_overlays + .into_iter() + .find(|ol| { + ol.thumbnail_overlay_time_status_renderer.style == TimeOverlayStyle::Default + }) + .map(|ol| ol.thumbnail_overlay_time_status_renderer.text) }); VideoItem { @@ -472,8 +476,8 @@ impl YouTubeListMapper { view_count: video .view_count_text .map(|txt| util::parse_numeric(&txt).unwrap_or_default()), - is_live: tn_overlays.is_live() || video.badges.is_live(), - is_short: tn_overlays.is_short(), + is_live, + is_short, is_upcoming: video.upcoming_event_data.is_some(), short_description: video .detailed_metadata_snippets @@ -483,9 +487,6 @@ impl YouTubeListMapper { } fn map_short_video(&mut self, video: ReelItemRenderer, lang: Language) -> VideoItem { - static ACCESSIBILITY_SEP_REGEX: Lazy = - Lazy::new(|| Regex::new(" [-\u{2013}] ").unwrap()); - let pub_date_txt = video.navigation_endpoint.map(|n| { n.reel_watch_endpoint .overlay @@ -499,7 +500,7 @@ impl YouTubeListMapper { id: video.video_id, name: video.headline, length: video.accessibility.and_then(|acc| { - ACCESSIBILITY_SEP_REGEX.split(&acc).nth(1).and_then(|s| { + acc.rsplit(" - ").nth(1).and_then(|s| { timeago::parse_video_duration_or_warn(self.lang, s, &mut self.warnings) }) }), diff --git a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_live.snap b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_live.snap index 835d9ff..834d87c 100644 --- a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_live.snap +++ b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_live.snap @@ -168,7 +168,7 @@ Channel( publish_date: "[date]", publish_date_txt: None, view_count: Some(94), - is_live: false, + is_live: true, is_short: false, is_upcoming: false, short_description: None, @@ -209,7 +209,7 @@ Channel( publish_date: "[date]", publish_date_txt: None, view_count: Some(381), - is_live: false, + is_live: true, is_short: false, is_upcoming: false, short_description: None, @@ -414,7 +414,7 @@ Channel( publish_date: "[date]", publish_date_txt: None, view_count: Some(2043), - is_live: false, + is_live: true, is_short: false, is_upcoming: false, short_description: None, @@ -783,7 +783,7 @@ Channel( publish_date: "[date]", publish_date_txt: None, view_count: Some(4030), - is_live: false, + is_live: true, is_short: false, is_upcoming: false, short_description: None, diff --git a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_shorts.snap b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_shorts.snap index 9912aec..0f8a1cb 100644 --- a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_shorts.snap +++ b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_videos_shorts.snap @@ -141,7 +141,7 @@ Channel( publish_date_txt: Some("1 day ago"), view_count: Some(443549), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -167,7 +167,7 @@ Channel( publish_date_txt: Some("2 days ago"), view_count: Some(1154962), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -234,7 +234,7 @@ Channel( publish_date_txt: Some("6 days ago"), view_count: Some(1388173), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -260,7 +260,7 @@ Channel( publish_date_txt: Some("7 days ago"), view_count: Some(1738301), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -286,7 +286,7 @@ Channel( publish_date_txt: Some("9 days ago"), view_count: Some(1316594), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -353,7 +353,7 @@ Channel( publish_date_txt: Some("11 days ago"), view_count: Some(1412213), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -379,7 +379,7 @@ Channel( publish_date_txt: Some("13 days ago"), view_count: Some(1513305), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -405,7 +405,7 @@ Channel( publish_date_txt: Some("2 weeks ago"), view_count: Some(8936223), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -472,7 +472,7 @@ Channel( publish_date_txt: Some("2 weeks ago"), view_count: Some(2769717), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -539,7 +539,7 @@ Channel( publish_date_txt: Some("3 weeks ago"), view_count: Some(572107), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -565,7 +565,7 @@ Channel( publish_date_txt: Some("3 weeks ago"), view_count: Some(1707132), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -591,7 +591,7 @@ Channel( publish_date_txt: Some("3 weeks ago"), view_count: Some(933094), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -617,7 +617,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(5985184), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -643,7 +643,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(14741387), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -669,7 +669,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(2511322), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -695,7 +695,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(2364408), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -762,7 +762,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(1947627), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -788,7 +788,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(4763839), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -814,7 +814,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(1915695), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -840,7 +840,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(7268944), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -866,7 +866,7 @@ Channel( publish_date_txt: Some("1 month ago"), view_count: Some(2539103), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -892,7 +892,7 @@ Channel( publish_date_txt: Some("2 months ago"), view_count: Some(5545680), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -918,7 +918,7 @@ Channel( publish_date_txt: Some("2 months ago"), view_count: Some(2202314), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), @@ -985,7 +985,7 @@ Channel( publish_date_txt: Some("2 months ago"), view_count: Some(6443699), is_live: false, - is_short: false, + is_short: true, is_upcoming: false, short_description: None, ), diff --git a/src/model/mod.rs b/src/model/mod.rs index 9d60374..1632333 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -850,7 +850,7 @@ pub struct VideoItem { pub publish_date: Option, /// Textual video publish date (e.g. `11 months ago`, depends on language) /// - /// Is [`None`] for livestreams. + /// Is [`None`] for livestreams and upcoming videos. pub publish_date_txt: Option, /// View count /// diff --git a/src/model/paginator.rs b/src/model/paginator.rs index 6ca5790..2139ade 100644 --- a/src/model/paginator.rs +++ b/src/model/paginator.rs @@ -34,7 +34,7 @@ pub struct Paginator { #[serde(skip_serializing_if = "Option::is_none")] pub visitor_data: Option, /// YouTube API endpoint to fetch continuations from - pub(crate) endpoint: ContinuationEndpoint, + pub endpoint: ContinuationEndpoint, } impl Default for Paginator { diff --git a/src/param/mod.rs b/src/param/mod.rs index a3f4708..804c7d8 100644 --- a/src/param/mod.rs +++ b/src/param/mod.rs @@ -7,3 +7,34 @@ pub mod search_filter; pub use locale::{Country, Language}; pub use stream_filter::StreamFilter; + +/// Channel video tab +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ChannelVideoTab { + /// Regular videos + Videos, + /// Short videos + Shorts, + /// Livestreams + Live, +} + +/// Sort order for channel videos +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ChannelOrder { + /// Order videos with the latest upload date first (default) + Latest = 1, + /// Order videos with the highest number of views first + Popular = 2, +} + +impl ChannelVideoTab { + /// Get the tab ID used to create ordered continuation tokens + pub(crate) const fn order_ctoken_id(&self) -> u32 { + match self { + ChannelVideoTab::Videos => 15, + ChannelVideoTab::Shorts => 10, + ChannelVideoTab::Live => 14, + } + } +} diff --git a/src/param/search_filter.rs b/src/param/search_filter.rs index 84a8034..489ae63 100644 --- a/src/param/search_filter.rs +++ b/src/param/search_filter.rs @@ -2,7 +2,7 @@ use std::collections::BTreeSet; -use crate::util::{self, ProtoBuilder}; +use crate::util::ProtoBuilder; /// YouTube search filter /// @@ -200,8 +200,7 @@ impl SearchFilter { pb.embedded(8, extras) } - let b64 = util::b64_encode(pb.bytes); - urlencoding::encode(&b64).to_string() + pb.to_base64() } } diff --git a/src/util/mod.rs b/src/util/mod.rs index a91375f..e794681 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -83,6 +83,18 @@ pub fn generate_content_playback_nonce() -> String { random_string(CONTENT_PLAYBACK_NONCE_ALPHABET, 16) } +pub fn random_uuid() -> String { + let mut rng = rand::thread_rng(); + format!( + "{:08x}-{:04x}-{:04x}-{:04x}-{:012x}", + rng.gen::(), + rng.gen::(), + rng.gen::(), + rng.gen::(), + rng.gen::() & 0xffffffffffff, + ) +} + /// Split an URL into its base string and parameter map /// /// Example: diff --git a/src/util/protobuf.rs b/src/util/protobuf.rs index 64488ac..8c1b0d6 100644 --- a/src/util/protobuf.rs +++ b/src/util/protobuf.rs @@ -45,6 +45,13 @@ impl ProtoBuilder { self._varint(val); } + /// Write a string field + pub fn string(&mut self, field: u32, string: &str) { + self._field(field, 2); + self._varint(string.len() as u64); + self.bytes.extend_from_slice(string.as_bytes()); + } + /// Write an embedded message /// /// Requires passing another [`ProtoBuilder`] with the embedded message. @@ -53,6 +60,12 @@ impl ProtoBuilder { self._varint(pb.bytes.len() as u64); self.bytes.append(&mut pb.bytes); } + + /// Base64 + urlencode the protobuf data + pub fn to_base64(&self) -> String { + let b64 = super::b64_encode(&self.bytes); + urlencoding::encode(&b64).to_string() + } } fn parse_varint>(pb: &mut P) -> Option { @@ -124,11 +137,6 @@ mod tests { use super::*; - // #[test] - // fn t_parse_varint() { - - // } - #[test] fn t_parse_proto() { let p = "GhhVQzl2cnZOU0wzeGNXR1NrVjg2UkVCU2c%3D"; diff --git a/tests/youtube.rs b/tests/youtube.rs index 928206d..fd2f368 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use rstest::{fixture, rstest}; use rustypipe::model::paginator::ContinuationEndpoint; -use rustypipe::param::Language; +use rustypipe::param::{ChannelOrder, ChannelVideoTab, Language}; use rustypipe::validate; use time::macros::date; use time::OffsetDateTime; @@ -261,15 +261,10 @@ fn get_player( let langs = player_data .audio_streams .iter() - .filter_map(|stream| { - stream - .track - .as_ref() - .map(|t| t.lang.as_ref().unwrap().to_owned()) - }) + .filter_map(|stream| stream.track.as_ref().map(|t| t.lang.as_deref().unwrap())) .collect::>(); - for l in ["en", "es", "fr", "pt", "ru"] { + for l in ["en-US", "es", "fr", "pt", "ru"] { assert!(langs.contains(l), "missing lang: {l}"); } } @@ -779,8 +774,11 @@ fn channel_videos(rp: RustyPipe) { #[rstest] fn channel_shorts(rp: RustyPipe) { - let channel = - tokio_test::block_on(rp.query().channel_shorts("UCh8gHdtzO2tXd593_bjErWg")).unwrap(); + let channel = tokio_test::block_on( + rp.query() + .channel_videos_tab("UCh8gHdtzO2tXd593_bjErWg", ChannelVideoTab::Shorts), + ) + .unwrap(); // dbg!(&channel); assert_eq!(channel.id, "UCh8gHdtzO2tXd593_bjErWg"); @@ -809,8 +807,11 @@ fn channel_shorts(rp: RustyPipe) { #[rstest] fn channel_livestreams(rp: RustyPipe) { - let channel = - tokio_test::block_on(rp.query().channel_livestreams("UC2DjFE7Xf11URZqWBigcVOQ")).unwrap(); + let channel = tokio_test::block_on( + rp.query() + .channel_videos_tab("UC2DjFE7Xf11URZqWBigcVOQ", ChannelVideoTab::Live), + ) + .unwrap(); // dbg!(&channel); assert_channel_eevblog(&channel); @@ -955,6 +956,63 @@ fn channel_more( assert_channel(&channel_info, id, name, unlocalized || name_unlocalized); } +#[rstest] +#[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "XqZsoesa55w")] +#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] +#[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "ojes5ULOqhc")] +fn channel_order( + #[case] id: &str, + #[case] tab: ChannelVideoTab, + #[case] most_popular: &str, + rp: RustyPipe, +) { + let latest = tokio_test::block_on(rp.query().channel_videos_tab_order( + id, + tab, + ChannelOrder::Latest, + )) + .unwrap(); + // Upload dates should be in descending order + if tab != ChannelVideoTab::Shorts { + let mut latest_items = latest.items.iter().peekable(); + while let (Some(v), Some(next_v)) = (latest_items.next(), latest_items.peek()) { + if !v.is_upcoming && !v.is_live && !next_v.is_upcoming && !next_v.is_live { + assert_gte( + v.publish_date.unwrap(), + next_v.publish_date.unwrap(), + "latest video date", + ); + } + } + } + assert_next(latest, rp.query(), 15, 2); + + let popular = tokio_test::block_on(rp.query().channel_videos_tab_order( + id, + tab, + ChannelOrder::Popular, + )) + .unwrap(); + // Most popular video should be in top 5 + assert!( + popular.items.iter().take(5).any(|v| v.id == most_popular), + "most popular video {most_popular} not found" + ); + + // View counts should be in descending order + if tab != ChannelVideoTab::Shorts { + let mut popular_items = popular.items.iter().peekable(); + while let (Some(v), Some(next_v)) = (popular_items.next(), popular_items.peek()) { + assert_gte( + v.view_count.unwrap(), + next_v.view_count.unwrap(), + "most popular view count", + ); + } + } + assert_next(popular, rp.query(), 15, 2); +} + #[rstest] #[case::not_exist("UCOpNcN46UbXVtpKMrmU4Abx")] #[case::gaming("UCOpNcN46UbXVtpKMrmU4Abg")] @@ -972,6 +1030,19 @@ fn channel_not_found(#[case] id: &str, rp: RustyPipe) { ); } +#[rstest] +#[case::shorts(ChannelVideoTab::Shorts)] +#[case::live(ChannelVideoTab::Live)] +fn channel_tab_not_found(#[case] tab: ChannelVideoTab, rp: RustyPipe) { + let channel = tokio_test::block_on( + rp.query() + .channel_videos_tab("UCGiJh0NZ52wRhYKYnuZI08Q", tab), + ) + .unwrap(); + + assert!(channel.content.is_empty(), "got: {:?}", channel.content); +} + //#CHANNEL_RSS #[cfg(feature = "rss")] @@ -2240,7 +2311,7 @@ fn assert_approx(left: f64, right: f64) { /// Assert that number A is greater than or equal to number B fn assert_gte(a: T, b: T, msg: &str) { - assert!(a >= b, "expected {b} {msg}, got {a}"); + assert!(a >= b, "expected >= {b} {msg}, got {a}"); } /// Assert that the paginator produces at least n pages From 86775ea95b79549e36ffcff13fd96b48c3b0bba2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 11 May 2023 16:00:29 +0200 Subject: [PATCH 3/6] feat: add audio track types --- Cargo.toml | 1 + codegen/src/gen_locales.rs | 36 +- src/client/player.rs | 89 +- src/error.rs | 6 + src/model/mod.rs | 25 +- src/param/locale.rs | 36 +- src/param/stream_filter.rs | 14 +- testfiles/player_model/multilanguage.json | 1643 +++++++++++++++++---- tests/youtube.rs | 29 +- 9 files changed, 1480 insertions(+), 399 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a1ac42a..8532046 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ serde_with = { version = "3.0.0", default-features = false, features = [ "macros", "json", ] } +serde_plain = "1.0.1" rand = "0.8.5" time = { version = "0.3.15", features = [ "macros", diff --git a/codegen/src/gen_locales.rs b/codegen/src/gen_locales.rs index 2762693..bcdeb70 100644 --- a/codegen/src/gen_locales.rs +++ b/codegen/src/gen_locales.rs @@ -145,40 +145,16 @@ pub async fn generate_locales() { //! Languages and countries -use std::{fmt::Display, str::FromStr}; - use serde::{Deserialize, Serialize}; + +use crate::error::Error; "#; - let code_foot = r#"impl Display for Language { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str( - &serde_json::to_string(self).map_or("".to_owned(), |s| s[1..s.len() - 1].to_owned()), - ) - } -} + let code_foot = r#"serde_plain::derive_fromstr_from_deserialize!(Language, Error); +serde_plain::derive_display_from_serialize!(Language); -impl Display for Country { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str( - &serde_json::to_string(self).map_or("".to_owned(), |s| s[1..s.len() - 1].to_owned()), - ) - } -} - -impl FromStr for Language { - type Err = serde_json::Error; - fn from_str(s: &str) -> Result { - serde_json::from_str(&format!("\"{}\"", s)) - } -} - -impl FromStr for Country { - type Err = serde_json::Error; - fn from_str(s: &str) -> Result { - serde_json::from_str(&format!("\"{}\"", s)) - } -} +serde_plain::derive_fromstr_from_deserialize!(Country, Error); +serde_plain::derive_display_from_serialize!(Country); "#; let mut code_langs = r#"/// Available languages diff --git a/src/client/player.rs b/src/client/player.rs index da1bc0d..fe28dca 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -377,12 +377,18 @@ fn deobf_nsig( Ok(()) } +struct UrlMapRes { + url: String, + throttled: bool, + xtags: Option, +} + fn map_url( url: &Option, signature_cipher: &Option, deobf: &Deobfuscator, last_nsig: &mut [String; 2], -) -> MapResult> { +) -> MapResult> { let x = match url { Some(url) => util::url_to_params(url).map_err(|_| format!("Could not parse url `{url}`")), None => match signature_cipher { @@ -414,7 +420,11 @@ fn map_url( match Url::parse_with_params(url_base.as_str(), url_params.iter()) { Ok(url) => MapResult { - c: Some((url.to_string(), throttled)), + c: Some(UrlMapRes { + url: url.to_string(), + throttled, + xtags: url_params.get("xtags").cloned(), + }), warnings, }, Err(_) => MapResult { @@ -455,9 +465,9 @@ fn map_video_stream( let map_res = map_url(&f.url, &f.signature_cipher, deobf, last_nsig); match map_res.c { - Some((url, throttled)) => MapResult { + Some(url) => MapResult { c: Some(VideoStream { - url, + url: url.url, itag: f.itag, bitrate: f.bitrate, average_bitrate: f.average_bitrate.unwrap_or(f.bitrate), @@ -476,7 +486,7 @@ fn map_video_stream( mime: f.mime_type.to_owned(), format, codec: get_video_codec(codecs), - throttled, + throttled: url.throttled, }), warnings: map_res.warnings, }, @@ -514,11 +524,12 @@ fn map_audio_stream( } }; let map_res = map_url(&f.url, &f.signature_cipher, deobf, last_nsig); + let mut warnings = map_res.warnings; match map_res.c { - Some((url, throttled)) => MapResult { + Some(url) => MapResult { c: Some(AudioStream { - url, + url: url.url, itag: f.itag, bitrate: f.bitrate, average_bitrate: f.average_bitrate.unwrap_or(f.bitrate), @@ -531,23 +542,14 @@ fn map_audio_stream( codec: get_audio_codec(codecs), channels: f.audio_channels, loudness_db: f.loudness_db, - throttled, - track: match f.audio_track { - Some(t) => Some(AudioTrack { - lang: t.id.split('.').next().map(str::to_owned), - id: t.id, - lang_name: t.display_name, - is_default: t.audio_is_default, - }), - None => None, - }, + throttled: url.throttled, + track: f + .audio_track + .map(|t| map_audio_track(t, url.xtags, &mut warnings)), }), - warnings: map_res.warnings, - }, - None => MapResult { - c: None, - warnings: map_res.warnings, + warnings, }, + None => MapResult { c: None, warnings }, } } @@ -610,6 +612,43 @@ fn get_audio_codec(codecs: Vec<&str>) -> AudioCodec { AudioCodec::Unknown } +fn map_audio_track( + track: response::player::AudioTrack, + xtags: Option, + warnings: &mut Vec, +) -> AudioTrack { + let mut lang = None; + let mut track_type = None; + + if let Some(xtags) = xtags { + xtags + .split(':') + .filter_map(|param| param.split_once('=')) + .for_each(|(k, v)| match k { + "lang" => { + lang = Some(v.to_owned()); + } + "acont" => match serde_plain::from_str(v) { + Ok(v) => { + track_type = Some(v); + } + Err(_) => { + warnings.push(format!("could not parse audio track type `{v}`")); + } + }, + _ => {} + }) + } + + AudioTrack { + id: track.id, + lang, + lang_name: track.display_name, + is_default: track.audio_is_default, + track_type, + } +} + #[cfg(test)] mod tests { use std::{fs::File, io::BufReader}; @@ -674,10 +713,10 @@ mod tests { &deobf, &mut last_nsig, ); - let (url, throttled) = map_res.c.unwrap(); + let url = map_res.c.unwrap(); - assert_eq!(url, "https://rr5---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=3781277&dur=229.301&ei=vb7nYvH5BMK8gAfBj7ToBQ&expire=1659376413&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-AB_BABwrXZJN428ZwDxq5ScPn2AbcGODnRlTVhCQ3mj2&initcwndbps=1588750&ip=2003%3Ade%3Aaf06%3A6300%3Ac750%3A1b77%3Ac74a%3A80e3&itag=251&keepalive=yes&lmt=1655510291473933&lsig=AG3C_xAwRQIgCKCGJ1iu4wlaGXy3jcJyU3inh9dr1FIfqYOZEG_MdmACIQCbungkQYFk7EhD6K2YvLaHFMjKOFWjw001_tLb0lPDtg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=hH&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5ednsl&ms=au%2Conr&mt=1659354538&mv=m&mvi=5&n=XzXGSfGusw6OCQ&ns=b_Mq_qlTFcSGlG9RpwpM9xQH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAPIsKd7-xi4xVHEC9gb__dU4hzfzsHEj9ytd3nt0gEceAiACJWBcw-wFEq9qir35bwKHJZxtQ9mOL7SKiVkLQNDa6A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khi831z8dTejFIRCvCEwx_6romtM&txp=4532434&vprv=1"); - assert!(!throttled); + assert_eq!(url.url, "https://rr5---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=3781277&dur=229.301&ei=vb7nYvH5BMK8gAfBj7ToBQ&expire=1659376413&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-AB_BABwrXZJN428ZwDxq5ScPn2AbcGODnRlTVhCQ3mj2&initcwndbps=1588750&ip=2003%3Ade%3Aaf06%3A6300%3Ac750%3A1b77%3Ac74a%3A80e3&itag=251&keepalive=yes&lmt=1655510291473933&lsig=AG3C_xAwRQIgCKCGJ1iu4wlaGXy3jcJyU3inh9dr1FIfqYOZEG_MdmACIQCbungkQYFk7EhD6K2YvLaHFMjKOFWjw001_tLb0lPDtg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=hH&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5ednsl&ms=au%2Conr&mt=1659354538&mv=m&mvi=5&n=XzXGSfGusw6OCQ&ns=b_Mq_qlTFcSGlG9RpwpM9xQH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAPIsKd7-xi4xVHEC9gb__dU4hzfzsHEj9ytd3nt0gEceAiACJWBcw-wFEq9qir35bwKHJZxtQ9mOL7SKiVkLQNDa6A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khi831z8dTejFIRCvCEwx_6romtM&txp=4532434&vprv=1"); + assert!(!url.throttled); assert!( map_res.warnings.is_empty(), "deserialization/mapping warnings: {:?}", diff --git a/src/error.rs b/src/error.rs index a5b4cc2..5e10d31 100644 --- a/src/error.rs +++ b/src/error.rs @@ -171,6 +171,12 @@ impl From for Error { } } +impl From for Error { + fn from(value: serde_plain::Error) -> Self { + Self::Other(value.to_string().into()) + } +} + impl ExtractionError { pub(crate) fn should_report(&self) -> bool { matches!( diff --git a/src/model/mod.rs b/src/model/mod.rs index 1632333..8b73556 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -342,14 +342,14 @@ pub enum VideoFormat { pub struct AudioTrack { /// Track ID (e.g. `en.0`) pub id: String, - /// 2/3 letter language code (e.g. `en`) - /// - /// Extracted from the track ID + /// Language code (e.g. `en-US`, `de`) pub lang: Option, /// Language name (e.g. "English") pub lang_name: String, /// True if this is the default audio track pub is_default: bool, + /// Audio track type (e.g. *Original*, *Dubbed*) + pub track_type: Option, } /// Audio file type @@ -363,6 +363,25 @@ pub enum AudioFormat { Webm, } +/// Audio track type +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[serde(rename_all = "snake_case")] +#[non_exhaustive] +pub enum AudioTrackType { + /// An original audio track of the video + Original, + /// An audio track with the original voices replaced, typically in a different language + Dubbed, + /// A descriptive audio track + /// + /// A descriptive audio track is an audio track in which descriptions of visual elements of + /// a video are added to the original audio, with the goal to make a video more accessible to + /// blind and visually impaired people. + /// + /// See + Descriptive, +} + /// YouTube provides subtitles in different formats. /// /// srv1 (XML) is the default format, to request a different format you have diff --git a/src/param/locale.rs b/src/param/locale.rs index 14cb41f..5ac8975 100644 --- a/src/param/locale.rs +++ b/src/param/locale.rs @@ -2,10 +2,10 @@ //! Languages and countries -use std::{fmt::Display, str::FromStr}; - use serde::{Deserialize, Serialize}; +use crate::error::Error; + /// Available languages #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] #[serde(rename_all = "lowercase")] @@ -829,32 +829,8 @@ impl Country { } } -impl Display for Language { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str( - &serde_json::to_string(self).map_or("".to_owned(), |s| s[1..s.len() - 1].to_owned()), - ) - } -} +serde_plain::derive_fromstr_from_deserialize!(Language, Error); +serde_plain::derive_display_from_serialize!(Language); -impl Display for Country { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str( - &serde_json::to_string(self).map_or("".to_owned(), |s| s[1..s.len() - 1].to_owned()), - ) - } -} - -impl FromStr for Language { - type Err = serde_json::Error; - fn from_str(s: &str) -> Result { - serde_json::from_str(&format!("\"{s}\"")) - } -} - -impl FromStr for Country { - type Err = serde_json::Error; - fn from_str(s: &str) -> Result { - serde_json::from_str(&format!("\"{s}\"")) - } -} +serde_plain::derive_fromstr_from_deserialize!(Country, Error); +serde_plain::derive_display_from_serialize!(Country); diff --git a/src/param/stream_filter.rs b/src/param/stream_filter.rs index dc178dd..f060b5b 100644 --- a/src/param/stream_filter.rs +++ b/src/param/stream_filter.rs @@ -352,13 +352,13 @@ mod tests { }); #[rstest] - #[case::default(StreamFilter::default(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104134&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767097097120&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgW4IxGJJFRAwZefvDdDkJfjhN7y3bPmh96BCFuyFn6pwCIQDW6pVnk_DwMC3FcZy5rXNUULMNWLdadScxwuhFTFR84g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] - #[case::bitrate(StreamFilter::default().audio_max_bitrate(100000).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217507&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767073159859&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgM9loLjlUtgwrALqSek4vO8KljcCltFjLw1TGX0d9lZ4CICRiTJ8a_KgdafXVo2vKwgLPuH2B7t0hF-ln2k_MI3ds&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] - #[case::m4a_format(StreamFilter::default().audio_formats(&[AudioFormat::M4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390628&dur=1012.691&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659766154827884&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgc8oxPEHDO0cgO3ZcbPmv3nrkzfy52WchpV0HcBcUw24CIEFxLKBcM4vVqGeRkt581dFL2tetvHd93SHCTVEUnIn_&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] - #[case::m4a_codec(StreamFilter::default().audio_codecs(&[AudioCodec::Mp4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390628&dur=1012.691&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659766154827884&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgc8oxPEHDO0cgO3ZcbPmv3nrkzfy52WchpV0HcBcUw24CIEFxLKBcM4vVqGeRkt581dFL2tetvHd93SHCTVEUnIn_&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] - #[case::french(StreamFilter::default().audio_language("fr").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16357630&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767033119964&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKtzVVyoS46hkuKX31EyUE6X6Q5wotcToOCnYKswX3x_AiB0G2SUdVoso39bYgewd3zT8Pf77DrVtahXh4kVb46T9g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dfr"))] - #[case::br_fallback(StreamFilter::default().audio_max_bitrate(0).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6297404&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767062297621&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAPm10DeIvOt5Oc7e36cfhPC0ej2PslQqF3-CFVUl5TNfAiEAlgvwjlQK14e_-6j3W_hMvk9KHax8zd5shSVlYSR1P34%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] - #[case::lang_fallback(StreamFilter::default().audio_language("xx").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104134&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767097097120&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgW4IxGJJFRAwZefvDdDkJfjhN7y3bPmh96BCFuyFn6pwCIQDW6pVnk_DwMC3FcZy5rXNUULMNWLdadScxwuhFTFR84g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den"))] + #[case::default(StreamFilter::default(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::bitrate(StreamFilter::default().audio_max_bitrate(100000).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217508&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683782195315620&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIga2iMQsToMxO7hTOx0gNAzhYoV1lL5PpE9lkAuBXt1nkCIQCuFuQXWNixIquEugtkT1C9khuKRP_C-wzSOiUmRp1DRg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::m4a_format(StreamFilter::default().audio_formats(&[AudioFormat::M4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::m4a_codec(StreamFilter::default().audio_codecs(&[AudioCodec::Mp4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::french(StreamFilter::default().audio_language("fr").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=940286&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774002236584&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIUUin7WZBnoVDb2p0wuTPc7HZwbF8I5sxzLrVN9WeBwAiBQTZwhxCQ1IdrUkkD1-cSGYBtMF1aKkjPZ-LWeie0aZA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr"))] + #[case::br_fallback(StreamFilter::default().audio_max_bitrate(0).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6306327&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683782187865292&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgW1DTCrLV_GyEM1rdjScgyceZE1llb73KJMFXmPm5Y04CIAYOLZuuzFX4ba5720kMOcQ1-Ld1DULs85nLxJglitCl&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::lang_fallback(StreamFilter::default().audio_language("xx").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] #[case::noformat(StreamFilter::default().audio_formats(&[]).to_owned(), None)] #[case::nocodec(StreamFilter::default().audio_codecs(&[]).to_owned(), None)] fn t_select_audio_stream(#[case] filter: StreamFilter, #[case] expect_url: Option<&str>) { diff --git a/testfiles/player_model/multilanguage.json b/testfiles/player_model/multilanguage.json index ddf8d58..ba8bde8 100644 --- a/testfiles/player_model/multilanguage.json +++ b/testfiles/player_model/multilanguage.json @@ -1,7 +1,7 @@ { "details": { "id": "tVWWp1PqDus", - "name": "100 Girls Vs 100 Boys For $500,000", + "name": "100 Boys Vs 100 Girls For $500,000", "description": "Giving away $25k on Current! Sign up and use my code “BEAST250” for a chance to win*: https://www.current.com/beast250\n\nSUBSCRIBE OR I TAKE YOUR DOG\n╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗\n║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣ \n╠╗║╚╝║║╠╗║╚╣║║║║║═╣\n╚═╩══╩═╩═╩═╩╝╚╩═╩═╝\n\n----------------------------------------------------------------\nfollow all of these or i will kick you\n• TikTok - https://www.tiktok.com/@mrbeast\n• Twitter - https://twitter.com/MrBeast\n• Instagram - https://www.instagram.com/mrbeast\n• Facebook - https://www.facebook.com/MrBeast6000/\n• Official Merch - https://www.shopmrbeast.com/\n• Beast Philanthropy - https://www.beastphilanthropy.org/\n\nText me @ +1 (917) 259-6364\nI'm Hiring! - https://www.mrbeastjobs.com/\nOrder a beast burger 🍔 - https://mrbeastburger.com\nChocolate 🍫 Win a Tesla or be in a MrBeast video - Buy now ▸ https://feastables.com\n-----------------------------------------------------------------—\n\nCurrent is a financial technology company, not a bank. Banking services provided by Choice Financial Group, Member FDIC. The Current Visa Debit Card is issued by Choice Financial Group pursuant to a license from Visa U.S.A. Inc. and may be used everywhere Visa debit cards are accepted.\n\n*NO PURCHASE OR PAYMENT NECESSARY TO ENTER OR WIN. Open to legal residents of the 50 U.S./D.C., age 18+ (19+ in AL and NE, 21+ in MS). Void outside the 50 U.S./D.C. and where prohibited. Sweepstakes starts at 12:00:01 AM ET on 7/9/22; ends at 11:59:59 PM ET on 10/9/22. Odds of winning will depend upon the number of eligible entries received. For full Official Rules and how to enter without becoming a Current member, visit https://www.current.com/beast250. Sponsor: Finco Services, Inc. d/b/a Current, 30 Cooper Square, Floor 4, New York, NY 10003.", "length": 1013, "thumbnail": [ @@ -31,22 +31,25 @@ "height": 1080 } ], - "channel": { "id": "UCX6OQ3DkcsbYNE6H8uQQuVA", "name": "MrBeast" }, - "publish_date": "2022-07-23T00:00:00Z", - "view_count": 71877575, + "channel": { + "id": "UCX6OQ3DkcsbYNE6H8uQQuVA", + "name": "MrBeast" + }, + "view_count": 136908834, "keywords": [], "is_live": false, "is_live_content": false }, "video_streams": [ { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=91654365&dur=1012.691&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=18&lmt=1659771857317964&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=_jyjH00dJBe7dg&ns=reEnGV5TXA4a46KeBfHlqJAH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgfPKHbo-nwvy2qfKM5toxUdYecumTWN0NUtHl_bhKzH4CIQC3uXom8W2XGgQ-Hhz2-81kezg4J28RdvBK3FI5gLet5A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4538434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=77073851&dur=1012.693&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=18&lmt=1683783187618995&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=jcptwbVfjmUWxQ&ns=1WzgXR-YoajDJVHVaMTvU9MN&pl=37&ratebypass=yes&requiressl=yes&sig=AOq0QJ8wRQIgeV0_N2s-9wI5GuXygB2NcAwoH7eyIZ0af6d-M6NkCOECIQC9ys-Y4JqPcI3aBT8J5crEET1nhmvjI0eGCAHks8M0hQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4530434&vprv=1", "itag": 18, - "bitrate": 724079, - "average_bitrate": 724046, - "size": 91654365, + "bitrate": 608891, + "average_bitrate": 608862, + "size": 77073851, "index_range": null, "init_range": null, + "duration_ms": 1012693, "width": 640, "height": 360, "fps": 30, @@ -60,11 +63,11 @@ ], "video_only_streams": [ { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=12082288&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=160&keepalive=yes&lmt=1659781594841916&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAOqzJbALHUbMk-uDUj9ArJfTNOb2p1NxjI1P7N3CKYNdAiEAzsb2JubT8Yv6bV1c7O-NRPRZBjjMiqnw5aKJFsh16rk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=12076981&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=160&keepalive=yes&lmt=1683787939431169&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgSet2oRfrnzJKcEetai80HOLE71xZH3N91zogTxPLwWMCIHPEuf0FsJHMroqQIei_bo1LysCWa3XGxK1EyBInr1xy&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 160, - "bitrate": 115315, - "average_bitrate": 95451, - "size": 12082288, + "bitrate": 114785, + "average_bitrate": 95409, + "size": 12076981, "index_range": { "start": 738, "end": 3061 @@ -73,6 +76,7 @@ "start": 0, "end": 737 }, + "duration_ms": 1012644, "width": 256, "height": 144, "fps": 30, @@ -84,11 +88,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=11827097&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=278&keepalive=yes&lmt=1659784398309743&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgEHp9vCd5vxU3MoUZf6vkKMisv5RiqaV8qkEh-1hU3PMCIF9EOQ2ytaheSxZmmuUeK9cBGOg1z4AZOVCpv1PfqPLc&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=10710406&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=278&keepalive=yes&lmt=1683793966364433&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAKJxQWqLK5DpZ7CkkavrjkrlaX5126Y49pV9wggc8Yx8AiEAoYc7_9O-wzI3G3xdFHh9qFwZEh1vrBrlA5p1glWK8uU%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 278, - "bitrate": 97659, - "average_bitrate": 93435, - "size": 11827097, + "bitrate": 92054, + "average_bitrate": 84613, + "size": 10710406, "index_range": { "start": 219, "end": 3455 @@ -97,6 +101,7 @@ "start": 0, "end": 218 }, + "duration_ms": 1012644, "width": 256, "height": 144, "fps": 30, @@ -108,11 +113,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=9302597&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=394&keepalive=yes&lmt=1659771776731568&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAPFT82c0yyCT_4gyp3QnddMDhCOPUSYXShIrahuUv9q5AiATpTawOCJDxWhgOJgHOJ_eaob-hpIJeTGI1Cah4Z8C6g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=10296353&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=394&keepalive=yes&lmt=1683783301275775&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAJSOvRY1MzTPGwVWuDAmFWxErp_WALzhgwKBex876BIMAiEAmK0nGArmm_YuQbYrOYtCtJMjJw2XrrzcnaPIzp51whk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 394, - "bitrate": 91838, - "average_bitrate": 73491, - "size": 9302597, + "bitrate": 102955, + "average_bitrate": 81342, + "size": 10296353, "index_range": { "start": 700, "end": 3023 @@ -121,6 +126,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 256, "height": 144, "fps": 30, @@ -132,11 +138,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=23102992&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=133&keepalive=yes&lmt=1659781643986574&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgNMcHjX1Wa9ctKv2vDbFzmTV87BuMGSdtWcAX8L9nsKMCIGikQTZmLDupR5fNm4gCSCedF4_Y9KqNTIScKYSqaxyq&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=23098224&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=133&keepalive=yes&lmt=1683787941592756&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgQSTbFEkh8LbH19nUQp92miSQSPzxLlddDOjrE72yGZkCICktF-HUzbZMeZYYXehhBapY55R5XNOn0mY-EWPq6iEl&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 133, - "bitrate": 248249, - "average_bitrate": 182516, - "size": 23102992, + "bitrate": 249917, + "average_bitrate": 182478, + "size": 23098224, "index_range": { "start": 739, "end": 3062 @@ -145,6 +151,7 @@ "start": 0, "end": 738 }, + "duration_ms": 1012644, "width": 426, "height": 240, "fps": 30, @@ -156,19 +163,20 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=26846976&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=242&keepalive=yes&lmt=1659784461564077&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgOvyxJqHnalVH0xsBN37mrR267gvemDT3GPPYMI-hr9YCIFOOxKVWJDX9SOvBmx6-M9goLbb7mN2h3r6leIj_egmh&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=23380710&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=242&keepalive=yes&lmt=1683793909671501&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgZbtufwU0g0-jFUoBrq7n1Ne09mkHjGN23Po34rndi24CIQCljHIB53OmtP27ul3cvsWVw4RFEi_Nl7qOBmWL4jZpFA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 242, - "bitrate": 246870, - "average_bitrate": 212094, - "size": 26846976, + "bitrate": 216267, + "average_bitrate": 184710, + "size": 23380710, "index_range": { "start": 219, - "end": 3529 + "end": 3511 }, "init_range": { "start": 0, "end": 218 }, + "duration_ms": 1012644, "width": 426, "height": 240, "fps": 30, @@ -180,11 +188,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=19652762&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=395&keepalive=yes&lmt=1659771951514711&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAJrybBNLlEJgNt58E9L9KRBCYhtr77pDeb7EwmpqyFraAiEA_nGMHqmhdt1fiCWEywIW2a3NY076Cvu9P1r2j_tXXdI%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=19803140&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=395&keepalive=yes&lmt=1683783381398973&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIUO10ENWskvvAu024zvKn0b3bRWX0EyRsVabzrL9v8KAiBSccc8iPXX_g_N2q40A5Bi7mmvnwWK63c-mzFAi_89Pw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 395, - "bitrate": 185967, - "average_bitrate": 155259, - "size": 19652762, + "bitrate": 214028, + "average_bitrate": 156447, + "size": 19803140, "index_range": { "start": 700, "end": 3023 @@ -193,6 +201,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 426, "height": 240, "fps": 30, @@ -204,11 +213,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=44714361&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=134&keepalive=yes&lmt=1659781629752284&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgeFvXl3HVmzgILvdnaOah5xhsFXl7kPonBW6xuS323BUCIENt0DteUxaeqAv2rq58SQEPik8eJElkqzSeFt44s_VO&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=44703914&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=134&keepalive=yes&lmt=1683787942654377&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgOWdv9KlCWVAv6jFEBK-6h3l1QOn1HDHjGdKfJBYtOBkCIBdi9P_YU9UX4GdGzuk2SSu_cgaUHJOXUJ9P4qf3K0z0&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 134, - "bitrate": 576280, - "average_bitrate": 353248, - "size": 44714361, + "bitrate": 576884, + "average_bitrate": 353165, + "size": 44703914, "index_range": { "start": 739, "end": 3062 @@ -217,6 +226,7 @@ "start": 0, "end": 738 }, + "duration_ms": 1012644, "width": 640, "height": 360, "fps": 30, @@ -228,11 +238,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=48584560&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=243&keepalive=yes&lmt=1659784475994141&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAO7GXL1MstX_2G5duLbbt7LXYo0UFxRM1P67xx2yaKELAiEArcC18fHQpzoyK_9e8NbWoHhHTz6-YSqpOxW3v0vgpY4%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=48610243&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=243&keepalive=yes&lmt=1683793911055215&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgNCvf4z47PxtAp-P4KRhzwb7WTjrnkmOYZ1mHJY4LmsQCIAI9fPaqklLUj6Qg6WV4Gq4-r8vs1BOn1v6tu06JGk9A&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 243, - "bitrate": 443297, - "average_bitrate": 383823, - "size": 48584560, + "bitrate": 442605, + "average_bitrate": 384026, + "size": 48610243, "index_range": { "start": 220, "end": 3581 @@ -241,6 +251,7 @@ "start": 0, "end": 219 }, + "duration_ms": 1012644, "width": 640, "height": 360, "fps": 30, @@ -252,11 +263,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=40662706&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=396&keepalive=yes&lmt=1659774465760284&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAK3ic4i0V2N3CO8c8CSnLQX25glhIpOwG2xzNhHM3tr6AiBW4B0iyYY5v0evmRYURbaHVlWXqfYGazqQ1naagIhUcg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=41498925&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=396&keepalive=yes&lmt=1683782484149627&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAJFg52NOZ7bbUwef3Krl7MfVtDuXdZXLrQv_SILY62VeAiEAgR-3tu2TBXyAIV0WILNi0jNknvbjMUxhYaCUsyz2LVw%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 396, - "bitrate": 391774, - "average_bitrate": 321239, - "size": 40662706, + "bitrate": 459348, + "average_bitrate": 327846, + "size": 41498925, "index_range": { "start": 700, "end": 3023 @@ -265,6 +276,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 640, "height": 360, "fps": 30, @@ -276,11 +288,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=68269120&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=135&keepalive=yes&lmt=1659781828864490&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgCoE6m9X2BUAB5MHSdfDm8U_CQo3Ax9nOYiisB3PNXWsCIBXzXZ6zhvHqNOCBSzFOkxPSqrBI1VwWwGIyXGLamiN5&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=68212637&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=135&keepalive=yes&lmt=1683787944411475&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAMZguS_4aJFCjWsvXkyxWxGa1DknMOlsP1vgrTK-VOKOAiAnJpIvttgWKmJrMW3rBocawXZMnqbjgWRqj5KJo53GGg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 135, - "bitrate": 1060991, - "average_bitrate": 539333, - "size": 68269120, + "bitrate": 1061343, + "average_bitrate": 538887, + "size": 68212637, "index_range": { "start": 739, "end": 3062 @@ -289,6 +301,7 @@ "start": 0, "end": 738 }, + "duration_ms": 1012644, "width": 854, "height": 480, "fps": 30, @@ -300,19 +313,20 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=77320479&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=244&keepalive=yes&lmt=1659784420892176&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgf-IluayL1TQWD9c2ZPvqvUtViItpbApY-MReL7yPAZ8CIQC-7CA-4bO91vqM-_T4HW36I87i4BNjLin834RoBXoIWA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=77648932&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=244&keepalive=yes&lmt=1683793912300747&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgT4fTt5I6BOTj8YHa7D4ZbiW5Kj1CXHwBAyMUEraGTu8CIEdpGzSiV9og54IsSFSsYapJcg8DLDxYZbu0dYcPGTaa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 244, - "bitrate": 749555, - "average_bitrate": 610840, - "size": 77320479, + "bitrate": 754723, + "average_bitrate": 613435, + "size": 77648932, "index_range": { "start": 220, - "end": 3606 + "end": 3607 }, "init_range": { "start": 0, "end": 219 }, + "duration_ms": 1012644, "width": 854, "height": 480, "fps": 30, @@ -324,11 +338,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=71890035&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=397&keepalive=yes&lmt=1659791212753044&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgTn-pdr2sxjkPplhFydtX2yJ6_PI0hUNedZZm6q29ktICIQDu2R2R7owZFBp1uuW7wL2Sm_MYV93TFE2GtbUOPEGapA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=72485445&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=397&keepalive=yes&lmt=1683783766846749&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgYUgo4QrIA6zcIMHuF_l4XiLaMPH7KGDwarzwgMUW2owCIF5entcVXfEtjug0b15rA6vub0BV0j5JMofS30BE7Eh9&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 397, - "bitrate": 700692, - "average_bitrate": 567939, - "size": 71890035, + "bitrate": 801728, + "average_bitrate": 572643, + "size": 72485445, "index_range": { "start": 700, "end": 3023 @@ -337,6 +351,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 854, "height": 480, "fps": 30, @@ -348,11 +363,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=123721377&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=136&keepalive=yes&lmt=1659784121644633&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgBRgfpr8411ec0ctulLdgpL6RfzEqboGttJLDmfgtCwICIQCVZvc-BQ9kiTg2mPI7qAD6LxCMzpWTdzeIRuzCNbgN0g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=123652442&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=136&keepalive=yes&lmt=1683787959744367&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgSvkoYKKZ-SEFRi_AZ2pQYzBOxHk4SgBruVIhW5Ui1EMCIHdvlJp8KwIh1UiJO00EmRUj8a03mtBxxWikecOl0Jk1&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 136, - "bitrate": 2015959, - "average_bitrate": 977412, - "size": 123721377, + "bitrate": 2016579, + "average_bitrate": 976868, + "size": 123652442, "index_range": { "start": 739, "end": 3062 @@ -361,6 +376,7 @@ "start": 0, "end": 738 }, + "duration_ms": 1012644, "width": 1280, "height": 720, "fps": 30, @@ -372,19 +388,39 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=143581331&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=247&keepalive=yes&lmt=1659784432582864&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMBFZfnO0TDVOcadYG1zgJudXUG3iyad5Y2eK0DqR9qQAiAgb16ay3WLOr_dIa34txketICiLNAvWEJ6kHkmpgRQIg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=22&lmt=1683783214350373&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=jcptwbVfjmUWxQ&ns=1WzgXR-YoajDJVHVaMTvU9MN&pl=37&ratebypass=yes&requiressl=yes&sig=AOq0QJ8wRQIhAKXn58k9q93HQFc68FF38guHL4SR95x72rAWp1rWFFv9AiAeSn8CY1vqf57ElYJs1m5ruVT5bO4rKLOwYhwYhnn11w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cratebypass%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1", + "itag": 22, + "bitrate": 2767711, + "average_bitrate": 2767711, + "size": null, + "index_range": null, + "init_range": null, + "duration_ms": 1012691, + "width": 1280, + "height": 720, + "fps": 30, + "quality": "720p", + "hdr": false, + "mime": "video/mp4; codecs=\"avc1.64001F, mp4a.40.2\"", + "format": "mp4", + "codec": "avc1", + "throttled": false + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=147601285&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=247&keepalive=yes&lmt=1683793917158272&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAJoFxlPhUMgIWaVBgvZj4wN-0AToP6LcpSE-9qU0aP6WAiBMVWP8RB023ja7aalg5EDWjSwSl8ZuFTyabKAd5fFisQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 247, - "bitrate": 1540881, - "average_bitrate": 1134308, - "size": 143581331, + "bitrate": 1539305, + "average_bitrate": 1166066, + "size": 147601285, "index_range": { "start": 220, - "end": 3626 + "end": 3627 }, "init_range": { "start": 0, "end": 219 }, + "duration_ms": 1012644, "width": 1280, "height": 720, "fps": 30, @@ -396,11 +432,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=141532316&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=398&keepalive=yes&lmt=1659773509914712&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANkJ5RXJ4nbM6C6Fjp3emq6jizYqpW0CZBnPxxI1mFDsAiBhTZdfVfwh48W9wLN6ThSNnxbZ6oL4O_nsFqaVv2Oylw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=131590322&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=398&keepalive=yes&lmt=1683783412184763&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAKPN8cLBkmuJxznCLh99bmrvR21hfSCGjwiTsu3K7ZeBAiEAlt0ZoiED2fyoJXIiUwmUhz17TYJcKYpOOweXkbQjrt0%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 398, - "bitrate": 1392815, - "average_bitrate": 1118121, - "size": 141532316, + "bitrate": 1548917, + "average_bitrate": 1039578, + "size": 131590322, "index_range": { "start": 700, "end": 3023 @@ -409,6 +445,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 1280, "height": 720, "fps": 30, @@ -420,11 +457,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=421725185&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=137&keepalive=yes&lmt=1659786363083094&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAP5Ylk8gGi95Hn2d2rXvxeLqGGWoVB6X2cwRoYeMbRokAiEA54LDtzyRvfBXdYqpwT6ES_tBwVbUz9a0hfiUAIdaUVA%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=421285879&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=137&keepalive=yes&lmt=1683787778380517&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgUO_KUVLUJNKgDHpJeZ5F1D9c4IOSqqU89cuWCgDpUoQCICiphHalGNgp7vzIyzb_fpBM_NNdLsytk-YSveq55I9R&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 137, - "bitrate": 4508621, - "average_bitrate": 3331675, - "size": 421725185, + "bitrate": 4444251, + "average_bitrate": 3328205, + "size": 421285879, "index_range": { "start": 741, "end": 3064 @@ -433,6 +470,7 @@ "start": 0, "end": 740 }, + "duration_ms": 1012644, "width": 1920, "height": 1080, "fps": 30, @@ -444,19 +482,20 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=283266224&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=248&keepalive=yes&lmt=1659792392954547&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgdW5nLHA9TliCMs6j5qdDAyfF_OsrQnJMR6BPh10mep0CIDVw5np7ss88sfEVFMlBG2c6XbDQsNPu4ZsISlIuzCIP&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4535434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=302252313&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=248&keepalive=yes&lmt=1683792273928810&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAO-yj9R-smK4_LceGBhpxxZ2m8gJ8eg3yAZ3B5-TxJ26AiEAvnKJZ1VCwqe0o8a5cds2SIxiw0XmIiEsFDD2JQVLudo%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=453D434&vprv=1", "itag": 248, - "bitrate": 2569402, - "average_bitrate": 2237834, - "size": 283266224, + "bitrate": 2704805, + "average_bitrate": 2387826, + "size": 302252313, "index_range": { "start": 221, - "end": 3637 + "end": 3638 }, "init_range": { "start": 0, "end": 220 }, + "duration_ms": 1012644, "width": 1920, "height": 1080, "fps": 30, @@ -468,11 +507,11 @@ "throttled": false }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=251083866&dur=1012.644&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=399&keepalive=yes&lmt=1659797852257648&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgPAYuihXswGT3Cze9Lc74SF3qmBeu4AaFb29HHzfD2WkCIQDbtxwaI7eUEhdSqCCLhNFHhrk9jIMVqLipl6E0Z2mcqg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=252581029&dur=1012.644&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=399&keepalive=yes&lmt=1683783754163506&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhANEV52WgnUwjh73umAJne0nV9N6sUNAMAfGcRcWdUttVAiB-MrgcOJkl47rpmM_wDIx1RKbgIwfpPYhgQm02VE_3tA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4537434&vprv=1", "itag": 399, - "bitrate": 2523962, - "average_bitrate": 1983590, - "size": 251083866, + "bitrate": 3324281, + "average_bitrate": 1995418, + "size": 252581029, "index_range": { "start": 700, "end": 3023 @@ -481,6 +520,7 @@ "start": 0, "end": 699 }, + "duration_ms": 1012644, "width": 1920, "height": 1080, "fps": 30, @@ -494,36 +534,69 @@ ], "audio_streams": [ { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6297404&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767062297621&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAPm10DeIvOt5Oc7e36cfhPC0ej2PslQqF3-CFVUl5TNfAiEAlgvwjlQK14e_-6j3W_hMvk9KHax8zd5shSVlYSR1P34%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=372147&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774002244357&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAK2jmkA3FY7jqV2I1GKtT4XTd4RYgC7ZK81yzwATcoyfAiEA1P3xQBGTvcSo5AVVJ7iVpADU3yUTomkW99NuL_6CehQ%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr", + "itag": 249, + "bitrate": 50996, + "average_bitrate": 49536, + "size": 372147, + "index_range": { + "start": 259, + "end": 372 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 60101, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.46000004, + "throttled": false, + "track": { + "id": "fr.3", + "lang": "fr", + "lang_name": "French dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6306327&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683782187865292&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgW1DTCrLV_GyEM1rdjScgyceZE1llb73KJMFXmPm5Y04CIAYOLZuuzFX4ba5720kMOcQ1-Ld1DULs85nLxJglitCl&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US", "itag": 249, "bitrate": 59750, - "average_bitrate": 49749, - "size": 6297404, + "average_bitrate": 49819, + "size": 6306327, "index_range": { "start": 266, - "end": 1995 + "end": 1996 }, "init_range": { "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 2.8500004, "throttled": false, "track": { - "id": "en.0", - "lang": "en", - "lang_name": "English", - "is_default": true + "id": "en-US.4", + "lang": "en-US", + "lang_name": "English (United States) original", + "is_default": true, + "track_type": "original" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6335194&dur=1012.701&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767030669485&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgB1E45ziiujPbZyoqtzF7dPp-zq2pYdqJxZIh1YyL7JICIBEuqAl9gkGmpC4BbdQHOrN94RwE8fAKehLLou-HRwkV&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dru", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6321564&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774142034638&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhANhcvte60E60oUIwFp1It_bBO7-z6Du2NUztcAJmgmmRAiEAzj-Z0M0zFYH-dh-eQyX-AKc_GHXgZJAbZ8CKz78ug-8%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dpt", "itag": 249, - "bitrate": 60370, - "average_bitrate": 50045, - "size": 6335194, + "bitrate": 59882, + "average_bitrate": 49940, + "size": 6321564, "index_range": { "start": 266, "end": 1995 @@ -532,48 +605,56 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.0, "throttled": false, "track": { - "id": "ru.0", + "id": "pt.3", + "lang": "pt", + "lang_name": "Portuguese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6357876&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774182040216&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgYAunNMdQwJpRsfBpokSM5tuQx59bEnTHNNOaLqWo-w4CIQC576EjyFGGVQXXtHL_ooEvjvxI7fLbITaDfX78DesSEA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dru", + "itag": 249, + "bitrate": 60151, + "average_bitrate": 50225, + "size": 6357876, + "index_range": { + "start": 266, + "end": 1995 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ru.3", "lang": "ru", - "lang_name": "Russian", - "is_default": false + "lang_name": "Russian dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6376949&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767030635910&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAImbjql1yRXwNQaTG_7BUTzyr0lOgn0qBZOCJ92MXE_vAiAY2lcEUg-CFtJGyMCrG21Qh7ylrDf_p5C1QGGadCE34w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Des", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6358303&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774312079215&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgddZWJZtC7Scl5EoxZIzpffL_MynOhR3JWkKNjYj4ah0CIQDaebvNn7AqcnYR-vJjBPnOYUzHl0shF_zgBtbBJo697g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dko", "itag": 249, - "bitrate": 58727, - "average_bitrate": 50377, - "size": 6376949, - "index_range": { - "start": 266, - "end": 1995 - }, - "init_range": { - "start": 0, - "end": 265 - }, - "mime": "audio/webm; codecs=\"opus\"", - "format": "webm", - "codec": "opus", - "throttled": false, - "track": { - "id": "es.0", - "lang": "es", - "lang_name": "Spanish", - "is_default": false - } - }, - { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6377249&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767030989871&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgMmGG3ZtSmER8wXgMIef1JzfZnj1hLHS3uTwrBCpYKeUCIQDNGVpI6pkwfd2lAlpMAxv7jAcgm2gMFj_lfoHlXplzVw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dfr", - "itag": 249, - "bitrate": 59711, - "average_bitrate": 50377, - "size": 6377249, + "bitrate": 59548, + "average_bitrate": 50230, + "size": 6358303, "index_range": { "start": 259, "end": 1988 @@ -582,23 +663,27 @@ "start": 0, "end": 258 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.19999981, "throttled": false, "track": { - "id": "fr.0", - "lang": "fr", - "lang_name": "French", - "is_default": false + "id": "ko.3", + "lang": "ko", + "lang_name": "Korean dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6418805&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=249&keepalive=yes&lmt=1659767030246466&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgZU5ZQrHtscZ39r6L5ij5H9IU0siKbd7ByvgfzamDZXoCIHUXqXl7daCGY1use3Nj15cRiW3a9RJ9raNVSamYCOI1&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dpt", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6377512&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774239246777&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgZG61rM8RijxP9i0OIRqTHwNTqqyjo0mXfuo9MkbtwB0CIQC5uU2hY2n1HpuN69XDCh--wGqSP25pbm2JT43UPG3j8g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Des", "itag": 249, - "bitrate": 60205, - "average_bitrate": 50705, - "size": 6418805, + "bitrate": 57882, + "average_bitrate": 50382, + "size": 6377512, "index_range": { "start": 266, "end": 1995 @@ -607,23 +692,259 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.0, "throttled": false, "track": { - "id": "pt.0", - "lang": "pt", - "lang_name": "Portuguese", - "is_default": false + "id": "es.3", + "lang": "es", + "lang_name": "Spanish dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217507&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767073159859&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgM9loLjlUtgwrALqSek4vO8KljcCltFjLw1TGX0d9lZ4CICRiTJ8a_KgdafXVo2vKwgLPuH2B7t0hF-ln2k_MI3ds&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6383258&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774201610058&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAOsN02fAPZN-Nj4QQjwj1YD0UM9yAqKU4g80KY9itVMbAiEAsWuLx-RsZCl8sqO5ZLxmmAq2xqoYjKmQ-q1X81S3r0I%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dja", + "itag": 249, + "bitrate": 57039, + "average_bitrate": 50427, + "size": 6383258, + "index_range": { + "start": 266, + "end": 1995 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ja.3", + "lang": "ja", + "lang_name": "Japanese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6399497&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774452781272&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgBKywl9Zh_sf_b5sNANKDaNL4H6JC5c4MOgouun07mcECIQCNx-HR0GQ14n_qSxzrI8ZbgBtRUvIkEayZ1xFFm0ubiA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dvi", + "itag": 249, + "bitrate": 58782, + "average_bitrate": 50551, + "size": 6399497, + "index_range": { + "start": 259, + "end": 1988 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012741, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.23999977, + "throttled": false, + "track": { + "id": "vi.3", + "lang": "vi", + "lang_name": "Vietnamese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6447873&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774297515785&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAOPNWjHF-zxNrSC087E1cUviWk4zj_hQgHjtxtLBFrsDAiEAzXNWsV3KICw6y2QyiHoDf7Cw_o1PDRPLbQ5sVxuVQmQ%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dar", + "itag": 249, + "bitrate": 58936, + "average_bitrate": 50936, + "size": 6447873, + "index_range": { + "start": 259, + "end": 1988 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -2.3899994, + "throttled": false, + "track": { + "id": "ar.3", + "lang": "ar", + "lang_name": "Arabic dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6466592&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774305734405&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgPzRz4PIP23lqCmV-8fGADENveMeEhls29a2Qz6MMST0CIF1-D7t8mdQEvuJ9qShndrEKle9Gey6a3cn7hKz2i3w-&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dtr", + "itag": 249, + "bitrate": 58928, + "average_bitrate": 51081, + "size": 6466592, + "index_range": { + "start": 259, + "end": 1988 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012741, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.32999992, + "throttled": false, + "track": { + "id": "tr.3", + "lang": "tr", + "lang_name": "Turkish dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6471089&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774258108589&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgXHv24gw_m9ygWqV9HFQOwbh9afgep9rr2xJxnCBPDtQCICr88lbprn7BearPW_J8trvEliGTosY38YW93isEQ1Jg&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dhi", + "itag": 249, + "bitrate": 58787, + "average_bitrate": 51121, + "size": 6471089, + "index_range": { + "start": 259, + "end": 1989 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.029999733, + "throttled": false, + "track": { + "id": "hi.3", + "lang": "hi", + "lang_name": "Hindi dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6614485&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774348285014&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgFmbm7K2Xw1m202KnzoR043M3cRT6Wl9u0LuNroVrRuQCIAto0wVakiu5oWUr-294cUyAIstySaigBU1KEA8Jp-aB&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Did", + "itag": 249, + "bitrate": 59106, + "average_bitrate": 52254, + "size": 6614485, + "index_range": { + "start": 259, + "end": 1988 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.03999996, + "throttled": false, + "track": { + "id": "id.3", + "lang": "id", + "lang_name": "Indonesian dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6710438&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683774591935986&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgd3q9BlBisSpOoBuzSXEEK1lu77Gq1c6elULEnAV7wY4CIQD4lkp1K6HPwO6X2CMQahM4VN0_rjfOmGXy7N_Fr9P-Uw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dth", + "itag": 249, + "bitrate": 58559, + "average_bitrate": 53012, + "size": 6710438, + "index_range": { + "start": 259, + "end": 1989 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.22000027, + "throttled": false, + "track": { + "id": "th.3", + "lang": "th", + "lang_name": "Thai dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=481052&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774002240466&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgIn1dBK-qpakvAGOR4h_HP46T9sqxljUFoGdtuC0Td1ECIHx1aOt5b51Cb2WyDA6nY66x4TNMojIndFdU-gkBgstO&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr", + "itag": 250, + "bitrate": 69840, + "average_bitrate": 64032, + "size": 481052, + "index_range": { + "start": 259, + "end": 373 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 60101, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.46000004, + "throttled": false, + "track": { + "id": "fr.3", + "lang": "fr", + "lang_name": "French dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217508&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683782195315620&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIga2iMQsToMxO7hTOx0gNAzhYoV1lL5PpE9lkAuBXt1nkCIQCuFuQXWNixIquEugtkT1C9khuKRP_C-wzSOiUmRp1DRg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US", "itag": 250, "bitrate": 74027, "average_bitrate": 64918, - "size": 8217507, + "size": 8217508, "index_range": { "start": 266, "end": 1996 @@ -632,23 +953,27 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 2.8500004, "throttled": false, "track": { - "id": "en.0", - "lang": "en", - "lang_name": "English", - "is_default": true + "id": "en-US.4", + "lang": "en-US", + "lang_name": "English (United States) original", + "is_default": true, + "track_type": "original" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8293591&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767031057381&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhANEtTydOAYap6umBAcRO1hr59UE-5ewFF5r6kEruX9HUAiEAnt99T6pIGgYHxFh_cEqlQ8CsJ_nARCt1P5TjsKRevo4%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Des", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8260279&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774141260993&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhALGb9Jzoys2gbMu8Tk7YNu61u-toa5XM-YFk-XdX5HAYAiAkW_HelQgMbAvwVHByi7KWpkf8rVFYpwIgCO7tJ01RHw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dpt", "itag": 250, - "bitrate": 72769, - "average_bitrate": 65519, - "size": 8293591, + "bitrate": 74668, + "average_bitrate": 65256, + "size": 8260279, "index_range": { "start": 266, "end": 1996 @@ -657,23 +982,114 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.0, "throttled": false, "track": { - "id": "es.0", + "id": "pt.3", + "lang": "pt", + "lang_name": "Portuguese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8290356&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774239437244&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgJ3-d7xud7yQge-7MjqkDxKrSAqunNIsqvfgN3g25GUUCIB7AqAhgTbEKPIYrM83JD7sJ732WgMCu7PGr-KcjsphE&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Des", + "itag": 250, + "bitrate": 72744, + "average_bitrate": 65493, + "size": 8290356, + "index_range": { + "start": 266, + "end": 1996 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "es.3", "lang": "es", - "lang_name": "Spanish", - "is_default": false + "lang_name": "Spanish dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8311366&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767030603155&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhANU27OApznf15qulGfhCuD_-fOONb6Y1AFmmfnNL6m8UAiEArioLYl7dxPvQmkIxBIBhDPvMdD4Ty2DsuX7RNJs6D2M%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dfr", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8324916&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774201619373&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhALyf4aRk1Z89sbWYDPEVIatkTbrJzgxXL0RELHbb1N4-AiEAjnYda5CpMiEMJ_oKTVFAW0UlE1Y4lutT6P3VgPif-S4%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dja", "itag": 250, - "bitrate": 76205, - "average_bitrate": 65655, - "size": 8311366, + "bitrate": 74419, + "average_bitrate": 65766, + "size": 8324916, + "index_range": { + "start": 266, + "end": 1996 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ja.3", + "lang": "ja", + "lang_name": "Japanese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8362478&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774181877935&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPoBge53XzCNOx83jlQKvwHbMWWSrFOL94eHFd_3xDH7AiBoSS7eCT9_1yenwdHUHhjZoF-93Vop9shwLKDfCrgVOA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dru", + "itag": 250, + "bitrate": 74850, + "average_bitrate": 66060, + "size": 8362478, + "index_range": { + "start": 266, + "end": 1996 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ru.3", + "lang": "ru", + "lang_name": "Russian dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8410510&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774452801532&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgJtUYBTXgaP8kAx4V29NY1hYOLRZ5d28ZRzKIWMPR8TkCIQDXP9_KaApgWxlzzW8cRtTj4vhtv9sKnsfQl_vkv55B1A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dvi", + "itag": 250, + "bitrate": 77816, + "average_bitrate": 66437, + "size": 8410510, "index_range": { "start": 259, "end": 1989 @@ -682,198 +1098,607 @@ "start": 0, "end": 258 }, + "duration_ms": 1012741, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.23999977, "throttled": false, "track": { - "id": "fr.0", - "lang": "fr", - "lang_name": "French", - "is_default": false + "id": "vi.3", + "lang": "vi", + "lang_name": "Vietnamese dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8354070&dur=1012.701&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767085773007&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhALGuAwE4R8j5LwXBPjdxmqvd6U_Dtl3eAmCcua2bVG_DAiEAqHX2vYI4uVAwKWFORA0lVvrfhvHZ_zuQvVJOu1K5v58%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dru", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8411394&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774312088308&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgaWfg2zzlmwoPWKWqQzFhy134-M2_SjVORGKUmfDfwX4CIQD9ZcdizPONgWY5ipEewPrA3LGLrEFP_pWwepzn-rMeHw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dko", "itag": 250, - "bitrate": 75194, - "average_bitrate": 65994, - "size": 8354070, + "bitrate": 74460, + "average_bitrate": 66449, + "size": 8411394, "index_range": { - "start": 266, - "end": 1996 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 265 + "end": 258 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.19999981, "throttled": false, "track": { - "id": "ru.0", - "lang": "ru", - "lang_name": "Russian", - "is_default": false + "id": "ko.3", + "lang": "ko", + "lang_name": "Korean dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8369023&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=250&keepalive=yes&lmt=1659767030614633&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgEVhNMJpw0ywLfQdNon1k7rvZcJtaSTlXj4I6mT9LewACIBP0qBboYtd8lLZXTwRW33tgs_bcBF6Hw9UJJmjxsKJj&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dpt", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8493254&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774305586842&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIDBMNc9T8315ks5RcKMDSWuJ2yTHiWiKRHR9b0cghCNAiBPeiwexMqF7_zNpDqulHg06iAYrMs4D4doeqWN4XuO3w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dtr", "itag": 250, - "bitrate": 74685, - "average_bitrate": 66111, - "size": 8369023, + "bitrate": 74936, + "average_bitrate": 67091, + "size": 8493254, "index_range": { - "start": 266, - "end": 1996 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 265 + "end": 258 }, + "duration_ms": 1012741, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.32999992, "throttled": false, "track": { - "id": "pt.0", - "lang": "pt", - "lang_name": "Portuguese", - "is_default": false + "id": "tr.3", + "lang": "tr", + "lang_name": "Turkish dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16391144&dur=1012.761&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659767030418280&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgFTrEtuhAmy8tJEGWu_k2FbI-QB0Ys6-euyQ3l2iY6soCIQDfGPsfnU28_FZ481vecjq6euo9jVz852ianzbwsKsVdg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dfr", - "itag": 140, - "bitrate": 131374, - "average_bitrate": 129476, - "size": 16391144, + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8659135&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774297514969&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAKqH1PxHOzFvYD0_VRpFJmy6mx9MvqTvtTA_9oN80CJbAiEAix8K45V87AhbENGduUjcs69-NfNUo5_x463C77mAvxg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dar", + "itag": 250, + "bitrate": 76615, + "average_bitrate": 68404, + "size": 8659135, "index_range": { - "start": 632, - "end": 1887 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 631 + "end": 258 }, - "mime": "audio/mp4; codecs=\"mp4a.40.2\"", - "format": "m4a", - "codec": "mp4a", + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -2.3899994, "throttled": false, "track": { - "id": "fr.0", - "lang": "fr", - "lang_name": "French", - "is_default": false + "id": "ar.3", + "lang": "ar", + "lang_name": "Arabic dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16391144&dur=1012.761&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659767036023479&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANXyWvfbULFu_TvVuqgI-gzDBJgAZXnXRlm2G3upjb47AiBkn1qJ1BOvyUqSZ91H57aisxE2Y9eRFSiy92TD4pfa0Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dpt", - "itag": 140, - "bitrate": 131489, - "average_bitrate": 129476, - "size": 16391144, + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8681306&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774348334857&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAOzQAGumDVtoVpUbieppdY0TDkl1OWN1GLxRoXX1XbH4AiAmh7DVhcV9usNSEZebAkLYWI5N0-RsZ0QKIlOyfknvkg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Did", + "itag": 250, + "bitrate": 78584, + "average_bitrate": 68582, + "size": 8681306, "index_range": { - "start": 632, - "end": 1887 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 631 + "end": 258 }, - "mime": "audio/mp4; codecs=\"mp4a.40.2\"", - "format": "m4a", - "codec": "mp4a", + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.03999996, "throttled": false, "track": { - "id": "pt.0", - "lang": "pt", - "lang_name": "Portuguese", - "is_default": false + "id": "id.3", + "lang": "id", + "lang_name": "Indonesian dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390769&dur=1012.738&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659767030572994&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wQwIgKW3Mpdik72We2u2IutJYkJuD0gHpefwSu1uBsj_VCJ4CHxRZjGRhFnn70id5yBXLH-lEqxIQubxwcD7wSohaOns%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dru", - "itag": 140, - "bitrate": 131362, - "average_bitrate": 129476, - "size": 16390769, + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8715674&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774592015544&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPX-PNJHxliWbpT8dILCbb8WoH3u8d27-wk7KF8LMKorAiBcexdzFZMXuvNehMvRmT65YbYIyKDy69266_K8_FQBcQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dth", + "itag": 250, + "bitrate": 76468, + "average_bitrate": 68853, + "size": 8715674, "index_range": { - "start": 632, - "end": 1887 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 631 + "end": 258 }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.22000027, + "throttled": false, + "track": { + "id": "th.3", + "lang": "th", + "lang_name": "Thai dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8738381&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683774258283594&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAOUhgcveQ7mGrVdAXoCS0slCPEg4Qy5ap3dAt3pa7ukIAiEA2mRmaWJkNROlcSLdHCM2v406QJCzXNa8PNCd_w_wOoE%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dhi", + "itag": 250, + "bitrate": 77674, + "average_bitrate": 69033, + "size": 8738381, + "index_range": { + "start": 259, + "end": 1989 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.029999733, + "throttled": false, + "track": { + "id": "hi.3", + "lang": "hi", + "lang_name": "Hindi dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390756&dur=1012.738&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774123850152&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wQwIfanR5MDfThXbzwwnx1ZgMfxJdKsQyIm-3FOPnm3qiRQIgO8QOe0bkSlF7oL90wFDEKBszM8wdUO3hL9pL6tDYd5M%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dar", + "itag": 140, + "bitrate": 131460, + "average_bitrate": 129476, + "size": 16390756, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012738, "mime": "audio/mp4; codecs=\"mp4a.40.2\"", "format": "m4a", "codec": "mp4a", + "channels": 2, + "loudness_db": -2.3899994, "throttled": false, "track": { - "id": "ru.0", + "id": "ar.3", + "lang": "ar", + "lang_name": "Arabic dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390756&dur=1012.738&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774146493742&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAJVVqcgdz9h3fc-XjCR3X5oJJdkZUcQseDrb7sHMivZtAiEA5V14Y_Stev1JMhZ2aLCAg8rDXj4MSkVY6lfvfKFOpJ8%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dru", + "itag": 140, + "bitrate": 131354, + "average_bitrate": 129476, + "size": 16390756, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012738, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ru.3", "lang": "ru", - "lang_name": "Russian", - "is_default": false + "lang_name": "Russian dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390216&dur=1012.691&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659767056863171&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAN1cxya7BwvrNImk5iv4JjUzRyRBq5-BDASnSzWpvcnGAiALNym4npHgJO2OnxIXTQ45dgxKpcr0kH3IaBRdTowcQQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Des", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16391507&dur=1012.784&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774228379420&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgQkP5YlobtvjMbbkF4Rf82wJr7_ko70HuFs9tbWjnUZECIG2dUQscPOFr9fOsSBgRzPvFOu10m4mjI8Elg0SU7qv-&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dtr", + "itag": 140, + "bitrate": 131377, + "average_bitrate": 129476, + "size": 16391507, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012784, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.32999992, + "throttled": false, + "track": { + "id": "tr.3", + "lang": "tr", + "lang_name": "Turkish dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16391530&dur=1012.784&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774356300589&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhALF8ZTztjqOF6rO5_MibY-F8-zLpwgWyMw-_WgEICW8RAiEAps0EZ_2x7g83f2CuoRuWIIGzw9hNQ7YVirbe-4imB94%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dvi", + "itag": 140, + "bitrate": 131428, + "average_bitrate": 129477, + "size": 16391530, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012784, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.23999977, + "throttled": false, + "track": { + "id": "vi.3", + "lang": "vi", + "lang_name": "Vietnamese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390259&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774635042742&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgOlIVxx0AC4wowbBpyQ89y2jppeCWMxdZ3LVbCG9rQd4CIGyEC05PE-_FM7TSttWlFTKgiNkA8jnJSNtf9D_4XjAG&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Did", + "itag": 140, + "bitrate": 131352, + "average_bitrate": 129478, + "size": 16390259, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.05000019, + "throttled": false, + "track": { + "id": "id.3", + "lang": "id", + "lang_name": "Indonesian dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390265&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774257753534&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhANeDj-p5NoubthSkV7E2a7YuHIeby3bpFex8RXjg4ZzeAiEAi83NgX8Yf8beGebB0OjdfilxDu0pUWhzwTtl0Hyjm9I%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dth", + "itag": 140, + "bitrate": 131370, + "average_bitrate": 129478, + "size": 16390265, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": -0.22000027, + "throttled": false, + "track": { + "id": "th.3", + "lang": "th", + "lang_name": "Thai dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390328&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774284010544&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgDZjsfx5XXux6JJBpb2cSCdXVfkrEUUtJkwgmUcW3Q70CIQC9vsH4-3EPqdpXp8e6a49Ymo-ABJ0qPMZXaGhN7RsQ7A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Des", + "itag": 140, + "bitrate": 131442, + "average_bitrate": 129479, + "size": 16390328, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "es.3", + "lang": "es", + "lang_name": "Spanish dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390322&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774247299153&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAK7dNFuJ-OabRdLYzssZBxeK5fvEwzbgzb5mvFUIYHLlAiEAxAXXgUO2Es4XwAdDahE6ZTgL_5F_vBA9GIOqsTEM-A8%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dja", + "itag": 140, + "bitrate": 131470, + "average_bitrate": 129479, + "size": 16390322, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.010000229, + "throttled": false, + "track": { + "id": "ja.3", + "lang": "ja", + "lang_name": "Japanese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390327&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774270027380&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhALW_gPmGkDROPn1a2dt-zyB1QqhQURdAkTEmn1cfudK8AiEA35nSRSAty0D_5AQfWobLi2bFqiy1sPRpkoBeFiycMEg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dko", + "itag": 140, + "bitrate": 131400, + "average_bitrate": 129479, + "size": 16390327, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.19999981, + "throttled": false, + "track": { + "id": "ko.3", + "lang": "ko", + "lang_name": "Korean dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390295&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774202026700&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgTAu0TTw0Wh26pTDuDZPPbfN-qdra_boIpasoKyULttQCIQD6yd5QpMAMxkDLeR2bKeZ9cxYDM8dH_qELj1xfvdPoQw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dpt", + "itag": 140, + "bitrate": 131397, + "average_bitrate": 129479, + "size": 16390295, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "pt.3", + "lang": "pt", + "lang_name": "Portuguese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390526&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683774128511667&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgAgPM-BChAxZes5e0jzlrdDPSJ11uydb4BhzNo8tTCY0CIFtzLtVfBpirTVBWGe2LSLTfBF37BKYutO9x-8ldUZYD&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dhi", + "itag": 140, + "bitrate": 131451, + "average_bitrate": 129480, + "size": 16390526, + "index_range": { + "start": 618, + "end": 1873 + }, + "init_range": { + "start": 0, + "end": 617 + }, + "duration_ms": 1012691, + "mime": "audio/mp4; codecs=\"mp4a.40.2\"", + "format": "m4a", + "codec": "mp4a", + "channels": 2, + "loudness_db": -0.029999733, + "throttled": false, + "track": { + "id": "hi.3", + "lang": "hi", + "lang_name": "Hindi dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US", "itag": 140, "bitrate": 131424, - "average_bitrate": 129478, - "size": 16390216, + "average_bitrate": 129480, + "size": 16390508, "index_range": { - "start": 632, - "end": 1887 + "start": 618, + "end": 1873 }, "init_range": { "start": 0, - "end": 631 + "end": 617 }, + "duration_ms": 1012691, "mime": "audio/mp4; codecs=\"mp4a.40.2\"", "format": "m4a", "codec": "mp4a", + "channels": 2, + "loudness_db": 2.8500004, "throttled": false, "track": { - "id": "es.0", - "lang": "es", - "lang_name": "Spanish", - "is_default": false + "id": "en-US.4", + "lang": "en-US", + "lang_name": "English (United States) original", + "is_default": true, + "track_type": "original" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390628&dur=1012.691&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=140&keepalive=yes&lmt=1659766154827884&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgc8oxPEHDO0cgO3ZcbPmv3nrkzfy52WchpV0HcBcUw24CIEFxLKBcM4vVqGeRkt581dFL2tetvHd93SHCTVEUnIn_&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=974435&dur=60.139&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683773999871168&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAM8CiLR9cWKK0bNXi94LSP507keLjhYqj-QVJ7yciDY-AiEApa5peClRS2uesRzXdlJfpuX9jEj_tBf1C85tEjcF1Sk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr", "itag": 140, - "bitrate": 131433, - "average_bitrate": 129481, - "size": 16390628, + "bitrate": 131206, + "average_bitrate": 129624, + "size": 974435, "index_range": { - "start": 632, - "end": 1887 + "start": 618, + "end": 733 }, "init_range": { "start": 0, - "end": 631 + "end": 617 }, + "duration_ms": 60139, "mime": "audio/mp4; codecs=\"mp4a.40.2\"", "format": "m4a", "codec": "mp4a", + "channels": 2, + "loudness_db": 0.47000027, "throttled": false, "track": { - "id": "en.0", - "lang": "en", - "lang_name": "English", - "is_default": true + "id": "fr.3", + "lang": "fr", + "lang_name": "French dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104134&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767097097120&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgW4IxGJJFRAwZefvDdDkJfjhN7y3bPmh96BCFuyFn6pwCIQDW6pVnk_DwMC3FcZy5rXNUULMNWLdadScxwuhFTFR84g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Den", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=940286&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774002236584&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIUUin7WZBnoVDb2p0wuTPc7HZwbF8I5sxzLrVN9WeBwAiBQTZwhxCQ1IdrUkkD1-cSGYBtMF1aKkjPZ-LWeie0aZA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr", + "itag": 251, + "bitrate": 133120, + "average_bitrate": 125160, + "size": 940286, + "index_range": { + "start": 259, + "end": 373 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 60101, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.46000004, + "throttled": false, + "track": { + "id": "fr.3", + "lang": "fr", + "lang_name": "French dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US", "itag": 251, "bitrate": 139540, "average_bitrate": 127222, - "size": 16104134, + "size": 16104136, "index_range": { "start": 266, "end": 1996 @@ -882,23 +1707,27 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 2.8500004, "throttled": false, "track": { - "id": "en.0", - "lang": "en", - "lang_name": "English", - "is_default": true + "id": "en-US.4", + "lang": "en-US", + "lang_name": "English (United States) original", + "is_default": true, + "track_type": "original" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16173831&dur=1012.661&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767030316577&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIhANpBdWMzUZPSAUKr8C4h14Nh2l_V-B0lBJljV-w40XbDAh91bkDc3H025IFyGbKZQbShgqstZOSRe3AI-hTYHX74&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Des", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16172620&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774239240001&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgG4vKZds_xbVFoiERAwSTUOS9Y2czcxrSnGutlEbeIt8CIQChci9XqI9w0kkMckgnwpjVk0o0md6ZJebwlbxfh_cxGg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Des", "itag": 251, - "bitrate": 142029, - "average_bitrate": 127772, - "size": 16173831, + "bitrate": 142399, + "average_bitrate": 127763, + "size": 16172620, "index_range": { "start": 266, "end": 1996 @@ -907,23 +1736,27 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.0, "throttled": false, "track": { - "id": "es.0", + "id": "es.3", "lang": "es", - "lang_name": "Spanish", - "is_default": false + "lang_name": "Spanish dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16303396&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767030204303&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgCRDUBzurQtw78ikEpSMCylA6fOCD8siwN3nlAulHsfkCIFgnZ9lhmqNfrYftjUFYhrL9GKqy-C1SxX3Yj5utvvem&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dpt", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16273626&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774141188913&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIgeOZsp58P_XkwS-3eh5icSEpAnFna2bdZYpus-lSKHqcCIQDXm3A2ITEfj4tmxAOEtukH93HXF3rE5x0zj-b2OHAAMw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dpt", "itag": 251, - "bitrate": 145195, - "average_bitrate": 128788, - "size": 16303396, + "bitrate": 149345, + "average_bitrate": 128561, + "size": 16273626, "index_range": { "start": 266, "end": 1996 @@ -932,23 +1765,85 @@ "start": 0, "end": 265 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.0, "throttled": false, "track": { - "id": "pt.0", + "id": "pt.3", "lang": "pt", - "lang_name": "Portuguese", - "is_default": false + "lang_name": "Portuguese dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16357630&dur=1012.721&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767033119964&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKtzVVyoS46hkuKX31EyUE6X6Q5wotcToOCnYKswX3x_AiB0G2SUdVoso39bYgewd3zT8Pf77DrVtahXh4kVb46T9g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dfr", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16309690&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774201612138&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgXxDJSDmUwzGJgZ8tQyZdOwQlvncTF3gZvwxFumOOYuoCIDSKOA_ceWGaWJxm068JlEqb2QZE-wskq6z9R6bm7raJ&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dja", "itag": 251, - "bitrate": 152389, - "average_bitrate": 129217, - "size": 16357630, + "bitrate": 148909, + "average_bitrate": 128846, + "size": 16309690, + "index_range": { + "start": 266, + "end": 1996 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ja.3", + "lang": "ja", + "lang_name": "Japanese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16406377&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774182484168&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgV_085hjjR501_w5qnEorlFTYW7edYPRWPumTUphUlJ8CICz89tkm-TvGb6xOY6mLDM9gLQvWqQW4LNGjLHE16USh&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dru", + "itag": 251, + "bitrate": 148233, + "average_bitrate": 129604, + "size": 16406377, + "index_range": { + "start": 266, + "end": 1996 + }, + "init_range": { + "start": 0, + "end": 265 + }, + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.0, + "throttled": false, + "track": { + "id": "ru.3", + "lang": "ru", + "lang_name": "Russian dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16437242&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774312098922&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAOy0wyTuoLcKSjmtm8mFU076qnuM-PflNbMh1G8YvwPjAiEAuXhOfAH7MfBkgVTbCK8VXV8T0oBfGmhAeiOOXUEaOdQ%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dko", + "itag": 251, + "bitrate": 147336, + "average_bitrate": 129853, + "size": 16437242, "index_range": { "start": 259, "end": 1989 @@ -957,112 +1852,265 @@ "start": 0, "end": 258 }, + "duration_ms": 1012661, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.19999981, "throttled": false, "track": { - "id": "fr.0", - "lang": "fr", - "lang_name": "French", - "is_default": false + "id": "ko.3", + "lang": "ko", + "lang_name": "Korean dubbed", + "is_default": false, + "track_type": "dubbed" } }, { - "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16395805&dur=1012.701&ei=498HY6KvArqM6dsPiN6QgAE&expire=1661482051&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AK8GbbQovVxldcBz4pkXu4EA9N2sU-4yPPa5hFT3bXta&initcwndbps=1392500&ip=2003%3Ade%3Aaf1e%3A8a00%3A84c6%3A28f3%3A9de2%3A464&itag=251&keepalive=yes&lmt=1659767045309297&lsig=AG3C_xAwRAIgLFPuLqOoHoNQax15AE9Q2YIZ7pM7-olbGWgYGv1MDccCIADKSc_HeOdmD7CDs4AkY5ZtWF4gdZd4rw99Cqlzakbk&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1661460078&mv=m&mvi=4&n=LwUYrFgbIVPzmA&ns=bBqoZtLH6lsaX8ke0xgRMM8H&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgZEM5KWfik0JpS3ss9jNMTPY-iNi-LH0opwLwe4PlRusCIQCB4W1brmFsbmAM62FM21U5ZljqnYlnW3lT-9otjFlL7w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-Khmjdu08WYG7DxAg_8xq0R2u5a6w&txp=4532434&vprv=1&xtags=lang%3Dru", + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16503759&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774452750409&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgZ9I1Exp2E_Yz2h3Y3resoex9xjX4qKxuLaeSA4LOT0oCICEOkfSfZWVN9gIPTv_u2QsuLYaKdJR5QbF8l_RKwRrR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dvi", "itag": 251, - "bitrate": 147725, - "average_bitrate": 129521, - "size": 16395805, + "bitrate": 156644, + "average_bitrate": 130369, + "size": 16503759, "index_range": { - "start": 266, - "end": 1996 + "start": 259, + "end": 1989 }, "init_range": { "start": 0, - "end": 265 + "end": 258 }, + "duration_ms": 1012741, "mime": "audio/webm; codecs=\"opus\"", "format": "webm", "codec": "opus", + "channels": 2, + "loudness_db": 0.23999977, "throttled": false, "track": { - "id": "ru.0", - "lang": "ru", - "lang_name": "Russian", - "is_default": false + "id": "vi.3", + "lang": "vi", + "lang_name": "Vietnamese dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16595154&dur=1012.741&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774305565612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhALmBI5BItjBxGA38fu01UiqEsyfj0GYhryI92fjJqHznAiEAjAALeoI0QriCyzgnGAIoQLiYXB6aqa2cVCFzuzaAxng%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dtr", + "itag": 251, + "bitrate": 149448, + "average_bitrate": 131091, + "size": 16595154, + "index_range": { + "start": 259, + "end": 1989 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012741, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.32999992, + "throttled": false, + "track": { + "id": "tr.3", + "lang": "tr", + "lang_name": "Turkish dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16782431&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774591808718&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgEE8fki4wbboBeQKe2fPD7lsLdhfEIZYzc0eUYFXUOK4CIBfRgCpPUW4KKfUXn6_xMUFgHEnicCtFTwjDtjpwEiqw&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dth", + "itag": 251, + "bitrate": 149351, + "average_bitrate": 132580, + "size": 16782431, + "index_range": { + "start": 259, + "end": 1989 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.22000027, + "throttled": false, + "track": { + "id": "th.3", + "lang": "th", + "lang_name": "Thai dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16908426&dur=1012.701&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774297518607&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAP6XUiAQEuUJ2R3pUSEOufTqB1-44vM3g56El1_JPPSkAiEAwiFctjZJ1UI80Mdyvl90eVb0pm9UdNnfikpc_ytFhSc%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dar", + "itag": 251, + "bitrate": 150531, + "average_bitrate": 133570, + "size": 16908426, + "index_range": { + "start": 259, + "end": 1990 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012701, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -2.3899994, + "throttled": false, + "track": { + "id": "ar.3", + "lang": "ar", + "lang_name": "Arabic dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16914299&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774258129207&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAK5P0ty7iw3jrkPX_jcgrlBm03_kTnBpTDjt5XEoqKVkAiEAoAXxjEi9pO1ZLG92AheS0FTSd4L6ZZhV5GLSUWsDXIE%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dhi", + "itag": 251, + "bitrate": 150421, + "average_bitrate": 133622, + "size": 16914299, + "index_range": { + "start": 259, + "end": 1990 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": -0.029999733, + "throttled": false, + "track": { + "id": "hi.3", + "lang": "hi", + "lang_name": "Hindi dubbed", + "is_default": false, + "track_type": "dubbed" + } + }, + { + "url": "https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=17006899&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774349365634&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhALICU7eDcDhm4CJCG2onLBNBvFnx0esdDH892bit1mg1AiEA-lPYQY5tWdMCXj-UDD2v3TyUJ3kuBvnh_K3FjkVwIz4%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Did", + "itag": 251, + "bitrate": 156919, + "average_bitrate": 134354, + "size": 17006899, + "index_range": { + "start": 259, + "end": 1991 + }, + "init_range": { + "start": 0, + "end": 258 + }, + "duration_ms": 1012661, + "mime": "audio/webm; codecs=\"opus\"", + "format": "webm", + "codec": "opus", + "channels": 2, + "loudness_db": 0.03999996, + "throttled": false, + "track": { + "id": "id.3", + "lang": "id", + "lang_name": "Indonesian dubbed", + "is_default": false, + "track_type": "dubbed" } } ], "subtitles": [ { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=ar", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=ar", "lang": "ar", "lang_name": "Arabic", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=zh-Hant", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=zh-Hant", "lang": "zh-Hant", "lang_name": "Chinese (Traditional)", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&kind=asr&lang=en", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&kind=asr&lang=en", "lang": "en", "lang_name": "English", "auto_generated": true }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=en-US", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=en-US", "lang": "en-US", "lang_name": "English (United States)", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=fr", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=fr", "lang": "fr", "lang_name": "French", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=de", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=de", "lang": "de", "lang_name": "German", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=hi", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=hi", "lang": "hi", "lang_name": "Hindi", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=ja", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=ja", "lang": "ja", "lang_name": "Japanese", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=ko", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=ko", "lang": "ko", "lang_name": "Korean", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=pt-BR", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=pt-BR", "lang": "pt-BR", "lang_name": "Portuguese (Brazil)", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=ru", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=ru", "lang": "ru", "lang_name": "Russian", "auto_generated": false }, { - "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1661485651&sparams=ip,ipbits,expire,v,caps,xoaf&signature=3093423A0F5435651253D036B9DD393187B769F0.EA07522F077826AD35561DF31A1EFD47BAE6178A&key=yt8&lang=es-419", + "url": "https://www.youtube.com/api/timedtext?v=tVWWp1PqDus&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1683836504&sparams=ip,ipbits,expire,v,caps,opi,xoaf&signature=41CBFC1E137A939274C980CEA38500AB72760AC4.96803D0F64B42001D73C1897234E1C75FE528F10&key=yt8&lang=es-419", "lang": "es-419", "lang_name": "Spanish (Latin America)", "auto_generated": false @@ -1070,5 +2118,6 @@ ], "expires_in_seconds": 21540, "hls_manifest_url": null, - "dash_manifest_url": null + "dash_manifest_url": null, + "visitor_data": "CgtGWDFCUllrcTdxayjo1_OiBg%3D%3D" } diff --git a/tests/youtube.rs b/tests/youtube.rs index fd2f368..3660e84 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::collections::HashMap; use std::fmt::Display; use std::str::FromStr; @@ -15,8 +15,8 @@ use rustypipe::model::{ paginator::Paginator, richtext::ToPlaintext, traits::{FromYtItem, YtStream}, - AlbumType, AudioCodec, AudioFormat, Channel, MusicGenre, MusicItemType, UrlTarget, - Verification, VideoCodec, VideoFormat, YouTubeItem, + AlbumType, AudioCodec, AudioFormat, AudioTrackType, Channel, MusicGenre, MusicItemType, + UrlTarget, Verification, VideoCodec, VideoFormat, YouTubeItem, }; use rustypipe::param::{ search_filter::{self, SearchFilter}, @@ -261,11 +261,26 @@ fn get_player( let langs = player_data .audio_streams .iter() - .filter_map(|stream| stream.track.as_ref().map(|t| t.lang.as_deref().unwrap())) - .collect::>(); + .filter_map(|stream| { + stream + .track + .as_ref() + .map(|t| (t.lang.as_deref().unwrap(), t.track_type.unwrap())) + }) + .collect::>(); - for l in ["en-US", "es", "fr", "pt", "ru"] { - assert!(langs.contains(l), "missing lang: {l}"); + assert_eq!( + langs.get("en-US"), + Some(&AudioTrackType::Original), + "missing lang: en-US" + ); + + for l in ["es", "fr", "pt", "ru"] { + assert_eq!( + langs.get(l), + Some(&AudioTrackType::Dubbed), + "missing lang: {l}" + ); } } _ => {} From e1843416255d26eb91f582f4be33adcc79d98c84 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 11 May 2023 17:00:01 +0200 Subject: [PATCH 4/6] fix: improve language docs + string parsing --- codegen/src/gen_locales.rs | 48 +++++++-- src/param/locale.rs | 178 +++++++++++++++++-------------- src/util/mod.rs | 12 +++ testfiles/dict/gen_lang_names.js | 16 +++ testfiles/dict/lang_names.json | 85 +++++++++++++++ tests/youtube.rs | 8 +- 6 files changed, 255 insertions(+), 92 deletions(-) create mode 100644 testfiles/dict/gen_lang_names.js create mode 100644 testfiles/dict/lang_names.json diff --git a/codegen/src/gen_locales.rs b/codegen/src/gen_locales.rs index bcdeb70..b31a113 100644 --- a/codegen/src/gen_locales.rs +++ b/codegen/src/gen_locales.rs @@ -1,5 +1,7 @@ use std::collections::BTreeMap; use std::fmt::Write; +use std::fs::File; +use std::io::BufReader; use path_macro::path; use reqwest::header; @@ -9,6 +11,7 @@ use serde_with::serde_as; use serde_with::VecSkipError; use crate::model::Text; +use crate::util::DICT_DIR; use crate::util::SRC_DIR; #[serde_as] @@ -141,16 +144,41 @@ struct LanguageCountryCommand { pub async fn generate_locales() { let (languages, countries) = get_locales().await; + let json_path = path!(*DICT_DIR / "lang_names.json"); + let json_file = File::open(json_path).unwrap(); + let lang_names: BTreeMap = + serde_json::from_reader(BufReader::new(json_file)).unwrap(); + let code_head = r#"// This file is automatically generated. DO NOT EDIT. //! Languages and countries +use std::str::FromStr; + use serde::{Deserialize, Serialize}; use crate::error::Error; "#; - let code_foot = r#"serde_plain::derive_fromstr_from_deserialize!(Language, Error); + let code_foot = r#"impl FromStr for Language { + type Err = Error; + + fn from_str(s: &str) -> Result { + let mut sub = s; + loop { + if let Ok(v) = serde_plain::from_str(sub) { + return Ok(v); + } + match sub.rfind('-') { + Some(pos) => { + sub = &sub[..pos]; + } + None => return Err(Error::Other("could not parse language `{s}`".into())), + } + } + } +} + serde_plain::derive_display_from_serialize!(Language); serde_plain::derive_fromstr_from_deserialize!(Country, Error); @@ -199,8 +227,8 @@ pub enum Country { "# .to_owned(); - languages.iter().for_each(|(c, n)| { - let enum_name = c + languages.iter().for_each(|(code, native_name)| { + let enum_name = code .split('-') .map(|c| { format!( @@ -211,10 +239,16 @@ pub enum Country { }) .collect::(); + let en_name = lang_names.get(code).expect(code); + // Language enum - write!(code_langs, " /// {n}\n ").unwrap(); - if c.contains('-') { - write!(code_langs, "#[serde(rename = \"{c}\")]\n ").unwrap(); + if en_name == native_name || code.starts_with("en") { + write!(code_langs, " /// {native_name}\n ").unwrap(); + } else { + write!(code_langs, " /// {en_name} / {native_name}\n ").unwrap(); + } + if code.contains('-') { + write!(code_langs, "#[serde(rename = \"{code}\")]\n ").unwrap(); } code_langs += &enum_name; code_langs += ",\n"; @@ -225,7 +259,7 @@ pub enum Country { // Language names writeln!( code_lang_names, - " Language::{enum_name} => \"{n}\"," + " Language::{enum_name} => \"{native_name}\"," ) .unwrap(); }); diff --git a/src/param/locale.rs b/src/param/locale.rs index 5ac8975..a9f1be2 100644 --- a/src/param/locale.rs +++ b/src/param/locale.rs @@ -2,6 +2,8 @@ //! Languages and countries +use std::str::FromStr; + use serde::{Deserialize, Serialize}; use crate::error::Error; @@ -13,31 +15,31 @@ use crate::error::Error; pub enum Language { /// Afrikaans Af, - /// አማርኛ + /// Amharic / አማርኛ Am, - /// العربية + /// Arabic / العربية Ar, - /// অসমীয়া + /// Assamese / অসমীয়া As, - /// Azərbaycan + /// Azerbaijani / Azərbaycan Az, - /// Беларуская + /// Belarusian / Беларуская Be, - /// Български + /// Bulgarian / Български Bg, - /// বাংলা + /// Bangla / বাংলা Bn, - /// Bosanski + /// Bosnian / Bosanski Bs, - /// Català + /// Catalan / Català Ca, - /// Čeština + /// Czech / Čeština Cs, - /// Dansk + /// Danish / Dansk Da, - /// Deutsch + /// German / Deutsch De, - /// Ελληνικά + /// Greek / Ελληνικά El, /// English (US) En, @@ -47,145 +49,145 @@ pub enum Language { /// English (India) #[serde(rename = "en-IN")] EnIn, - /// Español (España) + /// Spanish / Español (España) Es, - /// Español (Latinoamérica) + /// Latin American Spanish / Español (Latinoamérica) #[serde(rename = "es-419")] Es419, - /// Español (US) + /// Spanish (United States) / Español (US) #[serde(rename = "es-US")] EsUs, - /// Eesti + /// Estonian / Eesti Et, - /// Euskara + /// Basque / Euskara Eu, - /// فارسی + /// Persian / فارسی Fa, - /// Suomi + /// Finnish / Suomi Fi, /// Filipino Fil, - /// Français + /// French / Français Fr, - /// Français (Canada) + /// Canadian French / Français (Canada) #[serde(rename = "fr-CA")] FrCa, - /// Galego + /// Galician / Galego Gl, - /// ગુજરાતી + /// Gujarati / ગુજરાતી Gu, - /// हिन्दी + /// Hindi / हिन्दी Hi, - /// Hrvatski + /// Croatian / Hrvatski Hr, - /// Magyar + /// Hungarian / Magyar Hu, - /// Հայերեն + /// Armenian / Հայերեն Hy, - /// Bahasa Indonesia + /// Indonesian / Bahasa Indonesia Id, - /// Íslenska + /// Icelandic / Íslenska Is, - /// Italiano + /// Italian / Italiano It, - /// עברית + /// Hebrew / עברית Iw, - /// 日本語 + /// Japanese / 日本語 Ja, - /// ქართული + /// Georgian / ქართული Ka, - /// Қазақ Тілі + /// Kazakh / Қазақ Тілі Kk, - /// ខ្មែរ + /// Khmer / ខ្មែរ Km, - /// ಕನ್ನಡ + /// Kannada / ಕನ್ನಡ Kn, - /// 한국어 + /// Korean / 한국어 Ko, - /// Кыргызча + /// Kyrgyz / Кыргызча Ky, - /// ລາວ + /// Lao / ລາວ Lo, - /// Lietuvių + /// Lithuanian / Lietuvių Lt, - /// Latviešu valoda + /// Latvian / Latviešu valoda Lv, - /// Македонски + /// Macedonian / Македонски Mk, - /// മലയാളം + /// Malayalam / മലയാളം Ml, - /// Монгол + /// Mongolian / Монгол Mn, - /// मराठी + /// Marathi / मराठी Mr, - /// Bahasa Malaysia + /// Malay / Bahasa Malaysia Ms, - /// ဗမာ + /// Burmese / ဗမာ My, - /// नेपाली + /// Nepali / नेपाली Ne, - /// Nederlands + /// Dutch / Nederlands Nl, - /// Norsk + /// Norwegian / Norsk No, - /// ଓଡ଼ିଆ + /// Odia / ଓଡ଼ିଆ Or, - /// ਪੰਜਾਬੀ + /// Punjabi / ਪੰਜਾਬੀ Pa, - /// Polski + /// Polish / Polski Pl, - /// Português (Brasil) + /// Portuguese / Português (Brasil) Pt, - /// Português + /// European Portuguese / Português #[serde(rename = "pt-PT")] PtPt, - /// Română + /// Romanian / Română Ro, - /// Русский + /// Russian / Русский Ru, - /// සිංහල + /// Sinhala / සිංහල Si, - /// Slovenčina + /// Slovak / Slovenčina Sk, - /// Slovenščina + /// Slovenian / Slovenščina Sl, - /// Shqip + /// Albanian / Shqip Sq, - /// Српски + /// Serbian / Српски Sr, - /// Srpski + /// Serbian (Latin) / Srpski #[serde(rename = "sr-Latn")] SrLatn, - /// Svenska + /// Swedish / Svenska Sv, - /// Kiswahili + /// Swahili / Kiswahili Sw, - /// தமிழ் + /// Tamil / தமிழ் Ta, - /// తెలుగు + /// Telugu / తెలుగు Te, - /// ภาษาไทย + /// Thai / ภาษาไทย Th, - /// Türkçe + /// Turkish / Türkçe Tr, - /// Українська + /// Ukrainian / Українська Uk, - /// اردو + /// Urdu / اردو Ur, - /// O‘zbek + /// Uzbek / O‘zbek Uz, - /// Tiếng Việt + /// Vietnamese / Tiếng Việt Vi, - /// 中文 (简体) + /// Chinese (China) / 中文 (简体) #[serde(rename = "zh-CN")] ZhCn, - /// 中文 (香港) + /// Chinese (Hong Kong) / 中文 (香港) #[serde(rename = "zh-HK")] ZhHk, - /// 中文 (繁體) + /// Chinese (Taiwan) / 中文 (繁體) #[serde(rename = "zh-TW")] ZhTw, - /// IsiZulu + /// Zulu / IsiZulu Zu, } @@ -829,7 +831,25 @@ impl Country { } } -serde_plain::derive_fromstr_from_deserialize!(Language, Error); +impl FromStr for Language { + type Err = Error; + + fn from_str(s: &str) -> Result { + let mut sub = s; + loop { + if let Ok(v) = serde_plain::from_str(sub) { + return Ok(v); + } + match sub.rfind('-') { + Some(pos) => { + sub = &sub[..pos]; + } + None => return Err(Error::Other("could not parse language `{s}`".into())), + } + } + } +} + serde_plain::derive_display_from_serialize!(Language); serde_plain::derive_fromstr_from_deserialize!(Country, Error); diff --git a/src/util/mod.rs b/src/util/mod.rs index e794681..f77e600 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -618,4 +618,16 @@ pub(crate) mod tests { let res_str = res.join(" "); assert_eq!(res_str, teststr) } + + #[rstest] + #[case("en", Some(Language::En))] + #[case("en-GB", Some(Language::EnGb))] + #[case("en-US", Some(Language::En))] + #[case("en-ZZ", Some(Language::En))] + #[case("xy", None)] + #[case("xy-ZZ", None)] + fn parse_language(#[case] s: &str, #[case] expect: Option) { + let res = Language::from_str(s).ok(); + assert_eq!(res, expect); + } } diff --git a/testfiles/dict/gen_lang_names.js b/testfiles/dict/gen_lang_names.js new file mode 100644 index 0000000..8dde523 --- /dev/null +++ b/testfiles/dict/gen_lang_names.js @@ -0,0 +1,16 @@ +const fs = require("fs"); + +const dict = JSON.parse(fs.readFileSync("dictionary.json")); + +const intl = new Intl.DisplayNames(["en"], { type: "language" }); + +let langs = Object.keys(dict); +Object.values(dict).forEach(entry => { + if (entry.equivalent) { + langs.push(...entry.equivalent); + } +}); +langs.sort(); + +const res = Object.fromEntries(langs.map((l) => [l, intl.of(l)])); +fs.writeFileSync("lang_names.json", JSON.stringify(res, null, 2)); diff --git a/testfiles/dict/lang_names.json b/testfiles/dict/lang_names.json new file mode 100644 index 0000000..730ff2e --- /dev/null +++ b/testfiles/dict/lang_names.json @@ -0,0 +1,85 @@ +{ + "af": "Afrikaans", + "am": "Amharic", + "ar": "Arabic", + "as": "Assamese", + "az": "Azerbaijani", + "be": "Belarusian", + "bg": "Bulgarian", + "bn": "Bangla", + "bs": "Bosnian", + "ca": "Catalan", + "cs": "Czech", + "da": "Danish", + "de": "German", + "el": "Greek", + "en": "English", + "en-GB": "British English", + "en-IN": "English (India)", + "es": "Spanish", + "es-419": "Latin American Spanish", + "es-US": "Spanish (United States)", + "et": "Estonian", + "eu": "Basque", + "fa": "Persian", + "fi": "Finnish", + "fil": "Filipino", + "fr": "French", + "fr-CA": "Canadian French", + "gl": "Galician", + "gu": "Gujarati", + "hi": "Hindi", + "hr": "Croatian", + "hu": "Hungarian", + "hy": "Armenian", + "id": "Indonesian", + "is": "Icelandic", + "it": "Italian", + "iw": "Hebrew", + "ja": "Japanese", + "ka": "Georgian", + "kk": "Kazakh", + "km": "Khmer", + "kn": "Kannada", + "ko": "Korean", + "ky": "Kyrgyz", + "lo": "Lao", + "lt": "Lithuanian", + "lv": "Latvian", + "mk": "Macedonian", + "ml": "Malayalam", + "mn": "Mongolian", + "mr": "Marathi", + "ms": "Malay", + "my": "Burmese", + "ne": "Nepali", + "nl": "Dutch", + "no": "Norwegian", + "or": "Odia", + "pa": "Punjabi", + "pl": "Polish", + "pt": "Portuguese", + "pt-PT": "European Portuguese", + "ro": "Romanian", + "ru": "Russian", + "si": "Sinhala", + "sk": "Slovak", + "sl": "Slovenian", + "sq": "Albanian", + "sr": "Serbian", + "sr-Latn": "Serbian (Latin)", + "sv": "Swedish", + "sw": "Swahili", + "ta": "Tamil", + "te": "Telugu", + "th": "Thai", + "tr": "Turkish", + "uk": "Ukrainian", + "ur": "Urdu", + "uz": "Uzbek", + "vi": "Vietnamese", + "zh-CN": "Chinese (China)", + "zh-HK": "Chinese (Hong Kong)", + "zh-TW": "Chinese (Taiwan)", + "zu": "Zulu" +} diff --git a/tests/youtube.rs b/tests/youtube.rs index 3660e84..8d71802 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1172,12 +1172,8 @@ fn search_suggestion(rp: RustyPipe) { #[rstest] fn search_suggestion_empty(rp: RustyPipe) { - let result = tokio_test::block_on( - rp.query() - .lang(Language::Th) - .search_suggestion("fjew327p4ifjelwfvnewg49"), - ) - .unwrap(); + let result = + tokio_test::block_on(rp.query().search_suggestion("fjew327p4ifjelwfvnewg49")).unwrap(); assert!(result.is_empty()); } From aa5cd47dcdb63b986b6cedf50471562811d4576c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 24 Apr 2023 23:56:17 +0200 Subject: [PATCH 5/6] feat: add frameset --- src/client/player.rs | 53 +++++++++++++++- src/client/response/player.rs | 16 +++++ ...layer__tests__map_player_data_android.snap | 32 ++++++++++ ...layer__tests__map_player_data_desktop.snap | 32 ++++++++++ ...__tests__map_player_data_desktopmusic.snap | 32 ++++++++++ ...t__player__tests__map_player_data_ios.snap | 32 ++++++++++ ...__tests__map_player_data_tvhtml5embed.snap | 32 ++++++++++ src/model/frameset.rs | 61 +++++++++++++++++++ src/model/mod.rs | 11 ++-- testfiles/player_model/hdr.json | 3 +- testfiles/player_model/multilanguage.json | 1 + tests/youtube.rs | 44 ++++++++++++- 12 files changed, 339 insertions(+), 10 deletions(-) create mode 100644 src/model/frameset.rs diff --git a/src/client/player.rs b/src/client/player.rs index fe28dca..d84adfb 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -12,8 +12,8 @@ use crate::{ deobfuscate::Deobfuscator, error::{internal::DeobfError, Error, ExtractionError, UnavailabilityReason}, model::{ - traits::QualityOrd, AudioCodec, AudioFormat, AudioStream, AudioTrack, ChannelId, Subtitle, - VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails, VideoStream, + traits::QualityOrd, AudioCodec, AudioFormat, AudioStream, AudioTrack, ChannelId, Frameset, + Subtitle, VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails, VideoStream, }, param::Language, util, @@ -313,6 +313,54 @@ impl MapResponse for response::Player { .collect() }); + let preview_frames = self + .storyboards + .and_then(|sb| { + let spec = sb.player_storyboard_spec_renderer.spec; + let mut spec_parts = spec.split('|'); + let url_tmpl = spec_parts.next()?; + + Some( + spec_parts + .enumerate() + .filter_map(|(i, fs_spec)| { + // Example: 160#90#131#5#5#2000#M$M#rs$AOn4CLCV3TJ2Nty5fbw2r-Lqg4VDOZcVvQ + let mut parts = fs_spec.split('#'); + + let frame_width = parts.next()?.parse().ok()?; + let frame_height = parts.next()?.parse().ok()?; + let total_count = parts.next()?.parse().ok()?; + let frames_per_page_x = parts.next()?.parse().ok()?; + let frames_per_page_y = parts.next()?.parse().ok()?; + let duration_per_frame = parts.next()?.parse().ok()?; + + let n = parts.next()?; + let sigh = parts.next()?; + + let url = url_tmpl.replace("$L", &i.to_string()).replace("$N", n) + + "&sigh=" + + sigh; + + let sprite_count = ((total_count as f64) + / (frames_per_page_x * frames_per_page_y) as f64) + .ceil() as u32; + + Some(Frameset { + url_template: url, + frame_width, + frame_height, + page_count: sprite_count, + total_count, + duration_per_frame, + frames_per_page_x, + frames_per_page_y, + }) + }) + .collect(), + ) + }) + .unwrap_or_default(); + Ok(MapResult { c: VideoPlayer { details: video_info, @@ -323,6 +371,7 @@ impl MapResponse for response::Player { expires_in_seconds: streaming_data.expires_in_seconds, hls_manifest_url: streaming_data.hls_manifest_url, dash_manifest_url: streaming_data.dash_manifest_url, + preview_frames, visitor_data: self.response_context.visitor_data, }, warnings, diff --git a/src/client/response/player.rs b/src/client/response/player.rs index a801a3a..0de004d 100644 --- a/src/client/response/player.rs +++ b/src/client/response/player.rs @@ -7,6 +7,7 @@ use serde_with::{json::JsonString, DefaultOnError}; use super::{ResponseContext, Thumbnails}; use crate::serializer::{text::Text, MapResult}; +#[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Player { @@ -14,6 +15,9 @@ pub(crate) struct Player { pub streaming_data: Option, pub captions: Option, pub video_details: Option, + #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnError")] + pub storyboards: Option, pub response_context: ResponseContext, } @@ -246,3 +250,15 @@ pub(crate) struct VideoDetails { pub author: String, pub is_live_content: bool, } + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct Storyboards { + pub player_storyboard_spec_renderer: StoryboardRenderer, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct StoryboardRenderer { + pub spec: String, +} diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap index 98168f1..696c919 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_android.snap @@ -450,5 +450,37 @@ VideoPlayer( expires_in_seconds: 21540, hls_manifest_url: None, dash_manifest_url: Some("https://manifest.googlevideo.com/api/manifest/dash/expire/1659481355/ei/q1jpYtOPEYSBgQeHmqbwAQ/ip/2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e/id/a4fbddf14c6649b4/source/youtube/requiressl/yes/playback_host/rr5---sn-h0jeenek.googlevideo.com/mh/mQ/mm/31%2C29/mn/sn-h0jeenek%2Csn-h0jelnez/ms/au%2Crdu/mv/m/mvi/5/pl/37/hfr/1/as/fmp4_audio_clear%2Cfmp4_sd_hd_clear/initcwndbps/1527500/vprv/1/mt/1659459429/fvip/4/itag_bl/376%2C377%2C384%2C385%2C612%2C613%2C617%2C619%2C623%2C628%2C655%2C656%2C660%2C662%2C666%2C671/keepalive/yes/fexp/24001373%2C24007246/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cvprv%2Citag/sig/AOq0QJ8wRAIgMm4a_MIHA3YUszKeruSy3exs5JwNjJAyLAwxL0yPdNMCIANb9GDMSTp_NT-PPhbvYMwRULJ5a9BO6MYD9FuWprC1/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AG3C_xAwRQIgETSOwhwWVMy7gmrFXZlJu655ToLzSwOEsT16oRyrWhACIQDkvOEw1fImz5omu4iVIRNFe-z-JC9v8WUyx281dW2NOw%3D%3D"), + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCWd3ylPF7ViQFBu5RUODMcusr_5g", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLA6xat5cfw0e3EX_5SW-TPwkmExxA", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], visitor_data: Some("Cgt2aHFtQU5YZFBvYyirsaWXBg%3D%3D"), ) diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap index 56b35be..8de2d4a 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktop.snap @@ -569,5 +569,37 @@ VideoPlayer( expires_in_seconds: 21540, hls_manifest_url: None, dash_manifest_url: Some("https://manifest.googlevideo.com/api/manifest/dash/expire/1659481355/ei/q1jpYtq3BJCX1gKVyJGQDg/ip/2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e/id/a4fbddf14c6649b4/source/youtube/requiressl/yes/playback_host/rr4---sn-h0jelnez.googlevideo.com/mh/mQ/mm/31%2C26/mn/sn-h0jelnez%2Csn-4g5edn6k/ms/au%2Conr/mv/m/mvi/4/pl/37/hfr/all/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/initcwndbps/1513750/spc/lT-KhrZGE2opztWyVdAtyUNlb8dXPDs/vprv/1/mt/1659459429/fvip/4/keepalive/yes/fexp/24001373%2C24007246/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cspc%2Cvprv%2Citag/sig/AOq0QJ8wRgIhAPEjHK19PKVHqQeia6WF4qubuMYk74LGi8F8lk5ZMPkFAiEAsaB2pKQWBvuPnNUnbdQXHc-izgsHJUP793woC2xNJlg%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AG3C_xAwRQIgOY4xu4H9wqPVZ7vF2i0hFcOnqrur1XGoA43a7ZEuuSUCIQCyPxBKXUQrKFmknNEGpX5GSWySKgMw_xHBikWpKpKwvg%3D%3D"), + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCWd3ylPF7ViQFBu5RUODMcusr_5g", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLA6xat5cfw0e3EX_5SW-TPwkmExxA", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], visitor_data: Some("CgtoS1pCMVJTNUJISSirsaWXBg%3D%3D"), ) diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap index 36f191a..19b2530 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_desktopmusic.snap @@ -387,5 +387,37 @@ VideoPlayer( expires_in_seconds: 21540, hls_manifest_url: None, dash_manifest_url: Some("https://manifest.googlevideo.com/api/manifest/dash/expire/1659487474/ei/knDpYub6BojEgAf6jbLgDw/ip/2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e/id/a4fbddf14c6649b4/source/youtube/requiressl/yes/playback_host/rr5---sn-h0jeenek.googlevideo.com/mh/mQ/mm/31%2C29/mn/sn-h0jeenek%2Csn-h0jelnez/ms/au%2Crdu/mv/m/mvi/5/pl/37/hfr/all/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/initcwndbps/1418750/spc/lT-Khox4YuJQ2wmH79zYALRvsWTPCUc/vprv/1/mt/1659465669/fvip/4/keepalive/yes/fexp/24001373%2C24007246/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cspc%2Cvprv%2Citag/sig/AOq0QJ8wRAIgErABhAEaoKHUDu9dDbpxE_8gR4b8WWAi61fnu8UKnuICIEYrEKcHvqHdO4V3R7cvSGwi_HGH34IlQsKbziOfMBov/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AG3C_xAwRQIgJxHmH0Sxo3cY_pW_ZzQ3hW9-7oz6K_pZWcUdrDDQ2sQCIQDJYNINQwLgKelgbO3CZYx7sMxdUAFpWdokmRBQ77vwvw%3D%3D"), + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCWd3ylPF7ViQFBu5RUODMcusr_5g", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLA6xat5cfw0e3EX_5SW-TPwkmExxA", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], visitor_data: Some("CgszSHZWNWs0SDhpTSiS4aWXBg%3D%3D"), ) diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap index 771f676..c5b2870 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_ios.snap @@ -168,5 +168,37 @@ VideoPlayer( expires_in_seconds: 21540, hls_manifest_url: Some("https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1659481355/ei/q1jpYq-xHs7NgQev0bfwAQ/ip/2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e/id/a4fbddf14c6649b4/source/youtube/requiressl/yes/playback_host/rr4---sn-h0jelnez.googlevideo.com/mh/mQ/mm/31%2C29/mn/sn-h0jelnez%2Csn-h0jeenek/ms/au%2Crdu/mv/m/mvi/4/pl/37/hfr/1/demuxed/1/tts_caps/1/maudio/1/initcwndbps/1513750/vprv/1/go/1/mt/1659459429/fvip/5/nvgoi/1/short_key/1/ncsapi/1/keepalive/yes/fexp/24001373%2C24007246/dover/13/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cdemuxed%2Ctts_caps%2Cmaudio%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AOq0QJ8wRQIhAIYnEHvIgJtJ8hehAXNtVY3qsgsq_GdOhWf2hkJZe6lCAiBxaRY_nubYp6hBizcAg_KFkKnkG-t2XYLRQ5wGdM3AjA%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AG3C_xAwRgIhAM_91Kk_0VLuSsR6nLCY7LdtWojyRAzXSScd_X9ShRROAiEA1AF4VY04F71NsAI8_j3iqjuXnWL9s6NoXHq7P8-bHx8%3D/file/index.m3u8"), dash_manifest_url: None, + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLBXrdgfuYV1WLnTGXqZtSAUm8oZCA", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCRazj84zMuwJLaCCc_PiUakX_YdQ", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], visitor_data: Some("Cgs4TXV4dk13WVEyWSirsaWXBg%3D%3D"), ) diff --git a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap index 5b7fad7..ab41d4a 100644 --- a/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap +++ b/src/client/snapshots/rustypipe__client__player__tests__map_player_data_tvhtml5embed.snap @@ -569,5 +569,37 @@ VideoPlayer( expires_in_seconds: 21540, hls_manifest_url: None, dash_manifest_url: Some("https://manifest.googlevideo.com/api/manifest/dash/expire/1659481355/ei/q1jpYv-eJ9uF6dsPhvyH8As/ip/2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e/id/a4fbddf14c6649b4/source/youtube/requiressl/yes/playback_host/rr4---sn-h0jelnez.googlevideo.com/mh/mQ/mm/31%2C29/mn/sn-h0jelnez%2Csn-h0jeenek/ms/au%2Crdu/mv/m/mvi/4/pl/37/hfr/all/as/fmp4_audio_clear%2Cfmp4_sd_hd_clear/initcwndbps/1527500/vprv/1/mt/1659459429/fvip/5/keepalive/yes/fexp/24001373%2C24007246/itag/0/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cas%2Cvprv%2Citag/sig/AOq0QJ8wRQIhANKWS7GCN4pSoHIQ6BMZdOaHAD0I25nHwRj7ds4qrxdEAiBsd9l8WIceqF7-2xyR82DGecCiS9hgUIPJhdNhkwVpHg%3D%3D/lsparams/playback_host%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps/lsig/AG3C_xAwRQIgMbu-wTOcXGCwGh27y0YZHktumKM1sopgxfQf8LCcCnECIQDnhFbgddOxwiQbnMOIcCn6ncpN54UyALRNigUSCp9Deg%3D%3D"), + preview_frames: [ + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ", + frame_width: 48, + frame_height: 27, + page_count: 1, + total_count: 100, + duration_per_frame: 0, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L1/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLBXrdgfuYV1WLnTGXqZtSAUm8oZCA", + frame_width: 80, + frame_height: 45, + page_count: 1, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 10, + frames_per_page_y: 10, + ), + Frameset( + url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L2/M$M.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCRazj84zMuwJLaCCc_PiUakX_YdQ", + frame_width: 160, + frame_height: 90, + page_count: 4, + total_count: 83, + duration_per_frame: 2000, + frames_per_page_x: 5, + frames_per_page_y: 5, + ), + ], visitor_data: Some("CgtacUJOMG81dTI3cyirsaWXBg%3D%3D"), ) diff --git a/src/model/frameset.rs b/src/model/frameset.rs new file mode 100644 index 0000000..cde1278 --- /dev/null +++ b/src/model/frameset.rs @@ -0,0 +1,61 @@ +use serde::{Deserialize, Serialize}; + +/// Set of video frames for seek preview +/// +/// YouTube generates a set of images containing a grid of frames for each video. +/// These images are used by the player for the seekbar preview. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[non_exhaustive] +pub struct Frameset { + /// Url template of the frameset + /// + /// The `$M` placeholder has to be replaced with the page index (starting from 0). + pub url_template: String, + /// Width of a single frame in pixels + pub frame_width: u32, + /// Height of a single frame in pixels + pub frame_height: u32, + /// Number of pages (individual images) + pub page_count: u32, + /// Total number of frames in the set + pub total_count: u32, + /// Duration per frame in milliseconds + pub duration_per_frame: u32, + /// Number of frames in the x direction + pub frames_per_page_x: u32, + /// Number of frames in the y direction. + pub frames_per_page_y: u32, +} + +/// Iterator producing frameset page urls +pub struct FramesetUrls<'a> { + frameset: &'a Frameset, + i: u32, +} + +impl Frameset { + /// Gets an iterator over the page URLs of the frameset + pub fn urls(&self) -> FramesetUrls { + FramesetUrls { + frameset: self, + i: 0, + } + } +} + +impl Iterator for FramesetUrls<'_> { + type Item = String; + + fn next(&mut self) -> Option { + if self.i < self.frameset.page_count { + let url = self + .frameset + .url_template + .replace("$M", &self.i.to_string()); + self.i += 1; + Some(url) + } else { + None + } + } +} diff --git a/src/model/mod.rs b/src/model/mod.rs index 8b73556..0250aaa 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -1,23 +1,22 @@ //! YouTube API response models mod convert; +mod frameset; mod ordering; pub mod paginator; pub mod richtext; - pub mod traits; - -use serde_with::serde_as; +pub use frameset::{Frameset, FramesetUrls}; use std::{collections::BTreeSet, ops::Range}; use serde::{Deserialize, Serialize}; +use serde_with::serde_as; use time::{Date, OffsetDateTime}; -use crate::{error::Error, param::Country, serializer::DateYmd, util}; - use self::{paginator::Paginator, richtext::RichText}; +use crate::{error::Error, param::Country, serializer::DateYmd, util}; /* #COMMON @@ -155,6 +154,8 @@ pub struct VideoPlayer { pub hls_manifest_url: Option, /// Dash manifest URL (for livestreams) pub dash_manifest_url: Option, + /// Video frames for seek preview + pub preview_frames: Vec, /// YouTube visitor data cookie pub visitor_data: Option, } diff --git a/testfiles/player_model/hdr.json b/testfiles/player_model/hdr.json index 4a9d8c1..d9b1f83 100644 --- a/testfiles/player_model/hdr.json +++ b/testfiles/player_model/hdr.json @@ -1124,5 +1124,6 @@ "subtitles": [], "expires_in_seconds": 21540, "hls_manifest_url": null, - "dash_manifest_url": null + "dash_manifest_url": null, + "preview_frames": [] } diff --git a/testfiles/player_model/multilanguage.json b/testfiles/player_model/multilanguage.json index ba8bde8..f1cb210 100644 --- a/testfiles/player_model/multilanguage.json +++ b/testfiles/player_model/multilanguage.json @@ -2119,5 +2119,6 @@ "expires_in_seconds": 21540, "hls_manifest_url": null, "dash_manifest_url": null, + "preview_frames": [], "visitor_data": "CgtGWDFCUllrcTdxayjo1_OiBg%3D%3D" } diff --git a/tests/youtube.rs b/tests/youtube.rs index 8d71802..7ff394b 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use std::fmt::Display; use std::str::FromStr; +use reqwest::Client; use rstest::{fixture, rstest}; use rustypipe::model::paginator::ContinuationEndpoint; use rustypipe::param::{ChannelOrder, ChannelVideoTab, Language}; @@ -15,8 +16,8 @@ use rustypipe::model::{ paginator::Paginator, richtext::ToPlaintext, traits::{FromYtItem, YtStream}, - AlbumType, AudioCodec, AudioFormat, AudioTrackType, Channel, MusicGenre, MusicItemType, - UrlTarget, Verification, VideoCodec, VideoFormat, YouTubeItem, + AlbumType, AudioCodec, AudioFormat, AudioTrackType, Channel, Frameset, MusicGenre, + MusicItemType, UrlTarget, Verification, VideoCodec, VideoFormat, YouTubeItem, }; use rustypipe::param::{ search_filter::{self, SearchFilter}, @@ -287,6 +288,11 @@ fn get_player( }; assert_gte(player_data.expires_in_seconds, 10_000, "expiry time"); + + if !is_live { + assert_gte(player_data.preview_frames.len(), 3, "preview framesets"); + player_data.preview_frames.iter().for_each(assert_frameset); + } } #[rstest] @@ -2375,3 +2381,37 @@ fn assert_album_id(id: &str) { fn assert_playlist_id(id: &str) { assert!(validate::playlist_id(id), "invalid playlist id: `{id}`"); } + +// fn assert_image(client: &Client, url: &str) { +// let resp = tokio_test::block_on(client.get(url).send()) +// .unwrap() +// .error_for_status() +// .unwrap(); +// let ctype = resp +// .headers() +// .get(reqwest::header::CONTENT_TYPE) +// .unwrap() +// .to_str() +// .unwrap(); + +// assert!(ctype.starts_with("image/"), "content type: {ctype}"); +// } + +fn assert_frameset(frameset: &Frameset) { + assert_gte(frameset.frame_height, 20, "frame height"); + assert_gte(frameset.frame_height, 20, "frame width"); + assert_gte(frameset.page_count, 1, "page count"); + assert_gte(frameset.total_count, 50, "total count"); + assert_gte(frameset.frames_per_page_x, 5, "frames per page x"); + assert_gte(frameset.frames_per_page_y, 5, "frames per page y"); + + // let client = Client::new(); + + let n = frameset + .urls() + // .map(|url| { + // assert_image(&client, &url); + // }) + .count() as u32; + assert_eq!(n, frameset.page_count); +} From b862d2d1f9f70fb751d90635b456dfb1312bd450 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 25 Apr 2023 00:12:59 +0200 Subject: [PATCH 6/6] cleanup tests --- tests/youtube.rs | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 7ff394b..5efdacf 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::fmt::Display; use std::str::FromStr; -use reqwest::Client; use rstest::{fixture, rstest}; use rustypipe::model::paginator::ContinuationEndpoint; use rustypipe::param::{ChannelOrder, ChannelVideoTab, Language}; @@ -2382,21 +2381,6 @@ fn assert_playlist_id(id: &str) { assert!(validate::playlist_id(id), "invalid playlist id: `{id}`"); } -// fn assert_image(client: &Client, url: &str) { -// let resp = tokio_test::block_on(client.get(url).send()) -// .unwrap() -// .error_for_status() -// .unwrap(); -// let ctype = resp -// .headers() -// .get(reqwest::header::CONTENT_TYPE) -// .unwrap() -// .to_str() -// .unwrap(); - -// assert!(ctype.starts_with("image/"), "content type: {ctype}"); -// } - fn assert_frameset(frameset: &Frameset) { assert_gte(frameset.frame_height, 20, "frame height"); assert_gte(frameset.frame_height, 20, "frame width"); @@ -2405,13 +2389,6 @@ fn assert_frameset(frameset: &Frameset) { assert_gte(frameset.frames_per_page_x, 5, "frames per page x"); assert_gte(frameset.frames_per_page_y, 5, "frames per page y"); - // let client = Client::new(); - - let n = frameset - .urls() - // .map(|url| { - // assert_image(&client, &url); - // }) - .count() as u32; + let n = frameset.urls().count() as u32; assert_eq!(n, frameset.page_count); }