Compare commits

..

26 commits

Author SHA1 Message Date
597db1797a fix: music_search: correct operation name in reports 2026-06-12 02:59:10 +02:00
33c531d2a4 feat: add support for SABR streams without stream URL 2026-06-12 02:37:17 +02:00
4ee4469303 fix: player requests with deobf feature disabled 2026-06-12 01:46:45 +02:00
94a602ede8 fix: retry with TV client using login for age-restricted videos 2026-06-11 22:30:16 +02:00
bb730961b2 feat: move complete deobfuscator into separate crate, add 'deobfuscator' feature 2026-06-11 22:22:42 +02:00
df0cb2fdf4 fix: TV client requiring visitor data 2026-06-10 23:12:41 +02:00
2131b47ef7 fix: code examples in README 2026-06-10 19:51:56 +02:00
e2d8ab44d2 feat: add featured channel names to video details/items 2026-06-10 04:17:48 +02:00
57101b2df6 fix: handle old rustypipe_cache files without new deobf.data.script, remove full deobf data from reports 2026-06-09 13:17:58 +02:00
6bb1d03cc1 chore: update dependencies 2026-06-08 18:03:51 +02:00
eff2440342 test: fix tests 2026-06-08 17:52:43 +02:00
690135205e chore: fix clippy lints, reformat 2026-06-08 17:50:29 +02:00
79340c92c9 test: fix tests 2026-06-08 17:48:29 +02:00
f765c851b6 chore: update to Rust edition 2024, MSRV 1.89.0 2026-06-08 17:47:45 +02:00
3b3abfbdff feat: add AndroidVr client 2026-06-08 17:18:35 +02:00
185f4177d3 fix: video details: parsing comments section 2026-06-08 17:18:04 +02:00
60afa8913c fix: parsing music_details and music_search 2026-06-08 17:13:40 +02:00
0a1067e6c5 feat!: output music artist description as RichText 2026-06-08 17:05:27 +02:00
aeb47010f6 fix: channel shorts: updated ShortsLockupViewModel thumbnail field, updated continuation tokens 2026-06-08 17:01:15 +02:00
7425243dea fix: Updated number/date parsing, fixed for languages ar, en-GB, bn, lo, mn, ro, si, sl 2026-06-08 16:50:21 +02:00
dc6640df20 Merge PR #77 into feat/deobf-extractor 2026-06-02 23:36:24 +02:00
4e3054eb5d fix: update channel_videos_tab_order continuation token 2026-06-02 23:31:35 +02:00
6eb770428e feat: working deobf extractor 2026-06-02 20:15:14 +02:00
cdcb36bd28 feat: add deobf-extractor 2026-06-01 16:58:02 +02:00
Julian Schmidhuber
a5c9ca89f2 fix: Fix duration parsing 2026-05-23 14:04:12 +02:00
Julian Schmidhuber
f5bab5b81c fix: Video item uploaded and views parsing 2026-05-23 11:43:49 +02:00
181 changed files with 262866 additions and 11888 deletions

View file

@ -1,7 +1,7 @@
[package]
name = "rustypipe"
version = "0.11.4"
rust-version = "1.67.1"
rust-version = "1.89.0"
edition.workspace = true
authors.workspace = true
license.workspace = true
@ -13,10 +13,10 @@ description = "Client for the public YouTube / YouTube Music API (Innertube), in
include = ["/src", "README.md", "CHANGELOG.md", "LICENSE", "!snapshots"]
[workspace]
members = [".", "codegen", "downloader", "cli"]
members = [".", "codegen", "downloader", "cli", "deobfuscator"]
[workspace.package]
edition = "2021"
edition = "2024"
authors = ["ThetaDev <thetadev@magenta.de>"]
license = "GPL-3.0"
repository = "https://codeberg.org/ThetaDev/rustypipe"
@ -24,13 +24,12 @@ keywords = ["youtube", "video", "music"]
categories = ["api-bindings", "multimedia"]
[workspace.dependencies]
rquickjs = "0.9.0"
rquickjs = "0.12.0"
once_cell = "1.12.0"
regex = "1.6.0"
fancy-regex = "0.14.0"
thiserror = "2.0.0"
url = "2.2.0"
reqwest = { version = "0.12.0", default-features = false }
reqwest = { version = "0.13.0", default-features = false }
tokio = "1.20.4"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.82"
@ -39,8 +38,8 @@ serde_with = { version = "3.0.0", default-features = false, features = [
"macros",
] }
serde_plain = "1.0.0"
sha1 = "0.10.0"
rand = "0.9.0"
sha1 = "0.11.0"
rand = "0.10.0"
time = { version = "0.3.37", features = [
"macros",
"serde-human-readable",
@ -48,17 +47,18 @@ time = { version = "0.3.37", features = [
"local-offset",
] }
futures-util = "0.3.31"
ress = "0.11.0"
phf = "0.11.0"
phf_codegen = "0.11.0"
phf = "0.13.0"
phf_codegen = "0.13.0"
data-encoding = "2.0.0"
urlencoding = "2.1.0"
quick-xml = { version = "0.37.0", features = ["serialize"] }
quick-xml = { version = "0.40.0", features = ["serialize"] }
tracing = { version = "0.1.0", features = ["log"] }
log = "0.4.0"
localzone = "0.3.1"
double-ended-peekable = "0.1.0"
# CLI
indicatif = "0.17.0"
indicatif = "0.18.0"
anyhow = "1.0"
clap = { version = "4.0.0", features = ["derive"] }
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
@ -67,11 +67,11 @@ dirs = "6.0.0"
filenamify = "0.1.0"
# Testing
rstest = "0.25.0"
rstest = "0.26.0"
tokio-test = "0.4.2"
insta = { version = "1.17.1", features = ["ron", "redactions"] }
path_macro = "1.0.0"
tracing-test = "0.2.5"
tracing-test = { version = "0.2.5", features = ["no-env-filter"] }
# Included crates
rustypipe = { path = ".", version = "0.11.4", default-features = false }
@ -79,26 +79,27 @@ rustypipe-downloader = { path = "./downloader", version = "0.3.1", default-featu
"indicatif",
"audiotag",
] }
rustypipe-deobfuscator = { path = "./deobfuscator", version = "0.1.0" }
[features]
default = ["default-tls"]
default = ["default-tls", "deobfuscator"]
rss = ["dep:quick-xml"]
userdata = []
deobfuscator = ["dep:rustypipe-deobfuscator"]
# Reqwest TLS options
default-tls = ["reqwest/default-tls"]
rustls = ["reqwest/rustls"]
rustls-no-provider = ["reqwest/rustls-no-provider"]
native-tls = ["reqwest/native-tls"]
native-tls-alpn = ["reqwest/native-tls-alpn"]
native-tls-no-alpn = ["reqwest/native-tls-no-alpn"]
native-tls-vendored = ["reqwest/native-tls-vendored"]
rustls-tls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"]
native-tls-vendored-no-alpn = ["reqwest/native-tls-vendored-no-alpn"]
[dependencies]
rquickjs.workspace = true
once_cell.workspace = true
regex.workspace = true
fancy-regex.workspace = true
thiserror.workspace = true
url.workspace = true
reqwest = { workspace = true, features = ["json", "gzip", "brotli"] }
@ -110,13 +111,14 @@ serde_plain.workspace = true
sha1.workspace = true
rand.workspace = true
time.workspace = true
ress.workspace = true
phf.workspace = true
data-encoding.workspace = true
urlencoding.workspace = true
tracing.workspace = true
localzone.workspace = true
double-ended-peekable.workspace = true
quick-xml = { workspace = true, optional = true }
rustypipe-deobfuscator = { workspace = true, optional = true }
[dev-dependencies]
rstest.workspace = true

View file

@ -103,7 +103,7 @@ async fn main() {
// Create a client
let rp = RustyPipe::new();
// Get the playlist
let playlist = rp
let mut playlist = rp
.query()
.playlist("PL2_OBreMn7FrsiSW0VDZjdq0xqUKkZYHT")
.await
@ -119,7 +119,7 @@ async fn main() {
.videos
.items
.iter()
.for_each(|v| println!("[{}] {} ({}s)", v.id, v.name, v.length));
.for_each(|v| println!("[{}] {} ({}s)", v.id, v.name, v.duration.unwrap_or_default()));
}
```
@ -162,7 +162,7 @@ async fn main() {
.content
.items
.iter()
.for_each(|v| println!("[{}] {} ({}s)", v.id, v.name, v.length.unwrap()));
.for_each(|v| println!("[{}] {} ({}s)", v.id, v.name, v.duration.unwrap_or_default()));
}
```

View file

@ -1,7 +1,7 @@
[package]
name = "rustypipe-cli"
version = "0.7.2"
rust-version = "1.70.0"
rust-version = "1.89.0"
edition.workspace = true
authors.workspace = true
license.workspace = true
@ -15,30 +15,33 @@ default = ["native-tls"]
timezone = ["dep:time", "dep:time-tz"]
# Reqwest TLS options
native-tls = [
"reqwest/native-tls",
"rustypipe/native-tls",
"rustypipe-downloader/native-tls",
default-tls = [
"reqwest/default-tls",
"rustypipe/default-tls",
"rustypipe-downloader/default-tls",
]
native-tls-alpn = [
"reqwest/native-tls-alpn",
"rustypipe/native-tls-alpn",
"rustypipe-downloader/native-tls-alpn",
rustls = ["reqwest/rustls", "rustypipe/rustls", "rustypipe-downloader/rustls"]
rustls-no-provider = [
"reqwest/rustls-no-provider",
"rustypipe/rustls-no-provider",
"rustypipe-downloader/rustls-no-provider",
]
native-tls = ["reqwest/native-tls", "rustypipe/native-tls"]
native-tls-no-alpn = [
"reqwest/native-tls-no-alpn",
"rustypipe/native-tls-no-alpn",
"rustypipe-downloader/native-tls-no-alpn",
]
native-tls-vendored = [
"reqwest/native-tls-vendored",
"rustypipe/native-tls-vendored",
"rustypipe-downloader/native-tls-vendored",
]
rustls-tls-webpki-roots = [
"reqwest/rustls-tls-webpki-roots",
"rustypipe/rustls-tls-webpki-roots",
"rustypipe-downloader/rustls-tls-webpki-roots",
]
rustls-tls-native-roots = [
"reqwest/rustls-tls-native-roots",
"rustypipe/rustls-tls-native-roots",
"rustypipe-downloader/rustls-tls-native-roots",
native-tls-vendored-no-alpn = [
"reqwest/native-tls-vendored-no-alpn",
"rustypipe/native-tls-vendored-no-alpn",
"rustypipe-downloader/native-tls-vendored-no-alpn",
]
[dependencies]
@ -61,7 +64,7 @@ tracing-subscriber.workspace = true
serde_yaml.workspace = true
dirs.workspace = true
anstream = "0.6.15"
anstream = "1.0.0"
owo-colors = "4.0.0"
const_format = "0.2.33"

View file

@ -5,7 +5,7 @@ use std::{
ffi::OsString,
path::PathBuf,
str::FromStr,
sync::{atomic::AtomicUsize, Arc},
sync::{Arc, atomic::AtomicUsize},
time::Duration,
};
@ -18,12 +18,12 @@ use rustypipe::{
cache::FileStorage,
client::{ClientType, RustyPipe},
model::{
richtext::{RichText, ToPlaintext},
traits::YtEntity,
ArtistId, AudioCodec, Comment, MusicSearchResult, TrackItem, TrackType, UrlTarget,
Verification, YouTubeItem,
richtext::{RichText, ToPlaintext},
traits::YtEntity,
},
param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter},
param::{ChannelVideoTab, Country, Language, StreamFilter, search_filter},
report::FileReporter,
};
use rustypipe_downloader::{
@ -31,7 +31,7 @@ use rustypipe_downloader::{
};
use serde::Serialize;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{fmt::MakeWriter, EnvFilter};
use tracing_subscriber::{EnvFilter, fmt::MakeWriter};
#[derive(Parser)]
#[clap(
@ -103,10 +103,11 @@ impl DownloadTarget {
fn assert_dir(&self) {
if self.output_file.is_some() {
panic!("Cannot download multiple videos to a single file")
} else if let Some(template) = &self.template {
if !template.contains("{id}") && !template.contains("{title}") {
panic!("Template must contain {{id}} or {{title}} variables")
}
} else if let Some(template) = &self.template
&& !template.contains("{id}")
&& !template.contains("{title}")
{
panic!("Template must contain {{id}} or {{title}} variables")
}
}
@ -425,6 +426,7 @@ enum ClientTypeArg {
Mobile,
Tv,
Android,
AndroidVr,
Ios,
}
@ -491,6 +493,7 @@ impl From<ClientTypeArg> for ClientType {
ClientTypeArg::Mobile => Self::Mobile,
ClientTypeArg::Tv => Self::Tv,
ClientTypeArg::Android => Self::Android,
ClientTypeArg::AndroidVr => Self::AndroidVr,
ClientTypeArg::Ios => Self::Ios,
}
}
@ -527,10 +530,8 @@ fn print_entities(items: &[impl YtEntity], with_type: bool) {
}
fn print_entity(e: &impl YtEntity, with_type: bool) {
if with_type {
if let Some(t) = e.music_item_type() {
anstream::print!("{: >8} ", format!("{t:?}").dimmed());
}
if with_type && let Some(t) = e.music_item_type() {
anstream::print!("{: >8} ", format!("{t:?}").dimmed());
}
anstream::print!("[{}] {}", e.id(), e.name().bold());
if let Some(n) = e.channel_name() {
@ -691,11 +692,11 @@ fn print_music_search<T: Serialize + YtEntity>(
}
fn print_description(desc: Option<String>) {
if let Some(desc) = desc {
if !desc.is_empty() {
print_h2("Description");
println!("{}", desc.trim());
}
if let Some(desc) = desc
&& !desc.is_empty()
{
print_h2("Description");
println!("{}", desc.trim());
}
}
@ -1224,7 +1225,9 @@ async fn run() -> anyhow::Result<()> {
if let Some(id) = artist.radio_id {
anstream::println!("{} {}", "Radio:".blue(), id);
}
print_description(artist.description);
if let Some(desc) = &artist.description {
print_richtext(desc);
}
if !artist.albums.is_empty() {
print_h2("Albums");
for b in artist.albums {

View file

@ -1,7 +1,7 @@
[package]
name = "rustypipe-codegen"
version = "0.1.0"
rust-version = "1.74.0"
rust-version = "1.89.0"
edition.workspace = true
authors.workspace = true
license.workspace = true
@ -30,4 +30,4 @@ indicatif.workspace = true
num_enum = "0.7.2"
intl_pluralrules = "7.0.2"
unic-langid = "0.9.1"
ordered_hash_map = { version = "0.4.0", features = ["serde"] }
ordered_hash_map = { version = "0.6.0", features = ["serde"] }

View file

@ -1,15 +1,15 @@
use std::collections::BTreeMap;
use anyhow::{bail, Result};
use futures_util::{stream, StreamExt};
use anyhow::{Result, bail};
use futures_util::{StreamExt, stream};
use indicatif::{ProgressBar, ProgressStyle};
use num_enum::TryFromPrimitive;
use once_cell::sync::Lazy;
use regex::Regex;
use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery};
use rustypipe::model::{MusicItem, YouTubeItem};
use rustypipe::param::search_filter::{ItemType, SearchFilter};
use rustypipe::param::ChannelVideoTab;
use rustypipe::param::search_filter::{ItemType, SearchFilter};
use serde::de::IgnoredAny;
use serde::{Deserialize, Serialize};

View file

@ -5,7 +5,7 @@ use path_macro::path;
use rustypipe::{
client::{ClientType, RustyPipe, RustyPipeQuery},
model::AlbumType,
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use serde::{Deserialize, Serialize};
use serde_with::rust::deserialize_ignore_any;

View file

@ -3,7 +3,7 @@ use std::{collections::BTreeMap, fs::File, io::BufReader};
use path_macro::path;
use rustypipe::{
client::{ClientType, RustyPipe},
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use serde::Deserialize;
use serde_with::rust::deserialize_ignore_any;

View file

@ -3,7 +3,7 @@ use std::{collections::BTreeMap, fs::File, io::BufReader};
use path_macro::path;
use rustypipe::{
client::RustyPipe,
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use serde::{Deserialize, Serialize};

View file

@ -3,7 +3,7 @@ use std::{collections::BTreeMap, fs::File, io::BufReader};
use path_macro::path;
use rustypipe::{
client::RustyPipe,
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use crate::util::{self, DICT_DIR};

View file

@ -6,12 +6,12 @@ use std::{
};
use anyhow::{Context, Result};
use futures_util::{stream, StreamExt};
use futures_util::{StreamExt, stream};
use once_cell::sync::Lazy;
use path_macro::path;
use regex::Regex;
use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery};
use rustypipe::param::{Language, LANGUAGES};
use rustypipe::param::{LANGUAGES, Language};
use serde::Deserialize;
use crate::model::{Channel, ContinuationResponse};
@ -194,20 +194,20 @@ pub fn write_samples_to_dict() {
x => Some(x),
});
if let Some(f) = found_token {
if *f != mag {
*found_token = None;
}
if let Some(f) = found_token
&& *f != mag
{
*found_token = None;
}
};
let mut insert_nd_token = |token: String, n: Option<u8>| {
let found_token = found_nd_tokens.entry(token).or_insert(n);
if let Some(f) = found_token {
if Some(*f) != n {
*found_token = None;
}
if let Some(f) = found_token
&& Some(*f) != n
{
*found_token = None;
}
};

View file

@ -5,12 +5,12 @@ use std::{
io::BufReader,
};
use futures_util::{stream, StreamExt};
use futures_util::{StreamExt, stream};
use ordered_hash_map::OrderedHashMap;
use path_macro::path;
use rustypipe::{
client::RustyPipe,
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use serde::{Deserialize, Serialize};
@ -22,7 +22,8 @@ type CollectedDates = BTreeMap<Language, BTreeMap<DateCase, String>>;
enum DateCase {
Today,
Yesterday,
Ago,
Ago2,
AgoN,
Jan,
Feb,
Mar,
@ -61,14 +62,16 @@ enum DateCase {
///
/// Because the relative dates change with time, the first three playlists
/// have to checked and eventually changed before running the program.
/// To find matching playlists, search for music on YouTube and filter for playlists
pub async fn collect_dates(concurrency: usize) {
let json_path = path!(*DICT_DIR / "playlist_samples.json");
// These are the sample playlists
let cases = [
(DateCase::Today, "PL3oW2tjiIxvQ98ZTLhBh5soCbE1mC3uAT"),
(DateCase::Yesterday, "PLGBuKfnErZlCkRRgt06em8nbXvcV5Sae7"),
(DateCase::Ago, "PLAQ7nLSEnhWTEihjeM1I-ToPDJEKfZHZu"),
(DateCase::Yesterday, "PLDIoUOhQQPlXzhp-83rECoLaV6BwFtNC4"),
(DateCase::Ago2, "PLplXQ2cg9B_qrCVd1J_iId5SvP8Kf_BfS"),
(DateCase::AgoN, "PLeIL8_T2qvIRtvk6gryaK4Uh-E8Z_YYYR"),
(DateCase::Jan, "PL1J-6JOckZtFjcni6Xj1pLYglJp6JCpKD"),
(DateCase::Feb, "PL1J-6JOckZtETrbzwZE7mRIIK6BzWNLAs"),
(DateCase::Mar, "PL1J-6JOckZtG3AVdvBXhMO64mB2k3BtKi"),
@ -193,7 +196,7 @@ pub fn write_samples_to_dict() {
parse(datestr_table.get(&DateCase::Today).unwrap(), 1);
parse(datestr_table.get(&DateCase::Yesterday).unwrap(), 2);
parse(datestr_table.get(&DateCase::Ago).unwrap(), 0);
parse(datestr_table.get(&DateCase::AgoN).unwrap(), 0);
parse(datestr_table.get(&DateCase::Jan).unwrap(), 0);
}

View file

@ -3,11 +3,11 @@ use std::{
fs::File,
};
use futures_util::{stream, StreamExt};
use futures_util::{StreamExt, stream};
use path_macro::path;
use rustypipe::{
client::{RustyPipe, RustyPipeQuery},
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use crate::util::DICT_DIR;

View file

@ -5,11 +5,11 @@ use std::{
};
use anyhow::Result;
use futures_util::{stream, StreamExt};
use futures_util::{StreamExt, stream};
use path_macro::path;
use rustypipe::{
client::{ClientType, RustyPipe, RustyPipeQuery},
param::{Language, LANGUAGES},
param::{LANGUAGES, Language},
};
use crate::{
@ -121,10 +121,10 @@ pub fn parse_video_durations() {
}
let entry = words.entry(w.to_owned()).or_insert(Some(*val));
if let Some(e) = entry {
if e != val {
*entry = None;
}
if let Some(e) = entry
&& e != val
{
*entry = None;
}
};

View file

@ -10,8 +10,8 @@ use rustypipe::{
client::{ClientType, RustyPipe},
model::YouTubeItem,
param::{
search_filter::{self, ItemType, SearchFilter},
ChannelVideoTab, Country,
search_filter::{self, ItemType, SearchFilter},
},
report::{Report, Reporter},
};
@ -129,7 +129,7 @@ impl Reporter for TestFileReporter {
};
let data =
serde_json::from_str::<serde_json::Value>(&report.http_request.resp_body).unwrap();
serde_json::from_str::<serde_json::Value>(report.http_request.resp_body).unwrap();
let file = File::create(&path).unwrap();
serde_json::to_writer_pretty(file, &data).unwrap();
@ -193,6 +193,7 @@ async fn playlist() {
("long", "PL5dDx681T4bR7ZF1IuWzOv1omlRbE7PiJ"),
("nomusic", "PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe"),
("live", "UULVvqRdlKsE5Q8mf8YXbdIJLw"),
("featuring", "PLLsua0MU5Y8JZZaDko8Ewv95Tv98A36ee"),
] {
let json_path = path!(*TESTFILES_DIR / "playlist" / format!("playlist_{name}.json"));
if json_path.exists() {
@ -229,6 +230,7 @@ async fn video_details() {
("chapters", "nFDBxBUfE74"),
("live", "86YLFOog4GM"),
("agegate", "HRKu0cvrr_o"),
("featuring", "Y8JFxS1HlDo"),
] {
let json_path =
path!(*TESTFILES_DIR / "video_details" / format!("video_details_{name}.json"));

View file

@ -115,16 +115,16 @@ pub(crate) fn entry(lang: Language) -> Entry {
match unit {
Some(unit) => ta_tokens.entry(
txt,
&format!("TaToken {{ n: {n}, unit: Some(TimeUnit::{unit:?}) }}"),
format!("TaToken {{ n: {n}, unit: Some(TimeUnit::{unit:?}) }}"),
),
None => ta_tokens.entry(txt, &format!("TaToken {{ n: {n}, unit: None }}")),
None => ta_tokens.entry(txt, format!("TaToken {{ n: {n}, unit: None }}")),
};
});
// Months
let mut months = phf_codegen::Map::<&str>::new();
entry.months.iter().for_each(|(txt, n_mon)| {
months.entry(txt, &n_mon.to_string());
months.entry(txt, n_mon.to_string());
});
// Timeago(ND) tokens
@ -134,28 +134,28 @@ pub(crate) fn entry(lang: Language) -> Entry {
match unit {
Some(unit) => ta_nd_tokens.entry(
txt,
&format!("TaToken {{ n: {n}, unit: Some(TimeUnit::{unit:?}) }}"),
format!("TaToken {{ n: {n}, unit: Some(TimeUnit::{unit:?}) }}"),
),
None => ta_nd_tokens.entry(txt, &format!("TaToken {{ n: {n}, unit: None }}")),
None => ta_nd_tokens.entry(txt, format!("TaToken {{ n: {n}, unit: None }}")),
};
});
// Number tokens
let mut number_tokens = phf_codegen::Map::<&str>::new();
entry.number_tokens.iter().for_each(|(txt, mag)| {
number_tokens.entry(txt, &mag.to_string());
number_tokens.entry(txt, mag.to_string());
});
// Number nd tokens
let mut number_nd_tokens = phf_codegen::Map::<&str>::new();
entry.number_nd_tokens.iter().for_each(|(txt, mag)| {
number_nd_tokens.entry(txt, &mag.to_string());
number_nd_tokens.entry(txt, mag.to_string());
});
// Album types
let mut album_types = phf_codegen::Map::<&str>::new();
entry.album_types.iter().for_each(|(txt, album_type)| {
album_types.entry(txt, &format!("AlbumType::{album_type:?}"));
album_types.entry(txt, format!("AlbumType::{album_type:?}"));
});
let code_ta_tokens = &ta_tokens

View file

@ -4,11 +4,11 @@ use std::fs::File;
use std::io::BufReader;
use path_macro::path;
use reqwest::header;
use reqwest::Client;
use reqwest::header;
use serde::Deserialize;
use serde_with::serde_as;
use serde_with::VecSkipError;
use serde_with::serde_as;
use crate::model::Text;
use crate::util::DICT_DIR;

View file

@ -1,3 +1,4 @@
#![allow(dead_code)]
#![warn(clippy::todo)]
mod abtest;

View file

@ -3,7 +3,7 @@ use std::collections::BTreeMap;
use ordered_hash_map::OrderedHashMap;
use rustypipe::{model::AlbumType, param::Language};
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, serde_as};
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]

View file

@ -140,10 +140,10 @@ where
buf.clear();
}
}
if !buf.is_empty() {
if let Ok(n) = buf.parse::<F>() {
numbers.push(n);
}
if !buf.is_empty()
&& let Ok(n) = buf.parse::<F>()
{
numbers.push(n);
}
numbers

28
deobfuscator/Cargo.toml Normal file
View file

@ -0,0 +1,28 @@
[package]
name = "rustypipe-deobfuscator"
version = "0.1.0"
edition.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
keywords.workspace = true
categories.workspace = true
description = "Deobfuscation javascript extractor for RustyPipe"
[dependencies]
javascript-globals = "1.5.0"
oxc_allocator = "0.133.0"
oxc_ast = "0.133.0"
oxc_ast_visit = "0.133.0"
oxc_codegen = "0.133.0"
oxc_parser = "0.133.0"
oxc_semantic = "0.133.0"
oxc_span = "0.133.0"
oxc_str = "0.133.0"
oxc_syntax = "0.133.0"
itertools = "0.14.0"
rquickjs.workspace = true
regex.workspace = true
rand.workspace = true
log.workspace = true
thiserror.workspace = true

32
deobfuscator/src/error.rs Normal file
View file

@ -0,0 +1,32 @@
use std::borrow::Cow;
/// Error from
#[derive(thiserror::Error, Debug)]
#[non_exhaustive]
pub enum DeobfExtractionError {
#[error("JS parsing error:\n{0}")]
Parsing(String),
#[error("{0} not found")]
NotFound(&'static str),
}
/// Error that occurred during the initialization
/// or use of the YouTube URL signature deobfuscator.
#[derive(thiserror::Error, Debug)]
pub enum DeobfuscationError {
/// Error during JavaScript execution
#[error("js execution error: {0}")]
JavaScript(#[from] rquickjs::Error),
/// Unspecified error
#[error("error: {0}")]
Other(Cow<'static, str>),
}
impl From<rquickjs::CaughtError<'_>> for DeobfuscationError {
fn from(value: rquickjs::CaughtError) -> Self {
match value {
rquickjs::CaughtError::Error(error) => DeobfuscationError::JavaScript(error),
_ => DeobfuscationError::Other(value.to_string().into()),
}
}
}

397
deobfuscator/src/extract.rs Normal file
View file

@ -0,0 +1,397 @@
use std::collections::HashSet;
use std::sync::{Arc, LazyLock};
use itertools::Itertools;
use oxc_allocator::{Allocator, Box as OxBox, FromIn, Vec as OxVec};
use oxc_ast::ast::{
ArrowFunctionExpression, AssignmentExpression, AssignmentOperator, AssignmentTarget,
BindingIdentifier, BindingPattern, Expression, ExpressionStatement, IdentifierName,
IdentifierReference, Program, Statement, StaticMemberExpression, VariableDeclaration,
VariableDeclarator,
};
use oxc_semantic::{NodeId, SemanticBuilder};
use oxc_span::{GetSpan, SPAN, SourceType};
use oxc_str::Ident;
use regex::Regex;
use crate::visitor::{find_function, get_function_length, program_contains_string};
pub fn makeprog<'a>(statements: OxVec<'a, Statement<'a>>, allocator: &'a Allocator) -> Program<'a> {
Program {
span: SPAN,
node_id: NodeId::DUMMY.into(),
scope_id: None.into(),
source_text: "",
comments: OxVec::new_in(allocator),
hashbang: None,
directives: OxVec::new_in(allocator),
body: statements,
source_type: SourceType::script(),
}
}
pub fn makeprog_expr<'a>(expression: Expression<'a>, allocator: &'a Allocator) -> Program<'a> {
let statements = OxVec::from_array_in(
[Statement::ExpressionStatement(OxBox::new_in(
ExpressionStatement {
span: SPAN,
node_id: NodeId::DUMMY.into(),
expression,
},
allocator,
))],
allocator,
);
makeprog(statements, allocator)
}
pub fn makeprog_stmt<'a>(statement: Statement<'a>, allocator: &'a Allocator) -> Program<'a> {
let statements = OxVec::from_array_in([statement], allocator);
makeprog(statements, allocator)
}
fn make_stub_fn<'a>(value: Option<Expression<'a>>, allocator: &'a Allocator) -> Expression<'a> {
Expression::ArrowFunctionExpression(OxBox::new_in(
ArrowFunctionExpression {
node_id: NodeId::DUMMY.into(),
span: SPAN,
expression: value.is_some(),
r#async: false,
type_parameters: None,
params: OxBox::new_in(
oxc_ast::ast::FormalParameters {
node_id: NodeId::DUMMY.into(),
span: SPAN,
kind: oxc_ast::ast::FormalParameterKind::ArrowFormalParameters,
items: OxVec::new_in(allocator),
rest: None,
},
allocator,
),
return_type: None,
body: OxBox::new_in(
oxc_ast::ast::FunctionBody {
node_id: NodeId::DUMMY.into(),
span: SPAN,
directives: OxVec::new_in(allocator),
statements: match value {
Some(value) => OxVec::from_array_in(
[Statement::ExpressionStatement(OxBox::new_in(
ExpressionStatement {
node_id: NodeId::DUMMY.into(),
span: SPAN,
expression: value,
},
allocator,
))],
allocator,
),
None => OxVec::new_in(allocator),
},
},
allocator,
),
scope_id: None.into(),
pure: false,
pife: false,
},
allocator,
))
}
fn prog_to_expr<'a>(program: Program<'a>) -> Expression<'a> {
let s1 = program.body.into_iter().next().unwrap();
if let Statement::ExpressionStatement(expr) = s1 {
expr.unbox().expression
} else {
panic!("invalid statement");
}
}
fn prog_to_stmt<'a>(program: Program<'a>) -> Statement<'a> {
program.body.into_iter().next().unwrap()
}
fn make_declaration<'a>(
fname: String,
g: bool,
value: Expression<'a>,
allocator: &'a Allocator,
) -> Statement<'a> {
let span = value.span();
if g {
Statement::ExpressionStatement(OxBox::new_in(
ExpressionStatement {
node_id: NodeId::DUMMY.into(),
span,
expression: Expression::AssignmentExpression(OxBox::new_in(
AssignmentExpression {
node_id: NodeId::DUMMY.into(),
span: SPAN,
operator: AssignmentOperator::Assign,
left: AssignmentTarget::StaticMemberExpression(OxBox::new_in(
StaticMemberExpression {
node_id: NodeId::DUMMY.into(),
span: SPAN,
object: Expression::Identifier(OxBox::new_in(
IdentifierReference {
node_id: NodeId::DUMMY.into(),
span: SPAN,
name: Ident::from_in("g", allocator),
reference_id: None.into(),
},
allocator,
)),
property: IdentifierName {
node_id: NodeId::DUMMY.into(),
span: SPAN,
name: Ident::from_in(fname, allocator),
},
optional: false,
},
allocator,
)),
right: value,
},
allocator,
)),
},
allocator,
))
} else {
Statement::VariableDeclaration(OxBox::new_in(
VariableDeclaration {
node_id: NodeId::DUMMY.into(),
span,
kind: oxc_ast::ast::VariableDeclarationKind::Const,
declarations: OxVec::from_array_in(
[VariableDeclarator {
node_id: NodeId::DUMMY.into(),
span: SPAN,
kind: oxc_ast::ast::VariableDeclarationKind::Const,
id: BindingPattern::BindingIdentifier(OxBox::new_in(
BindingIdentifier {
node_id: NodeId::DUMMY.into(),
span: SPAN,
name: Ident::from_in(fname, allocator),
symbol_id: None.into(),
},
allocator,
)),
type_annotation: None,
init: Some(value),
definite: false,
}],
allocator,
),
declare: false,
},
allocator,
))
}
}
fn extract_function_deps<'a>(
program: &mut Program<'a>,
name: &str,
fprog: &Program<'a>,
visited: &mut HashSet<String>,
extracted: &mut OxVec<'a, Statement<'a>>,
source_text: Arc<String>,
allocator: &'a Allocator,
) {
let semantic = SemanticBuilder::new().build(fprog);
if !semantic.errors.is_empty() {
let reason = semantic
.errors
.into_iter()
.map(|error| format!("{:?}", error.with_source_code(Arc::clone(&source_text))))
.join("\n");
log::error!("could not evaluate function {name}:\n{reason}");
return;
}
let symbol_table = semantic.semantic.scoping();
// extract dependencies
static RE_VAR: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"^g\.[\w$]+").unwrap());
for (name, reference_id_list) in symbol_table.root_unresolved_references() {
if name == "g" {
for reference_id in reference_id_list {
let reference = symbol_table.get_reference(*reference_id);
let node = semantic.semantic.nodes().get_node(reference.node_id());
let pos = node.span().start as usize;
let found = RE_VAR.captures(&source_text[pos..]).unwrap();
let g_name = &found[0];
extract_function(
program,
g_name,
visited,
extracted,
source_text.clone(),
allocator,
);
}
} else if !(name.len() > 2
&& (javascript_globals::GLOBALS_BUILTIN.contains_key(name)
|| javascript_globals::GLOBALS_BROWSER.contains_key(name)))
&& name != "arguments"
{
extract_function(
program,
name.as_str(),
visited,
extracted,
source_text.clone(),
allocator,
);
}
}
}
pub fn extract_function<'a>(
program: &mut Program<'a>,
name: &str,
visited: &mut HashSet<String>,
extracted: &mut OxVec<'a, Statement<'a>>,
source_text: Arc<String>,
allocator: &'a Allocator,
) {
let mut found_func = None;
if visited.contains(name) {
return;
}
visited.insert(name.to_owned());
log::debug!("deobf: extracting function {name}");
let (fname, g) = match name.strip_prefix("g.") {
Some(n) => (n.to_owned(), true),
None => (name.to_owned(), false),
};
let (found, overloads) =
match find_function(program, fname.to_owned(), g, source_text.clone(), allocator) {
Some(f) => f,
None => {
log::error!("function {name} not found");
return;
}
};
let fprog = makeprog_expr(found, allocator);
let flen = get_function_length(&fprog);
if flen < 3 {
match program_contains_string(&fprog, &["yt.logging.", "Trusted Stream URL"]) {
Some(0) => {
log::debug!("stubbing logging func {name}; len={flen}");
found_func = Some(make_stub_fn(None, allocator));
}
Some(1) => {
log::debug!("stubbing url verification func {name}; len={flen}");
found_func = Some(make_stub_fn(
Some(Expression::BooleanLiteral(OxBox::new_in(
oxc_ast::ast::BooleanLiteral {
node_id: NodeId::DUMMY.into(),
span: SPAN,
value: true,
},
allocator,
))),
allocator,
));
}
_ => {}
}
}
let found_func = match found_func {
Some(f) => f,
None => {
extract_function_deps(
program,
name,
&fprog,
visited,
extracted,
source_text.clone(),
allocator,
);
prog_to_expr(fprog)
}
};
extracted.push(make_declaration(fname, g, found_func, allocator));
// extracted.extend(overloads);
for (stmt, name) in overloads {
let olprog = makeprog_stmt(stmt, allocator);
extract_function_deps(
program,
&name,
&olprog,
visited,
extracted,
source_text.clone(),
allocator,
);
extracted.push(prog_to_stmt(olprog));
}
}
#[cfg(test)]
mod tests {
use super::*;
use oxc_parser::Parser;
#[test]
fn t_extract_function() {
let dyn_assign_js = Arc::new(
r#"g.hB=function(){return "Hello"};g.hB[F[65]][F[42]]=function(){return "set"};"#
.to_owned(),
);
let allocator = Allocator::new();
let ret = Parser::new(&allocator, &dyn_assign_js, SourceType::script()).parse();
assert!(ret.errors.is_empty());
let mut program = ret.program;
let (found_fn, overloads) = find_function(
&mut program,
"hB".to_owned(),
true,
dyn_assign_js.clone(),
&allocator,
)
.unwrap();
assert!(found_fn.is_function());
assert_eq!(overloads.len(), 1);
}
#[test]
fn t_extract_function2() {
let dyn_assign_js = Arc::new(
r#"g.hB=function(){return "Hello"};g.hB.prototype.set=function(){return "set"};"#
.to_owned(),
);
let allocator = Allocator::new();
let ret = Parser::new(&allocator, &dyn_assign_js, SourceType::script()).parse();
assert!(ret.errors.is_empty());
let mut program = ret.program;
let (found_fn, overloads) = find_function(
&mut program,
"hB".to_owned(),
true,
dyn_assign_js.clone(),
&allocator,
)
.unwrap();
assert!(found_fn.is_function());
assert_eq!(overloads.len(), 1);
}
}

View file

@ -0,0 +1,113 @@
use std::collections::HashSet;
use std::sync::Arc;
use itertools::Itertools;
use oxc_allocator::{Allocator, Box as OxBox, FromIn, Vec as OxVec};
use oxc_ast::ast::{
BindingIdentifier, BindingPattern, Expression, ObjectExpression, Statement,
VariableDeclaration, VariableDeclarator,
};
use oxc_parser::Parser;
use oxc_semantic::NodeId;
use oxc_span::{GetSpan, SPAN, SourceType};
use oxc_str::Ident;
use crate::extract::{extract_function, makeprog};
use crate::visitor::{find_deobf_fn, get_script_body};
pub use crate::error::DeobfExtractionError;
pub const DEOBF_SIG_FUNC_NAME: &str = "deobf_sig";
pub const DEOBF_NSIG_FUNC_NAME: &str = "deobf_nsig";
pub fn extract_deobf_fn(player_js: Arc<String>) -> Result<String, DeobfExtractionError> {
let allocator = Allocator::new();
let ret = Parser::new(&allocator, &player_js, SourceType::script()).parse();
if !ret.errors.is_empty() {
let msg = ret
.errors
.into_iter()
.map(|e| e.with_source_code(player_js.clone()))
.join("\n");
return Err(DeobfExtractionError::Parsing(msg));
}
let mut program = ret.program;
let script_body = get_script_body(&mut program, &allocator)
.and_then(|fx| fx.body)
.ok_or(DeobfExtractionError::NotFound("script body"))?;
let mut program = makeprog(script_body.unbox().statements, &allocator);
let start_fn =
find_deobf_fn(&program).ok_or(DeobfExtractionError::NotFound("deobf function"))?;
let mut visited = HashSet::new();
let mut extracted = OxVec::from_array_in(
[Statement::VariableDeclaration(OxBox::new_in(
VariableDeclaration {
node_id: NodeId::DUMMY.into(),
span: SPAN,
kind: oxc_ast::ast::VariableDeclarationKind::Const,
declarations: OxVec::from_array_in(
[VariableDeclarator {
node_id: NodeId::DUMMY.into(),
span: SPAN,
kind: oxc_ast::ast::VariableDeclarationKind::Const,
id: BindingPattern::BindingIdentifier(OxBox::new_in(
BindingIdentifier {
node_id: NodeId::DUMMY.into(),
span: SPAN,
name: Ident::from_in("g", &allocator),
symbol_id: None.into(),
},
&allocator,
)),
type_annotation: None,
init: Some(Expression::ObjectExpression(OxBox::new_in(
ObjectExpression {
node_id: NodeId::DUMMY.into(),
span: SPAN,
properties: OxVec::new_in(&allocator),
},
&allocator,
))),
definite: false,
}],
&allocator,
),
declare: false,
},
&allocator,
))],
&allocator,
);
extract_function(
&mut program,
&start_fn,
&mut visited,
&mut extracted,
player_js.clone(),
&allocator,
);
if extracted.len() < 2 {
return Err(DeobfExtractionError::NotFound("nothing extracted"));
}
extracted.sort_by_key(|s| s.span().start);
let extracted_script = makeprog(extracted, &allocator);
let printed = oxc_codegen::Codegen::new()
.with_options(oxc_codegen::CodegenOptions {
minify: true,
..Default::default()
})
.build(&extracted_script);
let script = printed.code
+ "\nconst solver=({sig,n})=>{const url="
+ &start_fn
+ r#"("https://youtube.com/watch?v=yt-dlp-wins","s",sig?encodeURIComponent(sig):undefined,);url.set("n",n);const proto=Object.getPrototypeOf(url);const keys=Object.keys(proto).concat(Object.getOwnPropertyNames(proto));for(const key of keys){if(!["constructor","set","get","clone"].includes(key)){url[key]();break}}const s=url.get("s");return{sig:s?decodeURIComponent(s):null,n:url.get("n")??null}};function deobf_sig(sig) {return solver({sig}).sig} function deobf_nsig(n) {return solver({n}).n}"#;
Ok(script)
}

114
deobfuscator/src/lib.rs Normal file
View file

@ -0,0 +1,114 @@
pub mod error;
mod extract;
mod extract_deobf;
mod visitor;
use crate::error::DeobfuscationError;
use crate::extract_deobf::{DEOBF_NSIG_FUNC_NAME, DEOBF_SIG_FUNC_NAME};
use rand::RngExt;
use rquickjs::{CatchResultExt, Context, Runtime};
pub use extract_deobf::extract_deobf_fn;
pub struct Deobfuscator {
ctx: Context,
}
impl Deobfuscator {
/// Instantiate a new deobfuscator with the given data
pub fn new(script: &str) -> Result<Self, DeobfuscationError> {
let rt = Runtime::new()?;
let ctx = Context::full(&rt)?;
ctx.with(|ctx| {
let mut opts = rquickjs::context::EvalOptions::default();
opts.strict = false;
ctx.eval_with_options::<(), _>(script.as_bytes(), opts)
.catch(&ctx)
.map_err(DeobfuscationError::from)
})?;
let deobf = Self { ctx };
deobf.verify()?;
Ok(deobf)
}
/// Verify if the deobfuscator successfully processes a random input string
fn verify(&self) -> Result<(), DeobfuscationError> {
let testinp = generate_content_playback_nonce();
let res = self.deobfuscate_sig(&testinp)?;
if res.is_empty() {
return Err(DeobfuscationError::Other(
"sig fn returned empty string".into(),
));
}
if res.starts_with("enhanced_except_") || res.ends_with(&testinp) {
return Err(DeobfuscationError::Other(
"sig fn returned an exception".into(),
));
}
let res = self.deobfuscate_nsig(&testinp)?;
if res.is_empty() {
return Err(DeobfuscationError::Other(
"nsig fn returned empty string".into(),
));
}
if res.starts_with("enhanced_except_") || res.ends_with(&testinp) {
return Err(DeobfuscationError::Other(
"nsig fn returned an exception".into(),
));
}
Ok(())
}
/// Deobfuscate the `s` parameter from the `signature_cipher` field
pub fn deobfuscate_sig(&self, sig: &str) -> Result<String, DeobfuscationError> {
let res = self.ctx.with(|ctx| {
call_fn(&ctx, DEOBF_SIG_FUNC_NAME, sig)
.catch(&ctx)
.map_err(DeobfuscationError::from)
})?;
log::trace!("deobf sig: {sig} -> {res}");
Ok(res)
}
/// Deobfuscate the `n` stream URL parameter to circumvent throttling
pub fn deobfuscate_nsig(&self, nsig: &str) -> Result<String, DeobfuscationError> {
let res = self.ctx.with(|ctx| {
call_fn(&ctx, DEOBF_NSIG_FUNC_NAME, nsig)
.catch(&ctx)
.map_err(DeobfuscationError::from)
})?;
log::trace!("deobf nsig: {nsig} -> {res}");
if res.starts_with("enhanced_except_") || res.ends_with(nsig) {
return Err(DeobfuscationError::Other(
"nsig fn returned an exception".into(),
));
}
Ok(res)
}
}
fn call_fn(ctx: &rquickjs::Ctx, fn_name: &str, arg: &str) -> Result<String, rquickjs::Error> {
let f: rquickjs::Function = ctx.globals().get(fn_name)?;
f.call((arg,))
}
/// Generate a random string with given length and byte charset.
fn random_string(charset: &[u8], length: usize) -> String {
let mut result = String::with_capacity(length);
let mut rng = rand::rng();
for _ in 0..length {
result.push(char::from(charset[rng.random_range(0..charset.len())]));
}
result
}
fn generate_content_playback_nonce() -> String {
const CONTENT_PLAYBACK_NONCE_ALPHABET: &[u8; 64] =
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
random_string(CONTENT_PLAYBACK_NONCE_ALPHABET, 16)
}

352
deobfuscator/src/visitor.rs Normal file
View file

@ -0,0 +1,352 @@
use std::sync::Arc;
use oxc_allocator::{Allocator, Box as OxBox, TakeIn};
use oxc_ast::ast::{
AssignmentExpression, AssignmentOperator, AssignmentTarget, BindingPattern, Expression,
Function, FunctionBody, Program, Statement, StringLiteral, UnaryOperator, VariableDeclarator,
};
use oxc_ast_visit::{Visit, VisitMut};
use oxc_semantic::NodeId;
use oxc_span::GetSpan;
pub fn get_script_body<'a>(
program: &mut Program<'a>,
allocator: &'a Allocator,
) -> Option<Function<'a>> {
let mut ff = BodyFinder {
allocator,
found_function: None,
};
ff.visit_program(program);
ff.found_function
}
struct BodyFinder<'a> {
allocator: &'a Allocator,
found_function: Option<Function<'a>>,
}
impl<'a> VisitMut<'a> for BodyFinder<'a> {
fn visit_function(&mut self, func: &mut Function<'a>, _flags: oxc_semantic::ScopeFlags) {
if self.found_function.is_none() && func.body.is_some() {
let params = &func.params.items;
let has_single_g = params.len() == 1
&& matches!(
&params[0].pattern,
BindingPattern::BindingIdentifier(id)
if id.name == "g"
);
if has_single_g {
self.found_function = Some(func.take_in(self.allocator));
}
}
}
}
pub fn find_function<'a>(
program: &mut Program<'a>,
name: String,
g: bool,
source_text: Arc<String>,
allocator: &'a Allocator,
) -> Option<(Expression<'a>, Vec<(Statement<'a>, String)>)> {
let mut ff = FunctionFinder {
allocator,
name,
g,
source_text,
found: None,
overloads: Vec::new(),
};
ff.visit_program(program);
ff.found.map(|f| (f, ff.overloads))
}
struct FunctionFinder<'a> {
allocator: &'a Allocator,
name: String,
g: bool,
source_text: Arc<String>,
found: Option<Expression<'a>>,
overloads: Vec<(Statement<'a>, String)>,
}
impl<'a> FunctionFinder<'a> {
fn assignment_target_matches(&self, at: &AssignmentTarget<'a>, i: usize) -> usize {
match at {
// x = fn
AssignmentTarget::AssignmentTargetIdentifier(id) => {
self.id_matches(id.name.as_str(), i)
}
// g.hB = fn
AssignmentTarget::StaticMemberExpression(static_member_expression) => {
// First level must be g.
if let Expression::Identifier(oid) = &static_member_expression.object
&& self.g
&& oid.name == "g"
&& static_member_expression.property.name.as_str() == self.name
{
return i + 1;
}
self.expression_matches(&static_member_expression.object, i)
}
// g.hB[F[65]][F[22]] = fn
// CME{object: CME{object: SME{object: g, property: hB}, expression: CME{object: F, expression: 65}}, expression: CME{object: F, expression: 22}}
// hB[F[65]][F[22]] = fn
// CME{object: CME{object:hB, expression: CME{object: F, expression: 65}}, expression: CME{object: F, expression: 22}}
AssignmentTarget::ComputedMemberExpression(id) => {
self.expression_matches(&id.object, i + 1)
}
_ => 0,
}
}
fn expression_matches(&self, exp: &Expression<'a>, i: usize) -> usize {
match exp {
Expression::ComputedMemberExpression(computed_member_expression) => {
self.expression_matches(&computed_member_expression.object, i + 1)
}
Expression::StaticMemberExpression(static_member_expression) => {
if let Expression::Identifier(oid) = &static_member_expression.object
&& self.g
&& oid.name == "g"
&& static_member_expression.property.name.as_str() == self.name
{
return i + 1;
}
self.expression_matches(&static_member_expression.object, i + 1)
}
Expression::Identifier(id) => self.id_matches(id.name.as_str(), i),
_ => 0,
}
}
fn id_matches(&self, id: &str, i: usize) -> usize {
if !self.g && id == self.name { i + 1 } else { 0 }
}
}
impl<'a> VisitMut<'a> for FunctionFinder<'a> {
fn visit_assignment_expression(&mut self, it: &mut AssignmentExpression<'a>) {
let depth = self.assignment_target_matches(&it.left, 0);
if depth == 1 {
if self.found.is_none() {
self.found = Some(it.right.take_in(self.allocator));
}
} else if depth > 1 {
let stmt = Statement::ExpressionStatement(OxBox::new_in(
oxc_ast::ast::ExpressionStatement {
span: it.span,
node_id: NodeId::DUMMY.into(),
expression: Expression::AssignmentExpression(it.take_in_box(self.allocator)),
},
self.allocator,
));
self.overloads.push((
stmt,
it.left.span().source_text(&self.source_text).to_owned(),
));
}
}
fn visit_variable_declarator(&mut self, it: &mut VariableDeclarator<'a>) {
if !self.g
&& self.found.is_none()
&& let BindingPattern::BindingIdentifier(ident) = &it.id
&& ident.name.as_str() == self.name
&& let Some(init) = &mut it.init
{
self.found = Some(init.take_in(self.allocator));
}
}
}
pub fn program_contains_string(program: &Program<'_>, strings: &[&str]) -> Option<u32> {
let mut sf = StringFinder {
strings,
found: None,
};
sf.visit_program(program);
sf.found
}
struct StringFinder<'a> {
strings: &'a [&'a str],
found: Option<u32>,
}
impl<'a> Visit<'a> for StringFinder<'a> {
fn visit_string_literal(&mut self, it: &StringLiteral<'a>) {
if self.found.is_none() {
self.found = self
.strings
.iter()
.position(|s| it.value.starts_with(s))
.map(|x| x as u32);
}
}
}
pub fn get_function_length(program: &Program<'_>) -> usize {
let mut fl = FunctionLength { len: 0 };
fl.visit_program(program);
fl.len
}
struct FunctionLength {
len: usize,
}
impl<'a> Visit<'a> for FunctionLength {
fn visit_function_body(&mut self, it: &FunctionBody<'a>) {
self.len += it.statements.len();
}
}
pub fn find_deobf_fn<'a>(program: &Program<'a>) -> Option<String> {
let mut df = DeobfFinder { found: None };
df.visit_program(program);
df.found
}
struct DeobfFinder {
found: Option<String>,
}
impl DeobfFinder {
/// p0 = new g.Hd(p0, !0);
fn is_url_creation(stmt: &Statement<'_>, p0: &str) -> bool {
if let Statement::ExpressionStatement(expr) = stmt
&& let Expression::AssignmentExpression(ae) = &expr.expression
&& ae.operator == AssignmentOperator::Assign
&& ae.left.get_identifier_name().is_some_and(|n| n == p0)
&& let Expression::NewExpression(ne) = &ae.right
&& let Expression::StaticMemberExpression(gne) = &ne.callee
&& gne
.object
.get_identifier_reference()
.is_some_and(|r| r.name == "g")
&& ne.arguments.len() == 2
{
let a0 = &ne.arguments[0];
let a1 = &ne.arguments[1];
if a0.as_expression().is_some_and(|x| x.is_specific_id(p0))
&& let Some(Expression::UnaryExpression(ue)) = a1.as_expression()
&& ue.operator == UnaryOperator::LogicalNot
&& ue.argument.is_number_0()
{
return true;
}
}
false
}
/// p0.set("alr", "yes");
fn is_set_alr_yes(stmt: &Statement<'_>, p0: &str) -> bool {
if let Statement::ExpressionStatement(expr) = stmt
&& let Expression::CallExpression(call) = &expr.expression
&& let Some(callee) = call.callee.as_member_expression()
&& callee.object().is_specific_id(p0)
{
if callee.static_property_name().is_some_and(|pn| pn != "set") {
return false;
}
if call.arguments.len() == 2
&& let (Some(a0), Some(a1)) = (
call.arguments[0].as_expression(),
call.arguments[1].as_expression(),
)
{
// accept string literal "alr" or any expression in case this gets obfuscated
if a0.is_string_literal() && !a0.is_specific_string_literal("alr") {
return false;
}
if a1.is_string_literal() && !a1.is_specific_string_literal("yes") {
return false;
}
return true;
}
}
false
}
fn is_deobf_function(expression: &Expression<'_>) -> bool {
let res = match expression {
Expression::FunctionExpression(f) => {
if f.r#async {
None
} else {
f.body.as_ref().map(|b| (b, f.params.items.first()))
}
}
Expression::ArrowFunctionExpression(f) => {
if f.r#async {
None
} else {
Some((&f.body, f.params.items.first()))
}
}
_ => None,
};
res.is_some_and(|(body, p0)| {
if let Some(p0) = p0
&& let BindingPattern::BindingIdentifier(p0_id) = &p0.pattern
{
let p0n = p0_id.name.as_str();
if !(4..11).contains(&body.statements.len()) {
return false;
}
if let Some(i_url_creation) = body
.statements
.iter()
.position(|s| Self::is_url_creation(s, p0n))
{
return body
.statements
.iter()
.skip(i_url_creation + 1)
.any(|s| Self::is_set_alr_yes(s, p0n));
}
}
false
})
}
}
impl<'a> Visit<'a> for DeobfFinder {
fn visit_assignment_expression(&mut self, it: &AssignmentExpression<'a>) {
if self.found.is_none()
&& matches!(
&it.left,
AssignmentTarget::AssignmentTargetIdentifier(_)
| AssignmentTarget::StaticMemberExpression(_)
)
&& Self::is_deobf_function(&it.right)
{
match &it.left {
AssignmentTarget::AssignmentTargetIdentifier(id) => {
self.found = Some(id.name.to_string());
}
AssignmentTarget::StaticMemberExpression(id) => {
if let Some(idr) = id.object.get_identifier_reference() {
self.found = Some(format!("{}.{}", idr.name, id.property.name))
}
}
_ => {}
}
}
}
fn visit_variable_declarator(&mut self, it: &VariableDeclarator<'a>) {
if self.found.is_none()
&& let Some(init) = &it.init
&& Self::is_deobf_function(init)
&& let Some(ident) = it.id.get_identifier_name()
{
self.found = Some(ident.to_string());
}
}
}

View file

@ -1,7 +1,7 @@
[package]
name = "rustypipe-downloader"
version = "0.3.1"
rust-version = "1.67.1"
rust-version = "1.89.0"
edition.workspace = true
authors.workspace = true
license.workspace = true
@ -15,19 +15,23 @@ default = ["default-tls"]
# Reqwest TLS options
default-tls = ["reqwest/default-tls", "rustypipe/default-tls"]
rustls = ["reqwest/rustls", "rustypipe/rustls"]
rustls-no-provider = [
"reqwest/rustls-no-provider",
"rustypipe/rustls-no-provider",
]
native-tls = ["reqwest/native-tls", "rustypipe/native-tls"]
native-tls-alpn = ["reqwest/native-tls-alpn", "rustypipe/native-tls-alpn"]
native-tls-no-alpn = [
"reqwest/native-tls-no-alpn",
"rustypipe/native-tls-no-alpn",
]
native-tls-vendored = [
"reqwest/native-tls-vendored",
"rustypipe/native-tls-vendored",
]
rustls-tls-webpki-roots = [
"reqwest/rustls-tls-webpki-roots",
"rustypipe/rustls-tls-webpki-roots",
]
rustls-tls-native-roots = [
"reqwest/rustls-tls-native-roots",
"rustypipe/rustls-tls-native-roots",
native-tls-vendored-no-alpn = [
"reqwest/native-tls-vendored-no-alpn",
"rustypipe/native-tls-vendored-no-alpn",
]
audiotag = ["dep:lofty", "dep:image", "dep:smartcrop2"]
@ -45,7 +49,7 @@ indicatif = { workspace = true, optional = true }
filenamify.workspace = true
tracing.workspace = true
time.workspace = true
lofty = { version = "0.22.0", optional = true }
lofty = { version = "0.24.0", optional = true }
image = { version = "0.25.0", optional = true, default-features = false, features = [
"rayon",
"jpeg",

View file

@ -17,14 +17,14 @@ use std::{
use futures_util::stream::{self, StreamExt, TryStreamExt};
use once_cell::sync::Lazy;
use rand::Rng;
use rand::RngExt;
use regex::Regex;
use reqwest::{header, Client, StatusCode, Url};
use reqwest::{Client, StatusCode, Url, header};
use rustypipe::{
client::{ClientType, RustyPipe},
model::{
traits::{FileFormat, YtEntity},
AudioCodec, TrackItem, VideoCodec, VideoPlayer,
traits::{FileFormat, YtEntity, YtStream},
},
param::StreamFilter,
};
@ -40,7 +40,7 @@ use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
#[cfg(feature = "audiotag")]
use lofty::{config::WriteOptions, picture::Picture, prelude::*, tag::Tag};
#[cfg(feature = "audiotag")]
use rustypipe::model::{richtext::ToPlaintext, VideoDetails, VideoPlayerDetails};
use rustypipe::model::{VideoDetails, VideoPlayerDetails, richtext::ToPlaintext};
#[cfg(feature = "audiotag")]
use time::{Date, OffsetDateTime};
@ -742,14 +742,14 @@ impl DownloadQuery {
);
// If the last download failed, try another client if possible
if let Some(failed_client) = failed_client {
if let Some(pos) = client_types.iter().position(|c| c == &failed_client) {
let p2 = pos + 1;
if p2 < client_types.len() {
let mut v = client_types[p2..].to_vec();
v.extend(&client_types[..p2]);
client_types = v.into();
}
if let Some(failed_client) = failed_client
&& let Some(pos) = client_types.iter().position(|c| c == &failed_client)
{
let p2 = pos + 1;
if p2 < client_types.len() {
let mut v = client_types[p2..].to_vec();
v.extend(&client_types[..p2]);
client_types = v.into();
}
}
@ -812,18 +812,22 @@ impl DownloadQuery {
let mut downloads: Vec<StreamDownload> = Vec::new();
if let Some(v) = video {
if let Some(v) = video
&& let Some(url) = v.url()
{
downloads.push(StreamDownload {
file: output_path.with_extension(format!("video{}", v.format.extension())),
url: v.url.clone(),
url: url.to_owned(),
video_codec: Some(v.codec),
audio_codec: None,
});
}
if let Some(a) = audio {
if let Some(a) = audio
&& let Some(url) = a.url()
{
downloads.push(StreamDownload {
file: output_path.with_extension(format!("audio{}", a.format.extension())),
url: a.url.clone(),
url: url.to_owned(),
video_codec: None,
audio_codec: Some(a.codec),
});
@ -842,17 +846,17 @@ impl DownloadQuery {
)
.await
.map_err(|e| {
if let DownloadError::Http(e) = &e {
if e.status() == Some(StatusCode::FORBIDDEN) {
// 403 errors may occur due to bad visitor data IDs
if let Some(vd) = &player_data.visitor_data {
q.remove_visitor_data(vd);
}
return DownloadError::Forbidden {
client_type: player_data.client_type,
visitor_data: player_data.visitor_data.clone(),
};
if let DownloadError::Http(e) = &e
&& e.status() == Some(StatusCode::FORBIDDEN)
{
// 403 errors may occur due to bad visitor data IDs
if let Some(vd) = &player_data.visitor_data {
q.remove_visitor_data(vd);
}
return DownloadError::Forbidden {
client_type: player_data.client_type,
visitor_data: player_data.visitor_data.clone(),
};
}
e
})?;
@ -955,10 +959,10 @@ impl DownloadQuery {
.unwrap_or(details.channel.name),
);
tag.set_title(track.name);
if let Some(release_date) = extract_yt_release_date(&description, details.publish_date) {
if let Ok(date_str) = release_date.format(&YMD_FORMAT) {
tag.insert_text(ItemKey::RecordingDate, date_str);
}
if let Some(release_date) = extract_yt_release_date(&description, details.publish_date)
&& let Ok(date_str) = release_date.format(&YMD_FORMAT)
{
tag.insert_text(ItemKey::RecordingDate, date_str);
}
tag.set_comment(description);
if let Some(track_nr) = track_nr {
@ -988,8 +992,8 @@ impl DownloadQuery {
if let Some(thumbnail) = thumbnail {
// Attempt to get the higher resolution, uncropped maxresdefault.jpg thumbnail if available
let mut resp = None;
if thumbnail.height != thumbnail.width {
if let Ok(x) = self
if thumbnail.height != thumbnail.width
&& let Ok(x) = self
.dl
.i
.http
@ -1000,9 +1004,8 @@ impl DownloadQuery {
.send()
.await?
.error_for_status()
{
resp = Some(x);
}
{
resp = Some(x);
}
let resp = match resp {
@ -1209,30 +1212,33 @@ async fn download_single_file(
.open(&output_path_tmp)
.await?;
let res = if is_gvideo && size.is_some() {
download_chunks_by_param(
http,
&mut file,
url,
size.unwrap(),
offset,
user_agent,
#[cfg(feature = "indicatif")]
pb,
)
.await
} else {
download_chunks_by_header(
http,
&mut file,
url,
size,
offset,
user_agent,
#[cfg(feature = "indicatif")]
pb,
)
.await
let res = match size {
Some(size) if is_gvideo => {
download_chunks_by_param(
http,
&mut file,
url,
size,
offset,
user_agent,
#[cfg(feature = "indicatif")]
pb,
)
.await
}
_ => {
download_chunks_by_header(
http,
&mut file,
url,
size,
offset,
user_agent,
#[cfg(feature = "indicatif")]
pb,
)
.await
}
};
drop(file);

View file

@ -20,6 +20,7 @@ fn rp() -> RustyPipe {
#[rstest]
#[tokio::test]
#[ignore]
async fn download_video(rp: RustyPipe) {
let td = TempDir::default();
let td_path = td.to_path_buf();
@ -43,6 +44,7 @@ async fn download_video(rp: RustyPipe) {
#[rstest]
#[tokio::test]
#[ignore]
async fn download_music(rp: RustyPipe) {
let td = TempDir::default();
let td_path = td.to_path_buf();

33
rbody.json Normal file
View file

@ -0,0 +1,33 @@
{
"videoId": "83C3TZ4Zm_o",
"context": {
"client": {
"hl": "de",
"gl": "DE",
"deviceMake": "Samsung",
"deviceModel": "SmartTV",
"visitorData": "CgtTT3hKd0FIZVVOOCjdoqfRBjIKCgJERRIEEgAgMGLfAgrcAjE5LllUPW9PQUdYdlRSblFFYk1oR3Q4clpLSVVlVWtkR1UyemU1VDd6aWJRRmpsVGtSbFhhd3M2dVJjaWdFbE5MZmpxYkdFdlpDcDhKVjdGWDNacFZMQ1lnaFRHdGdNSVRuS0ZKa2ZQckxwT19vTmlQYjNUMEpobmN6NmRFRnQ3SWZtVVJzZjEzWkh4Z2QxZVhtb04yUHRMM2ZsS1FtQmJNakluRDJxc3hMQWtZeXhJWUo4d1RhQl9vV21hV0cxRTYtSUI5TUFMWGdpS0hCeVc1VDhQUUdack1SN3JzN2UtZnVYbTBMVGUwZEJyeWF4SjBxOWJfQnlyQnZ6UTZHYUE1WW0tT28ta19DbHc0bUxWSnlnOGFLdHQ1OG5wV1k5T3RDbGRLMU5XMGNLWkRBRk9mOVZZUjViWnNKX3p0TWE4Q1VrUTdkdmY3cEV2Z2hXMnRpY0RRN3hfeEtXQQ%3D%3D",
"clientName": "TVHTML5",
"clientVersion": "7.20260609.06.00",
"osName": "Tizen",
"osVersion": "5.0",
"originalUrl": "https://www.youtube.com/tv",
"platform": "TV",
"clientFormFactor": "UNKNOWN_FORM_FACTOR",
"webpSupport": false,
"timeZone": "Europe/Berlin",
"clientScreen": "WATCH"
},
"user": { "lockedSafetyMode": false },
"request": {
"useSsl": true,
"internalExperimentFlags": []
}
},
"playbackContext": {
"contentPlaybackContext": {
"referer": "https://www.youtube.com/tv#/watch?v=83C3TZ4Zm_o&list=RD83C3TZ4Zm_o",
"signatureTimestamp": 20612
}
}
}

View file

@ -8,16 +8,16 @@ use crate::{
client::response::YouTubeListItem,
error::{Error, ExtractionError},
model::{
paginator::{ContinuationEndpoint, Paginator},
Channel, ChannelInfo, PlaylistItem, Verification, VideoItem,
paginator::{ContinuationEndpoint, Paginator},
},
param::{ChannelOrder, ChannelVideoTab, Language},
serializer::{text::TextComponent, MapResult},
util::{self, timeago, ProtoBuilder},
serializer::{MapResult, text::TextComponent},
util::{self, ProtoBuilder, timeago},
};
use super::{
response, ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery,
ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery, response,
};
#[derive(Debug, Serialize)]
@ -37,7 +37,7 @@ enum ChannelTab {
Shorts,
#[serde(rename = "EgdzdHJlYW1z8gYECgJ6AA%3D%3D")]
Live,
#[serde(rename = "EglwbGF5bGlzdHMgAQ%3D%3D")]
#[serde(rename = "EglwbGF5bGlzdHPyBgQKAkIA")]
Playlists,
#[serde(rename = "EgZzZWFyY2jyBgQKAloA")]
Search,
@ -123,7 +123,7 @@ impl RustyPipeQuery {
order: ChannelOrder,
) -> Result<Paginator<VideoItem>, Error> {
self.continuation(
order_ctoken(channel_id.as_ref(), tab, order, &random_target()),
order_ctoken(channel_id.as_ref(), tab, order, &util::random_uuid()),
ContinuationEndpoint::Browse,
None,
)
@ -626,35 +626,27 @@ fn order_ctoken(
order: ChannelOrder,
target_id: &str,
) -> String {
let mut pb_tab = ProtoBuilder::new();
pb_tab.string(2, target_id);
let mut pb_tab_order = ProtoBuilder::new();
pb_tab_order.string(1, target_id);
match tab {
ChannelVideoTab::Videos => match order {
ChannelOrder::Latest => {
pb_tab.varint(3, 1);
pb_tab.varint(4, 4);
}
ChannelOrder::Popular => {
pb_tab.varint(3, 2);
pb_tab.varint(4, 2);
}
ChannelOrder::Oldest => {
pb_tab.varint(3, 4);
pb_tab.varint(4, 5);
}
},
ChannelVideoTab::Shorts => match order {
ChannelOrder::Latest => pb_tab.varint(4, 4),
ChannelOrder::Popular => pb_tab.varint(4, 2),
ChannelOrder::Oldest => pb_tab.varint(4, 5),
},
ChannelVideoTab::Live => match order {
ChannelOrder::Latest => pb_tab.varint(5, 12),
ChannelOrder::Popular => pb_tab.varint(5, 14),
ChannelOrder::Oldest => pb_tab.varint(5, 13),
},
}
let order_id = if tab == ChannelVideoTab::Live {
match order {
ChannelOrder::Latest => 12,
ChannelOrder::Popular => 14,
ChannelOrder::Oldest => 13,
}
} else {
match order {
ChannelOrder::Latest => 4,
ChannelOrder::Popular => 2,
ChannelOrder::Oldest => 5,
}
};
pb_tab_order.varint(3, order_id);
let mut pb_tab = ProtoBuilder::new();
let otabid = if tab == ChannelVideoTab::Shorts { 7 } else { 8 };
pb_tab.embedded(otabid, pb_tab_order);
let mut pb_3 = ProtoBuilder::new();
pb_3.embedded(tab.order_ctoken_id(), pb_tab);
@ -709,9 +701,9 @@ mod tests {
use rstest::rstest;
use crate::{
client::{response, MapRespCtx, MapResponse},
client::{MapRespCtx, MapResponse, response},
error::{ExtractionError, UnavailabilityReason},
model::{paginator::Paginator, Channel, ChannelInfo, PlaylistItem, VideoItem},
model::{Channel, ChannelInfo, PlaylistItem, VideoItem, paginator::Paginator},
param::{ChannelOrder, ChannelVideoTab},
serializer::MapResult,
util::tests::TESTFILES,
@ -733,7 +725,7 @@ mod tests {
#[case::livestreams("livestreams", "UC2DjFE7Xf11URZqWBigcVOQ")]
#[case::pageheader("shorts_20240129_pageheader", "UCh8gHdtzO2tXd593_bjErWg")]
#[case::pageheader2("videos_20240324_pageheader2", "UC2DjFE7Xf11URZqWBigcVOQ")]
#[case::lockup("shorts_20240910_lockup", "UCh8gHdtzO2tXd593_bjErWg")]
#[case::s20260606("shorts_20260606", "UCh8gHdtzO2tXd593_bjErWg")]
fn map_channel_videos(#[case] name: &str, #[case] id: &str) {
let json_path = path!(*TESTFILES / "channel" / format!("channel_{name}.json"));
let json_file = File::open(json_path).unwrap();
@ -827,7 +819,10 @@ mod tests {
ChannelOrder::Popular,
"\n$6461d7c8-0000-2040-87aa-089e0827e420",
);
assert_eq!(videos_popular_token, "4qmFsgJgEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaRDhnWXdHaTU2TEJJbUNpUTJORFl4WkRkak9DMHdNREF3TFRJd05EQXRPRGRoWVMwd09EbGxNRGd5TjJVME1qQVlBaUFD");
assert_eq!(
videos_popular_token,
"4qmFsgJgEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaRDhnWXdHaTU2TEVJcUNpWUtKRFkwTmpGa04yTTRMVEF3TURBdE1qQTBNQzA0TjJGaExUQTRPV1V3T0RJM1pUUXlNQmdD"
);
let shorts_popular_token = order_ctoken(
channel_id,
@ -835,7 +830,10 @@ mod tests {
ChannelOrder::Popular,
"\n$64679ffb-0000-26b3-a1bd-582429d2c794",
);
assert_eq!(shorts_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXhTS2hJbUNpUTJORFkzT1dabVlpMHdNREF3TFRJMllqTXRZVEZpWkMwMU9ESTBNamxrTW1NM09UUWdBZyUzRCUzRA%3D%3D");
assert_eq!(
shorts_popular_token,
"4qmFsgJgEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaRDhnWXdHaTVTTERvcUNpWUtKRFkwTmpjNVptWmlMVEF3TURBdE1qWmlNeTFoTVdKa0xUVTRNalF5T1dReVl6YzVOQmdD"
);
let live_popular_token = order_ctoken(
channel_id,
@ -843,7 +841,10 @@ mod tests {
ChannelOrder::Popular,
"\n$64693069-0000-2a1e-8c7d-582429bd5ba8",
);
assert_eq!(live_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXh5S2hJbUNpUTJORFk1TXpBMk9TMHdNREF3TFRKaE1XVXRPR00zWkMwMU9ESTBNamxpWkRWaVlUZ29EZyUzRCUzRA%3D%3D");
assert_eq!(
live_popular_token,
"4qmFsgJgEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaRDhnWXdHaTV5TEVJcUNpWUtKRFkwTmprek1EWTVMVEF3TURBdE1tRXhaUzA0WXpka0xUVTRNalF5T1dKa05XSmhPQmdP"
);
}
#[test]
@ -851,6 +852,9 @@ mod tests {
let channel_id = "UCh8gHdtzO2tXd593_bjErWg";
let token = channel_info_ctoken(channel_id, "\n$655b339a-0000-20b9-92dc-582429d254b4");
assert_eq!(token, "4qmFsgJgEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caRDhnWXJHaW1hQVNZS0pEWTFOV0l6TXpsaExUQXdNREF0TWpCaU9TMDVNbVJqTFRVNE1qUXlPV1F5TlRSaU5BJTNEJTNE");
assert_eq!(
token,
"4qmFsgJgEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caRDhnWXJHaW1hQVNZS0pEWTFOV0l6TXpsaExUQXdNREF0TWpCaU9TMDVNbVJqTFRVNE1qUXlPV1F5TlRSaU5BJTNEJTNE"
);
}
}

View file

@ -7,7 +7,7 @@ use crate::{
util,
};
use super::{response, RustyPipeQuery};
use super::{RustyPipeQuery, response};
impl RustyPipeQuery {
/// Get the 15 latest videos from the channel's RSS feed
@ -50,14 +50,14 @@ impl RustyPipeQuery {
operation: "channel_rss",
error: Some(e.to_string()),
msgs: Vec::new(),
deobf_data: None,
deobf_js_url: None,
http_request: crate::report::HTTPRequest {
url: &url,
method: "GET",
status: 200,
req_header: None,
req_body: None,
resp_body: xml,
resp_body: &xml,
},
};

View file

@ -37,21 +37,23 @@ use std::{borrow::Cow, fmt::Debug, time::Duration};
use once_cell::sync::Lazy;
use regex::Regex;
use reqwest::{header, Client, ClientBuilder, Request, RequestBuilder, Response, StatusCode};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use reqwest::{Client, ClientBuilder, Request, RequestBuilder, Response, StatusCode, header};
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use serde_with::{DefaultOnError, serde_as};
use sha1::{Digest, Sha1};
use time::{OffsetDateTime, UtcOffset};
use tokio::sync::RwLock as AsyncRwLock;
use crate::deobfuscate::Deobfuscator;
use crate::error::AuthError;
use crate::util::VisitorDataCache;
use crate::{
cache::{CacheStorage, FileStorage, DEFAULT_CACHE_FILE},
cache::{CacheStorage, DEFAULT_CACHE_FILE, FileStorage},
deobfuscate::DeobfData,
error::{Error, ExtractionError},
model::ArtistId,
param::{Country, Language},
report::{FileReporter, Level, Report, Reporter, RustyPipeInfo, DEFAULT_REPORT_DIR},
report::{DEFAULT_REPORT_DIR, FileReporter, Level, Report, Reporter, RustyPipeInfo},
serializer::MapResult,
util,
};
@ -85,6 +87,8 @@ pub enum ClientType {
/// - no obfuscated stream URLs
/// - includes lower resolution audio streams
Android,
/// Client used by the Android VR Player
AndroidVr,
/// Client used by the iOS app
///
/// - no obfuscated stream URLs
@ -100,7 +104,11 @@ impl ClientType {
}
fn needs_deobf(self) -> bool {
!matches!(self, ClientType::Ios)
self.is_web() || self == ClientType::Tv
}
fn needs_visitor_data(self) -> bool {
self == ClientType::Tv
}
fn needs_po_token(self) -> bool {
@ -133,6 +141,8 @@ struct ClientInfo<'a> {
#[serde(skip_serializing_if = "str::is_empty")]
client_screen: &'a str,
#[serde(skip_serializing_if = "str::is_empty")]
device_make: &'a str,
#[serde(skip_serializing_if = "str::is_empty")]
device_model: &'a str,
#[serde(skip_serializing_if = "str::is_empty")]
os_name: &'a str,
@ -156,6 +166,7 @@ impl Default for ClientInfo<'_> {
client_name: "",
client_version: Cow::default(),
client_screen: "",
device_make: "",
device_model: "",
os_name: "",
os_version: "",
@ -357,8 +368,8 @@ const IOS_CLIENT_VERSION: &str = "20.03.02";
const IOS_VERSION: &str = "18_2_1";
const IOS_VERSION_BUILD: &str = "18.2.1.22C161";
const IOS_DEVICE_MODEL: &str = "iPhone16,2";
const ANDROID_CLIENT_VERSION: &str = "19.44.38";
const ANDROID_VERSION: &str = "11";
const ANDROID_CLIENT_VERSION: &str = "21.03.36";
const ANDROID_VERSION: &str = "15";
const OAUTH_CLIENT_ID: &str =
"861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.com";
@ -570,13 +581,18 @@ struct CacheHolder {
auth_cookie: RwLock<Option<AuthCookie>>,
}
#[serde_as]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
struct CacheData {
#[serde_as(as = "DefaultOnError")]
clients: HashMap<ClientType, CacheEntry<ClientData>>,
#[serde_as(as = "DefaultOnError")]
deobf: CacheEntry<DeobfData>,
#[serde_as(as = "DefaultOnError")]
#[serde(skip_serializing_if = "Option::is_none")]
oauth_token: Option<OauthToken>,
#[serde_as(as = "DefaultOnError")]
#[serde(skip_serializing_if = "Option::is_none")]
auth_cookie: Option<AuthCookie>,
}
@ -626,6 +642,7 @@ impl<T> CacheEntry<T> {
}
/// Get the content of the cache, even if it is expired
#[allow(unused)]
fn get_expired(&self) -> Option<&T> {
self.data.as_ref()
}
@ -1271,55 +1288,61 @@ impl RustyPipe {
}
/// Get deobfuscation data (either from cache or extracted from YouTube's JavaScript code)
async fn get_deobf_data(&self) -> Result<DeobfData, Error> {
async fn get_deobf_data(&self) -> Result<Option<DeobfData>, Error> {
// Write lock here to prevent concurrent tasks from fetching the same data
let mut deobf_data = self.inner.cache.deobf.write().await;
match deobf_data.get() {
Some(deobf_data) => Ok(deobf_data.clone()),
None => {
// Only attempt to fetch deobf data every 24 hours to avoid a flood of error reports
// if the client JS cannot be parsed
if deobf_data.should_retry() {
tracing::debug!("getting deobf data");
// Return cached deobf data if it is up-to-date and contains extracted script
// If the deobfuscator is disabled, allow deobf data without a script (STS is still required for player requests)
if let Some(d) = deobf_data.get()
&& (d.script.is_some() || !Deobfuscator::ENABLED)
{
Ok(Some(d.clone()))
} else {
// Only attempt to fetch deobf data every 24 hours to avoid a flood of error reports
// if the client JS cannot be parsed
if deobf_data.should_retry() {
tracing::debug!("getting deobf data");
match DeobfData::extract(&self.inner.http, self.inner.reporter.as_deref()).await
{
Ok(new_data) => {
// Write new data to the cache
*deobf_data = CacheEntry::from(new_data.clone());
drop(deobf_data);
self.store_cache().await;
Ok(new_data)
}
Err(e) => {
// Try to fall back to expired cache data if available, otherwise return error
deobf_data.retry_later(24);
let res = match deobf_data.get_expired() {
Some(d) => {
tracing::warn!("could not get new deobf data ({e}), falling back to expired cache");
Ok(d.clone())
}
None => Err(e),
};
drop(deobf_data);
self.store_cache().await;
res
}
match DeobfData::extract(&self.inner.http, self.inner.reporter.as_deref()).await {
Ok(new_data) => {
// Write new data to the cache
*deobf_data = CacheEntry::from(new_data.clone());
drop(deobf_data);
self.store_cache().await;
Ok(Some(new_data))
}
} else {
match deobf_data.get_expired() {
Some(d) => {
Err(e) => {
// Try to fall back to expired cache data if available, otherwise return error
deobf_data.retry_later(24);
let res = if let Some(d) = deobf_data.get_expired()
&& (d.script.is_some() || !Deobfuscator::ENABLED)
{
tracing::warn!(
"could not get new deobf data, falling back to expired cache"
"could not get new deobf data ({e}), falling back to expired cache"
);
Ok(d.clone())
}
None => Err(Error::Extraction(ExtractionError::Deobfuscation(
"could not get deobf data".into(),
))),
} else {
Err(e)
};
drop(deobf_data);
self.store_cache().await;
res.map(Some)
}
}
} else {
match deobf_data.get_expired() {
Some(d) => {
tracing::warn!(
"could not get new deobf data, falling back to expired cache"
);
Ok(Some(d.clone()))
}
None => Err(Error::Extraction(ExtractionError::Deobfuscation(
crate::error::DeobfError::Extraction("deobf data".into()),
))),
}
}
}
}
@ -1839,6 +1862,9 @@ impl RustyPipeQuery {
ANDROID_CLIENT_VERSION, ANDROID_VERSION
)
.into(),
ClientType::AndroidVr => Cow::Borrowed(
"com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; en_US; Quest 3 Build/SQ3A.220605.009.A1) gzip",
),
ClientType::Ios => format!(
"com.google.ios.youtube/{} ({}; U; CPU iOS {} like Mac OS X)",
IOS_CLIENT_VERSION, IOS_DEVICE_MODEL, IOS_VERSION
@ -1976,7 +2002,11 @@ impl RustyPipeQuery {
client_version: self.client.get_client_version(ctype).await,
client_screen: "WATCH",
platform: "TV",
device_make: "Samsung",
device_model: "SmartTV",
os_name: "Tizen",
os_version: "5.0",
original_url: "https://www.youtube.com/tv",
visitor_data,
hl,
gl,
@ -1996,7 +2026,28 @@ impl RustyPipeQuery {
client_version: ANDROID_CLIENT_VERSION.into(),
os_name: "Android",
os_version: ANDROID_VERSION,
android_sdk_version: Some(30),
android_sdk_version: Some(35),
platform: "MOBILE",
client_screen: "WATCH",
visitor_data,
hl,
gl,
time_zone,
utc_offset_minutes,
..Default::default()
},
request: None,
user: User::default(),
third_party: None,
},
ClientType::AndroidVr => YTContext {
client: ClientInfo {
client_name: "ANDROID_VR",
client_version: "1.65.10".into(),
device_model: "Quest 3",
os_name: "Android",
os_version: "12L",
android_sdk_version: Some(32),
platform: "MOBILE",
visitor_data,
hl,
@ -2114,6 +2165,15 @@ impl RustyPipeQuery {
))
.header("X-YouTube-Client-Name", "3")
.header("X-Goog-Api-Format-Version", "2"),
ClientType::AndroidVr => self
.client
.inner
.http
.post(format!(
"{YOUTUBEI_V1_GAPIS_URL}{endpoint}?{DISABLE_PRETTY_PRINT_PARAMETER}"
))
.header("X-YouTube-Client-Name", "28")
.header("X-Goog-Api-Format-Version", "2"),
ClientType::Ios => self
.client
.inner
@ -2517,44 +2577,44 @@ impl RustyPipeQuery {
}
};
if level > Level::DBG || self.opts.report {
if let Some(reporter) = &self.client.inner.reporter {
let report = Report {
info: self.rp_info(),
level,
operation: &format!("{operation}({id})"),
error,
msgs,
deobf_data: ctx_src.deobf.cloned(),
http_request: crate::report::HTTPRequest {
url: request.url().as_str(),
method: request.method().as_str(),
req_header: Some(
request
.headers()
.iter()
.filter(|(k, _)| k != &header::COOKIE)
.map(|(k, v)| {
let vstr = if k == header::AUTHORIZATION {
"[redacted]"
} else {
v.to_str().unwrap_or_default()
};
(k.as_str(), vstr.to_owned())
})
.collect(),
),
req_body: request
.body()
.as_ref()
.and_then(|b| b.as_bytes())
.map(|b| String::from_utf8_lossy(b).into_owned()),
status: req_res.status.into(),
resp_body: req_res.body,
},
};
reporter.report(&report);
}
if (level > Level::DBG || self.opts.report)
&& let Some(reporter) = &self.client.inner.reporter
{
let report = Report {
info: self.rp_info(),
level,
operation: &format!("{operation}({id})"),
error,
msgs,
deobf_js_url: ctx_src.deobf.as_ref().map(|d| d.js_url.to_owned()),
http_request: crate::report::HTTPRequest {
url: request.url().as_str(),
method: request.method().as_str(),
req_header: Some(
request
.headers()
.iter()
.filter(|(k, _)| k != &header::COOKIE)
.map(|(k, v)| {
let vstr = if k == header::AUTHORIZATION {
"[redacted]"
} else {
v.to_str().unwrap_or_default()
};
(k.as_str(), vstr.to_owned())
})
.collect(),
),
req_body: request
.body()
.as_ref()
.and_then(|b| b.as_bytes())
.map(|b| String::from_utf8_lossy(b).into_owned()),
status: req_res.status.into(),
resp_body: &req_res.body,
},
};
reporter.report(&report);
}
if res.is_ok() && level > Level::DBG && self.opts.strict {
@ -2700,7 +2760,9 @@ trait MapResponse<T> {
fn validate_country(country: Country) -> Country {
if country == Country::Zz {
tracing::warn!("Country:Zz (Global) can only be used for fetching music charts, falling back to Country:Us");
tracing::warn!(
"Country:Zz (Global) can only be used for fetching music charts, falling back to Country:Us"
);
Country::Us
} else {
country
@ -2806,7 +2868,7 @@ mod tests {
let token_bts = data_encoding::BASE64URL
.decode(po_token.po_token.as_bytes())
.unwrap();
assert_eq!(token_bts.len(), ident.len() + 74);
assert!(token_bts.len() > 100, "{}", po_token.po_token);
assert!(
po_token.valid_until > OffsetDateTime::now_utc() + time::Duration::minutes(30),
"valid until {}",

View file

@ -6,22 +6,22 @@ use tracing::debug;
use crate::{
client::{
response::{music_item::map_album_type, url_endpoint::NavigationEndpoint},
MapRespOptions, QContinuation,
response::{music_item::map_album_type, url_endpoint::NavigationEndpoint},
},
error::{Error, ExtractionError},
model::{
paginator::Paginator, traits::FromYtItem, AlbumItem, AlbumType, ArtistId, MusicArtist,
MusicItem,
AlbumItem, AlbumType, ArtistId, MusicArtist, MusicItem, paginator::Paginator,
richtext::RichText, traits::FromYtItem,
},
param::{AlbumFilter, AlbumOrder},
serializer::MapResult,
serializer::{MapResult, text::TextComponent},
util::{self, ProtoBuilder},
};
use super::{
response::{self, music_item::MusicListMapper, url_endpoint::PageType},
ClientType, MapRespCtx, MapResponse, QBrowse, QBrowseParams, RustyPipeQuery,
response::{self, music_item::MusicListMapper, url_endpoint::PageType},
};
impl RustyPipeQuery {
@ -181,10 +181,10 @@ fn map_artist_page(
.and_then(|pb| util::b64_decode(pb.as_bytes()).ok())
.and_then(|pb| util::string_from_pb(pb, 3));
if let Some(share_channel_id) = share_channel_id {
if share_channel_id != ctx.id {
return Err(ExtractionError::Redirect(share_channel_id));
}
if let Some(share_channel_id) = share_channel_id
&& share_channel_id != ctx.id
{
return Err(ExtractionError::Redirect(share_channel_id));
}
}
@ -211,18 +211,12 @@ fn map_artist_page(
for section in sections {
match section {
response::music_item::ItemSection::MusicShelfRenderer(shelf) => {
if tracks_playlist_id.is_none() {
if let Some(ep) = shelf.bottom_endpoint {
if let Some(cfg) =
ep.browse_endpoint.browse_endpoint_context_supported_configs
{
if cfg.browse_endpoint_context_music_config.page_type
== PageType::Playlist
{
tracks_playlist_id = Some(ep.browse_endpoint.browse_id);
}
}
}
if tracks_playlist_id.is_none()
&& let Some(ep) = shelf.bottom_endpoint
&& let Some(cfg) = ep.browse_endpoint.browse_endpoint_context_supported_configs
&& cfg.browse_endpoint_context_music_config.page_type == PageType::Playlist
{
tracks_playlist_id = Some(ep.browse_endpoint.browse_id);
}
mapper.album_type = AlbumType::Single;
mapper.map_response(shelf.contents);
@ -234,37 +228,39 @@ fn map_artist_page(
if let Some(button) = h
.music_carousel_shelf_basic_header_renderer
.more_content_button
{
if let NavigationEndpoint::Browse {
&& let NavigationEndpoint::Browse {
browse_endpoint, ..
} = button.button_renderer.navigation_endpoint
{
// Music videos
if browse_endpoint
.browse_endpoint_context_supported_configs
.map(|cfg| {
cfg.browse_endpoint_context_music_config.page_type
== PageType::Playlist
})
.unwrap_or_default()
{
// Music videos
if browse_endpoint
.browse_endpoint_context_supported_configs
.map(|cfg| {
cfg.browse_endpoint_context_music_config.page_type
== PageType::Playlist
})
.unwrap_or_default()
{
if videos_playlist_id.is_none() {
videos_playlist_id = Some(browse_endpoint.browse_id);
}
} else if browse_endpoint
.browse_id
.starts_with(util::ARTIST_DISCOGRAPHY_PREFIX)
if videos_playlist_id.is_none() {
videos_playlist_id = Some(browse_endpoint.browse_id);
}
} else if browse_endpoint
.browse_id
.starts_with(util::ARTIST_DISCOGRAPHY_PREFIX)
{
can_fetch_more = true;
extendable_albums = true;
} else {
// Peek at the first item to determine type
if let Some(
response::music_item::MusicResponseItem::MusicTwoRowItemRenderer(
item,
),
) = shelf.contents.c.first()
&& let Some(PageType::Album) = item.navigation_endpoint.page_type()
{
can_fetch_more = true;
extendable_albums = true;
} else {
// Peek at the first item to determine type
if let Some(response::music_item::MusicResponseItem::MusicTwoRowItemRenderer(item)) = shelf.contents.c.first() {
if let Some(PageType::Album) = item.navigation_endpoint.page_type() {
can_fetch_more = true;
extendable_albums = true;
}
}
}
}
}
@ -287,17 +283,11 @@ fn map_artist_page(
let mut mapped = mapper.group_items();
static WIKIPEDIA_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r"\(?https://[a-z\d-]+\.wikipedia.org/wiki/[^\s]+").unwrap());
let wikipedia_url = header.description.as_deref().and_then(|h| {
WIKIPEDIA_REGEX.captures(h).and_then(|c| c.get(0)).map(|m| {
let m = m.as_str();
match m.strip_prefix('(') {
Some(m) => match m.strip_suffix(')') {
Some(m) => m.to_owned(),
None => m.to_owned(),
},
None => m.to_owned(),
}
Lazy::new(|| Regex::new(r"^https://[a-z\d-]+\.wikipedia.org/wiki/").unwrap());
let wikipedia_url = header.description.as_ref().and_then(|d| {
d.0.iter().find_map(|c| match c {
TextComponent::Web { url, .. } if WIKIPEDIA_REGEX.is_match(url) => Some(url.to_owned()),
_ => None,
})
});
@ -316,7 +306,7 @@ fn map_artist_page(
id: ctx.id.to_owned(),
name: header.title,
header_image: header.thumbnail.into(),
description: header.description,
description: header.description.map(RichText::from),
wikipedia_url,
subscriber_count: header.subscription_button.and_then(|btn| {
util::parse_large_numstr_or_warn(

View file

@ -10,8 +10,8 @@ use crate::{
};
use super::{
response::{self, music_item::MusicListMapper, url_endpoint::MusicPageType},
ClientType, MapRespCtx, MapResponse, RustyPipeQuery,
response::{self, music_item::MusicListMapper, url_endpoint::MusicPageType},
};
#[derive(Debug, Serialize)]

View file

@ -5,18 +5,18 @@ use serde::Serialize;
use crate::{
error::{Error, ExtractionError},
model::{
paginator::{ContinuationEndpoint, Paginator},
ArtistId, Lyrics, MusicRelated, TrackDetails, TrackItem,
paginator::{ContinuationEndpoint, Paginator},
},
serializer::MapResult,
};
use super::{
ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery,
response::{
self,
music_item::{map_queue_item, MusicListMapper},
music_item::{MusicListMapper, map_queue_item},
},
ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery,
};
#[derive(Debug, Serialize)]
@ -207,7 +207,7 @@ impl MapResponse<TrackDetails> for response::MusicDetails {
response::music_item::PlaylistPanelVideo::None => None,
})
.ok_or(ExtractionError::InvalidData(Cow::Borrowed("no video item")))?;
let mut track = map_queue_item(track_item, ctx.lang);
let mut track = map_queue_item(track_item, ctx.lang)?;
let mut warnings = content.contents.warnings;
warnings.append(&mut track.warnings);
@ -254,9 +254,16 @@ impl MapResponse<Paginator<TrackItem>> for response::MusicDetails {
.into_iter()
.filter_map(|item| match item {
response::music_item::PlaylistPanelVideo::PlaylistPanelVideoRenderer(item) => {
let mut track = map_queue_item(item, ctx.lang);
warnings.append(&mut track.warnings);
Some(track.c)
match map_queue_item(item, ctx.lang) {
Ok(mut track) => {
warnings.append(&mut track.warnings);
Some(track.c)
}
Err(e) => {
warnings.push(e.to_string());
None
}
}
}
response::music_item::PlaylistPanelVideo::None => None,
})
@ -393,6 +400,7 @@ mod tests {
#[rstest]
#[case::mv("mv", "ZeerrnuLi5E")]
#[case::mv_20260603("mv_20260603", "ZeerrnuLi5E")]
#[case::track("track", "7nigXQS1Xb0")]
fn map_music_details(#[case] name: &str, #[case] id: &str) {
let json_path = path!(*TESTFILES / "music_details" / format!("details_{name}.json"));

View file

@ -7,8 +7,8 @@ use crate::{
};
use super::{
response::{self, music_item::MusicListMapper, url_endpoint::NavigationEndpoint},
ClientType, MapRespCtx, MapResponse, QBrowse, QBrowseParams, RustyPipeQuery,
response::{self, music_item::MusicListMapper, url_endpoint::NavigationEndpoint},
};
impl RustyPipeQuery {

View file

@ -3,11 +3,11 @@ use std::borrow::Cow;
use crate::{
client::response::music_item::MusicListMapper,
error::{Error, ExtractionError},
model::{traits::FromYtItem, AlbumItem, TrackItem},
model::{AlbumItem, TrackItem, traits::FromYtItem},
serializer::MapResult,
};
use super::{response, ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery};
use super::{ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery, response};
impl RustyPipeQuery {
/// Get the new albums that were released on YouTube Music

View file

@ -4,22 +4,22 @@ use crate::{
client::response::url_endpoint::NavigationEndpoint,
error::{Error, ExtractionError},
model::{
AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem, TrackType,
paginator::{ContinuationEndpoint, Paginator},
richtext::RichText,
AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem, TrackType,
},
serializer::{text::TextComponents, MapResult},
util::{self, dictionary, TryRemove, DOT_SEPARATOR},
serializer::{MapResult, text::TextComponents},
util::{self, DOT_SEPARATOR, TryRemove, dictionary},
};
use self::response::url_endpoint::MusicPageType;
use super::{
ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery,
response::{
self,
music_item::{map_album_type, map_artist_id, map_artists, MusicListMapper},
music_item::{MusicListMapper, map_album_type, map_artist_id, map_artists},
},
ClientType, MapRespCtx, MapResponse, QBrowse, RustyPipeQuery,
};
impl RustyPipeQuery {
@ -211,13 +211,13 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
"no sectionListRenderer content",
)))?;
if let Some(playlist_id) = shelf.playlist_id {
if playlist_id != ctx.id {
return Err(ExtractionError::WrongResult(format!(
"got wrong playlist id {}, expected {}",
playlist_id, ctx.id
)));
}
if let Some(playlist_id) = shelf.playlist_id
&& playlist_id != ctx.id
{
return Err(ExtractionError::WrongResult(format!(
"got wrong playlist id {}, expected {}",
playlist_id, ctx.id
)));
}
let mut mapper = MusicListMapper::new(ctx.lang);

View file

@ -3,19 +3,19 @@ use std::{borrow::Cow, fmt::Debug};
use serde::Serialize;
use crate::{
client::response::music_item::MusicListMapper,
client::response::{music_item::MusicListMapper, music_search::ItemSectionRendererItem},
error::{Error, ExtractionError},
model::{
paginator::{ContinuationEndpoint, Paginator},
traits::FromYtItem,
AlbumItem, ArtistItem, MusicItem, MusicPlaylistItem, MusicSearchResult,
MusicSearchSuggestion, TrackItem, UserItem,
paginator::{ContinuationEndpoint, Paginator},
traits::FromYtItem,
},
param::search_filter::MusicSearchFilter,
serializer::MapResult,
};
use super::{response, ClientType, MapRespCtx, MapResponse, RustyPipeQuery};
use super::{ClientType, MapRespCtx, MapResponse, RustyPipeQuery, response};
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
@ -46,10 +46,14 @@ impl RustyPipeQuery {
query,
params: filter.map(MusicSearchFilter::params),
};
let op = match filter {
Some(op) => Cow::Owned(format!("music_search_{op:?}").to_ascii_lowercase()),
None => Cow::Borrowed("music_search"),
};
self.execute_request::<response::MusicSearch, _, _>(
ClientType::DesktopMusic,
"music_search_tracks",
&op,
query,
"search",
&request_body,
@ -179,9 +183,22 @@ impl<T: FromYtItem> MapResponse<MusicSearchResult<T>> for response::MusicSearch
response::music_search::ItemSection::MusicCardShelfRenderer(card) => {
mapper.map_card(card);
}
response::music_search::ItemSection::ItemSectionRenderer { contents } => {
if let Some(corrected) = contents.into_iter().next() {
corrected_query = Some(corrected.showing_results_for_renderer.corrected_query);
response::music_search::ItemSection::ItemSectionRenderer { mut contents } => {
mapper.add_warnings(&mut contents.warnings);
for item in contents.c {
match item {
ItemSectionRendererItem::MusicResponsiveListItemRenderer(
list_music_item,
) => {
mapper.add_list_item(list_music_item);
}
ItemSectionRendererItem::ShowingResultsForRenderer(
showing_results_for_renderer,
) => {
corrected_query = Some(showing_results_for_renderer.corrected_query);
}
ItemSectionRendererItem::None => {}
}
}
}
response::music_search::ItemSection::None => {}
@ -251,7 +268,7 @@ mod tests {
use rstest::rstest;
use crate::{
client::{response, MapRespCtx, MapResponse},
client::{MapRespCtx, MapResponse, response},
model::{
AlbumItem, ArtistItem, MusicItem, MusicPlaylistItem, MusicSearchResult,
MusicSearchSuggestion, TrackItem,
@ -266,6 +283,7 @@ mod tests {
#[case::radio("radio")]
#[case::artist("artist")]
#[case::live("live")]
#[case::artist_20260603("artist_20260603")]
fn map_music_search_main(#[case] name: &str) {
let json_path = path!(*TESTFILES / "music_search" / format!("main_{name}.json"));
let json_file = File::open(json_path).unwrap();

View file

@ -2,13 +2,13 @@ use std::fmt::Debug;
use crate::{
client::{
response::{self, music_item::MusicListMapper},
ClientType, MapResponse, QBrowseParams, RustyPipeQuery,
response::{self, music_item::MusicListMapper},
},
error::{Error, ExtractionError},
model::{
paginator::{ContinuationEndpoint, Paginator},
AlbumItem, ArtistItem, HistoryItem, MusicPlaylist, MusicPlaylistItem, TrackItem,
paginator::{ContinuationEndpoint, Paginator},
},
serializer::MapResult,
};

View file

@ -2,9 +2,9 @@ use std::fmt::Debug;
use crate::error::{Error, ExtractionError};
use crate::model::{
Comment, MusicItem, YouTubeItem,
paginator::{ContinuationEndpoint, Paginator},
traits::FromYtItem,
Comment, MusicItem, YouTubeItem,
};
use crate::serializer::MapResult;
@ -12,11 +12,11 @@ use crate::serializer::MapResult;
use crate::model::{HistoryItem, TrackItem, VideoItem};
use super::response::{
music_item::{map_queue_item, MusicListMapper, PlaylistPanelVideo},
YouTubeListItem,
music_item::{MusicListMapper, PlaylistPanelVideo, map_queue_item},
};
use super::{
response, ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery,
ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery, response,
};
impl RustyPipeQuery {
@ -189,9 +189,15 @@ impl MapResponse<Paginator<MusicItem>> for response::MusicContinuation {
mapper.add_warnings(&mut panel.contents.warnings);
panel.contents.c.into_iter().for_each(|item| {
if let PlaylistPanelVideo::PlaylistPanelVideoRenderer(item) = item {
let mut track = map_queue_item(item, ctx.lang);
mapper.add_item(MusicItem::Track(track.c));
mapper.add_warnings(&mut track.warnings);
match map_queue_item(item, ctx.lang) {
Ok(mut track) => {
mapper.add_item(MusicItem::Track(track.c));
mapper.add_warnings(&mut track.warnings);
}
Err(e) => {
mapper.add_warning(e.to_string());
}
}
}
});
}
@ -249,10 +255,8 @@ impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::Continuation {
&mut map_res,
);
}
response::YouTubeListItem::ContinuationItemRenderer(ep) => {
if ctoken.is_none() {
ctoken = ep.continuation_endpoint.into_token();
}
response::YouTubeListItem::ContinuationItemRenderer(ep) if ctoken.is_none() => {
ctoken = ep.continuation_endpoint.into_token();
}
_ => {}
}

View file

@ -1,6 +1,6 @@
use std::{
borrow::Cow,
collections::{BTreeMap, HashMap, HashSet},
collections::{BTreeMap, HashMap},
fmt::Debug,
};
@ -12,21 +12,21 @@ use url::Url;
use crate::{
deobfuscate::{DeobfData, Deobfuscator},
error::{internal::DeobfError, AuthError, Error, ExtractionError, UnavailabilityReason},
error::{AuthError, DeobfError, Error, ExtractionError, UnavailabilityReason},
model::{
traits::QualityOrd, AudioCodec, AudioFormat, AudioStream, AudioTrack, DrmLicense,
DrmSystem, Frameset, Subtitle, VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails,
VideoPlayerDrm, VideoStream,
AudioCodec, AudioFormat, AudioStream, AudioTrack, DrmLicense, DrmSystem, Frameset,
Subtitle, VideoCodec, VideoFormat, VideoPlayer, VideoPlayerDetails, VideoPlayerDrm,
VideoStream, traits::QualityOrd,
},
util,
};
use super::{
ClientType, MapRespCtx, MapRespOptions, MapResponse, MapResult, PoToken, RustyPipeQuery,
response::{
self,
player::{self, Format},
},
ClientType, MapRespCtx, MapRespOptions, MapResponse, MapResult, PoToken, RustyPipeQuery,
};
#[derive(Debug, Serialize)]
@ -106,7 +106,6 @@ impl RustyPipeQuery {
let mut last_e = None;
let mut query = Cow::Borrowed(self);
let mut clients_iter = clients.iter().peekable();
let mut failed_clients = HashSet::new();
while let Some(client) = clients_iter.next() {
if query.opts.auth == Some(true) && !self.auth_enabled(*client) {
@ -116,9 +115,6 @@ impl RustyPipeQuery {
}
continue;
}
if failed_clients.contains(client) {
continue;
}
let res = query.player_from_client(video_id, *client).await;
match res {
@ -131,10 +127,11 @@ impl RustyPipeQuery {
return Err(Error::Extraction(e));
}
if let Some(next_client) = clients_iter.peek() {
tracing::warn!("error fetching player with {client:?} client: {e}; retrying with {next_client:?} client");
tracing::warn!(
"error fetching player with {client:?} client: {e}; retrying with {next_client:?} client"
);
}
last_e = Some(Error::Extraction(e));
failed_clients.insert(*client);
}
Err(e) => return Err(e),
}
@ -191,10 +188,10 @@ impl RustyPipeQuery {
}
let video_id = video_id.as_ref();
let (deobf, player_po) = tokio::try_join!(
let (deobf, player_po, visitor_data) = tokio::try_join!(
async {
if client_type.needs_deobf() {
Ok::<_, Error>(Some(self.client.get_deobf_data().await?))
Ok::<_, Error>(self.client.get_deobf_data().await?)
} else {
Ok(None)
}
@ -205,7 +202,14 @@ impl RustyPipeQuery {
} else {
Ok(PlayerPoToken::default())
}
}
},
async {
if client_type.needs_visitor_data() {
Ok::<_, Error>(Some(self.get_visitor_data(false).await?))
} else {
Ok(None)
}
},
)?;
let playback_context = deobf.as_ref().map(|deobf| QPlaybackContext {
@ -230,7 +234,10 @@ impl RustyPipeQuery {
"player",
&request_body,
MapRespOptions {
visitor_data: player_po.visitor_data.as_deref(),
visitor_data: player_po
.visitor_data
.as_deref()
.or(visitor_data.as_deref()),
deobf: deobf.as_ref(),
unlocalized: true,
session_po_token: player_po.session_po_token,
@ -245,10 +252,12 @@ impl RustyPipeQuery {
/// The order may change in the future in case YouTube applies changes to their
/// platform that disable a client or make it less reliable.
pub fn player_client_order(&self) -> &'static [ClientType] {
if self.client.inner.botguard.is_some() {
&[ClientType::Desktop, ClientType::Ios, ClientType::Tv]
if self.client.inner.botguard.is_some() && Deobfuscator::ENABLED {
&[ClientType::Tv, ClientType::AndroidVr, ClientType::Desktop]
} else if Deobfuscator::ENABLED {
&[ClientType::Tv, ClientType::AndroidVr]
} else {
&[ClientType::Ios, ClientType::Tv]
&[ClientType::AndroidVr]
}
}
@ -300,7 +309,8 @@ impl MapResponse<VideoPlayer> for response::Player {
// Check playability status
let is_live = match self.playability_status {
response::player::PlayabilityStatus::Ok { live_streamability } => {
live_streamability.is_some()
let ls = live_streamability.live_streamability_renderer;
ls.broadcast_id.is_some() && !ls.display_endscreen
}
response::player::PlayabilityStatus::Unplayable {
reason,
@ -387,21 +397,6 @@ impl MapResponse<VideoPlayer> for response::Player {
video_details.video_id, ctx.id
)));
}
// Sometimes YouTube Desktop does not output any URLs for adaptive streams.
// Since this is currently rare, it is best to retry the request in this case.
if !is_live
&& !streaming_data.adaptive_formats.c.is_empty()
&& streaming_data
.adaptive_formats
.c
.iter()
.all(|f| f.url.is_none() && f.signature_cipher.is_none())
{
return Err(ExtractionError::Unavailable {
reason: UnavailabilityReason::TryAgain,
msg: "no adaptive stream URLs".to_owned(),
});
}
let video_info = VideoPlayerDetails {
id: video_details.video_id,
@ -417,11 +412,27 @@ impl MapResponse<VideoPlayer> for response::Player {
is_live_content: video_details.is_live_content,
};
let mut mapper = StreamsMapper::new(
ctx.deobf,
ctx.session_po_token.as_ref().map(|t| t.po_token.as_str()),
)?;
let abr_streaming_url = match &streaming_data.server_abr_streaming_url {
Some(url) => match mapper.map_url_abr(url) {
Ok(res) => Some(res),
Err(e) => {
warnings.push(format!("could not map abr_streaming_url: {e}"));
None
}
},
None => None,
};
let abr_ustreamer_config = self.player_config.media_common_config.map(|cfg| {
cfg.media_ustreamer_request_config
.video_playback_ustreamer_config
});
let streams = if !is_live {
let mut mapper = StreamsMapper::new(
ctx.deobf,
ctx.session_po_token.as_ref().map(|t| t.po_token.as_str()),
)?;
mapper.map_streams(streaming_data.formats);
mapper.map_streams(streaming_data.adaptive_formats);
let mut res = mapper.output()?;
@ -530,6 +541,12 @@ impl MapResponse<VideoPlayer> for response::Player {
valid_until,
hls_manifest_url: streaming_data.hls_manifest_url,
dash_manifest_url: streaming_data.dash_manifest_url,
abr_streaming_url,
abr_ustreamer_config,
po_token: ctx
.session_po_token
.as_ref()
.map(|pot| pot.po_token.to_owned()),
preview_frames,
drm,
client_type: ctx.client_type,
@ -568,8 +585,8 @@ impl<'a> StreamsMapper<'a> {
deobf_data: Option<&DeobfData>,
session_po_token: Option<&'a str>,
) -> Result<Self, DeobfError> {
let deobf = match deobf_data {
Some(deobf_data) => Some(Deobfuscator::new(deobf_data)?),
let deobf = match deobf_data.and_then(|d| d.script.as_deref()) {
Some(script) => Some(Deobfuscator::new(script)?),
None => None,
};
@ -588,9 +605,14 @@ impl<'a> StreamsMapper<'a> {
self.warnings.append(&mut streams.warnings);
let map_e = |m: &mut Self, e: ExtractionError| {
m.warnings.push(e.to_string());
if m.first_err.is_none() {
m.first_err = Some(e);
if !matches!(
e,
ExtractionError::Deobfuscation(DeobfError::Disabled | DeobfError::NoInstance)
) {
m.warnings.push(e.to_string());
if m.first_err.is_none() {
m.first_err = Some(e);
}
}
};
@ -623,10 +645,9 @@ impl<'a> StreamsMapper<'a> {
// If we did not extract any streams and there were mapping errors, fail with the first error
if self.streams.video_streams.is_empty()
&& (self.streams.video_only_streams.is_empty() || self.streams.audio_streams.is_empty())
&& let Some(e) = self.first_err
{
if let Some(e) = self.first_err {
return Err(e);
}
return Err(e);
}
self.streams.video_streams.sort_by(QualityOrd::quality_cmp);
@ -642,9 +663,11 @@ impl<'a> StreamsMapper<'a> {
}
fn deobf(&self) -> Result<&Deobfuscator, DeobfError> {
self.deobf
.as_ref()
.ok_or(DeobfError::Other("no deobfuscator".into()))
self.deobf.as_ref().ok_or(if Deobfuscator::ENABLED {
DeobfError::NoInstance
} else {
DeobfError::Disabled
})
}
fn cipher_to_url_params(
@ -659,13 +682,18 @@ impl<'a> StreamsMapper<'a> {
// `sp`: Signature parameter
// `url`: URL that is missing the signature parameter
let sig = params.get("s").ok_or(DeobfError::Extraction("s param"))?;
let sp = params.get("sp").ok_or(DeobfError::Extraction("sp param"))?;
let sig = params
.get("s")
.ok_or(DeobfError::Extraction("s param".into()))?;
let sp = params
.get("sp")
.ok_or(DeobfError::Extraction("sp param".into()))?;
let raw_url = params
.get("url")
.ok_or(DeobfError::Extraction("no url param"))?;
let (url_base, mut url_params) =
util::url_to_params(raw_url).or(Err(DeobfError::Extraction("url params")))?;
.ok_or(DeobfError::Extraction("no url param".into()))?;
let (url_base, mut url_params) = util::url_to_params(raw_url).or(Err(
DeobfError::Extraction("cannot split url to params".into()),
))?;
let deobf_sig = self.deobf()?.deobfuscate_sig(sig)?;
url_params.insert(sp.to_string(), deobf_sig);
@ -694,25 +722,25 @@ impl<'a> StreamsMapper<'a> {
url: &Option<String>,
signature_cipher: &Option<String>,
) -> Result<UrlMapRes, ExtractionError> {
let (url_base, mut url_params) =
match url {
Some(url) => util::url_to_params(url).map_err(|_| {
ExtractionError::InvalidData(format!("Could not parse url `{url}`").into())
}),
None => match signature_cipher {
Some(signature_cipher) => {
self.cipher_to_url_params(signature_cipher).map_err(|e| {
let (url_base, mut url_params) = match url {
Some(url) => util::url_to_params(url).map_err(|_| {
ExtractionError::InvalidData(format!("Could not parse url `{url}`").into())
}),
None => match signature_cipher {
Some(signature_cipher) => {
self.cipher_to_url_params(signature_cipher).map_err(|e| {
if matches!(e, DeobfError::Extraction(_)) {
ExtractionError::InvalidData(
format!("Could not deobfuscate signatureCipher `{signature_cipher}`: {e}")
.into(),
)
})
}
None => Err(ExtractionError::InvalidData(
"stream contained neither url or cipher".into(),
)),
},
}?;
.into())
} else {
ExtractionError::Deobfuscation(e)
}
})
}
None => return Ok(UrlMapRes::default()),
},
}?;
self.deobf_nsig(&mut url_params)?;
if let Some(pot) = self.session_po_token {
@ -723,11 +751,21 @@ impl<'a> StreamsMapper<'a> {
.map_err(|_| ExtractionError::InvalidData("could not combine URL".into()))?;
Ok(UrlMapRes {
url: url.to_string(),
url: Some(url.to_string()),
xtags: url_params.get("xtags").cloned(),
})
}
fn map_url_abr(&mut self, url: &str) -> Result<String, ExtractionError> {
let (url_base, mut url_params) = util::url_to_params(url).map_err(|_| {
ExtractionError::InvalidData(format!("Could not parse url `{url}`").into())
})?;
self.deobf_nsig(&mut url_params)?;
let url = Url::parse_with_params(url_base.as_str(), url_params.iter())
.map_err(|_| ExtractionError::InvalidData("could not combine URL".into()))?;
Ok(url.to_string())
}
fn map_video_stream(&mut self, f: player::Format) -> Result<VideoStream, ExtractionError> {
let Some((mtype, codecs)) = parse_mime(&f.mime_type) else {
return Err(ExtractionError::InvalidData(
@ -751,6 +789,7 @@ impl<'a> StreamsMapper<'a> {
bitrate: f.bitrate,
average_bitrate: f.average_bitrate.unwrap_or(f.bitrate),
size: f.content_length,
last_modified: f.last_modified,
index_range: f.index_range,
init_range: f.init_range,
duration_ms: f.approx_duration_ms,
@ -765,6 +804,7 @@ impl<'a> StreamsMapper<'a> {
format,
codec: get_video_codec(codecs),
mime: f.mime_type,
xtags: f.xtags,
drm_track_type: f.drm_track_type.map(|t| t.into()),
drm_systems: f.drm_families.into_iter().map(|t| t.into()).collect(),
})
@ -795,6 +835,7 @@ impl<'a> StreamsMapper<'a> {
format!("no audio content length. itag: {}", f.itag).into(),
)
})?,
last_modified: f.last_modified,
index_range: f.index_range,
init_range: f.init_range,
duration_ms: f.approx_duration_ms,
@ -803,9 +844,11 @@ impl<'a> StreamsMapper<'a> {
mime: f.mime_type,
channels: f.audio_channels,
loudness_db: f.loudness_db,
is_drc: f.is_drc,
track: f
.audio_track
.map(|t| self.map_audio_track(t, map_res.xtags)),
.map(|t| self.map_audio_track(t, map_res.xtags.as_deref())),
xtags: f.xtags,
drm_track_type: f.drm_track_type.map(|t| t.into()),
drm_systems: f.drm_families.into_iter().map(|t| t.into()).collect(),
})
@ -814,7 +857,7 @@ impl<'a> StreamsMapper<'a> {
fn map_audio_track(
&mut self,
track: response::player::AudioTrack,
xtags: Option<String>,
xtags: Option<&str>,
) -> AudioTrack {
let mut lang = None;
let mut track_type = None;
@ -850,8 +893,9 @@ impl<'a> StreamsMapper<'a> {
}
}
#[derive(Default)]
struct UrlMapRes {
url: String,
url: Option<String>,
xtags: Option<String>,
}
@ -957,13 +1001,12 @@ mod tests {
use time::UtcOffset;
use super::*;
use crate::{deobfuscate::DeobfData, param::Language, util::tests::TESTFILES};
use crate::{param::Language, util::tests::TESTFILES};
static DEOBF_DATA: Lazy<DeobfData> = Lazy::new(|| {
DeobfData {
js_url: "https://www.youtube.com/s/player/c8b8a173/player_ias.vflset/en_US/base.js".to_owned(),
sig_fn: "var oB={B4:function(a){a.reverse()},xm:function(a,b){a.splice(0,b)},dC:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c}};var Vva=function(a){a=a.split(\"\");oB.dC(a,42);oB.xm(a,3);oB.dC(a,48);oB.B4(a,68);return a.join(\"\")};var deobf_sig=Vva;".to_owned(),
nsig_fn: "Ska=function(a){var b=a.split(\"\"),c=[-1505243983,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(-e).reverse().forEach(function(f){d.unshift(f)})},\n-1692381986,function(d,e){e=(e%d.length+d.length)%d.length;var f=d[0];d[0]=d[e];d[e]=f},\n-262444939,\"unshift\",function(d){for(var e=d.length;e;)d.push(d.splice(--e,1)[0])},\n1201502951,-546377604,-504264123,-1978377336,1042456724,function(d,e){for(e=(e%d.length+d.length)%d.length;e--;)d.unshift(d.pop())},\n711986897,406699922,-1842537993,-1678108293,1803491779,1671716087,12778705,-718839990,null,null,-1617525823,342523552,-1338406651,-399705108,-696713950,b,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(0,1,d.splice(e,1,d[0])[0])},\nfunction(d,e){e=(e%d.length+d.length)%d.length;d.splice(e,1)},\n-980602034,356396192,null,-1617525823,function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(\"\"))},\n-1029864222,-641353250,-1681901809,-1391247867,1707415199,-1957855835,b,function(){for(var d=64,e=[];++d-e.length-32;)switch(d){case 58:d=96;continue;case 91:d=44;break;case 65:d=47;continue;case 46:d=153;case 123:d-=58;default:e.push(String.fromCharCode(d))}return e},\n-1936558978,-1505243983,function(d){d.reverse()},\n1296889058,-1813915420,-943019300,function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(\"\"))},\n\"join\",b,-2061642263];c[21]=c;c[22]=c;c[33]=c;try{c[3](c[33],c[9]),c[29](c[22],c[25]),c[29](c[22],c[19]),c[29](c[33],c[17]),c[29](c[21],c[2]),c[29](c[42],c[10]),c[1](c[52],c[40]),c[12](c[28],c[8]),c[29](c[21],c[45]),c[1](c[21],c[48]),c[44](c[26]),c[39](c[5],c[2]),c[31](c[53],c[16]),c[30](c[29],c[8]),c[51](c[29],c[6],c[44]()),c[4](c[43],c[1]),c[2](c[23],c[42]),c[2](c[0],c[46]),c[38](c[14],c[52]),c[32](c[5]),c[26](c[29],c[46]),c[26](c[5],c[13]),c[28](c[1],c[37]),c[26](c[31],c[13]),c[26](c[1],c[34]),\nc[46](c[1],c[32],c[40]()),c[26](c[50],c[44]),c[17](c[50],c[51]),c[0](c[3],c[24]),c[32](c[13]),c[43](c[3],c[51]),c[0](c[34],c[17]),c[16](c[45],c[53]),c[29](c[44],c[13]),c[42](c[1],c[50]),c[47](c[22],c[53]),c[37](c[22]),c[13](c[52],c[21]),c[6](c[43],c[34]),c[6](c[31],c[46])}catch(d){return\"enhanced_except_gZYB_un-_w8_\"+a}return b.join(\"\")};var deobf_nsig=Ska;".to_owned(),
script: Some("var oB={B4:function(a){a.reverse()},xm:function(a,b){a.splice(0,b)},dC:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c}};var Vva=function(a){a=a.split(\"\");oB.dC(a,42);oB.xm(a,3);oB.dC(a,48);oB.B4(a,68);return a.join(\"\")};var deobf_sig=Vva; var Ska=function(a){var b=a.split(\"\"),c=[-1505243983,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(-e).reverse().forEach(function(f){d.unshift(f)})},\n-1692381986,function(d,e){e=(e%d.length+d.length)%d.length;var f=d[0];d[0]=d[e];d[e]=f},\n-262444939,\"unshift\",function(d){for(var e=d.length;e;)d.push(d.splice(--e,1)[0])},\n1201502951,-546377604,-504264123,-1978377336,1042456724,function(d,e){for(e=(e%d.length+d.length)%d.length;e--;)d.unshift(d.pop())},\n711986897,406699922,-1842537993,-1678108293,1803491779,1671716087,12778705,-718839990,null,null,-1617525823,342523552,-1338406651,-399705108,-696713950,b,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(0,1,d.splice(e,1,d[0])[0])},\nfunction(d,e){e=(e%d.length+d.length)%d.length;d.splice(e,1)},\n-980602034,356396192,null,-1617525823,function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(\"\"))},\n-1029864222,-641353250,-1681901809,-1391247867,1707415199,-1957855835,b,function(){for(var d=64,e=[];++d-e.length-32;)switch(d){case 58:d=96;continue;case 91:d=44;break;case 65:d=47;continue;case 46:d=153;case 123:d-=58;default:e.push(String.fromCharCode(d))}return e},\n-1936558978,-1505243983,function(d){d.reverse()},\n1296889058,-1813915420,-943019300,function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(\"\"))},\n\"join\",b,-2061642263];c[21]=c;c[22]=c;c[33]=c;try{c[3](c[33],c[9]),c[29](c[22],c[25]),c[29](c[22],c[19]),c[29](c[33],c[17]),c[29](c[21],c[2]),c[29](c[42],c[10]),c[1](c[52],c[40]),c[12](c[28],c[8]),c[29](c[21],c[45]),c[1](c[21],c[48]),c[44](c[26]),c[39](c[5],c[2]),c[31](c[53],c[16]),c[30](c[29],c[8]),c[51](c[29],c[6],c[44]()),c[4](c[43],c[1]),c[2](c[23],c[42]),c[2](c[0],c[46]),c[38](c[14],c[52]),c[32](c[5]),c[26](c[29],c[46]),c[26](c[5],c[13]),c[28](c[1],c[37]),c[26](c[31],c[13]),c[26](c[1],c[34]),\nc[46](c[1],c[32],c[40]()),c[26](c[50],c[44]),c[17](c[50],c[51]),c[0](c[3],c[24]),c[32](c[13]),c[43](c[3],c[51]),c[0](c[34],c[17]),c[16](c[45],c[53]),c[29](c[44],c[13]),c[42](c[1],c[50]),c[47](c[22],c[53]),c[37](c[22]),c[13](c[52],c[21]),c[6](c[43],c[34]),c[6](c[31],c[46])}catch(d){return\"enhanced_except_gZYB_un-_w8_\"+a}return b.join(\"\")};var deobf_nsig=Ska;".to_owned()),
sts: "19201".to_owned(),
}
});
@ -1013,8 +1056,12 @@ mod tests {
let url = mapper
.map_url(&None, &Some(signature_cipher.to_owned()))
.unwrap()
.url;
.url
.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_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"
);
}
}

View file

@ -5,15 +5,15 @@ use time::OffsetDateTime;
use crate::{
error::{Error, ExtractionError},
model::{
ChannelId, Playlist, VideoItem,
paginator::{ContinuationEndpoint, Paginator},
richtext::RichText,
ChannelId, Playlist, VideoItem,
},
serializer::text::{TextComponent, TextComponents},
util::{self, dictionary, timeago, TryRemove},
util::{self, TryRemove, dictionary, timeago},
};
use super::{response, ClientType, MapRespCtx, MapResponse, MapResult, QBrowse, RustyPipeQuery};
use super::{ClientType, MapRespCtx, MapResponse, MapResult, QBrowse, RustyPipeQuery, response};
impl RustyPipeQuery {
/// Get a YouTube playlist
@ -59,14 +59,8 @@ impl MapResponse<Playlist> for response::Playlist {
"sectionListRenderer empty",
)))?
.item_section_renderer
.contents
.into_iter()
.next()
.ok_or(ExtractionError::InvalidData(Cow::Borrowed(
"itemSectionRenderer empty",
)))?
.playlist_video_list_renderer
.contents;
// dbg!(&ci.warnings);
let mut mapper = response::YouTubeListMapper::<VideoItem>::new(ctx.lang);
mapper.map_response(video_items);
@ -258,6 +252,8 @@ mod tests {
#[case::live("live", "UULVvqRdlKsE5Q8mf8YXbdIJLw")]
#[case::pageheader("20241011_pageheader", "PLT2w2oBf1TZKyvY_M6JsASs73m-wjLzH5")]
#[case::cmdexecutor("20250316_cmdexecutor", "PLbZIPy20-1pN7mqjckepWF78ndb6ci_qi")]
#[case::featuring("featuring", "PLLsua0MU5Y8JZZaDko8Ewv95Tv98A36ee")]
#[case::noplrenderer("20260610_noplrenderer", "PLbZIPy20-1pN7mqjckepWF78ndb6ci_qi")]
fn map_playlist_data(#[case] name: &str, #[case] id: &str) {
let json_path = path!(*TESTFILES / "playlist" / format!("playlist_{name}.json"));
let json_file = File::open(json_path).unwrap();

View file

@ -1,10 +1,10 @@
use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, rust::deserialize_ignore_any, serde_as};
use super::{
video_item::YouTubeListRenderer, Alert, AttachmentRun, AvatarViewModel, ChannelBadge,
ContentRenderer, ContentsRenderer, ContinuationActionWrap, ImageView,
PageHeaderRendererContent, PhMetadataView, ResponseContext, Thumbnails, TwoColumnBrowseResults,
Alert, AttachmentRun, AvatarViewModel, ChannelBadge, ContentRenderer, ContentsRenderer,
ContinuationActionWrap, ImageView, PageHeaderRendererContent, PhMetadataView, ResponseContext,
Thumbnails, TwoColumnBrowseResults, video_item::YouTubeListRenderer,
};
use crate::{
model::Verification,
@ -75,7 +75,6 @@ pub(crate) struct ChannelTabWebCommandMetadata {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(clippy::enum_variant_names)]
pub(crate) enum Header {
C4TabbedHeaderRenderer(HeaderRenderer),
/// Used for special channels like YouTube Music

View file

@ -1,6 +1,6 @@
use serde::Deserialize;
use super::{video_item::YouTubeListRendererWrap, Tab, TwoColumnBrowseResults};
use super::{Tab, TwoColumnBrowseResults, video_item::YouTubeListRendererWrap};
#[derive(Debug, Deserialize)]
pub(crate) struct History {

View file

@ -61,11 +61,12 @@ use std::collections::HashMap;
use std::marker::PhantomData;
use serde::{
de::{IgnoredAny, Visitor},
Deserialize,
de::{IgnoredAny, Visitor},
};
use serde_with::{serde_as, DisplayFromStr, VecSkipError};
use serde_with::{DisplayFromStr, VecSkipError, serde_as};
use crate::client::response::url_endpoint::OnTapWrap;
use crate::error::ExtractionError;
use crate::serializer::text::{AttributedText, Text, TextComponent};
use crate::serializer::{MapResult, VecSkipErrorWrap};
@ -142,13 +143,16 @@ pub(crate) struct Thumbnails {
#[serde(rename_all = "camelCase")]
pub(crate) struct Thumbnail {
pub url: String,
#[serde(default)]
pub width: u32,
#[serde(default)]
pub height: u32,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ContinuationItemRenderer {
#[serde(alias = "continuationCommand")]
pub continuation_endpoint: ContinuationEndpoint,
}
@ -156,9 +160,16 @@ pub(crate) struct ContinuationItemRenderer {
#[serde(untagged)]
pub(crate) enum ContinuationEndpoint {
ContinuationCommand(ContinuationCommandWrap),
InnertubeCommand(ContinuationInnertubeCommand),
CommandExecutorCommand(CommandExecutorCommandWrap),
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ContinuationInnertubeCommand {
pub innertube_command: ContinuationCommandWrap,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ContinuationCommandWrap {
@ -189,6 +200,7 @@ impl ContinuationEndpoint {
pub fn into_token(self) -> Option<String> {
match self {
Self::ContinuationCommand(cmd) => Some(cmd.continuation_command.token),
Self::InnertubeCommand(cmd) => Some(cmd.innertube_command.continuation_command.token),
Self::CommandExecutorCommand(cmd) => cmd
.command_executor_command
.commands
@ -702,6 +714,7 @@ pub(crate) struct ThumbnailViewModelWrap {
#[serde(rename_all = "camelCase")]
pub(crate) struct ImageViewOl {
pub image: Thumbnails,
#[serde(default)]
#[serde_as(as = "VecSkipError<_>")]
pub overlays: Vec<ImageViewOverlay>,
}
@ -709,15 +722,17 @@ pub(crate) struct ImageViewOl {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ImageViewOverlay {
pub thumbnail_overlay_badge_view_model: ThumbnailOverlayBadgeViewModel,
#[serde(alias = "thumbnailOverlayBadgeViewModel")]
pub thumbnail_bottom_overlay_view_model: ThumbnailBottomOverlayViewModel,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ThumbnailOverlayBadgeViewModel {
pub(crate) struct ThumbnailBottomOverlayViewModel {
#[serde(alias = "thumbnailBadges")]
#[serde_as(as = "VecSkipError<_>")]
pub thumbnail_badges: Vec<ThumbnailBadges>,
pub badges: Vec<ThumbnailBadges>,
}
#[derive(Debug, Deserialize)]
@ -728,3 +743,9 @@ pub(crate) struct ThumbnailBadges {
#[derive(Debug, Deserialize)]
pub(crate) struct Empty {}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarRendererContext {
pub command_context: Option<OnTapWrap>,
}

View file

@ -1,14 +1,14 @@
use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError};
use serde_with::{DefaultOnError, serde_as};
use crate::serializer::text::Text;
use crate::serializer::text::{Text, TextComponents};
use super::{
SectionList, Tab,
music_item::{
Button, Grid, ItemSection, MusicMicroformat, MusicThumbnailRenderer, SimpleHeader,
SingleColumnBrowseResult,
},
SectionList, Tab,
};
/// Response model for YouTube Music artists
@ -37,8 +37,7 @@ pub(crate) struct MusicHeaderRenderer {
#[serde(default)]
#[serde_as(as = "DefaultOnError")]
pub subscription_button: Option<SubscriptionButton>,
#[serde_as(as = "Option<Text>")]
pub description: Option<String>,
pub description: Option<TextComponents>,
#[serde(default)]
pub thumbnail: MusicThumbnailRenderer,
#[serde(default)]

View file

@ -1,9 +1,9 @@
use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, VecSkipError};
use serde_with::{VecSkipError, rust::deserialize_ignore_any, serde_as};
use crate::param::Country;
use super::{music_item::MusicCarouselShelf, ContentsRenderer, SectionList, Tab};
use super::{ContentsRenderer, SectionList, Tab, music_item::MusicCarouselShelf};
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]

View file

@ -1,13 +1,13 @@
use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, serde_as};
use crate::serializer::text::Text;
use super::ContentsRenderer;
use super::TextBox;
use super::{
music_item::{ItemSection, PlaylistPanelRenderer},
ContentRenderer,
music_item::{ItemSection, PlaylistPanelRenderer},
};
/// Response model for YouTube Music track details

View file

@ -4,9 +4,9 @@ use serde_with::{rust::deserialize_ignore_any, serde_as};
use crate::serializer::text::Text;
use super::{
ContentsRendererLogged, SectionList, Tab,
music_item::{ItemSection, SimpleHeader, SingleColumnBrowseResult},
url_endpoint::BrowseEndpointWrap,
ContentsRendererLogged, SectionList, Tab,
};
#[derive(Debug, Deserialize)]

View file

@ -1,25 +1,29 @@
#![allow(clippy::large_enum_variant)]
use double_ended_peekable::DoubleEndedPeekableExt;
use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, rust::deserialize_ignore_any, serde_as};
use crate::{
error::ExtractionError,
model::{
self, traits::FromYtItem, AlbumId, AlbumItem, AlbumType, ArtistId, ArtistItem, ChannelId,
MusicItem, MusicItemType, MusicPlaylistItem, TrackItem, UserItem,
self, AlbumId, AlbumItem, AlbumType, ArtistId, ArtistItem, ChannelId, MusicItem,
MusicItemType, MusicPlaylistItem, TrackItem, UserItem, traits::FromYtItem,
},
param::Language,
serializer::{
text::{Text, TextComponent, TextComponents},
MapResult,
text::{Text, TextComponent, TextComponents},
},
util::{self, dictionary, timeago},
};
use super::{
ContentsRenderer, ContinuationActionWrap, ContinuationEndpoint, MusicContinuationData,
SimpleHeaderRenderer, Thumbnails, ThumbnailsWrap,
url_endpoint::{
BrowseEndpointWrap, MusicPage, MusicPageType, MusicVideoType, NavigationEndpoint, PageType,
},
ContentsRenderer, ContinuationActionWrap, ContinuationEndpoint, MusicContinuationData,
SimpleHeaderRenderer, Thumbnails, ThumbnailsWrap,
};
#[cfg(feature = "userdata")]
@ -88,7 +92,6 @@ pub(crate) struct MusicCardShelf {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(clippy::enum_variant_names)]
pub(crate) enum MusicResponseItem {
MusicResponsiveListItemRenderer(ListMusicItem),
MusicTwoRowItemRenderer(CoverMusicItem),
@ -264,7 +267,7 @@ pub(crate) enum PlaylistPanelVideo {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct QueueMusicItem {
pub video_id: String,
pub video_id: Option<String>,
#[serde_as(as = "Text")]
pub title: String,
#[serde_as(as = "Option<Text>")]
@ -279,6 +282,8 @@ pub(crate) struct QueueMusicItem {
#[serde(default)]
pub thumbnail: Thumbnails,
pub menu: Option<MusicItemMenu>,
/// Alternative source for Video ID
pub navigation_endpoint: Option<NavigationEndpoint>,
}
#[derive(Default, Debug, Deserialize)]
@ -345,7 +350,6 @@ pub(crate) struct MusicContinuation {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(clippy::enum_variant_names)]
pub(crate) enum ContinuationContents {
#[serde(alias = "musicPlaylistShelfContinuation")]
MusicShelfContinuation(MusicShelf),
@ -561,10 +565,10 @@ impl MusicListMapper {
let mut etype = None;
self.warnings.append(&mut res.warnings);
res.c.into_iter().for_each(|item| {
if let Some(et) = self.add_response_item(item) {
if etype.is_none() {
etype = Some(et);
}
if let Some(et) = self.add_response_item(item)
&& etype.is_none()
{
etype = Some(et);
}
});
etype
@ -658,12 +662,14 @@ impl MusicListMapper {
..Default::default()
}
} else {
let mut subtitle_parts = c2
let subtitle_parts = c2
.ok_or_else(|| format!("track {id}: could not get subtitle"))?
.renderer
.text
.split(util::DOT_SEPARATOR)
.into_iter();
let subtitle_parts_len = subtitle_parts.len();
let mut subtitle_parts = subtitle_parts.double_ended_peekable();
// Is this a related video?
if item.item_height == ItemHeight::Compact {
@ -692,8 +698,17 @@ impl MusicListMapper {
}
} else {
// Skip first part (track type)
if subtitle_parts.len() > 3
|| (vtype == MusicVideoType::Video && subtitle_parts.len() == 2)
// Track (main search): Track type * Artists * View count
// Track (main search featured): {Track type * Artists * Duration}, {View count}
// Track (dedicated): {Artists * Album * Duration}, {View count}
// Video: [Track type] * Artists * View count * (Duration)
// If last part is not duration, remove first part (from main search)
if subtitle_parts_len > 3
|| !subtitle_parts.peek_back().is_some_and(|p| {
util::parse_video_length(p.first_str()).is_some()
})
{
subtitle_parts.next();
}
@ -767,20 +782,19 @@ impl MusicListMapper {
// This is used for extracting artist pages.
// On some albums, the artist name of the tracks is not given but different
// from the album artist. In this case dont copy the album artist.
if let Some((fb_artists, _)) = &self.artists {
if artists.is_empty()
&& (self.artist_page
|| artist_id.is_none()
|| fb_artists.iter().any(|fb_id| {
fb_id
.id
.as_deref()
.map(|aid| artist_id.as_deref() == Some(aid))
.unwrap_or_default()
}))
{
artists.clone_from(fb_artists);
}
if let Some((fb_artists, _)) = &self.artists
&& artists.is_empty()
&& (self.artist_page
|| artist_id.is_none()
|| fb_artists.iter().any(|fb_id| {
fb_id
.id
.as_deref()
.map(|aid| artist_id.as_deref() == Some(aid))
.unwrap_or_default()
}))
{
artists.clone_from(fb_artists);
}
let track_nr = item.index.and_then(|txt| util::parse_numeric(&txt).ok());
@ -852,10 +866,10 @@ impl MusicListMapper {
// Album artist links may be invisible on the search page, so
// fall back to menu data
if let Some(a1) = artists.first_mut() {
if a1.id.is_none() {
a1.id.clone_from(&artist_id);
}
if let Some(a1) = artists.first_mut()
&& a1.id.is_none()
{
a1.id.clone_from(&artist_id);
}
let year =
@ -1054,7 +1068,7 @@ impl MusicListMapper {
let from_ytm = subtitle_p2
.as_ref()
.and_then(|p| p.0.first())
.map_or(true, util::is_ytm);
.is_none_or(util::is_ytm);
let channel = subtitle_p2
.and_then(|p| p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()));
@ -1190,7 +1204,7 @@ impl MusicListMapper {
let from_ytm = subtitle_p2
.as_ref()
.and_then(|p| p.0.first())
.map_or(true, util::is_ytm);
.is_none_or(util::is_ytm);
let channel = subtitle_p2
.and_then(|p| p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()));
let track_count =
@ -1248,6 +1262,20 @@ impl MusicListMapper {
}
}
pub fn add_list_item(&mut self, item: ListMusicItem) -> Option<MusicItemType> {
match self.map_list_item(item) {
Ok(et) => et,
Err(e) => {
self.warnings.push(e);
None
}
}
}
pub fn add_warning(&mut self, warning: String) {
self.warnings.push(warning);
}
pub fn add_warnings(&mut self, warnings: &mut Vec<String>) {
self.warnings.append(warnings);
}
@ -1395,23 +1423,45 @@ pub(crate) fn map_album_type(txt: &str, lang: Language) -> AlbumType {
.unwrap_or_default()
}
pub(crate) fn map_queue_item(item: QueueMusicItem, lang: Language) -> MapResult<TrackItem> {
pub(crate) fn map_queue_item(
item: QueueMusicItem,
lang: Language,
) -> Result<MapResult<TrackItem>, ExtractionError> {
let mut warnings = Vec::new();
let mut subtitle_parts = item.long_byline_text.split(util::DOT_SEPARATOR).into_iter();
let is_video = !item
.thumbnail
.thumbnails
.first()
.map(|tn| tn.height == tn.width)
.unwrap_or_default();
let nav_wep = item.navigation_endpoint.and_then(|itm| {
if let NavigationEndpoint::Watch { watch_endpoint } = itm {
Some(watch_endpoint)
} else {
None
}
});
let mv_type = nav_wep
.as_ref()
.map(|wep| {
wep.watch_endpoint_music_supported_configs
.watch_endpoint_music_config
.music_video_type
})
.unwrap_or_else(|| {
MusicVideoType::from_is_video(
!item
.thumbnail
.thumbnails
.first()
.map(|tn| tn.height == tn.width)
.unwrap_or_default(),
)
});
let artist_p = subtitle_parts.next();
let (artists, by_va) = map_artists(artist_p);
let artist_id = map_artist_id_fallback(item.menu, artists.first());
let subtitle_p2 = subtitle_parts.next();
let (album, view_count) = if is_video {
let (album, view_count) = if mv_type.is_video() {
(
None,
subtitle_p2
@ -1424,9 +1474,14 @@ pub(crate) fn map_queue_item(item: QueueMusicItem, lang: Language) -> MapResult<
)
};
MapResult {
let video_id = item
.video_id
.or(nav_wep.map(|wep| wep.video_id))
.ok_or(ExtractionError::InvalidData("missing video ID".into()))?;
Ok(MapResult {
c: TrackItem {
id: item.video_id,
id: video_id,
name: item.title,
duration: item
.length_text
@ -1436,13 +1491,13 @@ pub(crate) fn map_queue_item(item: QueueMusicItem, lang: Language) -> MapResult<
artist_id,
album,
view_count,
track_type: MusicVideoType::from_is_video(is_video).into(),
track_type: mv_type.into(),
track_nr: None,
by_va,
unavailable: false,
},
warnings,
}
})
}
#[cfg(test)]

View file

@ -1,8 +1,8 @@
use serde::Deserialize;
use super::{
music_item::{Grid, SingleColumnBrowseResult},
SectionList, Tab,
music_item::{Grid, SingleColumnBrowseResult},
};
#[derive(Debug, Deserialize)]

View file

@ -1,15 +1,17 @@
use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, serde_as};
use crate::serializer::text::{AttributedText, Text, TextComponents};
use crate::{
client::response::AvatarRendererContext,
serializer::text::{AttributedText, Text, TextComponents},
};
use super::{
ContentsRenderer, SectionList, Tab,
music_item::{
Button, ItemSection, MusicContentsRenderer, MusicItemMenuEntry, MusicMicroformat,
MusicThumbnailRenderer,
},
url_endpoint::OnTapWrap,
ContentsRenderer, SectionList, Tab,
};
/// Response model for YouTube Music playlists and albums
@ -153,11 +155,5 @@ pub(crate) struct AvatarStackViewModel {
// pub avatars: Vec<AvatarViewModel>,
#[serde_as(as = "AttributedText")]
pub text: String,
pub renderer_context: AvatarStackRendererContext,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext {
pub command_context: Option<OnTapWrap>,
pub renderer_context: AvatarRendererContext,
}

View file

@ -1,11 +1,11 @@
use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, VecSkipError};
use serde_with::{VecSkipError, rust::deserialize_ignore_any, serde_as};
use crate::serializer::text::Text;
use crate::serializer::{MapResult, text::Text};
use super::{
music_item::{ListMusicItem, MusicCardShelf, MusicShelf},
ContentsRenderer, SectionList, Tab,
music_item::{ListMusicItem, MusicCardShelf, MusicShelf},
};
/// Response model for YouTube Music search
@ -31,25 +31,26 @@ pub(crate) struct Contents {
pub tabbed_search_results_renderer: ContentsRenderer<Tab<SectionList<ItemSection>>>,
}
#[allow(clippy::enum_variant_names)]
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) enum ItemSection {
MusicShelfRenderer(MusicShelf),
MusicCardShelfRenderer(MusicCardShelf),
ItemSectionRenderer {
#[serde_as(as = "VecSkipError<_>")]
contents: Vec<ShowingResultsFor>,
contents: MapResult<Vec<ItemSectionRendererItem>>,
},
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ShowingResultsFor {
pub showing_results_for_renderer: ShowingResultsForRenderer,
pub(crate) enum ItemSectionRendererItem {
MusicResponsiveListItemRenderer(ListMusicItem),
ShowingResultsForRenderer(ShowingResultsForRenderer),
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}
#[serde_as]

View file

@ -5,7 +5,7 @@ use serde_with::serde_as;
use serde_with::{DefaultOnError, DisplayFromStr, VecSkipError};
use super::{Empty, ResponseContext, Thumbnails};
use crate::serializer::{text::Text, MapResult};
use crate::serializer::{MapResult, text::Text};
#[serde_as]
#[derive(Debug, Deserialize)]
@ -30,7 +30,10 @@ pub(crate) struct Player {
#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")]
pub(crate) enum PlayabilityStatus {
#[serde(rename_all = "camelCase")]
Ok { live_streamability: Option<Empty> },
Ok {
#[serde(default)]
live_streamability: LiveStreamability,
},
/// Video cant be played because of DRM / Geoblock
#[serde(rename_all = "camelCase")]
Unplayable {
@ -78,6 +81,20 @@ pub(crate) struct ErrorMessage {
pub subreason: String,
}
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct LiveStreamability {
pub live_streamability_renderer: LiveStreamabilityRenderer,
}
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct LiveStreamabilityRenderer {
pub broadcast_id: Option<String>,
#[serde(default)]
pub display_endscreen: bool,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
@ -92,6 +109,7 @@ pub(crate) struct StreamingData {
pub dash_manifest_url: Option<String>,
/// Only on livestreams
pub hls_manifest_url: Option<String>,
pub server_abr_streaming_url: Option<String>,
pub drm_params: Option<String>,
#[serde(default)]
#[serde_as(deserialize_as = "VecSkipError<_>")]
@ -109,8 +127,12 @@ pub(crate) struct Format {
pub format_type: FormatType,
pub mime_type: String,
#[serde_as(as = "Option<DisplayFromStr>")]
pub last_modified: Option<u64>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub content_length: Option<u64>,
pub bitrate: u32,
pub xtags: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
@ -122,9 +144,6 @@ pub(crate) struct Format {
#[serde_as(as = "Option<crate::serializer::Range>")]
pub init_range: Option<Range<u32>>,
#[serde_as(as = "Option<DisplayFromStr>")]
pub content_length: Option<u64>,
#[serde(default)]
#[serde_as(deserialize_as = "DefaultOnError")]
pub quality: Option<Quality>,
@ -141,6 +160,8 @@ pub(crate) struct Format {
pub audio_sample_rate: Option<u32>,
pub audio_channels: Option<u8>,
pub loudness_db: Option<f32>,
#[serde(default)]
pub is_drc: bool,
pub audio_track: Option<AudioTrack>,
pub signature_cipher: Option<String>,
@ -216,7 +237,6 @@ pub(crate) enum Primaries {
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(clippy::enum_variant_names)]
pub(crate) enum DrmTrackType {
DrmTrackTypeAudio,
DrmTrackTypeSd,
@ -294,9 +314,13 @@ pub(crate) struct StoryboardRenderer {
pub spec: String,
}
#[serde_as]
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct PlayerConfig {
#[serde(default)]
#[serde_as(deserialize_as = "DefaultOnError")]
pub media_common_config: Option<MediaCommonConfig>,
pub web_drm_config: Option<WebDrmConfig>,
}
@ -306,6 +330,18 @@ pub(crate) struct WebDrmConfig {
pub widevine_service_cert: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaCommonConfig {
pub media_ustreamer_request_config: UstreamerRequestConfig,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UstreamerRequestConfig {
pub video_playback_ustreamer_config: String,
}
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct HeartbeatParams {

View file

@ -1,12 +1,12 @@
use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, serde_as};
use crate::serializer::text::{AttributedText, Text, TextComponent, TextComponents};
use super::{
url_endpoint::OnTapWrap, video_item::YouTubeListRenderer, Alert, ContentRenderer,
ContentsRenderer, ImageView, PageHeaderRendererContent, PhMetadataView, ResponseContext,
SectionList, Tab, TextBox, ThumbnailsWrap, TwoColumnBrowseResults,
Alert, ContentRenderer, ContentsRenderer, ImageView, PageHeaderRendererContent, PhMetadataView,
ResponseContext, SectionList, Tab, TextBox, ThumbnailsWrap, TwoColumnBrowseResults,
url_endpoint::OnTapWrap, video_item::YouTubeListRenderer,
};
#[serde_as]
@ -24,14 +24,7 @@ pub(crate) struct Playlist {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ItemSection {
pub item_section_renderer: ContentsRenderer<PlaylistVideoListRenderer>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct PlaylistVideoListRenderer {
#[serde(alias = "richGridRenderer")]
pub playlist_video_list_renderer: YouTubeListRenderer,
pub item_section_renderer: YouTubeListRenderer,
}
#[derive(Debug, Deserialize)]

View file

@ -1,10 +1,10 @@
use serde::{
de::{IgnoredAny, Visitor},
Deserialize,
de::{IgnoredAny, Visitor},
};
use serde_with::{serde_as, DisplayFromStr};
use serde_with::{DisplayFromStr, serde_as};
use super::{video_item::YouTubeListRendererWrap, ResponseContext};
use super::{ResponseContext, video_item::YouTubeListRendererWrap};
#[serde_as]
#[derive(Debug, Deserialize)]

View file

@ -1,6 +1,6 @@
use serde::Deserialize;
use super::{video_item::YouTubeListRendererWrap, Tab, TwoColumnBrowseResults};
use super::{Tab, TwoColumnBrowseResults, video_item::YouTubeListRendererWrap};
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]

View file

@ -1,5 +1,5 @@
use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError};
use serde_with::{DefaultOnError, serde_as};
use crate::{
model::{TrackType, UrlTarget},
@ -191,11 +191,7 @@ impl MusicVideoType {
}
pub fn from_is_video(is_video: bool) -> Self {
if is_video {
Self::Video
} else {
Self::Track
}
if is_video { Self::Video } else { Self::Track }
}
}
@ -380,11 +376,11 @@ impl NavigationEndpoint {
} => Some(browse_endpoint.browse_id).filter(|_| {
browse_endpoint
.browse_endpoint_context_supported_configs
.map(|c| c.browse_endpoint_context_music_config.page_type == PageType::Playlist)
.unwrap_or_default()
.is_some_and(|c| {
c.browse_endpoint_context_music_config.page_type == PageType::Playlist
})
|| command_metadata
.map(|c| c.web_command_metadata.web_page_type == PageType::Playlist)
.unwrap_or_default()
.is_some_and(|c| c.web_command_metadata.web_page_type == PageType::Playlist)
}),
NavigationEndpoint::Url { .. } => None,
NavigationEndpoint::WatchPlaylist {
@ -393,4 +389,22 @@ impl NavigationEndpoint {
NavigationEndpoint::CreatePlaylist { .. } => None,
}
}
pub(crate) fn into_channel_id(self) -> Option<String> {
match self {
NavigationEndpoint::Browse {
browse_endpoint,
command_metadata,
} => Some(browse_endpoint.browse_id).filter(|_| {
browse_endpoint
.browse_endpoint_context_supported_configs
.is_some_and(|c| {
c.browse_endpoint_context_music_config.page_type == PageType::Channel
})
|| command_metadata
.is_some_and(|c| c.web_command_metadata.web_page_type == PageType::Channel)
}),
_ => None,
}
}
}

View file

@ -1,27 +1,31 @@
#![allow(clippy::enum_variant_names)]
use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError, rust::deserialize_ignore_any, serde_as};
use crate::serializer::{
text::{AccessibilityText, AttributedText, Text, TextComponent, TextComponents},
MapResult,
use crate::{
client::response::video_item::DialogNavigationEndpoint,
serializer::{
MapResult,
text::{AccessibilityText, AttributedText, Text, TextComponents},
},
};
use super::{
url_endpoint::BrowseEndpointWrap, ContinuationEndpoint, ContinuationItemRenderer, Icon,
MusicContinuationData, Thumbnails,
};
use super::{
ChannelBadge, ContentsRendererLogged, FrameworkUpdates, ImageView, ResponseContext,
YouTubeListItem,
};
use super::{
ContinuationEndpoint, ContinuationItemRenderer, Icon, MusicContinuationData, Thumbnails,
url_endpoint::BrowseEndpointWrap,
};
/*
#VIDEO DETAILS
*/
/// Video details response
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct VideoDetails {
@ -30,7 +34,8 @@ pub(crate) struct VideoDetails {
/// Video ID
pub current_video_endpoint: Option<CurrentVideoEndpoint>,
/// Video chapters + comment section
pub engagement_panels: MapResult<Vec<EngagementPanel>>,
#[serde_as(as = "VecSkipError<_>")]
pub engagement_panels: Vec<EngagementPanel>,
pub response_context: ResponseContext,
}
@ -224,8 +229,13 @@ pub(crate) struct VideoOwner {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct VideoOwnerRenderer {
pub title: TextComponent,
pub thumbnail: Thumbnails,
#[serde(alias = "attributedTitle")]
#[serde_as(as = "Text")]
pub title: String,
/// Channel avatar (single channel)
pub thumbnail: Option<Thumbnails>,
/// Channel avatar (featuring channels)
pub navigation_endpoint: DialogNavigationEndpoint,
#[serde_as(as = "Option<Text>")]
pub subscriber_count_text: Option<String>,
#[serde(default)]
@ -364,14 +374,6 @@ pub(crate) enum EngagementPanelRenderer {
/// Comment section (contains no comments, but the
/// continuation tokens for fetching top/latest comments)
EngagementPanelCommentsSection { header: CommentItemSectionHeader },
/// Ignored items:
/// - `engagement-panel-ads`
/// - `engagement-panel-structured-description`
/// (Description already included in `VideoSecondaryInfoRenderer`)
/// - `engagement-panel-searchable-transcript`
/// (basically video subtitles in a different format)
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}
/// Chapter markers
@ -430,6 +432,8 @@ pub(crate) struct CommentItemSectionHeader {
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CommentItemSectionHeaderRenderer {
#[serde_as(as = "Option<Text>")]
pub contextual_info: Option<String>,
pub menu: CommentItemSectionHeaderMenu,
}

View file

@ -1,18 +1,22 @@
use serde::Deserialize;
use serde_with::{
rust::deserialize_ignore_any, serde_as, DefaultOnError, DisplayFromStr, VecSkipError,
DefaultOnError, DisplayFromStr, VecSkipError, rust::deserialize_ignore_any, serde_as,
};
use time::OffsetDateTime;
use super::{ChannelBadge, ContentImage, ContinuationItemRenderer, PhMetadataView, Thumbnails};
use crate::{
model::{Channel, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem},
client::response::{
AvatarRendererContext, AvatarViewModel, ThumbnailViewModelWrap,
url_endpoint::BrowseEndpoint,
},
model::{Channel, ChannelItem, ChannelTag, PlaylistItem, Verification, VideoItem, YouTubeItem},
param::Language,
serializer::{
text::{AttributedText, Text, TextComponent},
MapResult,
text::{AttributedText, Text, TextComponent},
},
util::{self, timeago, TryRemove},
util::{self, DOT_SEPARATOR, TryRemove, timeago},
};
#[cfg(feature = "userdata")]
@ -25,7 +29,7 @@ use time::UtcOffset;
#[serde(rename_all = "camelCase")]
pub(crate) enum YouTubeListItem {
#[serde(alias = "gridVideoRenderer", alias = "compactVideoRenderer")]
VideoRenderer(VideoRenderer),
VideoRenderer(Box<VideoRenderer>),
ReelItemRenderer(ReelItemRenderer),
ShortsLockupViewModel(ShortsLockupViewModel),
PlaylistVideoRenderer(PlaylistVideoRenderer),
@ -39,6 +43,7 @@ pub(crate) enum YouTubeListItem {
/// Continuation items are located at the end of a list
/// and contain the continuation token for progressive loading
#[serde(alias = "continuationItemViewModel")]
ContinuationItemRenderer(ContinuationItemRenderer),
/// Corrected search query
@ -63,9 +68,17 @@ pub(crate) enum YouTubeListItem {
/// as of 11.10.2022
///
/// GridRenderer: contains videos on channel page
#[serde(alias = "expandedShelfContentsRenderer", alias = "gridRenderer")]
#[serde(
alias = "expandedShelfContentsRenderer",
alias = "gridRenderer",
alias = "verticalListRenderer",
alias = "gridShelfViewModel",
alias = "playlistVideoListRenderer"
)]
ItemSectionRenderer {
#[cfg(feature = "userdata")]
#[serde(default)]
#[serde_as(as = "DefaultOnError")]
header: Option<ItemSectionHeader>,
#[serde(alias = "items")]
contents: MapResult<Vec<YouTubeListItem>>,
@ -127,6 +140,7 @@ pub(crate) struct VideoRenderer {
pub detailed_metadata_snippets: Option<Vec<DetailedMetadataSnippet>>,
/// Release date for upcoming videos
pub upcoming_event_data: Option<UpcomingEventData>,
pub avatar: Option<LockupViewModelMetadataImage>,
}
/// Short video item
@ -152,7 +166,7 @@ pub(crate) struct ReelItemRenderer {
pub(crate) struct ShortsLockupViewModel {
/// `shorts-shelf-item-[video_id]`
pub entity_id: String,
pub thumbnail: Thumbnails,
pub thumbnail_view_model: ThumbnailViewModelWrap,
pub overlay_metadata: ShortsOverlayMetadata,
}
@ -183,7 +197,6 @@ pub(crate) struct LockupViewModel {
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(clippy::enum_variant_names)]
pub(crate) enum LockupContentType {
LockupContentTypePlaylist,
LockupContentTypeVideo,
@ -203,9 +216,106 @@ pub(crate) struct LockupViewModelMetadata {
pub(crate) struct LockupViewModelMetadataInner {
#[serde_as(as = "AttributedText")]
pub title: String,
/// Channel avatar image with link to channel
pub image: Option<LockupViewModelMetadataImage>,
pub metadata: PhMetadataView,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) enum LockupViewModelMetadataImage {
/// Single channel avatar
#[serde(rename_all = "camelCase")]
DecoratedAvatarViewModel { avatar: AvatarViewModel },
/// Multiple avatars for featured channels
#[serde(rename_all = "camelCase")]
AvatarStackViewModel {
renderer_context: AvatarStackRendererContext,
},
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext {
pub command_context: AvatarStackRendererContext2,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext2 {
pub on_tap: AvatarStackRendererContext3,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext3 {
pub innertube_command: DialogNavigationEndpoint,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(crate) enum DialogNavigationEndpoint {
#[serde(rename_all = "camelCase")]
Browse { browse_endpoint: BrowseEndpoint },
#[serde(rename_all = "camelCase")]
ShowDialog {
show_dialog_command: ShowDialogCommand,
},
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ShowDialogCommand {
pub panel_loading_strategy: AvatarStackRendererContext6,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext6 {
pub inline_content: AvatarStackRendererContext7,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext7 {
pub dialog_view_model: AvatarStackRendererContext8,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext8 {
pub custom_content: AvatarStackRendererContext9,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext9 {
pub list_view_model: AvatarStackRendererContext10,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext10 {
pub list_items: Vec<AvatarStackRendererContext11>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackRendererContext11 {
pub list_item_view_model: ChannelDialogItem,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ChannelDialogItem {
pub title: AttributedText,
#[serde_as(as = "Text")]
pub subtitle: String,
pub renderer_context: AvatarRendererContext,
pub leading_accessory: AvatarViewModel,
}
/// Video displayed in a playlist
#[serde_as]
#[derive(Debug, Deserialize)]
@ -457,6 +567,66 @@ impl IsShort for Vec<TimeOverlay> {
}
}
impl ShowDialogCommand {
pub fn map(
self,
lang: Language,
warnings: &mut Vec<String>,
) -> Option<(ChannelTag, Vec<ChannelTag>)> {
let mut channel_items = self
.panel_loading_strategy
.inline_content
.dialog_view_model
.custom_content
.list_view_model
.list_items
.into_iter()
.filter_map(|itm| {
let itm = itm.list_item_view_model;
let id = if let Some(id) = itm
.renderer_context
.command_context
.and_then(|x| x.on_tap.innertube_command.into_channel_id())
.or_else(|| {
itm.title
.command_runs
.into_iter()
.find_map(|c| c.on_tap.innertube_command.into_channel_id())
}) {
id
} else {
warnings.push("could not parse featured channel: no ID".to_owned());
return None;
};
let subscriber_count =
if let Some((_vname, stxt)) = itm.subtitle.split_once(DOT_SEPARATOR) {
util::parse_large_numstr_or_warn(stxt, lang, warnings)
} else {
warnings.push(
"could not parse featured channel: could not split subtitle".to_owned(),
);
None
};
Some(ChannelTag {
id,
name: itm.title.content,
avatar: itm.leading_accessory.avatar_view_model.image.into(),
verification: itm
.title
.attachment_runs
.into_iter()
.next()
.map(Verification::from)
.unwrap_or_default(),
subscriber_count,
})
});
channel_items.next().map(|c| (c, channel_items.collect()))
}
}
/// Result of mapping a list of different YouTube enities
/// (videos, channels, playlists)
#[derive(Debug)]
@ -513,27 +683,59 @@ impl<T> YouTubeListMapper<T> {
.map(|ol| ol.thumbnail_overlay_time_status_renderer.text)
});
let channel_t = video
.channel
.and_then(|c| ChannelTag::try_from(c).ok())
.map(|mut c| {
c.avatar = video
.channel_thumbnail_supported_renderers
.map(|tn| tn.channel_thumbnail_with_link_renderer.thumbnail)
.or(video.channel_thumbnail)
.unwrap_or_default()
.into();
if !c.verification.verified() {
c.verification = video.owner_badges.into();
}
c
});
let (channel, channels_feat) = match video.avatar {
Some(LockupViewModelMetadataImage::DecoratedAvatarViewModel { avatar }) => {
let mut c = channel_t;
if let Some(c) = &mut c
&& c.avatar.is_empty()
{
c.avatar = avatar.avatar_view_model.image.into();
}
(c, Vec::new())
}
Some(LockupViewModelMetadataImage::AvatarStackViewModel { renderer_context }) => {
if let DialogNavigationEndpoint::ShowDialog {
show_dialog_command,
} = renderer_context.command_context.on_tap.innertube_command
{
if let Some((c, feat)) = show_dialog_command.map(self.lang, &mut self.warnings)
{
(Some(c), feat)
} else {
self.warnings
.push("no valid featured channel item".to_owned());
(None, Vec::new())
}
} else {
(None, Vec::new())
}
}
None => (channel_t, Vec::new()),
};
VideoItem {
id: video.video_id,
name: video.title,
duration: length_text.and_then(|txt| util::parse_video_length(&txt)),
thumbnail: video.thumbnail.into(),
channel: video
.channel
.and_then(|c| ChannelTag::try_from(c).ok())
.map(|mut c| {
c.avatar = video
.channel_thumbnail_supported_renderers
.map(|tn| tn.channel_thumbnail_with_link_renderer.thumbnail)
.or(video.channel_thumbnail)
.unwrap_or_default()
.into();
if !c.verification.verified() {
c.verification = video.owner_badges.into();
}
c
})
.or_else(|| self.channel.clone()),
channel: channel.or_else(|| self.channel.clone()),
channels_feat,
publish_date: video
.upcoming_event_data
.as_ref()
@ -573,6 +775,7 @@ impl<T> YouTubeListMapper<T> {
duration: None,
thumbnail: video.thumbnail.into(),
channel: self.channel.clone(),
channels_feat: Vec::new(),
publish_date: pub_date_txt.as_ref().and_then(|txt| {
timeago::parse_timeago_dt_or_warn(self.lang, txt, &mut self.warnings)
}),
@ -593,8 +796,9 @@ impl<T> YouTubeListMapper<T> {
id: video_id.to_owned(),
name: video.overlay_metadata.primary_text,
duration: None,
thumbnail: video.thumbnail.into(),
thumbnail: video.thumbnail_view_model.thumbnail_view_model.image.into(),
channel: self.channel.clone(),
channels_feat: Vec::new(),
publish_date: None,
publish_date_txt: None,
view_count: video.overlay_metadata.secondary_text.and_then(|txt| {
@ -653,6 +857,7 @@ impl<T> YouTubeListMapper<T> {
duration: video.length_seconds,
thumbnail: video.thumbnail.into(),
channel,
channels_feat: Vec::new(), // TODO: multi-channel
publish_date,
publish_date_txt,
view_count: view_count_txt.and_then(|txt| {
@ -731,26 +936,63 @@ impl<T> YouTubeListMapper<T> {
video_count: tn
.overlays
.first()
.and_then(|ol| {
ol.thumbnail_overlay_badge_view_model
.thumbnail_badges
.first()
})
.and_then(|ol| ol.thumbnail_bottom_overlay_view_model.badges.first())
.and_then(|badge| {
util::parse_numeric(&badge.thumbnail_badge_view_model.text).ok()
}),
}))
}
LockupContentType::LockupContentTypeVideo => {
// Metadata rows:
// Channel name
// 55M views * 1 month ago
let mut mdr = md
.metadata
.content_metadata_view_model
.metadata_rows
.into_iter();
let channel = mdr
.next()
.and_then(|r| r.metadata_parts.into_iter().next())
.and_then(|p| ChannelTag::try_from(p.into_text_component()).ok());
.into_iter()
.peekable();
let channel_t = if mdr.peek().is_some_and(|r1| r1.metadata_parts.len() == 1) {
mdr.next()
.and_then(|r| r.metadata_parts.into_iter().next())
.and_then(|p| ChannelTag::try_from(p.into_text_component()).ok())
} else {
None
};
let (channel, channels_feat) = match md.image {
Some(LockupViewModelMetadataImage::DecoratedAvatarViewModel {
avatar, ..
}) => channel_t
.map(|mut c| {
c.avatar = avatar.avatar_view_model.image.into();
(Some(c), Vec::new())
})
.unwrap_or_default(),
Some(LockupViewModelMetadataImage::AvatarStackViewModel {
renderer_context,
}) => {
if let DialogNavigationEndpoint::ShowDialog {
show_dialog_command,
} = renderer_context.command_context.on_tap.innertube_command
{
if let Some((c, feat)) =
show_dialog_command.map(self.lang, &mut self.warnings)
{
(Some(c), feat)
} else {
self.warnings
.push("no valid featured channel item".to_owned());
(None, Vec::new())
}
} else {
(None, Vec::new())
}
}
None => (channel_t, Vec::new()),
};
let (view_count, publish_date_txt) = mdr
.next()
.map(|metadata_row| {
@ -776,16 +1018,13 @@ impl<T> YouTubeListMapper<T> {
duration: tn
.overlays
.first()
.and_then(|ol| {
ol.thumbnail_overlay_badge_view_model
.thumbnail_badges
.first()
})
.and_then(|ol| ol.thumbnail_bottom_overlay_view_model.badges.first())
.and_then(|badge| {
util::parse_video_length(&badge.thumbnail_badge_view_model.text)
}),
thumbnail: tn.image.into(),
channel,
channels_feat,
publish_date: publish_date_txt.as_deref().and_then(|t| {
timeago::parse_timeago_dt_or_warn(self.lang, t, &mut self.warnings)
}),
@ -806,7 +1045,7 @@ impl YouTubeListMapper<YouTubeItem> {
fn map_item(&mut self, item: YouTubeListItem) {
match item {
YouTubeListItem::VideoRenderer(video) => {
let mapped = YouTubeItem::Video(self.map_video(video));
let mapped = YouTubeItem::Video(self.map_video(*video));
self.items.push(mapped);
}
YouTubeListItem::ShortsLockupViewModel(video) => {
@ -864,7 +1103,7 @@ impl YouTubeListMapper<VideoItem> {
fn map_item(&mut self, item: YouTubeListItem) {
match item {
YouTubeListItem::VideoRenderer(video) => {
let mapped = self.map_video(video);
let mapped = self.map_video(*video);
self.items.push(mapped);
}
YouTubeListItem::ReelItemRenderer(video) => {

View file

@ -5,14 +5,14 @@ use serde::Serialize;
use crate::{
error::{Error, ExtractionError},
model::{
SearchResult, YouTubeItem,
paginator::{ContinuationEndpoint, Paginator},
traits::FromYtItem,
SearchResult, YouTubeItem,
},
param::search_filter::SearchFilter,
};
use super::{response, ClientType, MapRespCtx, MapResponse, MapResult, RustyPipeQuery};
use super::{ClientType, MapRespCtx, MapResponse, MapResult, RustyPipeQuery, response};
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
@ -143,7 +143,7 @@ mod tests {
use rstest::rstest;
use crate::{
client::{response, MapRespCtx, MapResponse},
client::{MapRespCtx, MapResponse, response},
model::{SearchResult, YouTubeItem},
serializer::MapResult,
util::tests::TESTFILES,
@ -153,6 +153,7 @@ mod tests {
#[case::default("default")]
#[case::playlists("playlists")]
#[case::empty("empty")]
#[case::featuring("featuring")]
#[case::ab3_channel_handles("20221121_AB3_channel_handles")]
fn t_map_search(#[case] name: &str) {
let json_path = path!(*TESTFILES / "search" / format!("{name}.json"));

View file

@ -128,6 +128,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 1 year ago"),
view_count: Some(28847),
@ -169,6 +170,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(24182),
@ -210,6 +212,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(23565),
@ -251,6 +254,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(25015),
@ -292,6 +296,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(8752),
@ -333,6 +338,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(9189),
@ -374,6 +380,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(17241),
@ -415,6 +422,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(47171),
@ -456,6 +464,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(23998),
@ -497,6 +506,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(36880),
@ -538,6 +548,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(49061),
@ -579,6 +590,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(13210),
@ -620,6 +632,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(37927),
@ -661,6 +674,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 5 years ago"),
view_count: Some(18865),
@ -702,6 +716,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 5 years ago"),
view_count: Some(72807),
@ -743,6 +758,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 5 years ago"),
view_count: Some(61173),
@ -784,6 +800,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(13529),
@ -825,6 +842,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(6536),
@ -866,6 +884,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(14472),
@ -907,6 +926,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(21240),
@ -948,6 +968,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(30840),
@ -989,6 +1010,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(34258),
@ -1030,6 +1052,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(26864),
@ -1071,6 +1094,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 6 years ago"),
view_count: Some(10757),
@ -1112,6 +1136,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 7 years ago"),
view_count: Some(21599),
@ -1153,6 +1178,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 7 years ago"),
view_count: Some(23010),
@ -1194,6 +1220,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 7 years ago"),
view_count: Some(24056),
@ -1235,6 +1262,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 7 years ago"),
view_count: Some(41211),
@ -1276,6 +1304,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 8 years ago"),
view_count: Some(25316),
@ -1317,6 +1346,7 @@ Channel(
verification: verified,
subscriber_count: Some(884000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 8 years ago"),
view_count: Some(11747),

View file

@ -84,6 +84,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1300000),
@ -110,6 +111,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3000000),
@ -136,6 +138,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(6400000),
@ -162,6 +165,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(935000),
@ -188,6 +192,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3000000),
@ -214,6 +219,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3300000),
@ -240,6 +246,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1800000),
@ -266,6 +273,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2400000),
@ -292,6 +300,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3000000),
@ -318,6 +327,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1900000),
@ -344,6 +354,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3100000),
@ -370,6 +381,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2800000),
@ -396,6 +408,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2400000),
@ -422,6 +435,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(6700000),
@ -448,6 +462,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2900000),
@ -474,6 +489,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4700000),
@ -500,6 +516,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1500000),
@ -526,6 +543,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3700000),
@ -552,6 +570,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1600000),
@ -578,6 +597,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(982000),
@ -604,6 +624,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1700000),
@ -630,6 +651,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1400000),
@ -656,6 +678,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2200000),
@ -682,6 +705,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1500000),
@ -708,6 +732,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2500000),
@ -734,6 +759,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1700000),
@ -760,6 +786,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3600000),
@ -786,6 +813,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1500000),
@ -812,6 +840,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4100000),
@ -838,6 +867,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1600000),
@ -864,6 +894,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(980000),
@ -890,6 +921,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1600000),
@ -916,6 +948,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2600000),
@ -942,6 +975,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(9300000),
@ -968,6 +1002,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(529000),
@ -994,6 +1029,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -1020,6 +1056,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1500000),
@ -1046,6 +1083,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(5700000),
@ -1072,6 +1110,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2100000),
@ -1098,6 +1137,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3200000),
@ -1124,6 +1164,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4400000),
@ -1150,6 +1191,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -1176,6 +1218,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2700000),
@ -1202,6 +1245,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -1228,6 +1272,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(6600000),
@ -1254,6 +1299,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2700000),
@ -1280,6 +1326,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1800000),
@ -1306,6 +1353,7 @@ Channel(
verification: verified,
subscriber_count: Some(3360000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1600000),

View file

@ -84,6 +84,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(835000),
@ -110,6 +111,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(932000),
@ -136,6 +138,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -162,6 +165,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(906000),
@ -188,6 +192,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1300000),
@ -214,6 +219,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(409000),
@ -240,6 +246,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1000000),
@ -266,6 +273,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(895000),
@ -292,6 +300,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(696000),
@ -318,6 +327,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -344,6 +354,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2500000),
@ -370,6 +381,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1400000),
@ -396,6 +408,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1200000),
@ -422,6 +435,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1800000),
@ -448,6 +462,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(5400000),
@ -474,6 +489,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1700000),
@ -500,6 +516,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(780000),
@ -526,6 +543,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(961000),
@ -552,6 +570,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1000000),
@ -578,6 +597,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(835000),
@ -604,6 +624,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3900000),
@ -630,6 +651,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2100000),
@ -656,6 +678,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3100000),
@ -682,6 +705,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1300000),
@ -708,6 +732,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2300000),
@ -734,6 +759,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3700000),
@ -760,6 +786,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2900000),
@ -786,6 +813,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(5500000),
@ -812,6 +840,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(16000000),
@ -838,6 +867,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1500000),
@ -864,6 +894,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4100000),
@ -890,6 +921,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(7100000),
@ -916,6 +948,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2700000),
@ -942,6 +975,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3200000),
@ -968,6 +1002,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3600000),
@ -994,6 +1029,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2500000),
@ -1020,6 +1056,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4300000),
@ -1046,6 +1083,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4200000),
@ -1072,6 +1110,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3500000),
@ -1098,6 +1137,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(11000000),
@ -1124,6 +1164,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(3400000),
@ -1150,6 +1191,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(5300000),
@ -1176,6 +1218,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1800000),
@ -1202,6 +1245,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4800000),
@ -1228,6 +1272,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1900000),
@ -1254,6 +1299,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1100000),
@ -1280,6 +1326,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1900000),
@ -1306,6 +1353,7 @@ Channel(
verification: verified,
subscriber_count: Some(3740000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(1600000),

View file

@ -99,6 +99,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 hours ago"),
view_count: Some(142423),
@ -140,6 +141,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 days ago"),
view_count: Some(989763),
@ -181,6 +183,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(355470),
@ -222,6 +225,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(697188),
@ -263,6 +267,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 weeks ago"),
view_count: Some(529586),
@ -304,6 +309,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(1066729),
@ -345,6 +351,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(525663),
@ -386,6 +393,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(717806),
@ -427,6 +435,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(624673),
@ -468,6 +477,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(924135),
@ -509,6 +519,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(1053353),
@ -550,6 +561,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(697242),
@ -591,6 +603,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1086097),
@ -632,6 +645,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(528979),
@ -673,6 +687,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1036890),
@ -714,6 +729,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(832542),
@ -755,6 +771,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1342882),
@ -796,6 +813,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1076848),
@ -837,6 +855,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(562349),
@ -878,6 +897,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(531938),
@ -919,6 +939,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(426469),
@ -960,6 +981,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(448915),
@ -1001,6 +1023,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(675443),
@ -1042,6 +1065,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(426465),
@ -1083,6 +1107,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(1137831),
@ -1124,6 +1149,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(612275),
@ -1165,6 +1191,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(396397),
@ -1206,6 +1233,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(599030),
@ -1247,6 +1275,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(530192),
@ -1288,6 +1317,7 @@ Channel(
verification: verified,
subscriber_count: Some(2930000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(567604),

View file

@ -128,6 +128,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 day ago"),
view_count: Some(8813),
@ -169,6 +170,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 days ago"),
view_count: Some(48599),
@ -210,6 +212,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 days ago"),
view_count: Some(74126),
@ -251,6 +254,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 days ago"),
view_count: Some(36129),
@ -292,6 +296,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(87357),
@ -333,6 +338,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(48259),
@ -374,6 +380,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(27509),
@ -415,6 +422,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(57925),
@ -456,6 +464,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(77907),
@ -497,6 +506,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(63421),
@ -538,6 +548,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(73052),
@ -579,6 +590,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(93529),
@ -620,6 +632,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(41569),
@ -661,6 +674,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(22842),
@ -702,6 +716,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(41621),
@ -743,6 +758,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(77542),
@ -784,6 +800,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(34947),
@ -825,6 +842,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(45618),
@ -866,6 +884,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(34868),
@ -907,6 +926,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(64336),
@ -948,6 +968,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(150958),
@ -989,6 +1010,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(30903),
@ -1030,6 +1052,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(48669),
@ -1071,6 +1094,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(83505),
@ -1112,6 +1136,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(42843),
@ -1153,6 +1178,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(26036),
@ -1194,6 +1220,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(63729),
@ -1235,6 +1262,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(22920),
@ -1276,6 +1304,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(66042),
@ -1317,6 +1346,7 @@ Channel(
verification: verified,
subscriber_count: Some(883000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(52065),

View file

@ -73,6 +73,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(18243),
@ -114,6 +115,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(22085),
@ -155,6 +157,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(12816),
@ -196,6 +199,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(5648),
@ -237,6 +241,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(21741),
@ -278,6 +283,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(8090),
@ -319,6 +325,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(19118),
@ -360,6 +367,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(13697),
@ -401,6 +409,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(293675),
@ -442,6 +451,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 hours ago"),
view_count: Some(230150),
@ -483,6 +493,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 days ago"),
view_count: Some(19046),
@ -524,6 +535,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 days ago"),
view_count: Some(487186),
@ -565,6 +577,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 weeks ago"),
view_count: Some(8763),
@ -606,6 +619,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(712644),
@ -647,6 +661,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(6701),
@ -688,6 +703,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(7898),
@ -729,6 +745,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(8503),
@ -770,6 +787,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(2155),
@ -811,6 +829,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(3050),
@ -852,6 +871,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(16468),
@ -893,6 +913,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(91744),
@ -934,6 +955,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(3921),
@ -975,6 +997,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(2924),
@ -1016,6 +1039,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(36043),
@ -1057,6 +1081,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(966),
@ -1098,6 +1123,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(6601),
@ -1139,6 +1165,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(39401),
@ -1180,6 +1207,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(2111),
@ -1221,6 +1249,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(6124),
@ -1262,6 +1291,7 @@ Channel(
verification: verified,
subscriber_count: Some(2710000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(2944),

View file

@ -128,6 +128,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 days ago"),
view_count: Some(27799),
@ -169,6 +170,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(34723),
@ -210,6 +212,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(60589),
@ -251,6 +254,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(48158),
@ -292,6 +296,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 weeks ago"),
view_count: Some(23312),
@ -333,6 +338,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(70912),
@ -374,6 +380,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(45396),
@ -415,6 +422,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(54864),
@ -456,6 +464,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(145453),
@ -497,6 +506,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(37347),
@ -538,6 +548,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(145315),
@ -579,6 +590,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(73277),
@ -620,6 +632,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(24722),
@ -661,6 +674,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(51408),
@ -702,6 +716,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(48969),
@ -743,6 +758,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(49405),
@ -784,6 +800,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(24160),
@ -825,6 +842,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(56586),
@ -866,6 +884,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(21250),
@ -907,6 +926,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(23126),
@ -948,6 +968,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(42940),
@ -989,6 +1010,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(48996),
@ -1030,6 +1052,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(49899),
@ -1071,6 +1094,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(24076),
@ -1112,6 +1136,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(149964),
@ -1153,6 +1178,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(52290),
@ -1194,6 +1220,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(29462),
@ -1235,6 +1262,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(116169),
@ -1276,6 +1304,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(40487),
@ -1317,6 +1346,7 @@ Channel(
verification: verified,
subscriber_count: Some(933000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(17237),

View file

@ -128,6 +128,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("20 hours ago"),
view_count: Some(19739),
@ -169,6 +170,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 days ago"),
view_count: Some(24194),
@ -210,6 +212,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 days ago"),
view_count: Some(51443),
@ -251,6 +254,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 days ago"),
view_count: Some(72324),
@ -292,6 +296,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(57348),
@ -333,6 +338,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(68645),
@ -374,6 +380,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(91388),
@ -415,6 +422,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(39993),
@ -456,6 +464,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 weeks ago"),
view_count: Some(22512),
@ -497,6 +506,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(40137),
@ -538,6 +548,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(74510),
@ -579,6 +590,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(34487),
@ -620,6 +632,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(44928),
@ -661,6 +674,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(34324),
@ -702,6 +716,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(63763),
@ -743,6 +758,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(149186),
@ -784,6 +800,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(30130),
@ -825,6 +842,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(48037),
@ -866,6 +884,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(81958),
@ -907,6 +926,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(42635),
@ -948,6 +968,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(25860),
@ -989,6 +1010,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(63035),
@ -1030,6 +1052,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(22731),
@ -1071,6 +1094,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(65765),
@ -1112,6 +1136,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(51555),
@ -1153,6 +1178,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(46638),
@ -1194,6 +1220,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(62921),
@ -1235,6 +1262,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(66895),
@ -1276,6 +1304,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(25894),
@ -1317,6 +1346,7 @@ Channel(
verification: verified,
subscriber_count: Some(880000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(80173),

View file

@ -112,6 +112,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(94),
@ -153,6 +154,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(381),
@ -194,6 +196,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(241528),
@ -235,6 +238,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(118351),
@ -276,6 +280,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(157971),
@ -317,6 +322,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(82309),
@ -358,6 +364,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(2043),
@ -399,6 +406,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(186475),
@ -440,6 +448,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(66425),
@ -481,6 +490,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(1520020),
@ -522,6 +532,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(37549),
@ -563,6 +574,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(33002),
@ -604,6 +616,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(42036),
@ -645,6 +658,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(322935),
@ -686,6 +700,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(91980),
@ -727,6 +742,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4030),
@ -768,6 +784,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(288098),
@ -809,6 +826,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(50818),
@ -850,6 +868,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(98431),
@ -891,6 +910,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(572456),
@ -932,6 +952,7 @@ Channel(
verification: verified,
subscriber_count: Some(760000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(3114909),

View file

@ -84,6 +84,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 day ago"),
view_count: Some(443549),
@ -110,6 +111,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 days ago"),
view_count: Some(1154962),
@ -151,6 +153,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 days ago"),
view_count: Some(477460),
@ -177,6 +180,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 days ago"),
view_count: Some(1388173),
@ -203,6 +207,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 days ago"),
view_count: Some(1738301),
@ -229,6 +234,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 days ago"),
view_count: Some(1316594),
@ -270,6 +276,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 days ago"),
view_count: Some(478703),
@ -296,6 +303,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 days ago"),
view_count: Some(1412213),
@ -322,6 +330,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 days ago"),
view_count: Some(1513305),
@ -348,6 +357,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(8936223),
@ -389,6 +399,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(987083),
@ -415,6 +426,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(2769717),
@ -456,6 +468,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(497660),
@ -482,6 +495,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(572107),
@ -508,6 +522,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(1707132),
@ -534,6 +549,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(933094),
@ -560,6 +576,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(5985184),
@ -586,6 +603,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(14741387),
@ -612,6 +630,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(2511322),
@ -638,6 +657,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(2364408),
@ -679,6 +699,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(706059),
@ -705,6 +726,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(1947627),
@ -731,6 +753,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(4763839),
@ -757,6 +780,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(1915695),
@ -783,6 +807,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(7268944),
@ -809,6 +834,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(2539103),
@ -835,6 +861,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(5545680),
@ -861,6 +888,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(2202314),
@ -902,6 +930,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(613416),
@ -928,6 +957,7 @@ Channel(
verification: verified,
subscriber_count: Some(2840000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(6443699),

View file

@ -116,6 +116,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: Some("2022-09-27T16:00:00Z"),
publish_date_txt: None,
view_count: Some(237),
@ -157,6 +158,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 days ago"),
view_count: Some(742284),
@ -198,6 +200,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(420368),
@ -239,6 +242,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(528718),
@ -280,6 +284,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(897237),
@ -321,6 +326,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(526638),
@ -362,6 +368,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(368801),
@ -403,6 +410,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(286737),
@ -444,6 +452,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(664499),
@ -485,6 +494,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(592227),
@ -526,6 +536,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(396946),
@ -567,6 +578,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(778430),
@ -608,6 +620,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(2118499),
@ -649,6 +662,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(525824),
@ -690,6 +704,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(1097056),
@ -731,6 +746,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1532114),
@ -772,6 +788,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(511601),
@ -813,6 +830,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(662099),
@ -854,6 +872,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(549826),
@ -895,6 +914,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(538197),
@ -936,6 +956,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(536648),
@ -977,6 +998,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(724630),
@ -1018,6 +1040,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(426960),
@ -1059,6 +1082,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(735941),
@ -1100,6 +1124,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(502205),
@ -1141,6 +1166,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(718668),
@ -1182,6 +1208,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(775830),
@ -1223,6 +1250,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(480357),
@ -1264,6 +1292,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(460878),
@ -1305,6 +1334,7 @@ Channel(
verification: verified,
subscriber_count: Some(947000),
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(228151),

View file

@ -32,7 +32,25 @@ MusicArtist(
height: 1200,
),
],
description: Some("Edward Christopher Sheeran MBE is an English singer-songwriter. Born in Halifax, West Yorkshire, and raised in Framlingham, Suffolk, he began writing songs around the age of eleven. In early 2011, Sheeran independently released the extended play No. 5 Collaborations Project. He signed with Asylum Records the same year.\nSheeran\'s debut album, +, was released in September 2011 and topped the UK Albums Chart. It contained his first hit single \"The A Team\". In 2012, Sheeran won the Brit Awards for Best British Male Solo Artist and British Breakthrough Act. Sheeran\'s second studio album, ×, topped charts around the world upon its release in June 2014. It was named the second-best-selling album worldwide of 2015. In the same year, × won Album of the Year at the 2015 Brit Awards, and he received the Ivor Novello Award for Songwriter of the Year from the British Academy of Songwriters, Composers and Authors. A single from ×, \"Thinking Out Loud\", earned him the 2016 Grammy Awards for Song of the Year and Best Pop Solo Performance.\nSheeran\'s third album, ÷, was released in March 2017, and was the best-selling album worldwide of 2017.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Ed_Sheeran) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"),
description: Some(RichText([
Text(
text: "Edward Christopher Sheeran is an English singer-songwriter and musician. Born in Halifax, West Yorkshire, and raised in Framlingham, Suffolk, he began writing songs around the age of eleven. In early 2011, Sheeran independently released the extended play No. 5 Collaborations Project. He signed with Asylum Records the same year.\nSheeran\'s debut album, +, was released on 9 September 2011 and topped the UK Albums Chart. It contained his first hit single, \"The A Team\". In 2012, Sheeran won the Brit Awards for Best British Male Solo Artist and British Breakthrough Act. Sheeran\'s second studio album, ×, topped charts around the world upon its release in June 2014. It was named the second-best-selling album worldwide of 2015. In the same year, × won Album of the Year at the 2015 Brit Awards, and he received the Ivor Novello Award for Songwriter of the Year from the British Academy of Songwriters, Composers and Authors. A single from ×, \"Thinking Out Loud\", earned him the 2016 Grammy Awards for Song of the Year and Best Pop Solo Performance.\nSheeran\'s third album, ÷, was released in March 2017 and was the best-selling album worldwide of 2017.\n\nFrom Wikipedia (",
),
Web(
text: "https://en.wikipedia.org/wiki/Ed_Sheeran",
url: "https://en.wikipedia.org/wiki/Ed_Sheeran",
),
Text(
text: ") under Creative Commons Attribution CC-BY-SA 3.0 (",
),
Web(
text: "http://creativecommons.org/licenses/b...",
url: "http://creativecommons.org/licenses/by-sa/3.0/legalcode",
),
Text(
text: ")",
),
])),
wikipedia_url: Some("https://en.wikipedia.org/wiki/Ed_Sheeran"),
subscriber_count: Some(55300000),
tracks: [

View file

@ -32,7 +32,25 @@ MusicArtist(
height: 1200,
),
],
description: Some("Edward Christopher Sheeran MBE is an English singer-songwriter. Born in Halifax, West Yorkshire, and raised in Framlingham, Suffolk, he began writing songs around the age of eleven. In early 2011, Sheeran independently released the extended play No. 5 Collaborations Project. He signed with Asylum Records the same year.\nSheeran\'s debut album, +, was released in September 2011 and topped the UK Albums Chart. It contained his first hit single \"The A Team\". In 2012, Sheeran won the Brit Awards for Best British Male Solo Artist and British Breakthrough Act. Sheeran\'s second studio album, ×, topped charts around the world upon its release in June 2014. It was named the second-best-selling album worldwide of 2015. In the same year, × won Album of the Year at the 2015 Brit Awards, and he received the Ivor Novello Award for Songwriter of the Year from the British Academy of Songwriters, Composers and Authors. A single from ×, \"Thinking Out Loud\", earned him the 2016 Grammy Awards for Song of the Year and Best Pop Solo Performance.\nSheeran\'s third album, ÷, was released in March 2017, and was the best-selling album worldwide of 2017.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Ed_Sheeran) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"),
description: Some(RichText([
Text(
text: "Edward Christopher Sheeran is an English singer-songwriter and musician. Born in Halifax, West Yorkshire, and raised in Framlingham, Suffolk, he began writing songs around the age of eleven. In early 2011, Sheeran independently released the extended play No. 5 Collaborations Project. He signed with Asylum Records the same year.\nSheeran\'s debut album, +, was released on 9 September 2011 and topped the UK Albums Chart. It contained his first hit single, \"The A Team\". In 2012, Sheeran won the Brit Awards for Best British Male Solo Artist and British Breakthrough Act. Sheeran\'s second studio album, ×, topped charts around the world upon its release in June 2014. It was named the second-best-selling album worldwide of 2015. In the same year, × won Album of the Year at the 2015 Brit Awards, and he received the Ivor Novello Award for Songwriter of the Year from the British Academy of Songwriters, Composers and Authors. A single from ×, \"Thinking Out Loud\", earned him the 2016 Grammy Awards for Song of the Year and Best Pop Solo Performance.\nSheeran\'s third album, ÷, was released in March 2017 and was the best-selling album worldwide of 2017.\n\nFrom Wikipedia (",
),
Web(
text: "https://en.wikipedia.org/wiki/Ed_Sheeran",
url: "https://en.wikipedia.org/wiki/Ed_Sheeran",
),
Text(
text: ") under Creative Commons Attribution CC-BY-SA 3.0 (",
),
Web(
text: "http://creativecommons.org/licenses/b...",
url: "http://creativecommons.org/licenses/by-sa/3.0/legalcode",
),
Text(
text: ")",
),
])),
wikipedia_url: Some("https://en.wikipedia.org/wiki/Ed_Sheeran"),
subscriber_count: Some(55300000),
tracks: [

View file

@ -32,7 +32,12 @@ MusicArtist(
height: 1200,
),
],
description: Some("ImagineDragons.lnk.to/Mercury"),
description: Some(RichText([
Web(
text: "https://imaginedragons.lnk.to/EyesClosed",
url: "https://imaginedragons.lnk.to/EyesClosed",
),
])),
wikipedia_url: None,
subscriber_count: Some(30400000),
tracks: [

View file

@ -32,7 +32,25 @@ MusicArtist(
height: 1200,
),
],
description: Some("Choi Jin-ri, better known by her stage name Sulli, was a South Korean actress and singer. She first made her debut as a child actress, appearing as a supporting cast member on the SBS historical drama Ballad of Seodong. Following this, she earned a number of guest roles, appearing in the television series Love Needs a Miracle and Drama City, and the film Vacation. She then subsequently appeared in the independent films Punch Lady and BA:BO, the former being her first time cast in a substantial dramatic role.\nAfter signing a record deal with SM Entertainment, Sulli rose to prominence as a member of the girl group f(x) formed in 2009. The group achieved both critical and commercial success, with four Korean number-one singles and international recognition after becoming the first K-pop act to perform at SXSW. Concurrently with her music career, Sulli returned to acting by starring in the SBS romantic comedy series, To the Beautiful You, a Korean adaptation of the shōjo manga Hana-Kimi where her performance was positively received and earned her two SBS Drama Awards and a nomination at the 49th Paeksang Arts Awards.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Sulli) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"),
description: Some(RichText([
Text(
text: "Choi Jin-ri, known professionally as Sulli, was a South Korean singer and actress. She first made her debut as a child actress, appearing as a supporting cast member on the SBS historical drama Ballad of Seodong. Following this, she earned a number of guest roles, appearing in the television series Love Needs a Miracle and Drama City, and the film Vacation. She then subsequently appeared in the independent films Punch Lady and BA:BO, the former being her first time cast in a substantial dramatic role.\nAfter signing a record deal with SM Entertainment, Sulli rose to prominence as a member of the girl group f(x) formed in 2009. The group achieved both critical and commercial success, with four Korean number-one singles and international recognition after becoming the first K-pop act to perform at SXSW. Concurrently with her music career, Sulli returned to acting by starring in the SBS romantic comedy series, To the Beautiful You, a Korean adaptation of the shōjo manga Hana-Kimi where her performance was positively received and earned her two SBS Drama Awards and a nomination at the 49th Paeksang Arts Awards.\n\nFrom Wikipedia (",
),
Web(
text: "https://en.wikipedia.org/wiki/Sulli",
url: "https://en.wikipedia.org/wiki/Sulli",
),
Text(
text: ") under Creative Commons Attribution CC-BY-SA 3.0 (",
),
Web(
text: "http://creativecommons.org/licenses/b...",
url: "http://creativecommons.org/licenses/by-sa/3.0/legalcode",
),
Text(
text: ")",
),
])),
wikipedia_url: Some("https://en.wikipedia.org/wiki/Sulli"),
subscriber_count: Some(80800),
tracks: [

View file

@ -0,0 +1,43 @@
---
source: src/client/music_details.rs
expression: map_res.c
---
TrackDetails(
track: TrackItem(
id: "ZeerrnuLi5E",
name: "Black Mamba",
duration: Some(230),
cover: [
Thumbnail(
url: "https://i.ytimg.com/vi/ZeerrnuLi5E/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3maNxpYzTFmXZBd8s1w1iE6rTBDaw",
width: 400,
height: 225,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ZeerrnuLi5E/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k5q17nduJ8-t3h9_obEVMVi8Cz3A",
width: 800,
height: 450,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ZeerrnuLi5E/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k7CsaxHObhW1JXPtGyKE1fgSGZ3Q",
width: 853,
height: 480,
),
],
artists: [
ArtistId(
id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"),
name: "aespa",
),
],
artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"),
album: None,
view_count: Some(290000000),
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
),
lyrics_id: Some("MPLYt_wrKjTn9hmry"),
related_id: Some("MPTRt_wrKjTn9hmry"),
)

View file

@ -0,0 +1,815 @@
---
source: src/client/music_search.rs
expression: map_res.c
---
MusicSearchResult(
items: Paginator(
count: Some(30),
items: [
Artist(ArtistItem(
id: "UCPC0L1d253x-KuMNwa05TpA",
name: "Taylor Swift",
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/RCpTA6EXJQyjVFDosWOKa2SMmqkua_lA9mHPDWWciLwgqpZLz-k8rXWRF_367trrQ7up9BUwCbk6kRk=w60-h60-p-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/RCpTA6EXJQyjVFDosWOKa2SMmqkua_lA9mHPDWWciLwgqpZLz-k8rXWRF_367trrQ7up9BUwCbk6kRk=w120-h120-p-l90-rj",
width: 120,
height: 120,
),
],
subscriber_count: Some(375000000),
)),
Track(TrackItem(
id: "7nVctvQVz0U",
name: "The Fate of Ophelia",
duration: Some(227),
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: None,
name: "Song",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(650000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "Qc0sEMYv620",
name: "Out Of The Woods (Taylor\'s Version)",
duration: Some(236),
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/gj8tAERbPzlAoLI6knG2Yv1JiB9kv_pFwckfFHWUS6RcnQonszeMyxTdDEdOxCRNFmMezvwEBeRPwNSy3Q=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/gj8tAERbPzlAoLI6knG2Yv1JiB9kv_pFwckfFHWUS6RcnQonszeMyxTdDEdOxCRNFmMezvwEBeRPwNSy3Q=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: None,
name: "Song",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(30000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "DDIcJUf3Al4",
name: "Starlight",
duration: Some(221),
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/4DDgDnCVMgPB8TBvd26Yt4gEvBN8zymEdEBnfRzjleANB6PdEe8ZcNWn_-sXMyAJ5_2egN8wYXOHf4F-=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/4DDgDnCVMgPB8TBvd26Yt4gEvBN8zymEdEBnfRzjleANB6PdEe8ZcNWn_-sXMyAJ5_2egN8wYXOHf4F-=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: None,
name: "Song",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(10000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Album(AlbumItem(
id: "MPREb_p6BGcsuOpGt",
name: "The Life of a Showgirl",
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/ZpWD37EEQE_LVuQ_O03cRmz5mZA7jG0gKGLt-49uHNDX6DycysijGGSOX9woU-OfQR5jyahz3aEdmBmm3A=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album_type: album,
year: Some(2025),
by_va: false,
)),
Playlist(MusicPlaylistItem(
id: "RDCLAK5uy_mzXJjbWkgn116YtozMdS4kAgaPhjIWqBg",
name: "Taylor Swift Eras Setlist",
thumbnail: [
Thumbnail(
url: "https://yt3.googleusercontent.com/A59BQG7X0v_lyJqDjqhq0G83r_Lck-7puOITTfhKc-khapWkrtOBNLwvp_fLy34e960OLIRyJ5zPEfw=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/A59BQG7X0v_lyJqDjqhq0G83r_Lck-7puOITTfhKc-khapWkrtOBNLwvp_fLy34e960OLIRyJ5zPEfw=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/A59BQG7X0v_lyJqDjqhq0G83r_Lck-7puOITTfhKc-khapWkrtOBNLwvp_fLy34e960OLIRyJ5zPEfw=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/A59BQG7X0v_lyJqDjqhq0G83r_Lck-7puOITTfhKc-khapWkrtOBNLwvp_fLy34e960OLIRyJ5zPEfw=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
channel: None,
track_count: Some(44),
from_ytm: true,
is_podcast: false,
)),
Playlist(MusicPlaylistItem(
id: "RDCLAK5uy_k1272v-yXtLJm7gmMiAxjOl-vh5aEC11A",
name: "Presenting Taylor Swift",
thumbnail: [
Thumbnail(
url: "https://yt3.googleusercontent.com/jvshZlSlG9Kc5RRuzl-dT4RWigZeKhyg1pA1wE-zNOy5Wm2Du-ILxI-dbH-Fu-zA-fwqk-FtK5a_09w=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jvshZlSlG9Kc5RRuzl-dT4RWigZeKhyg1pA1wE-zNOy5Wm2Du-ILxI-dbH-Fu-zA-fwqk-FtK5a_09w=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jvshZlSlG9Kc5RRuzl-dT4RWigZeKhyg1pA1wE-zNOy5Wm2Du-ILxI-dbH-Fu-zA-fwqk-FtK5a_09w=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jvshZlSlG9Kc5RRuzl-dT4RWigZeKhyg1pA1wE-zNOy5Wm2Du-ILxI-dbH-Fu-zA-fwqk-FtK5a_09w=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
channel: None,
track_count: Some(121),
from_ytm: true,
is_podcast: false,
)),
Album(AlbumItem(
id: "MPREb_BdDqjcHkOwb",
name: "reputation",
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/RuKPkn6LLmXNOUcyRqh0zQbMWTpZDhHnkxHEZHrv6J8AbxLwemm9F0xaPpHX51WB_Xlj00My9vpZ_zRh=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/RuKPkn6LLmXNOUcyRqh0zQbMWTpZDhHnkxHEZHrv6J8AbxLwemm9F0xaPpHX51WB_Xlj00My9vpZ_zRh=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/RuKPkn6LLmXNOUcyRqh0zQbMWTpZDhHnkxHEZHrv6J8AbxLwemm9F0xaPpHX51WB_Xlj00My9vpZ_zRh=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/RuKPkn6LLmXNOUcyRqh0zQbMWTpZDhHnkxHEZHrv6J8AbxLwemm9F0xaPpHX51WB_Xlj00My9vpZ_zRh=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album_type: album,
year: Some(2017),
by_va: false,
)),
Album(AlbumItem(
id: "MPREb_7u82vYqpamW",
name: "Speak Now (Taylor\'s Version)",
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album_type: album,
year: Some(2023),
by_va: false,
)),
Track(TrackItem(
id: "e7yg0A-PCTI",
name: "Love Story (Taylors Version)",
duration: None,
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/huIYugJjpimikk-tSDJyDU09Jr8vDVJuLOh5uGG6T45c5MEtYvFW_9NlqkHHSaLl231kLBgAS8rtDfQ=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/huIYugJjpimikk-tSDJyDU09Jr8vDVJuLOh5uGG6T45c5MEtYvFW_9NlqkHHSaLl231kLBgAS8rtDfQ=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(259000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "LYyUr75fs_o",
name: "You Belong With Me",
duration: None,
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(2100000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "gGwN25z7FrE",
name: "Anti-Hero",
duration: None,
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(541000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "sEPXrepgujY",
name: "Style",
duration: None,
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/GcrDhHXqrPm4BjS-4L1c0OHC9iz0ZxmFeRur2A6Aqo9Vm7OfFCBOSVbRzp1M1D1s_3rsvKaC7w6kku0=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/GcrDhHXqrPm4BjS-4L1c0OHC9iz0ZxmFeRur2A6Aqo9Vm7OfFCBOSVbRzp1M1D1s_3rsvKaC7w6kku0=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(1300000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "oOEhHDx6xOQ",
name: "Back To December (Taylor\'s Version)",
duration: None,
cover: [
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/PzdFvhZwBo2kxfifFF82vShEUh8xEQfvoUTRIUBvZjs3ibCmTqMQZ6ZL03tPz1iwjP4UH6xB0CAGPwqj=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(101000000),
track_type: track,
track_nr: None,
by_va: false,
unavailable: false,
)),
Playlist(MusicPlaylistItem(
id: "PLh7pLzn8qaqXxc4S-sYw_P2jAqgJl_UNu",
name: "Taylor Swift Study Playlist",
thumbnail: [
Thumbnail(
url: "https://yt3.ggpht.com/W8K9kHzTWhnBBVUwFp8ybP4WpUNaZL26P1-jH4T4AdDrQq-zV-x5qOsGLlhbaCBUQO3LMEkIbL4=s192",
width: 192,
height: 192,
),
Thumbnail(
url: "https://yt3.ggpht.com/W8K9kHzTWhnBBVUwFp8ybP4WpUNaZL26P1-jH4T4AdDrQq-zV-x5qOsGLlhbaCBUQO3LMEkIbL4=s576",
width: 576,
height: 576,
),
Thumbnail(
url: "https://yt3.ggpht.com/W8K9kHzTWhnBBVUwFp8ybP4WpUNaZL26P1-jH4T4AdDrQq-zV-x5qOsGLlhbaCBUQO3LMEkIbL4=s1200",
width: 1200,
height: 1200,
),
],
channel: Some(ChannelId(
id: "UC4Nx_ksbcnfAexy0YOeXWDA",
name: "Jorgelina Ramirez",
)),
track_count: None,
from_ytm: false,
is_podcast: false,
)),
Artist(ArtistItem(
id: "UCYmegxA27i3GYivu-FN-lYg",
name: "Piano Tribute Players",
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/6c7xT8CeESUklHTzG0iEkbf14-6jM46dZep_6eCeiliAxMwi1We4XXe_XhXiaTarSz5Mj338DUhPnOEDXQ=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/6c7xT8CeESUklHTzG0iEkbf14-6jM46dZep_6eCeiliAxMwi1We4XXe_XhXiaTarSz5Mj338DUhPnOEDXQ=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
subscriber_count: Some(1),
)),
Artist(ArtistItem(
id: "UCcFRMtkYJsQO2biUzogKp-g",
name: "Sweet Baby Mae",
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/rTzDOTEMth0I63JRgkHG-iXivVWgqN9Z-r0ziTKB40qT2XwYL9y80zwv8R6gTsGW9724jPzehcjaj52ufg=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/rTzDOTEMth0I63JRgkHG-iXivVWgqN9Z-r0ziTKB40qT2XwYL9y80zwv8R6gTsGW9724jPzehcjaj52ufg=w120-h120-l90-rj",
width: 120,
height: 120,
),
],
subscriber_count: Some(185),
)),
Artist(ArtistItem(
id: "UCw-0GSqznYHfyfDBBe6a46A",
name: "Gracie Abrams",
avatar: [
Thumbnail(
url: "https://lh3.googleusercontent.com/ZK5OsaCicvq8y9dbDlfZIYW9IEVbfou_NWdTmeoQ-EYFu5EgE-mBKZmjaShYinYveVNvw0Dvs04w5eo=w60-h60-p-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://lh3.googleusercontent.com/ZK5OsaCicvq8y9dbDlfZIYW9IEVbfou_NWdTmeoQ-EYFu5EgE-mBKZmjaShYinYveVNvw0Dvs04w5eo=w120-h120-p-l90-rj",
width: 120,
height: 120,
),
],
subscriber_count: Some(103000000),
)),
Playlist(MusicPlaylistItem(
id: "PLXmaWI4hITKsFZ9QnKIatkCBUtJ3q7deG",
name: "Taylor Swift • folklore (the long pond studio sessions)",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/mVfzb7S_KwI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k8tcigyW7D4rFLA0VK6NHEF9NNlg",
width: 400,
height: 225,
),
Thumbnail(
url: "https://i.ytimg.com/vi/mVfzb7S_KwI/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l1twBfvFOTd-Lk0sl-8rtbggLMZA",
width: 426,
height: 240,
),
],
channel: Some(ChannelId(
id: "UC35imtjkWi43Wpvbv_2gkZw",
name: "imusic",
)),
track_count: None,
from_ytm: false,
is_podcast: false,
)),
Track(TrackItem(
id: "uo_CXTq6gmU",
name: "TAYLOR SWIFT THE ERAS TOUR Concert ~ Best Summer Songs Full Album || Penguin",
duration: None,
cover: [
Thumbnail(
url: "https://i.ytimg.com/vi/uo_CXTq6gmU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l396KNdVXRKRjyFKwiwcDfNP7jeg",
width: 400,
height: 225,
),
],
artists: [
ArtistId(
id: Some("UCRwekCSL5jAT-vLLcaf8k2g"),
name: "Penguin Lyrics",
),
],
artist_id: Some("UCRwekCSL5jAT-vLLcaf8k2g"),
album: None,
view_count: Some(8100000),
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
)),
Playlist(MusicPlaylistItem(
id: "RDCLAK5uy_lL718gGQZgQf4jkKYjVbOXHABQCFAYuj0",
name: "Presenting Ed Sheeran",
thumbnail: [
Thumbnail(
url: "https://yt3.googleusercontent.com/jPfSesF1ouKETA3Bd_mfIQvyhQdLFv4vbwbaQLTIfCHaftzSzqrh6adTh3d9_RKUJEj9l2kA_At3Ej5T=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jPfSesF1ouKETA3Bd_mfIQvyhQdLFv4vbwbaQLTIfCHaftzSzqrh6adTh3d9_RKUJEj9l2kA_At3Ej5T=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jPfSesF1ouKETA3Bd_mfIQvyhQdLFv4vbwbaQLTIfCHaftzSzqrh6adTh3d9_RKUJEj9l2kA_At3Ej5T=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/jPfSesF1ouKETA3Bd_mfIQvyhQdLFv4vbwbaQLTIfCHaftzSzqrh6adTh3d9_RKUJEj9l2kA_At3Ej5T=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
channel: None,
track_count: Some(45),
from_ytm: true,
is_podcast: false,
)),
Playlist(MusicPlaylistItem(
id: "PLxdXxDPCmiu1gk8Mhvvb8b8Up3IYq48VN",
name: "Taylor Swift random playlist",
thumbnail: [
Thumbnail(
url: "https://yt3.googleusercontent.com/aRnpZpC-UvD2b50ziNEEB5kIoSnLeH_QKEG1DkoVQd_yyqS_xTAFqGov0B96L-ZdlzrXHFKwCWs=s192",
width: 192,
height: 192,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/aRnpZpC-UvD2b50ziNEEB5kIoSnLeH_QKEG1DkoVQd_yyqS_xTAFqGov0B96L-ZdlzrXHFKwCWs=s576",
width: 576,
height: 576,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/aRnpZpC-UvD2b50ziNEEB5kIoSnLeH_QKEG1DkoVQd_yyqS_xTAFqGov0B96L-ZdlzrXHFKwCWs=s1200",
width: 1200,
height: 1200,
),
],
channel: Some(ChannelId(
id: "UCaW05RDAz0Ry5RSwBl2J2Fg",
name: "Dayne Jumawid",
)),
track_count: None,
from_ytm: false,
is_podcast: false,
)),
Track(TrackItem(
id: "ko70cExuzZM",
name: "The Fate of Ophelia",
duration: None,
cover: [
Thumbnail(
url: "https://i.ytimg.com/vi/ko70cExuzZM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mEOKu47w7ANm72Cvx-cwKcqskR_w",
width: 400,
height: 225,
),
],
artists: [
ArtistId(
id: Some("UCPC0L1d253x-KuMNwa05TpA"),
name: "Taylor Swift",
),
],
artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"),
album: None,
view_count: Some(415000000),
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
)),
Track(TrackItem(
id: "2glHZo0gx_w",
name: "Taylor Swift, Shakira, Bruno Mars, Justin Bieber 🏖\u{fe0f}🎧 Top Hits 2026 🔥 Spotify Trending Summer Vibes",
duration: None,
cover: [
Thumbnail(
url: "https://i.ytimg.com/vi/2glHZo0gx_w/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lk1zghRbX4ijRMoZrDOONkQx-SAw",
width: 400,
height: 225,
),
],
artists: [
ArtistId(
id: Some("UCsUUmUhP6u_gqzGGFtFPpOA"),
name: "Moonlight Chill Vibes",
),
],
artist_id: Some("UCsUUmUhP6u_gqzGGFtFPpOA"),
album: None,
view_count: Some(7900),
track_type: video,
track_nr: None,
by_va: false,
unavailable: false,
)),
Playlist(MusicPlaylistItem(
id: "PL1Nc9dcQuS8z1oj6avXVkM0GqGZg9_6Mk",
name: "Die Taylor Swift Story",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/pl_c/PL1Nc9dcQuS8z1oj6avXVkM0GqGZg9_6Mk/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEICDwQPCAASFqi85f_AwYI98WAswY&rs=AMzJL3nVC62cMZapgD9W46alyXxOXmhcpg",
width: 60,
height: 60,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PL1Nc9dcQuS8z1oj6avXVkM0GqGZg9_6Mk/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEICHgQeCAASFqi85f_AwYI98WAswY&rs=AMzJL3l46lAvy96qFssa6Xh3ipVgBjKwAA",
width: 120,
height: 120,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PL1Nc9dcQuS8z1oj6avXVkM0GqGZg9_6Mk/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEKCOIBEOIBIABIWqLzl_8DBgj3xYCzBg&rs=AMzJL3nWJKQykUL6rbg4AswYexiBIji5Yw",
width: 226,
height: 226,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PL1Nc9dcQuS8z1oj6avXVkM0GqGZg9_6Mk/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEKCKAEEKAEIABIWqLzl_8DBgj3xYCzBg&rs=AMzJL3lJ1a1qj2NY_FBVMPcRc6lX_JrxeQ",
width: 544,
height: 544,
),
],
channel: None,
track_count: None,
from_ytm: false,
is_podcast: true,
)),
Playlist(MusicPlaylistItem(
id: "PLkM40s4AfBz9KtVJIHlExeqvETajdLwWW",
name: "Mend with Mere x Taylor Swift Reaction Videos!",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/pl_c/PLkM40s4AfBz9KtVJIHlExeqvETajdLwWW/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEICDwQPCAASFqi85f_AwYI5onxpQY&rs=AMzJL3lVxLHz9SmZXaVBKVL_yJH_ukf9Sg",
width: 60,
height: 60,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PLkM40s4AfBz9KtVJIHlExeqvETajdLwWW/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEICHgQeCAASFqi85f_AwYI5onxpQY&rs=AMzJL3khQTkIKo0HgBJ9lXGLeuWqGOuSvQ",
width: 120,
height: 120,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PLkM40s4AfBz9KtVJIHlExeqvETajdLwWW/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEKCOIBEOIBIABIWqLzl_8DBgjmifGlBg&rs=AMzJL3kjtHIKz8ReNzURFLVhGdTeeht4ig",
width: 226,
height: 226,
),
Thumbnail(
url: "https://i.ytimg.com/pl_c/PLkM40s4AfBz9KtVJIHlExeqvETajdLwWW/studio_square_thumbnail.jpg?sqp=COKkgNEG-oaymwEKCKAEEKAEIABIWqLzl_8DBgjmifGlBg&rs=AMzJL3nHKxJGRrPac8LyyX_nyogrsxWyeQ",
width: 544,
height: 544,
),
],
channel: None,
track_count: None,
from_ytm: false,
is_podcast: true,
)),
Playlist(MusicPlaylistItem(
id: "PLKXeAFgIkqY_dNNWZVsdlXyVxbeErJROg",
name: "13: A Taylor Swift Fan Podcast",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/podcasts_artwork/PLKXeAFgIkqY_dNNWZVsdlXyVxbeErJROg/rss_feed_ingested.jpg?sqp=COKkgNEG-oaymwEICDwQPCAASFo&rs=AMzJL3kc8M2AJIUFAHKl0HJxIge3-OTP8A",
width: 60,
height: 60,
),
Thumbnail(
url: "https://i.ytimg.com/podcasts_artwork/PLKXeAFgIkqY_dNNWZVsdlXyVxbeErJROg/rss_feed_ingested.jpg?sqp=COKkgNEG-oaymwEICHgQeCAASFo&rs=AMzJL3m-4F49HfVIhBVj_rX4o9HqmdaCzw",
width: 120,
height: 120,
),
Thumbnail(
url: "https://i.ytimg.com/podcasts_artwork/PLKXeAFgIkqY_dNNWZVsdlXyVxbeErJROg/rss_feed_ingested.jpg?sqp=COKkgNEG-oaymwEKCOIBEOIBIABIWg&rs=AMzJL3nRT636cpspamEYXtKmvZh_lGqbmw",
width: 226,
height: 226,
),
Thumbnail(
url: "https://i.ytimg.com/podcasts_artwork/PLKXeAFgIkqY_dNNWZVsdlXyVxbeErJROg/rss_feed_ingested.jpg?sqp=COKkgNEG-oaymwEKCKAEEKAEIABIWg&rs=AMzJL3n6BSBouho3uZwzayb1V8UafYd_MA",
width: 544,
height: 544,
),
],
channel: None,
track_count: None,
from_ytm: false,
is_podcast: true,
)),
User(UserItem(
id: "UC84Q02DHvuBzaB1a1TCF9OQ",
name: "Official Album Instrumentals",
handle: Some("@officialalbuminstrumentals9760"),
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/LAQXnLOzsXC7-hJtbREHUM53A8pcgIe0go592Ikw9mmh6AQNiGoxN1TXH1YV-sA0ySFEiyjzS6Q=w60-c-h60-k-c0x00ffffff-no-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/LAQXnLOzsXC7-hJtbREHUM53A8pcgIe0go592Ikw9mmh6AQNiGoxN1TXH1YV-sA0ySFEiyjzS6Q=w120-c-h120-k-c0x00ffffff-no-l90-rj",
width: 120,
height: 120,
),
],
)),
User(UserItem(
id: "UCz6aKkENqq23rL3RyCH_QOw",
name: "Timeless_Swiftie",
handle: Some("@Timeless_Swiftie1989"),
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/D_VDSnN7WfsH08g1LwpzpXlXBoO6PpX-DLVP8Joob0NfHNyr0fBJYLFbV8u3IdhXdFJUr0BOAAM=w60-c-h60-k-c0x00ffffff-no-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/D_VDSnN7WfsH08g1LwpzpXlXBoO6PpX-DLVP8Joob0NfHNyr0fBJYLFbV8u3IdhXdFJUr0BOAAM=w120-c-h120-k-c0x00ffffff-no-l90-rj",
width: 120,
height: 120,
),
],
)),
User(UserItem(
id: "UCvJwHWeD6SJ8zXXVsXIbVEw",
name: "Taylor swift fan ",
handle: Some("@realTaylorswift13fan"),
avatar: [
Thumbnail(
url: "https://yt3.googleusercontent.com/SHeka46S_UVKpsE6iXN0zt_7nRltUEq-NLf9gTw24cqcn4ngyOa0yzrFmj59tiZiY79y_bPV=w60-c-h60-k-c0x00ffffff-no-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://yt3.googleusercontent.com/SHeka46S_UVKpsE6iXN0zt_7nRltUEq-NLf9gTw24cqcn4ngyOa0yzrFmj59tiZiY79y_bPV=w120-c-h120-k-c0x00ffffff-no-l90-rj",
width: 120,
height: 120,
),
],
)),
],
ctoken: None,
endpoint: music_search,
),
corrected_query: None,
)

View file

@ -32,6 +32,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(80296),
@ -67,6 +68,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(36294),
@ -102,6 +104,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(34736),
@ -137,6 +140,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(73544),
@ -172,6 +176,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(67231),
@ -207,6 +212,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(44946),
@ -242,6 +248,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(43264),
@ -277,6 +284,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(98175),
@ -312,6 +320,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(59376),
@ -347,6 +356,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(25496),
@ -382,6 +392,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(22982),
@ -417,6 +428,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(38804),
@ -452,6 +464,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(25505),
@ -487,6 +500,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(98432),
@ -522,6 +536,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(53410),
@ -557,6 +572,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(54771),
@ -592,6 +608,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(39823),
@ -627,6 +644,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(51596),
@ -662,6 +680,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(125391),
@ -697,6 +716,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(120457),
@ -732,6 +752,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(49062),
@ -767,6 +788,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(49032),
@ -802,6 +824,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(64108),
@ -837,6 +860,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(76831),
@ -872,6 +896,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(49961),
@ -907,6 +932,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(17393),
@ -942,6 +968,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(38281),
@ -977,6 +1004,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(70004),
@ -1012,6 +1040,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(93700),
@ -1047,6 +1076,7 @@ Paginator(
),
],
channel: None,
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(37515),

View file

@ -38,6 +38,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(85000000),
@ -79,6 +80,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(59000000),
@ -120,6 +122,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(15000000),
@ -161,6 +164,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(19000000),
@ -202,6 +206,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(14000000),
@ -243,6 +248,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(21000000),
@ -284,6 +290,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(20000000),
@ -325,6 +332,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(16000000),
@ -366,6 +374,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(4100000),
@ -407,6 +416,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(10000000),
@ -448,6 +458,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(33000000),
@ -489,6 +500,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(3600000),
@ -530,6 +542,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(14000000),
@ -571,6 +584,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(7200000),
@ -612,6 +626,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(11000000),
@ -653,6 +668,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(31000000),
@ -694,6 +710,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(25000000),
@ -735,6 +752,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(2200000),
@ -776,6 +794,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(69000000),
@ -817,6 +836,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(7700000),
@ -858,6 +878,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(3400000),
@ -899,6 +920,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(3000000),
@ -940,6 +962,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(35000000),
@ -981,6 +1004,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(134000000),
@ -1022,6 +1046,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(19000000),
@ -1063,6 +1088,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(17000000),
@ -1104,6 +1130,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(60000000),
@ -1145,6 +1172,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(63000000),
@ -1186,6 +1214,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(36000000),
@ -1227,6 +1256,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(8100000),
@ -1268,6 +1298,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(8300000),
@ -1309,6 +1340,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(31000000),
@ -1350,6 +1382,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(41000000),
@ -1391,6 +1424,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(4600000),
@ -1432,6 +1466,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(9200000),
@ -1473,6 +1508,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(50000000),
@ -1514,6 +1550,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(61000000),
@ -1555,6 +1592,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(8000000),
@ -1596,6 +1634,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(38000000),
@ -1637,6 +1676,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(49000000),
@ -1678,6 +1718,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(28000000),
@ -1719,6 +1760,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(75000000),
@ -1760,6 +1802,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(23000000),
@ -1801,6 +1844,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(1800000),
@ -1842,6 +1886,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(2000000),
@ -1883,6 +1928,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(21000000),
@ -1924,6 +1970,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(51000000),
@ -1965,6 +2012,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(15000000),
@ -2006,6 +2054,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(47000000),
@ -2047,6 +2096,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(8300000),
@ -2088,6 +2138,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(49000000),
@ -2129,6 +2180,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(20000000),
@ -2170,6 +2222,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(25000000),
@ -2211,6 +2264,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(55000000),
@ -2252,6 +2306,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(47000000),
@ -2293,6 +2348,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(509000000),
@ -2334,6 +2390,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(89000000),
@ -2375,6 +2432,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(88000000),
@ -2416,6 +2474,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(88000000),
@ -2457,6 +2516,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(49000000),
@ -2498,6 +2558,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(62000000),
@ -2539,6 +2600,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(63000000),
@ -2580,6 +2642,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(42000000),
@ -2621,6 +2684,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(46000000),
@ -2662,6 +2726,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(32000000),
@ -2703,6 +2768,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(34000000),
@ -2744,6 +2810,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(47000000),
@ -2785,6 +2852,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(37000000),
@ -2826,6 +2894,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(31000000),
@ -2867,6 +2936,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(45000000),
@ -2908,6 +2978,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(38000000),
@ -2949,6 +3020,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(30000000),
@ -2990,6 +3062,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(36000000),
@ -3031,6 +3104,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(34000000),
@ -3072,6 +3146,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(27000000),
@ -3113,6 +3188,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(25000000),
@ -3154,6 +3230,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(22000000),
@ -3195,6 +3272,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(31000000),
@ -3236,6 +3314,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(18000000),
@ -3277,6 +3356,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(25000000),
@ -3318,6 +3398,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(24000000),
@ -3359,6 +3440,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(29000000),
@ -3400,6 +3482,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(23000000),
@ -3441,6 +3524,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(27000000),
@ -3482,6 +3566,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(19000000),
@ -3523,6 +3608,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(31000000),
@ -3564,6 +3650,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(19000000),
@ -3605,6 +3692,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(18000000),
@ -3646,6 +3734,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(22000000),
@ -3687,6 +3776,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(16000000),
@ -3728,6 +3818,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(16000000),
@ -3769,6 +3860,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(21000000),
@ -3810,6 +3902,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(40000000),
@ -3851,6 +3944,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(15000000),
@ -3892,6 +3986,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(19000000),
@ -3933,6 +4028,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(15000000),
@ -3974,6 +4070,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(25000000),
@ -4015,6 +4112,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(16000000),
@ -4056,6 +4154,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(23000000),
@ -4097,6 +4196,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(15000000),

View file

@ -34,6 +34,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(216222873),
@ -71,6 +72,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(155106313),
@ -108,6 +110,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(265238677),
@ -145,6 +148,7 @@ Paginator(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(9989591),
@ -182,6 +186,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(34588526),
@ -219,6 +224,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(242737870),
@ -256,6 +262,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(126677200),
@ -293,6 +300,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(335903776),
@ -330,6 +338,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(86125645),
@ -367,6 +376,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(170016610),
@ -404,6 +414,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(123861096),
@ -441,6 +452,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(101968219),
@ -478,6 +490,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(322510403),
@ -515,6 +528,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(345491789),
@ -552,6 +566,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(314744776),
@ -589,6 +604,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(18830758),
@ -626,6 +642,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(282957370),
@ -663,6 +680,7 @@ Paginator(
verification: artist,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(355203298),
@ -700,6 +718,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(157400947),

View file

@ -29,6 +29,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 day ago"),
view_count: Some(859366),
@ -61,6 +62,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 days ago"),
view_count: Some(1000402),
@ -98,6 +100,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(528795),
@ -130,6 +133,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 days ago"),
view_count: Some(1096055),
@ -167,6 +171,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(928968),
@ -204,6 +209,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(1137138),
@ -241,6 +247,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(462437),
@ -273,6 +280,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(11285067),
@ -305,6 +313,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 weeks ago"),
view_count: Some(2415040),
@ -337,6 +346,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(5100787),
@ -369,6 +379,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(55308394),
@ -406,6 +417,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(774061),
@ -438,6 +450,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(12314192),
@ -470,6 +483,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(4266748),
@ -507,6 +521,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(439888),
@ -539,6 +554,7 @@ Paginator(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(9312774),

View file

@ -61,11 +61,12 @@ VideoPlayer(
),
video_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1619781&dur=163.143&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=17&lmt=1580005480199246&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2F3gpp&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJ2s7Pm4w42X3u3PWYViDeqIaE2tE9J6oIGpd0KB9gFsAiAH84QaJ4oUNivdRDUBi1ZYI7JSxESsPQ53mLInajKzcQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1619781&dur=163.143&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=17&lmt=1580005480199246&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2F3gpp&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJ2s7Pm4w42X3u3PWYViDeqIaE2tE9J6oIGpd0KB9gFsAiAH84QaJ4oUNivdRDUBi1ZYI7JSxESsPQ53mLInajKzcQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 17,
bitrate: 79452,
average_bitrate: 79428,
size: Some(1619781),
last_modified: Some(1580005480199246),
index_range: None,
init_range: None,
duration_ms: Some(163143),
@ -77,15 +78,17 @@ VideoPlayer(
mime: "video/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"",
format: r#3gp,
codec: mp4v,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=11439331&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJAH-tWof01vrs8phEoz51XkWwdMzQ77k1UTrdY5XiuTAiA38z-qANX0jtfCiAl4EVMZaKo1ncrzJFRrCffZ6LagrA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=11439331&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJAH-tWof01vrs8phEoz51XkWwdMzQ77k1UTrdY5XiuTAiA38z-qANX0jtfCiAl4EVMZaKo1ncrzJFRrCffZ6LagrA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 18,
bitrate: 561339,
average_bitrate: 561109,
size: Some(11439331),
last_modified: Some(1580005476071743),
index_range: None,
init_range: None,
duration_ms: Some(163096),
@ -97,15 +100,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=22&lmt=1580005750956837&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFlQZgR63Yz9UgY9gVqiyGDVkZmSmACRP3-MmKN7CRzQCIAMHAwZbHmWL1qNH4Nu3A0pXZwErXMVPzMIt-PyxeZqa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cratebypass%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=22&lmt=1580005750956837&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFlQZgR63Yz9UgY9gVqiyGDVkZmSmACRP3-MmKN7CRzQCIAMHAwZbHmWL1qNH4Nu3A0pXZwErXMVPzMIt-PyxeZqa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cratebypass%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 22,
bitrate: 1574434,
average_bitrate: 1574434,
size: None,
last_modified: Some(1580005750956837),
index_range: None,
init_range: None,
duration_ms: Some(163096),
@ -117,17 +122,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64001F, mp4a.40.2\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
video_only_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1224002&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=394&keepalive=yes&lmt=1608045375671513&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgYCPleG9F86UoDRvzFL2xSUUI-HLZGw_P7qBOixlcmKsCIQChdmrJ1NvKo5Ra4QJ9ivR5V8fEcQs0f_3aUiqMhGB5DQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1224002&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=394&keepalive=yes&lmt=1608045375671513&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgYCPleG9F86UoDRvzFL2xSUUI-HLZGw_P7qBOixlcmKsCIQChdmrJ1NvKo5Ra4QJ9ivR5V8fEcQs0f_3aUiqMhGB5DQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 394,
bitrate: 67637,
average_bitrate: 60063,
size: Some(1224002),
last_modified: Some(1608045375671513),
index_range: Some(Range(
start: 700,
end: 1115,
@ -145,15 +152,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.00M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2238952&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=395&keepalive=yes&lmt=1608045728968690&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKCXHOCh_P3VlNWebTeWw0WdSln-zYe3BjZeEm2QiltCAiAQNcJBI4G-8dK5z1IUoqBZctk6ddjkl_QYKRFAKXyOcw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2238952&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=395&keepalive=yes&lmt=1608045728968690&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKCXHOCh_P3VlNWebTeWw0WdSln-zYe3BjZeEm2QiltCAiAQNcJBI4G-8dK5z1IUoqBZctk6ddjkl_QYKRFAKXyOcw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 395,
bitrate: 135747,
average_bitrate: 109867,
size: Some(2238952),
last_modified: Some(1608045728968690),
index_range: Some(Range(
start: 700,
end: 1115,
@ -171,15 +180,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.00M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=7808990&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIjjrMvCEzSLlbvbrjItT4V9JdpggnO5IHye9i4PxTyzAiAmbaFCB2hH7evf9JX3JUx-tU9S6zv2IzSKz8ObGSVRjw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=7808990&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIjjrMvCEzSLlbvbrjItT4V9JdpggnO5IHye9i4PxTyzAiAmbaFCB2hH7evf9JX3JUx-tU9S6zv2IzSKz8ObGSVRjw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 134,
bitrate: 538143,
average_bitrate: 383195,
size: Some(7808990),
last_modified: Some(1580005649163759),
index_range: Some(Range(
start: 740,
end: 1155,
@ -197,15 +208,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401e\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=4130385&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=396&keepalive=yes&lmt=1608045761576250&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgBrQhbygTP6RGjUk0lGbxBI5e3NdeR6C_SW8R_ckZ2PkCIQDaBg5cJxYVWfwRrrELQFgRMOJ4xS3oOOROayoQMjxaCA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=4130385&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=396&keepalive=yes&lmt=1608045761576250&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgBrQhbygTP6RGjUk0lGbxBI5e3NdeR6C_SW8R_ckZ2PkCIQDaBg5cJxYVWfwRrrELQFgRMOJ4xS3oOOROayoQMjxaCA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 396,
bitrate: 258097,
average_bitrate: 202682,
size: Some(4130385),
last_modified: Some(1608045761576250),
index_range: Some(Range(
start: 700,
end: 1115,
@ -223,15 +236,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.01M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=6873325&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=397&keepalive=yes&lmt=1608045990917419&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMqBb1hKVVzWl3Awrh1T8GQG9IrSWF84zW_ZfjgbAN5QAiAaP3jYyI4ox2aclcOCzYFzqWgByWCxj_FgTN-SfsARXw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=6873325&dur=163.029&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=397&keepalive=yes&lmt=1608045990917419&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMqBb1hKVVzWl3Awrh1T8GQG9IrSWF84zW_ZfjgbAN5QAiAaP3jYyI4ox2aclcOCzYFzqWgByWCxj_FgTN-SfsARXw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 397,
bitrate: 436843,
average_bitrate: 337281,
size: Some(6873325),
last_modified: Some(1608045990917419),
index_range: Some(Range(
start: 700,
end: 1115,
@ -249,15 +264,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.04M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=22365208&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=398&keepalive=yes&lmt=1608048380553749&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgR6KqCOoig_FMl2tWKa7qHSmCjIZa9S7ABzEI16qdO2sCIFXccwql4bqV9CHlqXY4tgxyMFUsp7vW4XUjxs3AyG6H&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=22365208&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=398&keepalive=yes&lmt=1608048380553749&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgR6KqCOoig_FMl2tWKa7qHSmCjIZa9S7ABzEI16qdO2sCIFXccwql4bqV9CHlqXY4tgxyMFUsp7vW4XUjxs3AyG6H&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 398,
bitrate: 1348419,
average_bitrate: 1097369,
size: Some(22365208),
last_modified: Some(1608048380553749),
index_range: Some(Range(
start: 700,
end: 1115,
@ -275,15 +292,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.08M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=65400181&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAPjxbuzkozPDc1Nd_0q5X8x8H2SiDvAUFuqqMadtz3SNAiEA_3kXCeePb2kci-WB2779tzI56E6E0iKwoHnUSkKCzwU%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=65400181&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAPjxbuzkozPDc1Nd_0q5X8x8H2SiDvAUFuqqMadtz3SNAiEA_3kXCeePb2kci-WB2779tzI56E6E0iKwoHnUSkKCzwU%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 299,
bitrate: 4190323,
average_bitrate: 3208919,
size: Some(65400181),
last_modified: Some(1580005649161486),
index_range: Some(Range(
start: 740,
end: 1155,
@ -301,15 +320,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64002a\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=42567727&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=399&keepalive=yes&lmt=1608052932785283&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFguw-cmBNOQegpyRRzcCScp2WaSnq_o7FB1-AiBgFpICIAGlMj9-kzNCWb3nhpg98Mc239ls6YYyoL8z1QpM8VmL&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=42567727&dur=163.046&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=399&keepalive=yes&lmt=1608052932785283&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFguw-cmBNOQegpyRRzcCScp2WaSnq_o7FB1-AiBgFpICIAGlMj9-kzNCWb3nhpg98Mc239ls6YYyoL8z1QpM8VmL&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 399,
bitrate: 2572342,
average_bitrate: 2088624,
size: Some(42567727),
last_modified: Some(1608052932785283),
index_range: Some(Range(
start: 700,
end: 1115,
@ -327,17 +348,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.09M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
audio_streams: [
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=995840&dur=163.189&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=139&keepalive=yes&lmt=1580005582214385&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALhtrbIL9_CQBeXsEwxFqyPY1XqBCOceQc7y00h7XBS9AiAH9VkMnkuFCU1ACkYU__uApTwcYeDoYNU74VYmKED3Gw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=995840&dur=163.189&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=139&keepalive=yes&lmt=1580005582214385&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALhtrbIL9_CQBeXsEwxFqyPY1XqBCOceQc7y00h7XBS9AiAH9VkMnkuFCU1ACkYU__uApTwcYeDoYNU74VYmKED3Gw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 139,
bitrate: 49724,
average_bitrate: 48818,
size: 995840,
last_modified: Some(1580005582214385),
index_range: Some(Range(
start: 641,
end: 876,
@ -352,16 +375,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: None,
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=934449&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgPmadKd9As393GMRmu1Ow4RfQkDQhY6SbPRnkLMYyZOoCIE9AIgMMJ7n5HD2gKv3c8-HrnkMeakq_uWUOivnWquJX&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=934449&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgPmadKd9As393GMRmu1Ow4RfQkDQhY6SbPRnkLMYyZOoCIE9AIgMMJ7n5HD2gKv3c8-HrnkMeakq_uWUOivnWquJX&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 249,
bitrate: 53039,
average_bitrate: 45845,
size: 934449,
last_modified: Some(1608509101590706),
index_range: Some(Range(
start: 266,
end: 551,
@ -376,16 +402,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: None,
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1245866&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIge8uetzhejNg3DegY9EQkpvVam1gp8Jm-q6oqtb6Rn9wCIQD_VeQle7Z2H1uXB6qsYMGDU4OWA4h6YTTwMDmw5DDvuA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=1245866&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIge8uetzhejNg3DegY9EQkpvVam1gp8Jm-q6oqtb6Rn9wCIQD_VeQle7Z2H1uXB6qsYMGDU4OWA4h6YTTwMDmw5DDvuA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 250,
bitrate: 71268,
average_bitrate: 61123,
size: 1245866,
last_modified: Some(1608509101111096),
index_range: Some(Range(
start: 266,
end: 551,
@ -400,16 +429,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: None,
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2640283&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAI8YylDImOPxxRo251u_RX6ir_j0p-gP_yQPcI6SxareAiArCxOcgrF9pxYS5bNYEnLGEQxRiEFJ0sT2Ydpa1G7x5A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2640283&dur=163.096&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAI8YylDImOPxxRo251u_RX6ir_j0p-gP_yQPcI6SxareAiArCxOcgrF9pxYS5bNYEnLGEQxRiEFJ0sT2Ydpa1G7x5A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=2211222&vprv=1"),
itag: 140,
bitrate: 130268,
average_bitrate: 129508,
size: 2640283,
last_modified: Some(1580005579712232),
index_range: Some(Range(
start: 632,
end: 867,
@ -424,16 +456,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: None,
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2476314&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgErpt4HOgIybMGrMD2qg9JB4O53n0jsCxkiI9JBxbz8ECIQDixyFJ54m4NsxhyFtIYPscMVp_G6RyvwrfKzdoya-62Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=ANDROID&clen=2476314&dur=163.061&ei=q1jpYtOPEYSBgQeHmqbwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AEDMTCojVtwpIKOdhBaxEHE5s322qnAJHGqa2r1F46BM&initcwndbps=1527500&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhAOiL-qJ04sA8FSOkEJfOYl3gFe4SzwYu_rAf3DMLHYigAiEA0Upi1HqqIu7NH_LTDL0jT1R5TTozQypL5FiSP9RoqtU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659459429&mv=m&mvi=5&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgErpt4HOgIybMGrMD2qg9JB4O53n0jsCxkiI9JBxbz8ECIQDixyFJ54m4NsxhyFtIYPscMVp_G6RyvwrfKzdoya-62Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&txp=1311222&vprv=1"),
itag: 251,
bitrate: 140633,
average_bitrate: 121491,
size: 2476314,
last_modified: Some(1608509101894140),
index_range: Some(Range(
start: 266,
end: 551,
@ -448,7 +483,9 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: None,
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
@ -465,6 +502,9 @@ VideoPlayer(
valid_until: "[date]",
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"),
abr_streaming_url: None,
abr_ustreamer_config: Some("Cs0CCAAlMZkqPi0AAIA_NT0Klz9YAXjoAoABAaABAbUB9ijcP-ABAegBA_ABAfkBAAAAAAAA0D-BAgAAAAAAABhAmALwAaAC6AK4AgDaAlUQsOoBGKhGIKCcASjYNjCYdXCIJ4AB9AO4AQHgAQGYAgyoAgGwAgG4AgHAAgHIAgHQAgLgAgHoAgLwAgGAAwaIA4gnmAMBqAMIsAMBuAMBwAMB2AMB-gIrCAwQGBgyIDItAABwQjUAAIxCQAFIAWUAAIBAaMBwzQEAAIA_8AEB6ALgA4IDAJADAaADAbADA-ADkE6wBAG4BAHKBFgKFQiA4gkQmHUYrAIlAAAAACgAMABAARDg1AMY0A8qNgoKdGJfY29zdF81MCAIKQAAAAAAAAAASAFQAV2amZk-ZQAAAD9tAAAAP3UAAAA_eMCpB5IBADAB6AQB8AQB-AQBkAUBGAEgATIMCKsCEI662NuboOcCMgwIjwMQg-na_r_Q7QIyDAiqAhCOutjbm6DnAjIMCI4DEJXUhISv0O0CMgwIhwEQjrrY25ug5wIyDAiNAxCr6siQptDtAjIMCIYBEO_L2NuboOcCMgwIjAMQuvqao6XQ7QIyDAiFARCOutjbm6DnAjIMCIsDEPLf1JOl0O0CMgwIoAEQjrrY25ug5wIyDAiKAxDZmZnro9DtAjIMCIsBEPGp4ruboOcCMgwIjAEQ6M3Jupug5wIyDAj5ARCykfms493tAjIMCPoBELju26zj3e0CMgwI-wEQ_NOLrePd7QI6AA=="),
po_token: None,
preview_frames: [
Frameset(
url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow",

View file

@ -66,11 +66,12 @@ VideoPlayer(
),
video_streams: [
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=11439331&dur=163.096&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=ig_QojS86GYHYg&ns=cOm8mnsR9HFwfq55dDyGyqYH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgNqstD2C4HG7Vn5En5Z4aUyH2mk7gAB9cyfOAWGCaWeoCIQDbxxJZuOnz_3RJNviFYADvgTO7u8YBYKtpFtp9Ujmk2w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=11439331&dur=163.096&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=ig_QojS86GYHYg&ns=cOm8mnsR9HFwfq55dDyGyqYH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgNqstD2C4HG7Vn5En5Z4aUyH2mk7gAB9cyfOAWGCaWeoCIQDbxxJZuOnz_3RJNviFYADvgTO7u8YBYKtpFtp9Ujmk2w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1"),
itag: 18,
bitrate: 561339,
average_bitrate: 561109,
size: Some(11439331),
last_modified: Some(1580005476071743),
index_range: None,
init_range: None,
duration_ms: Some(163096),
@ -82,17 +83,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
video_only_streams: [
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=1484736&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=278&keepalive=yes&lmt=1608509388295661&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgDYs7xrSqi-Co90zypk9zutEJ-aaEpNAHWnE57zVIfxgCIQDE0exs9SN8JH5OEJ8728Ke6bfa0CsUucFETHLk3IFF7w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=1484736&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=278&keepalive=yes&lmt=1608509388295661&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgDYs7xrSqi-Co90zypk9zutEJ-aaEpNAHWnE57zVIfxgCIQDE0exs9SN8JH5OEJ8728Ke6bfa0CsUucFETHLk3IFF7w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 278,
bitrate: 87458,
average_bitrate: 72857,
size: Some(1484736),
last_modified: Some(1608509388295661),
index_range: Some(Range(
start: 218,
end: 751,
@ -110,15 +113,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=1224002&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=394&keepalive=yes&lmt=1608045375671513&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAI-uoNLUkMHpH35niVh1tBvwwFLtmSbeHyknmyCvccFVAiB2XriyJd0u2q-tGIRTx5qtKt6bJCs5ndXtMsdSxOheuA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=1224002&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=394&keepalive=yes&lmt=1608045375671513&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAI-uoNLUkMHpH35niVh1tBvwwFLtmSbeHyknmyCvccFVAiB2XriyJd0u2q-tGIRTx5qtKt6bJCs5ndXtMsdSxOheuA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 394,
bitrate: 67637,
average_bitrate: 60063,
size: Some(1224002),
last_modified: Some(1608045375671513),
index_range: Some(Range(
start: 700,
end: 1115,
@ -136,15 +141,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.00M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=2973283&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=242&keepalive=yes&lmt=1608509388282028&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgEleuqkeo7x7BsHur5aGPfHaT6KjKEG4c1d_xXwqlrsYCIQD85X_m050XwWyYlfLiWtZz-TX--H8H0UvfZCWKpY7m4Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=2973283&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=242&keepalive=yes&lmt=1608509388282028&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgEleuqkeo7x7BsHur5aGPfHaT6KjKEG4c1d_xXwqlrsYCIQD85X_m050XwWyYlfLiWtZz-TX--H8H0UvfZCWKpY7m4Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 242,
bitrate: 184064,
average_bitrate: 145902,
size: Some(2973283),
last_modified: Some(1608509388282028),
index_range: Some(Range(
start: 219,
end: 753,
@ -162,15 +169,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=2238952&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=395&keepalive=yes&lmt=1608045728968690&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIBttTR02kTdGb4vdxQ9Gro88JOAY7u5z69nJbdmVS1sAiBr61rqkUtra4PHLdnp2w-s8ZSaN_4qZ3OEeeuIr5C13w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=2238952&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=395&keepalive=yes&lmt=1608045728968690&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIBttTR02kTdGb4vdxQ9Gro88JOAY7u5z69nJbdmVS1sAiBr61rqkUtra4PHLdnp2w-s8ZSaN_4qZ3OEeeuIr5C13w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 395,
bitrate: 135747,
average_bitrate: 109867,
size: Some(2238952),
last_modified: Some(1608045728968690),
index_range: Some(Range(
start: 700,
end: 1115,
@ -188,15 +197,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.00M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=7808990&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMBRhMAZ5GXFSZHN6D-XhXRdG_EWSNwnN2eLPlwVNQ6PAiEA75eH0iJLgwRkujaABZnaJxG2ni-4irYHEGD42x6uaQg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=7808990&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMBRhMAZ5GXFSZHN6D-XhXRdG_EWSNwnN2eLPlwVNQ6PAiEA75eH0iJLgwRkujaABZnaJxG2ni-4irYHEGD42x6uaQg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1"),
itag: 134,
bitrate: 538143,
average_bitrate: 383195,
size: Some(7808990),
last_modified: Some(1580005649163759),
index_range: Some(Range(
start: 740,
end: 1155,
@ -214,15 +225,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401e\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=5169510&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=243&keepalive=yes&lmt=1608509388282405&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgNi0fwQbep6oKsEeEGfms2Ay4x2OL2G0hUX5GFhycgKkCIANiC-j-Gz3-noxsNeSKKPxy--T9mFBu_8V7Vi5-zDYS&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=5169510&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=243&keepalive=yes&lmt=1608509388282405&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgNi0fwQbep6oKsEeEGfms2Ay4x2OL2G0hUX5GFhycgKkCIANiC-j-Gz3-noxsNeSKKPxy--T9mFBu_8V7Vi5-zDYS&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 243,
bitrate: 319085,
average_bitrate: 253673,
size: Some(5169510),
last_modified: Some(1608509388282405),
index_range: Some(Range(
start: 220,
end: 754,
@ -240,15 +253,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=4130385&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=396&keepalive=yes&lmt=1608045761576250&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFuBoOIkqwq0D1_OmnNJx3C0jmhHUyskpzPrTMoaWRYECIFZ1Y4QbQ41GsWS8yRHox8l_nGVosfXhXfKu3v18AyeT&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=4130385&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=396&keepalive=yes&lmt=1608045761576250&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgFuBoOIkqwq0D1_OmnNJx3C0jmhHUyskpzPrTMoaWRYECIFZ1Y4QbQ41GsWS8yRHox8l_nGVosfXhXfKu3v18AyeT&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 396,
bitrate: 258097,
average_bitrate: 202682,
size: Some(4130385),
last_modified: Some(1608045761576250),
index_range: Some(Range(
start: 700,
end: 1115,
@ -266,15 +281,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.01M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=8890590&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=244&keepalive=yes&lmt=1608509388284632&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgMYF0KQQNgYI8oOhgdCwyRY6E_hvFnJiaAadyMf89MRoCIHnDnROTvUoy0iIBM3MzFAxJh_bLA-2vFl9KFDrHOf1B&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=8890590&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=244&keepalive=yes&lmt=1608509388284632&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgMYF0KQQNgYI8oOhgdCwyRY6E_hvFnJiaAadyMf89MRoCIHnDnROTvUoy0iIBM3MzFAxJh_bLA-2vFl9KFDrHOf1B&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 244,
bitrate: 539056,
average_bitrate: 436270,
size: Some(8890590),
last_modified: Some(1608509388284632),
index_range: Some(Range(
start: 220,
end: 754,
@ -292,15 +309,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=6873325&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=397&keepalive=yes&lmt=1608045990917419&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAOtLGFoFtLHIXzNRoSrR7ULbIz91OYmaVQkcSatqNKAiAiEA23ZF7h2BZZCAGc0Zdd2p3PWRotmwLDyH6yYCuQpE8xw%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=6873325&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=397&keepalive=yes&lmt=1608045990917419&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAOtLGFoFtLHIXzNRoSrR7ULbIz91OYmaVQkcSatqNKAiAiEA23ZF7h2BZZCAGc0Zdd2p3PWRotmwLDyH6yYCuQpE8xw%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 397,
bitrate: 436843,
average_bitrate: 337281,
size: Some(6873325),
last_modified: Some(1608045990917419),
index_range: Some(Range(
start: 700,
end: 1115,
@ -318,15 +337,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.04M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=16547577&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=247&keepalive=yes&lmt=1608509388326822&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgfYKbT_196P-2EtjuqcTKdataiM480y65Ko0a73dv7WECIQC6nqWienQvu7swC1OW9HlwFWRH7VwTwj6H4yjY6FYvzg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=16547577&dur=163.029&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=247&keepalive=yes&lmt=1608509388326822&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgfYKbT_196P-2EtjuqcTKdataiM480y65Ko0a73dv7WECIQC6nqWienQvu7swC1OW9HlwFWRH7VwTwj6H4yjY6FYvzg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 247,
bitrate: 982813,
average_bitrate: 812006,
size: Some(16547577),
last_modified: Some(1608509388326822),
index_range: Some(Range(
start: 220,
end: 754,
@ -344,15 +365,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=35955780&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=302&keepalive=yes&lmt=1608509234088626&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgQG8GPj3w_5_Lr2apagmte66IFBY3bYcZ2KnhwnUpshYCIFgvHYIZsz8WdYGSk9adpfMNKX0pzSP_l8cW47Gq2RTi&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=35955780&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=302&keepalive=yes&lmt=1608509234088626&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgQG8GPj3w_5_Lr2apagmte66IFBY3bYcZ2KnhwnUpshYCIFgvHYIZsz8WdYGSk9adpfMNKX0pzSP_l8cW47Gq2RTi&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 302,
bitrate: 2354009,
average_bitrate: 1764202,
size: Some(35955780),
last_modified: Some(1608509234088626),
index_range: Some(Range(
start: 219,
end: 771,
@ -370,15 +393,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=22365208&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=398&keepalive=yes&lmt=1608048380553749&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAI-VhcBU6o8LGmeuVYC2_zbxeGvC6XWf7yIOQ1RvjURhAiEA0YcZlVOI2ZUtKl-31__Hzax2SOUPeekCRjqjfw4m15s%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=22365208&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=398&keepalive=yes&lmt=1608048380553749&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAI-VhcBU6o8LGmeuVYC2_zbxeGvC6XWf7yIOQ1RvjURhAiEA0YcZlVOI2ZUtKl-31__Hzax2SOUPeekCRjqjfw4m15s%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 398,
bitrate: 1348419,
average_bitrate: 1097369,
size: Some(22365208),
last_modified: Some(1608048380553749),
index_range: Some(Range(
start: 700,
end: 1115,
@ -396,15 +421,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.08M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=65400181&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAIdbG-deTvLhp7mD2b-QZYQamPFv75l1bNBEEOMihrxPAiEA1NYvRlFphbRRvFIBCP-Ij9-5q8OTwUskgsL6LyIrD7c%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=65400181&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAIdbG-deTvLhp7mD2b-QZYQamPFv75l1bNBEEOMihrxPAiEA1NYvRlFphbRRvFIBCP-Ij9-5q8OTwUskgsL6LyIrD7c%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1"),
itag: 299,
bitrate: 4190323,
average_bitrate: 3208919,
size: Some(65400181),
last_modified: Some(1580005649161486),
index_range: Some(Range(
start: 740,
end: 1155,
@ -422,15 +449,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64002a\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=62993617&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=303&keepalive=yes&lmt=1608509371758331&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJ8n34LQhg6iEg1Ux9rDkk48e8l3vBR4WwuHeIpKnorlAiBopK4z-nq-pJTPTmrdbbKPW1Lfufdz2f9sGUKY-dzk5A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=62993617&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=303&keepalive=yes&lmt=1608509371758331&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAJ8n34LQhg6iEg1Ux9rDkk48e8l3vBR4WwuHeIpKnorlAiBopK4z-nq-pJTPTmrdbbKPW1Lfufdz2f9sGUKY-dzk5A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 303,
bitrate: 3832648,
average_bitrate: 3090839,
size: Some(62993617),
last_modified: Some(1608509371758331),
index_range: Some(Range(
start: 219,
end: 776,
@ -448,15 +477,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=42567727&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=399&keepalive=yes&lmt=1608052932785283&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMewAT3SgJRGn7wqDaDzNWcsAfrjFRu6k0wm7O_5YJeQAiANVhGmILp_gmNXnmixDesxsZ44_72YBT2SqjLLSZV32w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C394%2C395%2C396%2C397%2C398%2C399&c=WEB&clen=42567727&dur=163.046&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=399&keepalive=yes&lmt=1608052932785283&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMewAT3SgJRGn7wqDaDzNWcsAfrjFRu6k0wm7O_5YJeQAiANVhGmILp_gmNXnmixDesxsZ44_72YBT2SqjLLSZV32w%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 399,
bitrate: 2572342,
average_bitrate: 2088624,
size: Some(42567727),
last_modified: Some(1608052932785283),
index_range: Some(Range(
start: 700,
end: 1115,
@ -474,17 +505,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"av01.0.09M.08\"",
format: mp4,
codec: av01,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
audio_streams: [
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=934449&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAOdVu1woKNveQspV4WPm1PHrOBuzlrnPu2ZLvyiYZCSbAiAYODN_y5t1oU334SHUqqgyc4Wnt-9If-W98Fd966fy2A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=934449&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAOdVu1woKNveQspV4WPm1PHrOBuzlrnPu2ZLvyiYZCSbAiAYODN_y5t1oU334SHUqqgyc4Wnt-9If-W98Fd966fy2A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 249,
bitrate: 53039,
average_bitrate: 45845,
size: 934449,
last_modified: Some(1608509101590706),
index_range: Some(Range(
start: 266,
end: 551,
@ -499,16 +532,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.2200003),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=1245866&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMJJ-uGQureE70LIxHjHP9hFxqcWwsSlxXX6EjGKmFfEAiAvQ98YKkqUrweNnBZOI7pXJk1kuU_1hSsQ0KeNU4CbyQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=1245866&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAMJJ-uGQureE70LIxHjHP9hFxqcWwsSlxXX6EjGKmFfEAiAvQ98YKkqUrweNnBZOI7pXJk1kuU_1hSsQ0KeNU4CbyQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 250,
bitrate: 71268,
average_bitrate: 61123,
size: 1245866,
last_modified: Some(1608509101111096),
index_range: Some(Range(
start: 266,
end: 551,
@ -523,16 +559,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.2200003),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=2640283&dur=163.096&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANXIw4pIwIPvMGWnJSrA_bnmBX6KPBPqak18aPtKsI8jAiBvisRnEtFax7OTrwKbOiktCihoMraLkCi7Rnnu6JGmeQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=2640283&dur=163.096&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANXIw4pIwIPvMGWnJSrA_bnmBX6KPBPqak18aPtKsI8jAiBvisRnEtFax7OTrwKbOiktCihoMraLkCi7Rnnu6JGmeQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=2211222&vprv=1"),
itag: 140,
bitrate: 130268,
average_bitrate: 129508,
size: 2640283,
last_modified: Some(1580005579712232),
index_range: Some(Range(
start: 632,
end: 867,
@ -547,16 +586,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: Some(5.2159004),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=2476314&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKP_KjT_SSnz5WGXaveO56pJAEw166qT3cpBdAZI1zwCAiBWZKVQZxfOPWnqSp5FnRDyQBQ-6a2nZopyA1eHicgHtw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=WEB&clen=2476314&dur=163.061&ei=q1jpYtq3BJCX1gKVyJGQDg&expire=1659481355&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AGfBIFoT5D_NZAwXN7lVCS2VYLDMMegfaJQqvSJp-Hhy&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhANxHzq0WC6OvdTpPJp52z3eGAm-jzUX7fcKiWlJ0T9kEAiEA02Bjesi_an2-pUh0kHdKQe0s_7micbcv3JKiBlxsYGs%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C26&mn=sn-h0jelnez%2Csn-4g5edn6k&ms=au%2Conr&mt=1659459429&mv=m&mvi=4&n=T16m7p0RvV7UhQ&ns=tWuNfisHu8yiCA6Avm7nUlwH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAKP_KjT_SSnz5WGXaveO56pJAEw166qT3cpBdAZI1zwCAiBWZKVQZxfOPWnqSp5FnRDyQBQ-6a2nZopyA1eHicgHtw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-KhrZGE2opztWyVdAtyUNlb8dXPDs&txp=1311222&vprv=1"),
itag: 251,
bitrate: 140633,
average_bitrate: 121491,
size: 2476314,
last_modified: Some(1608509101894140),
index_range: Some(Range(
start: 266,
end: 551,
@ -571,7 +613,9 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.2200003),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
@ -588,6 +632,9 @@ VideoPlayer(
valid_until: "[date]",
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"),
abr_streaming_url: None,
abr_ustreamer_config: None,
po_token: None,
preview_frames: [
Frameset(
url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow",

View file

@ -34,11 +34,12 @@ VideoPlayer(
),
video_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=11439331&dur=163.096&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=mAEwZepBJSQPkQ&ns=orl5qWACo00YlHHyQZ7a6awH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANfXubbDcXpc25m3F5xQ97ygJRjrTvm8ruVxgnxgFAUBAiAEnj_3KacDNTTLUk-6ZEbL-52zxmBLU1iuTEDx0NvJzA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=11439331&dur=163.096&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=18&lmt=1580005476071743&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=mAEwZepBJSQPkQ&ns=orl5qWACo00YlHHyQZ7a6awH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhANfXubbDcXpc25m3F5xQ97ygJRjrTvm8ruVxgnxgFAUBAiAEnj_3KacDNTTLUk-6ZEbL-52zxmBLU1iuTEDx0NvJzA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1"),
itag: 18,
bitrate: 561339,
average_bitrate: 561109,
size: Some(11439331),
last_modified: Some(1580005476071743),
index_range: None,
init_range: None,
duration_ms: Some(163096),
@ -50,17 +51,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
video_only_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=1484736&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=278&keepalive=yes&lmt=1608509388295661&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgEQ0-VVvo41T4l2X26p5zP8Wo8sXOPmBWvCf2OW33ilgCIH2bIFOYgpmsml7FvRQj_SoLzPh7yBvmLZ61Kgsj4FUe&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=1484736&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=278&keepalive=yes&lmt=1608509388295661&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgEQ0-VVvo41T4l2X26p5zP8Wo8sXOPmBWvCf2OW33ilgCIH2bIFOYgpmsml7FvRQj_SoLzPh7yBvmLZ61Kgsj4FUe&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 278,
bitrate: 87458,
average_bitrate: 72857,
size: Some(1484736),
last_modified: Some(1608509388295661),
index_range: Some(Range(
start: 218,
end: 751,
@ -78,15 +81,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2973283&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=242&keepalive=yes&lmt=1608509388282028&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAO7DI5E91yHpLhgiWg9C99NsMoJBVOWsNTNF3os9kREQAiAr2oC8vFtXIHwkJJt45q0sdmjiJdkTO2i8VAjUodk6Xw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2973283&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=242&keepalive=yes&lmt=1608509388282028&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAO7DI5E91yHpLhgiWg9C99NsMoJBVOWsNTNF3os9kREQAiAr2oC8vFtXIHwkJJt45q0sdmjiJdkTO2i8VAjUodk6Xw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 242,
bitrate: 184064,
average_bitrate: 145902,
size: Some(2973283),
last_modified: Some(1608509388282028),
index_range: Some(Range(
start: 219,
end: 753,
@ -104,15 +109,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=7808990&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgTkOjFd0nExEtpr8sBIaNu9HhkxWNdjhSKufHMhLR8-8CIHJAmOuCD7VBv_krH6rn5zqXFqAfsq9rQPXlC3CcQrjM&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=7808990&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgTkOjFd0nExEtpr8sBIaNu9HhkxWNdjhSKufHMhLR8-8CIHJAmOuCD7VBv_krH6rn5zqXFqAfsq9rQPXlC3CcQrjM&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1"),
itag: 134,
bitrate: 538143,
average_bitrate: 383195,
size: Some(7808990),
last_modified: Some(1580005649163759),
index_range: Some(Range(
start: 740,
end: 1155,
@ -130,15 +137,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401e\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=5169510&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=243&keepalive=yes&lmt=1608509388282405&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAPqQfxwIANgIC3DrQ6avaWOhCvIMLdzMPQtFOx2gwEXNAiAwJp2mgN9-zl4vPOB2uoQXOfmGsYDB470q1zg7wRW4Sw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=5169510&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=243&keepalive=yes&lmt=1608509388282405&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAPqQfxwIANgIC3DrQ6avaWOhCvIMLdzMPQtFOx2gwEXNAiAwJp2mgN9-zl4vPOB2uoQXOfmGsYDB470q1zg7wRW4Sw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 243,
bitrate: 319085,
average_bitrate: 253673,
size: Some(5169510),
last_modified: Some(1608509388282405),
index_range: Some(Range(
start: 220,
end: 754,
@ -156,15 +165,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=8890590&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=244&keepalive=yes&lmt=1608509388284632&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIjdvhcThMxoo_v2bzEjaR_w0ryWFQDs0f0INaI5WPcVAiApQZUYTqcQJdfxZlNSsp7cl3FK8XPfDZ-qbVvj9GuauQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=8890590&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=244&keepalive=yes&lmt=1608509388284632&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIjdvhcThMxoo_v2bzEjaR_w0ryWFQDs0f0INaI5WPcVAiApQZUYTqcQJdfxZlNSsp7cl3FK8XPfDZ-qbVvj9GuauQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 244,
bitrate: 539056,
average_bitrate: 436270,
size: Some(8890590),
last_modified: Some(1608509388284632),
index_range: Some(Range(
start: 220,
end: 754,
@ -182,15 +193,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=16547577&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=247&keepalive=yes&lmt=1608509388326822&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgBV4Oa1IQ0YNDvRrKO5ec3Pfbg65MxzmIxCcm0gOuwT0CIFysQdow6DQXzz1W9KZVuqACTdjXQ3-yiBj9GcmNw3HE&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=16547577&dur=163.029&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=247&keepalive=yes&lmt=1608509388326822&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgBV4Oa1IQ0YNDvRrKO5ec3Pfbg65MxzmIxCcm0gOuwT0CIFysQdow6DQXzz1W9KZVuqACTdjXQ3-yiBj9GcmNw3HE&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 247,
bitrate: 982813,
average_bitrate: 812006,
size: Some(16547577),
last_modified: Some(1608509388326822),
index_range: Some(Range(
start: 220,
end: 754,
@ -208,15 +221,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=35955780&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=302&keepalive=yes&lmt=1608509234088626&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAOiqSNfGfOprZ9InWVMc7gY0KrTf8weLibcpK0W2Hfa6AiAFHW213qsByzlar5ivCAYttjo1rPciQnLEnh-izJ3ZhA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=35955780&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=302&keepalive=yes&lmt=1608509234088626&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAOiqSNfGfOprZ9InWVMc7gY0KrTf8weLibcpK0W2Hfa6AiAFHW213qsByzlar5ivCAYttjo1rPciQnLEnh-izJ3ZhA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 302,
bitrate: 2354009,
average_bitrate: 1764202,
size: Some(35955780),
last_modified: Some(1608509234088626),
index_range: Some(Range(
start: 219,
end: 771,
@ -234,15 +249,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=65400181&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgdkJv6w9_Azf0m6poA-ULyX0eH_GKBtSJRwUY1lNBAZgCIDCrC0lnu__ycTaIhg0pUcsRUqay60S3QMo5084EWifd&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=65400181&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgdkJv6w9_Azf0m6poA-ULyX0eH_GKBtSJRwUY1lNBAZgCIDCrC0lnu__ycTaIhg0pUcsRUqay60S3QMo5084EWifd&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1"),
itag: 299,
bitrate: 4190323,
average_bitrate: 3208919,
size: Some(65400181),
last_modified: Some(1580005649161486),
index_range: Some(Range(
start: 740,
end: 1155,
@ -260,15 +277,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64002a\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=62993617&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=303&keepalive=yes&lmt=1608509371758331&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgZi9dDSMWh10NID8-QNn3azIH1zw5UooZrRTPZjVn7hYCIAm9bFc6NBwJ_DzY4V2R_zGmJSpOwQl8LEsfCb7hf6i7&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=62993617&dur=163.046&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=303&keepalive=yes&lmt=1608509371758331&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgZi9dDSMWh10NID8-QNn3azIH1zw5UooZrRTPZjVn7hYCIAm9bFc6NBwJ_DzY4V2R_zGmJSpOwQl8LEsfCb7hf6i7&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 303,
bitrate: 3832648,
average_bitrate: 3090839,
size: Some(62993617),
last_modified: Some(1608509371758331),
index_range: Some(Range(
start: 219,
end: 776,
@ -286,17 +305,19 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
audio_streams: [
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=934449&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMUfr2X-eQJt1abn-IK1H4d5DtvKZuBaETo4opNi6mqCAiEAvBmrmuaoFjB1CJ2Kug87w-Uv6OCdxyrJ_3HIaHX9KBI%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=934449&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=249&keepalive=yes&lmt=1608509101590706&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMUfr2X-eQJt1abn-IK1H4d5DtvKZuBaETo4opNi6mqCAiEAvBmrmuaoFjB1CJ2Kug87w-Uv6OCdxyrJ_3HIaHX9KBI%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 249,
bitrate: 53039,
average_bitrate: 45845,
size: 934449,
last_modified: Some(1608509101590706),
index_range: Some(Range(
start: 266,
end: 551,
@ -311,16 +332,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(0.0006532669),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=1245866&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIflUU4t4Ukf4CXW3ttB5c8SnP4z4z3ef-7EFVMFv4U8AiAlcKmmofCTzzr2NRRsRVosQdpDBphUqWyVzS7noGrixw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=1245866&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=250&keepalive=yes&lmt=1608509101111096&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhAIflUU4t4Ukf4CXW3ttB5c8SnP4z4z3ef-7EFVMFv4U8AiAlcKmmofCTzzr2NRRsRVosQdpDBphUqWyVzS7noGrixw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 250,
bitrate: 71268,
average_bitrate: 61123,
size: 1245866,
last_modified: Some(1608509101111096),
index_range: Some(Range(
start: 266,
end: 551,
@ -335,16 +359,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(0.0006532669),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2640283&dur=163.096&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhALBveArAZ7DP9r1BIpNz6ZXst5MtzvUM72jhtYMrildCAiEArvwqaqcowZwR_UrRM-O7jq2CMxgBtbnmul27AEcBqEI%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2640283&dur=163.096&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhALBveArAZ7DP9r1BIpNz6ZXst5MtzvUM72jhtYMrildCAiEArvwqaqcowZwR_UrRM-O7jq2CMxgBtbnmul27AEcBqEI%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=2211222&vprv=1"),
itag: 140,
bitrate: 130268,
average_bitrate: 129508,
size: 2640283,
last_modified: Some(1580005579712232),
index_range: Some(Range(
start: 632,
end: 867,
@ -359,16 +386,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: Some(-0.003446579),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2476314&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgARPqD-6172OshMHeV8DpONV7tnPvdsxcg8QlaIGxcuMCICSe8LWvhRTEO2bdAQ43OzOoc5XfJcj3veyhScVXVz8O&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=WEB_REMIX&clen=2476314&dur=163.061&ei=knDpYub6BojEgAf6jbLgDw&expire=1659487474&fexp=24001373%2C24007246&fvip=4&gir=yes&id=o-AM-wcJVO-yYYbVFnuifnzM4eRnD-AG1bS1AhLoDqi_is&initcwndbps=1418750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=251&keepalive=yes&lmt=1608509101894140&lsig=AG3C_xAwRgIhAMwYJqxve8BSujC-oaSFBbq67p-rFi7saU5V8Yb3qrjLAiEAlrMKR_sadHrkFpy7o7lGzKOCmU1OQazCNBbXjDT2a-o%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1659465669&mv=m&mvi=5&n=1taQMNHGExb_Vg&ns=UTT8RXHZNhPYTw6NgkzWMWEH&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgARPqD-6172OshMHeV8DpONV7tnPvdsxcg8QlaIGxcuMCICSe8LWvhRTEO2bdAQ43OzOoc5XfJcj3veyhScVXVz8O&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&spc=lT-Khox4YuJQ2wmH79zYALRvsWTPCUc&txp=1311222&vprv=1"),
itag: 251,
bitrate: 140633,
average_bitrate: 121491,
size: 2476314,
last_modified: Some(1608509101894140),
index_range: Some(Range(
start: 266,
end: 551,
@ -383,7 +413,9 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(0.0006532669),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
@ -400,6 +432,9 @@ VideoPlayer(
valid_until: "[date]",
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"),
abr_streaming_url: None,
abr_ustreamer_config: None,
po_token: None,
preview_frames: [
Frameset(
url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLAXobPyrylgm8IEvjlZzqYTiPe1Ow",

View file

@ -57,11 +57,12 @@ VideoPlayer(
video_streams: [],
video_only_streams: [
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=7808990&dur=163.029&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMFQo_RyC3Ud44QVGtKckMcuq5UQ3J7CgYsYl0bXaWMUAiEAhMi1h0ru4zoIGX0jBZT23dozvtrhf_m61p4qbAfEhZo%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=7808990&dur=163.029&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=134&keepalive=yes&lmt=1580005649163759&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMFQo_RyC3Ud44QVGtKckMcuq5UQ3J7CgYsYl0bXaWMUAiEAhMi1h0ru4zoIGX0jBZT23dozvtrhf_m61p4qbAfEhZo%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1"),
itag: 134,
bitrate: 538143,
average_bitrate: 383195,
size: Some(7808990),
last_modified: Some(1580005649163759),
index_range: Some(Range(
start: 740,
end: 1155,
@ -79,15 +80,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4D401E\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=65400181&dur=163.046&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAP6zxXXA18ToZWUfalauhhsgOsDHTu-R0QrqNrJR7D5kAiEAi8HBa9OkYwmA0bcRxhgvXfN9JsFlXwCWJ-x4ty6TjoY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=65400181&dur=163.046&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=299&keepalive=yes&lmt=1580005649161486&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAP6zxXXA18ToZWUfalauhhsgOsDHTu-R0QrqNrJR7D5kAiEAi8HBa9OkYwmA0bcRxhgvXfN9JsFlXwCWJ-x4ty6TjoY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1"),
itag: 299,
bitrate: 4190323,
average_bitrate: 3208919,
size: Some(65400181),
last_modified: Some(1580005649161486),
index_range: Some(Range(
start: 740,
end: 1155,
@ -105,17 +108,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64002A\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
audio_streams: [
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=995840&dur=163.189&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=139&keepalive=yes&lmt=1580005582214385&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMXDvZZznm1LafIKh_pdGf-TjY5Kz-F9N67o6gXenKouAiEA5qji45i5ABmAytPDOORjw0OaBmwX88S7bgUWcmF-_LU%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=995840&dur=163.189&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=139&keepalive=yes&lmt=1580005582214385&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMXDvZZznm1LafIKh_pdGf-TjY5Kz-F9N67o6gXenKouAiEA5qji45i5ABmAytPDOORjw0OaBmwX88S7bgUWcmF-_LU%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1"),
itag: 139,
bitrate: 49724,
average_bitrate: 48818,
size: 995840,
last_modified: Some(1580005582214385),
index_range: Some(Range(
start: 641,
end: 876,
@ -130,16 +135,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: Some(5.2159004),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=2640283&dur=163.096&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgcsPm6rrUAwCi1VTGf0FMDTjzjM01__iTC13PnzDTFeQCIQCJ_EGeKVZztkmK3Cr7gVuxUP83XCSlP01YLx5FO-PPcQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1",
url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&clen=2640283&dur=163.096&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&gir=yes&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&itag=140&keepalive=yes&lmt=1580005579712232&lsig=AG3C_xAwRQIgWKVoDpyI6QmVnkdGzdirFtjMAXhmLex64VTO7UUJd-4CIQDoJKkT2-Kpa7j0merJJoZDs4IkkXSjdNm3bvdCL8t2Pg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&otfp=1&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgcsPm6rrUAwCi1VTGf0FMDTjzjM01__iTC13PnzDTFeQCIQCJ_EGeKVZztkmK3Cr7gVuxUP83XCSlP01YLx5FO-PPcQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cotfp%2Cdur%2Clmt&svpuc=1&txp=2211222&vprv=1"),
itag: 140,
bitrate: 130268,
average_bitrate: 129508,
size: 2640283,
last_modified: Some(1580005579712232),
index_range: Some(Range(
start: 632,
end: 867,
@ -154,7 +162,9 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: Some(5.2159004),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
@ -171,6 +181,9 @@ VideoPlayer(
valid_until: "[date]",
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,
abr_streaming_url: Some("https://rr4---sn-h0jelnez.googlevideo.com/videoplayback?c=IOS&ei=q1jpYq-xHs7NgQev0bfwAQ&expire=1659481355&fexp=24001373%2C24007246&fvip=5&id=o-ANNg3iPHI56jhLSlPQk4pi4mdub5iAby0hmJBVrtiJgY&initcwndbps=1513750&ip=2003%3Ade%3Aaf0e%3A2f00%3Ade47%3A297%3Aa6db%3A774e&keepalive=yes&lsig=AG3C_xAwRgIhAK6T5ehnFBsc0FOurPHH1ME_vGcVysI-g5jrtEsvX64sAiEArY-iAvQCsc4R8yg8dvMdpnuHPIcPMCnRgyh8E527HF0%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mm=31%2C29&mn=sn-h0jelnez%2Csn-h0jeenek&ms=au%2Crdu&mt=1659459429&mv=m&mvi=4&pl=37&rbqsm=fr&requiressl=yes&sabr=1&sig=AOq0QJ8wRgIhAJCJpb5gE12jQc2qOUy-Y61vEHeiAP_F78weNCzj8VklAiEAwR2PK52CmwsVHfRVk75OOYOxwYKNW2g1eDBw3COBP9w%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Csvpuc%2Csabr&svpuc=1"),
abr_ustreamer_config: Some("CpYECp0DCAAQgAUY6AIl-n6qPi0AAIA_NT0Klz9oAXI6ChJtZnMyX2NtZnNfdjNfMV8wNDMSIAoeCgxkZXZpY2VfbW9kZWwSDgoMCgppcGhvbmUxNCw1GAAgAXIWChJtZnMyX2NtZnNfdjNfMV8wNDMYAHjoAoABAagBAbUB9ijcP6AC6AK4AgDaAmEQsOoBGKhGIKCcASjYNjCYdXCIJ4AB9AO4AQHgAQP4AQGQAgGYAgygAgGoAgGwAgG4AgHAAgHIAgHQAgLgAgHoAgLwAgGAAwKIA4gnmAMBqAMIwAMByAMB2AMB-LWR5QwB-gIvCAwQGBgyIDItAABwQjUAAIxCQAFIAVAKWAplAACAQGjAcM0BAACAP_ABAegC0AWCAwCQAwGgAwGoAwGwAwPQAwHYAwHgA5BOuAQBygRWChUI4NQDEJh1GOgHJQAAAAAoADAAQAEQ4NQDGNAPKjYKCnRiX2Nvc3RfNTAgDykAAAAAAAAAAEgBUAFdZmbmPmXNzEw-bZqZGT91mpkZP3jAqQeSAQDoBAHwBAH4BAGQBQGgBQEYASABMgwIqwIQjrrY25ug5wIyDAiqAhCOutjbm6DnAjIMCIcBEI662NuboOcCMgwIhgEQ78vY25ug5wIyDAiFARCOutjbm6DnAjIMCKABEI662NuboOcCMgwIiwEQ8aniu5ug5wIyDAiMARDozcm6m6DnAjoAEkwA8tjvwTBFAiAyo6mtW-M8Y8noBO_6Y3RmNo5U2LntCwiKcI2yye_zRgIhAK27d1UbqzhtkQhminIBAajD70ONeAQNwjt7VRpJRDimGgJlaQ=="),
po_token: None,
preview_frames: [
Frameset(
url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ",

View file

@ -24,11 +24,12 @@ VideoPlayer(
),
video_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IT4iUCpJNJWUitTMgIi6njuKSsi3MNed1Szyf0qysTX0v1Nf6AyCvjIGbek5Fn50kuBrGtRJ5q&c=TVHTML5&clen=10262148&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=18&lmt=1700885551970466&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=BMzwItzIOB1HhmG&ns=YmgbZhlLp0C-9ilsQWGAyUAQ&pl=26&ratebypass=yes&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgUah4qH8RqPzmo75ExCWSiRYlUlsAk0v9gl638LitVNICICxFs5lK3CsmOAja0bsXavXkyykzpdhHZKGXOZQYT1f8&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&svpuc=1&txp=1318224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IT4iUCpJNJWUitTMgIi6njuKSsi3MNed1Szyf0qysTX0v1Nf6AyCvjIGbek5Fn50kuBrGtRJ5q&c=TVHTML5&clen=10262148&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=18&lmt=1700885551970466&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=BMzwItzIOB1HhmG&ns=YmgbZhlLp0C-9ilsQWGAyUAQ&pl=26&ratebypass=yes&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgUah4qH8RqPzmo75ExCWSiRYlUlsAk0v9gl638LitVNICICxFs5lK3CsmOAja0bsXavXkyykzpdhHZKGXOZQYT1f8&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&svpuc=1&txp=1318224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 18,
bitrate: 503574,
average_bitrate: 503367,
size: Some(10262148),
last_modified: Some(1700885551970466),
index_range: None,
init_range: None,
duration_ms: Some(163096),
@ -40,17 +41,19 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
video_only_streams: [
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2273274&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=160&keepalive=yes&lmt=1705967288821438&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgb8eXnQ6MSJ3PuvFVBdYIWTnFobH8mTC9zbZpBNxLbBYCICkPLKEm3gNbW5HIFXs7bwF5rSqUKHHnXNK91qMslQog&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2273274&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=160&keepalive=yes&lmt=1705967288821438&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgb8eXnQ6MSJ3PuvFVBdYIWTnFobH8mTC9zbZpBNxLbBYCICkPLKEm3gNbW5HIFXs7bwF5rSqUKHHnXNK91qMslQog&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 160,
bitrate: 114816,
average_bitrate: 111551,
size: Some(2273274),
last_modified: Some(1705967288821438),
index_range: Some(Range(
start: 738,
end: 1165,
@ -68,15 +71,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d400c\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1151892&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=278&keepalive=yes&lmt=1705966620402771&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAP4IybR7cZRpx7IX1ke6UIu_hdFZN3LOuHBDywg_xv5WAiB8_XEx8VhT9OlFxmM-cY0fl6-7GT9uj3clMIPDk2w7cA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1151892&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=278&keepalive=yes&lmt=1705966620402771&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAP4IybR7cZRpx7IX1ke6UIu_hdFZN3LOuHBDywg_xv5WAiB8_XEx8VhT9OlFxmM-cY0fl6-7GT9uj3clMIPDk2w7cA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 278,
bitrate: 70630,
average_bitrate: 56524,
size: Some(1151892),
last_modified: Some(1705966620402771),
index_range: Some(Range(
start: 218,
end: 767,
@ -94,15 +99,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=5026513&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=133&keepalive=yes&lmt=1705967298859029&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgPF0ms4OEe15BTjOFVCkvf52UeTUf0b62_pavCfEyGjcCIH-0AoxzyT8iioWFFaX7iYjqzzaUTpo8rgAPQ0uX8DJa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=5026513&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=133&keepalive=yes&lmt=1705967298859029&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgPF0ms4OEe15BTjOFVCkvf52UeTUf0b62_pavCfEyGjcCIH-0AoxzyT8iioWFFaX7iYjqzzaUTpo8rgAPQ0uX8DJa&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 133,
bitrate: 257417,
average_bitrate: 246656,
size: Some(5026513),
last_modified: Some(1705967298859029),
index_range: Some(Range(
start: 739,
end: 1166,
@ -120,15 +127,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d4015\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2541351&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=242&keepalive=yes&lmt=1705966614837727&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgKj1JyMGwYtf16zLJsmbnizz5_v3jaZSa7-j-ls8-qzECIQDKUd50iIc52h7zOX50Hf1SkbV9h-hP4QHs-wkik1fk6Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2541351&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=242&keepalive=yes&lmt=1705966614837727&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgKj1JyMGwYtf16zLJsmbnizz5_v3jaZSa7-j-ls8-qzECIQDKUd50iIc52h7zOX50Hf1SkbV9h-hP4QHs-wkik1fk6Q%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 242,
bitrate: 149589,
average_bitrate: 124706,
size: Some(2541351),
last_modified: Some(1705966614837727),
index_range: Some(Range(
start: 219,
end: 768,
@ -146,15 +155,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7810925&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=134&keepalive=yes&lmt=1705967286812435&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAJ92IgZgdk3_WLsfzJV_ZyrSFSbzpsoJh3DkRKDHbNxzAiEA9UbnVlXQ2S3BUimLmWC5TZQfhIkc-PlLnZ81fL0S5yA%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7810925&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=134&keepalive=yes&lmt=1705967286812435&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAJ92IgZgdk3_WLsfzJV_ZyrSFSbzpsoJh3DkRKDHbNxzAiEA9UbnVlXQ2S3BUimLmWC5TZQfhIkc-PlLnZ81fL0S5yA%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 134,
bitrate: 537902,
average_bitrate: 383290,
size: Some(7810925),
last_modified: Some(1705967286812435),
index_range: Some(Range(
start: 740,
end: 1167,
@ -172,15 +183,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401e\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=4188954&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=243&keepalive=yes&lmt=1705966624121874&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgSCLGQvdZKNXym0zt7c3Yw_4e0J8-wNxtPagPRRn4dRoCIQCOj0IzalNG4EcowBIyK2LC6NLFDr8Zt6sNVkqPjw6lGg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=4188954&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=243&keepalive=yes&lmt=1705966624121874&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgSCLGQvdZKNXym0zt7c3Yw_4e0J8-wNxtPagPRRn4dRoCIQCOj0IzalNG4EcowBIyK2LC6NLFDr8Zt6sNVkqPjw6lGg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 243,
bitrate: 248858,
average_bitrate: 205556,
size: Some(4188954),
last_modified: Some(1705966624121874),
index_range: Some(Range(
start: 220,
end: 770,
@ -198,15 +211,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723538&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=135&keepalive=yes&lmt=1705967282545273&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM843wAa1e7Gc1S69gfXckm7hdgIKPXp0bUSh3hO6W5zAiEA-DDEPGsZBmF5N8VbPy75dhy3rLpE1F18KtWgmrUm2Pg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723538&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=135&keepalive=yes&lmt=1705967282545273&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM843wAa1e7Gc1S69gfXckm7hdgIKPXp0bUSh3hO6W5zAiEA-DDEPGsZBmF5N8VbPy75dhy3rLpE1F18KtWgmrUm2Pg%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 135,
bitrate: 978945,
average_bitrate: 722499,
size: Some(14723538),
last_modified: Some(1705967282545273),
index_range: Some(Range(
start: 740,
end: 1167,
@ -224,15 +239,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401f\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7788899&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=244&keepalive=yes&lmt=1705966622098793&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAKGyn799bfkVHYE195sPmD60dCMppqJrBM0O-sjgYTzzAiAoBjkNAtL90sXw2YP9UTW9JrMhPSvPiBI_KiCVMJAkFQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=7788899&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=244&keepalive=yes&lmt=1705966622098793&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAKGyn799bfkVHYE195sPmD60dCMppqJrBM0O-sjgYTzzAiAoBjkNAtL90sXw2YP9UTW9JrMhPSvPiBI_KiCVMJAkFQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 244,
bitrate: 467884,
average_bitrate: 382209,
size: Some(7788899),
last_modified: Some(1705966622098793),
index_range: Some(Range(
start: 220,
end: 770,
@ -250,15 +267,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=24616305&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=136&keepalive=yes&lmt=1705967307531372&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM57L2Utesn4xVyT0HSwR9Khv_S-efx4uFAbCPkZFoRXAiEAtIu63-jF2_FZkOMmZAqGU3SRU9QgxoajRjBhMFwcOuk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=24616305&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=136&keepalive=yes&lmt=1705967307531372&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAM57L2Utesn4xVyT0HSwR9Khv_S-efx4uFAbCPkZFoRXAiEAtIu63-jF2_FZkOMmZAqGU3SRU9QgxoajRjBhMFwcOuk%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 136,
bitrate: 1560439,
average_bitrate: 1207947,
size: Some(24616305),
last_modified: Some(1705967307531372),
index_range: Some(Range(
start: 739,
end: 1166,
@ -276,15 +295,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d401f\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723992&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=247&keepalive=yes&lmt=1705966613897741&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAL-upITxk7r9FQL5F4WL0A6SjPw673qyyzmXIC48eKfTAiEAlkdkx7IFYtehbhKakbffvIebpPXRtxSgBWLl7WEHCrE%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=14723992&dur=163.029&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=247&keepalive=yes&lmt=1705966613897741&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAL-upITxk7r9FQL5F4WL0A6SjPw673qyyzmXIC48eKfTAiEAlkdkx7IFYtehbhKakbffvIebpPXRtxSgBWLl7WEHCrE%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 247,
bitrate: 929607,
average_bitrate: 722521,
size: Some(14723992),
last_modified: Some(1705966613897741),
index_range: Some(Range(
start: 220,
end: 770,
@ -302,15 +323,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=34544823&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=298&keepalive=yes&lmt=1705967092637061&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAIIGU41JunuODw9qIlSoYQcwkCYO6k9XOVlDn1Nxqnu7AiEAoiMOgYU8s8lp01fW0L86hHrSrtlvOLSI9XA50iyIGBc%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=34544823&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=298&keepalive=yes&lmt=1705967092637061&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRgIhAIIGU41JunuODw9qIlSoYQcwkCYO6k9XOVlDn1Nxqnu7AiEAoiMOgYU8s8lp01fW0L86hHrSrtlvOLSI9XA50iyIGBc%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 298,
bitrate: 2188961,
average_bitrate: 1694973,
size: Some(34544823),
last_modified: Some(1705967092637061),
index_range: Some(Range(
start: 739,
end: 1166,
@ -328,15 +351,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.4d4020\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=30205331&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=302&keepalive=yes&lmt=1705966545733919&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAL428Az_BKxxff4FlH4WleHSy4Igq3mR71NuTMOc9xU3AiBN4lXfH9DklGaQUMnOT8wAhiMuzR73bW3cwr744TSoNA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=30205331&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=302&keepalive=yes&lmt=1705966545733919&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAL428Az_BKxxff4FlH4WleHSy4Igq3mR71NuTMOc9xU3AiBN4lXfH9DklGaQUMnOT8wAhiMuzR73bW3cwr744TSoNA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 302,
bitrate: 2250391,
average_bitrate: 1482051,
size: Some(30205331),
last_modified: Some(1705966545733919),
index_range: Some(Range(
start: 219,
end: 786,
@ -354,15 +379,17 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=62057888&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=299&keepalive=yes&lmt=1705967093743693&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgBEemc0Cvd3KhNooNRblgX64_fjNSP30RmWDfFwDR7qYCIQCXpQ9FO0_X93ZHcyvRZCKX5gbJuusCReaRcJbRLFsM_g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=62057888&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=299&keepalive=yes&lmt=1705967093743693&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgBEemc0Cvd3KhNooNRblgX64_fjNSP30RmWDfFwDR7qYCIQCXpQ9FO0_X93ZHcyvRZCKX5gbJuusCReaRcJbRLFsM_g%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 299,
bitrate: 3926810,
average_bitrate: 3044926,
size: Some(62057888),
last_modified: Some(1705967093743693),
index_range: Some(Range(
start: 740,
end: 1167,
@ -380,15 +407,17 @@ VideoPlayer(
mime: "video/mp4; codecs=\"avc1.64002a\"",
format: mp4,
codec: avc1,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
VideoStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=55300085&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=303&keepalive=yes&lmt=1705966651743358&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgTZlmOcsLYJ_a9SnVLehXnaoajtreQO97qawEIDPEi8sCIQDKFdtBWWMuQUb9X8H-x92B3q-y0g8TvAPanR95cfklXQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303&bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=55300085&dur=163.046&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=303&keepalive=yes&lmt=1705966651743358&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgTZlmOcsLYJ_a9SnVLehXnaoajtreQO97qawEIDPEi8sCIQDKFdtBWWMuQUb9X8H-x92B3q-y0g8TvAPanR95cfklXQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=130F224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 303,
bitrate: 3473307,
average_bitrate: 2713348,
size: Some(55300085),
last_modified: Some(1705966651743358),
index_range: Some(Range(
start: 219,
end: 792,
@ -406,17 +435,19 @@ VideoPlayer(
mime: "video/webm; codecs=\"vp9\"",
format: webm,
codec: vp9,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
],
audio_streams: [
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=934750&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=249&keepalive=yes&lmt=1714877357172339&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAItfaWkRs94vqyae7GR4M1xHoQO2lduvNRFugRSf0h-IAiA9fdLOJMwPI8vAO2C13igyv2qGSpOlKQptS4sN6p5Ffw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=934750&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=249&keepalive=yes&lmt=1714877357172339&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIhAItfaWkRs94vqyae7GR4M1xHoQO2lduvNRFugRSf0h-IAiA9fdLOJMwPI8vAO2C13igyv2qGSpOlKQptS4sN6p5Ffw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 249,
bitrate: 53073,
average_bitrate: 45860,
size: 934750,
last_modified: Some(1714877357172339),
index_range: Some(Range(
start: 266,
end: 551,
@ -431,16 +462,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.21),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1245582&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=250&keepalive=yes&lmt=1714877466693058&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgdJ1SjWwaloQecEblSIMFp2qFmpG_kKYZP1vX_M55dE0CIQCDSfa_FsaiFRcNL-1LRTgCIRSO7dj5vrpKR1Ya-KbmMw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=1245582&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=250&keepalive=yes&lmt=1714877466693058&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgdJ1SjWwaloQecEblSIMFp2qFmpG_kKYZP1vX_M55dE0CIQCDSfa_FsaiFRcNL-1LRTgCIRSO7dj5vrpKR1Ya-KbmMw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 250,
bitrate: 71197,
average_bitrate: 61109,
size: 1245582,
last_modified: Some(1714877466693058),
index_range: Some(Range(
start: 266,
end: 551,
@ -455,16 +489,19 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.21),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2640283&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=140&keepalive=yes&lmt=1705966477945761&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgSxdbLrbojMVJcyRzsI2TrzOf78LN28bWcsHpbs4QXDwCIHidfXoriWMHfuiktUCdzLuUmksU7r5vITdh6u0puNmx&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2640283&dur=163.096&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=140&keepalive=yes&lmt=1705966477945761&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRAIgSxdbLrbojMVJcyRzsI2TrzOf78LN28bWcsHpbs4QXDwCIHidfXoriWMHfuiktUCdzLuUmksU7r5vITdh6u0puNmx&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 140,
bitrate: 130268,
average_bitrate: 129508,
size: 2640283,
last_modified: Some(1705966477945761),
index_range: Some(Range(
start: 632,
end: 867,
@ -479,16 +516,19 @@ VideoPlayer(
codec: mp4a,
channels: Some(2),
loudness_db: Some(5.2200003),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
AudioStream(
url: "https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2480393&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=251&keepalive=yes&lmt=1714877359450110&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgO0jG-x2l6AF7tjryIX_oM3np78WgNDiseezppLfbQrgCIQCVLdpDhclKc8vQgWGzKXcqsAxgNl5S3MlLT8u1Jeok2A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D",
url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?bui=AXc671IvQBUNCtxNiAkj0M-Bvcb-N5cUu1XFk68f4Cnj0sFLEy1sixyW5lThzLYJXioG8kVQ2xT9KNLS&c=TVHTML5&clen=2480393&dur=163.061&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&gir=yes&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&itag=251&keepalive=yes&lmt=1714877359450110&lmw=1&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=SWvqB0UTkUvifuM&ns=ZR8RwjQ3VJGDvQifdaM1IRMQ&pl=26&requiressl=yes&rqh=1&sefc=1&sig=AJfQdSswRQIgO0jG-x2l6AF7tjryIX_oM3np78WgNDiseezppLfbQrgCIQCVLdpDhclKc8vQgWGzKXcqsAxgNl5S3MlLT8u1Jeok2A%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&svpuc=1&txp=1308224&vprv=1&xpc=EgVo2aDSNQ%3D%3D"),
itag: 251,
bitrate: 140833,
average_bitrate: 121691,
size: 2480393,
last_modified: Some(1714877359450110),
index_range: Some(Range(
start: 266,
end: 551,
@ -503,7 +543,9 @@ VideoPlayer(
codec: opus,
channels: Some(2),
loudness_db: Some(5.21),
is_drc: false,
track: None,
xtags: None,
drm_track_type: None,
drm_systems: [],
),
@ -520,6 +562,9 @@ VideoPlayer(
valid_until: "[date]",
hls_manifest_url: None,
dash_manifest_url: None,
abr_streaming_url: Some("https://rr5---sn-h0jeenek.googlevideo.com/videoplayback?c=TVHTML5&ei=viioZtTdKteHi9oPl42KsAg&expire=1722318110&fvip=4&id=o-AC7iotZ_nCvg7C6fK7ofX174GXVOdwW68lsyXLLmCs0h&initcwndbps=1957500&ip=93.235.183.158&keepalive=yes&lsig=AGtxev0wRgIhANyFV4Ji7jlkXvfkb_czMQDZCiu6AbJ3Kzyv_s9V9WyvAiEA0o8XuM9kyh98hG1yg7h44L3I5OAUXuTpQdjxUaZ1V4A%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=mQ&mm=31%2C29&mn=sn-h0jeenek%2Csn-h0jelnez&ms=au%2Crdu&mt=1722295996&mv=m&mvi=5&n=eBXmY26Y0c3VPyt&ns=Kl83P0QZk1oI9742KUD7ly8Q&pl=26&requiressl=yes&rqh=1&sabr=1&sig=AJfQdSswRAIgJRK55pIkQ3Pak9jZ4fHPDsxXv0YgkxKE-FFdIN12ph8CIFHlFEvAoUOoX4Fd1RmyCJqgLZhDkSLwD6s-xVW25kYL&smc=1&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cxpc%2Csvpuc%2Cns%2Csabr%2Crqh&svpuc=1&xpc=EgVo2aDSNQ%3D%3D"),
abr_ustreamer_config: Some("CswJCpcHCAAlAACAPy1SuF4_NQAAwD9YAWABaAFyFgoSbWZzMl9jbWZzX3YzXzJfMTA5GAB4j06gAQGoAQCQAgG4AgDIAgHaAroBELDqARioRiCgnAEoiCcwmHVwiCeAAfQDuAEB4AEDkAIBmAIMoAIBwAIB0AIC4AIB6AIEgAMCiAOIJ5gDAagDA8ADAcgDAdADAfgDAYAEAYgEAZAEAZgEAaAEAagEAcgEAdAEAdgEAeAEAOgEAfgEB4AFfYgFAbAFAbgFAcAFAcgFAdAFAdgFAeAF0A_oBQH4BdAPgAYBuAYBwAYB0AYB2AYB6AYB8AYB-AYBkAcBqAcB2AcB-LWR5QwB-gKeAi0AAIJCNQAAlkJIAWUAAIBAaMBwqAHQhgOwAeADuAEBzQEAAIA_8AEB_QEAAIA_hQKamRk-jQIAAIA_lQIAAAJCmAIBtQIAAIA_wALgA9ICEbD__________wEePEZaXF1e2gIFMjA6MDDgAnjoAugC9QIK16M7_QLNzMw9gAMBkAMBnQMK1yM9oAMBuAMByAMB2AMB5QNiSkRA7QMyyvM-8AMB_QNmZoY_hQQAAIBAmAQB1QQAACBB6ATwEPAEAb0Fo0Afu8UF308tP8gFAeAFAZgGAaAGAagGAbUGvTeGNb0GMzODQJAHAcAHAcgHAdUHAICdQ-UHAIAJRKEIAAAAAAAA8L-pCAAAAAAAAPC_sAjwAbgIAdgI8AHoCAGCAwCQAwGoAwGwAwPQAwHYAwHgA5BOuAQBygQcChMIwKkHEJh1GOgHJQAAAAAoADAAEODUAxjQD9IEDQoICLAJELAJIAEgiCfaBAsKBgjwLhDwLiCIJ-gEAfgEAYAFAYgFAZAFAagFAbAFAdAFAdgFAegFAfAFAYgGAZgGAagGgIACwAYByAYB0gYUCOgHEGQaDQiIJxUAAAA_Hc3MTD-CBwoVAACAPxhkIJBOiAcBoAcBsAcBuAcBwAcB-AcBgAgBoAgBsAgBuAgB0ggGCAEQARgBmAkBqQkAAAAAAADwv7EJAAAAAAAA8L_ICQHaCSRFRzRmTDl1Sm9tL2NWdklmNjg4bnB6c2t4SVQrMXl0N09POHXgCQGwCgHYCgHwCgGICwGYCwG4CwHICwHQCwHYCwHqCwSLBowG8AsB-AsBkAwBoAwBqAyQAbAMAbgMAcAMAdAMAeAMAegMAYANAaANAdANAeANAYgOAZAOAbAOAYinocoLARgBIAEyDAirAhDNgPzUlvKDAzIMCK8CEP64moKV8oMDMgwIiAEQ7Mj0upfygwMyDAj3ARCNxJTwlPKDAzIMCKoCEIW7uNSW8oMDMgwIrgIQn5LUz5TygwMyDAiHARD5xP-ul_KDAzIMCPQBEOmKifSU8oMDMgwIhgEQk_6DsZfygwMyDAjzARCSyIT1lPKDAzIMCIUBEJWg47aX8oMDMgwI8gEQ3_PN8JTygwMyDAigARC-zf6xl_KDAzIMCJYCENPIofOU8oMDMgwIjAEQodeqr5TygwMyDAj5ARDzzNT9v_WFAzIMCPoBEMKb8bHA9YUDMgwI-wEQ_s_f_r_1hQM6AEgAUiYaAmVuKAAyGFVDYnh4RWktSW1QbGJMeDVGLWZIZXRFZzgAQABYAJDL048OARJNAKEYC4YwRgIhAIj4Ug4dw_gq15NXvgcfXpI1Fm_fhmwl-4ad-rX3Ffg_AiEAkZDsUgoAGLOXIvWZlNyuyfu8HLWt-snFl3gkTiPo2acaAmVp"),
po_token: None,
preview_frames: [
Frameset(
url_template: "https://i.ytimg.com/sb/pPvd8UxmSbQ/storyboard3_L0/default.jpg?sqp=-oaymwGbA0g48quKqQOSA4gBAZUBAAAEQpgBMqABPKgBBLABELABDbABDLABELABFbABH7ABJrABLbABDrABDrABD7ABErABF7ABK7ABLLABKbABD7ABDrABELABFbABH7ABKrABMrABKbABD7ABEbABFLABGLABJrABPbABOLABLbABEbABFLABHrABKrABMbABS7ABR7ABNrABFbABHLABKbABLrABObABR7ABTbABP7ABJbABLrABN7ABPbABR7ABUrABUbABRbABM7ABQLABQrABQ7ABTLABRLABRrABQ7gBEbgBEbgBFbgBI7gBRLgBQ7gBQ7gBQ7gBEbgBE7gBFrgBL7gBQ7gBQ7gBQ7gBQ7gBFbgBFrgBKbgBQ7gBQ7gBQ7gBQ7gBQ7gBI7gBL7gBQ7gBQ7gBQ7gBQ7gBQ7gBQ7gBRLgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQ7gBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQ7gBQ7gBQ7gBQrgBQrgBQrgBQrgBQqLzl_8DBgjf8LPxBQ==&sigh=rs$AOn4CLCsCT8Lprh2S0ptmCRsWH7VtDl3YQ",

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(15000000),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(1200000),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(843000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(1300000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(707000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(797000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(2500000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(983000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(1100000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(1800000),

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(964000000),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(168000000),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(9600000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(989000000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(431000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(13000000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(769000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(3600000000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(648000000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(266000000),
@ -451,6 +461,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(92000000),
@ -492,6 +503,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(45000000),
@ -533,6 +545,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(41000000),
@ -574,6 +587,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(1200000000),
@ -615,6 +629,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(219000000),
@ -656,6 +671,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(7800000),
@ -697,6 +713,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(60000),
@ -738,6 +755,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(652000),
@ -779,6 +797,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(2400000),
@ -820,6 +839,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(117000000),
@ -861,6 +881,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(1000000000),
@ -902,6 +923,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(290000000),
@ -943,6 +965,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(583000000),
@ -984,6 +1007,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(68000000),
@ -1025,6 +1049,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(18000000),
@ -1066,6 +1091,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(842000),
@ -1107,6 +1133,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(2400000000),
@ -1148,6 +1175,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(21000000),
@ -1189,6 +1217,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(178000000),
@ -1230,6 +1259,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(3900000),
@ -1271,6 +1301,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(865000),
@ -1312,6 +1343,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(292000000),
@ -1353,6 +1385,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(150000000),
@ -1394,6 +1427,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(1700000),
@ -1435,6 +1469,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(5800000),
@ -1476,6 +1511,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(140000000),
@ -1517,6 +1553,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(16000000),
@ -1558,6 +1595,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(305000000),
@ -1599,6 +1637,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(219000000),
@ -1640,6 +1679,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(51000000),
@ -1681,6 +1721,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(24000000),
@ -1722,6 +1763,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(104000000),
@ -1763,6 +1805,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(159000000),
@ -1804,6 +1847,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(823000000),
@ -1845,6 +1889,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(271000),
@ -1886,6 +1931,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(94000000),
@ -1927,6 +1973,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(110000000),
@ -1968,6 +2015,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(76000000),
@ -2009,6 +2057,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(4100000000),
@ -2050,6 +2099,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(169000000),
@ -2091,6 +2141,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(28000000),
@ -2132,6 +2183,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(239000000),
@ -2173,6 +2225,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(285000000),
@ -2214,6 +2267,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(428000000),
@ -2255,6 +2309,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(556000000),
@ -2296,6 +2351,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(1300000000),
@ -2337,6 +2393,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(1000000000),
@ -2378,6 +2435,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(70000),
@ -2419,6 +2477,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(1400000000),
@ -2460,6 +2519,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(1200000000),
@ -2501,6 +2561,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(1000000),
@ -2542,6 +2603,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(232000000),
@ -2583,6 +2645,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(185000000),
@ -2624,6 +2687,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(19000),
@ -2665,6 +2729,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(6000000),
@ -2706,6 +2771,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(2500000),
@ -2747,6 +2813,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(62000000),
@ -2788,6 +2855,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(154000000),
@ -2829,6 +2897,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(255000000),
@ -2870,6 +2939,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(134000000),
@ -2911,6 +2981,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(671000000),
@ -2952,6 +3023,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(3800000),
@ -2993,6 +3065,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("16 years ago"),
view_count: Some(39000000),
@ -3034,6 +3107,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(14000000),
@ -3075,6 +3149,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(437000),
@ -3116,6 +3191,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(114000000),
@ -3157,6 +3233,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(115000000),
@ -3198,6 +3275,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(361000000),
@ -3239,6 +3317,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(31000000),
@ -3280,6 +3359,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(13000000),
@ -3321,6 +3401,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(385000000),
@ -3362,6 +3443,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(672000000),
@ -3403,6 +3485,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(127000000),
@ -3444,6 +3527,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(17000000),
@ -3485,6 +3569,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(154000),
@ -3526,6 +3611,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(328000000),
@ -3567,6 +3653,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(931000000),
@ -3608,6 +3695,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(1600000000),
@ -3649,6 +3737,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(177000000),
@ -3690,6 +3779,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(3700000000),
@ -3731,6 +3821,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(798000000),
@ -3772,6 +3863,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(71000000),
@ -3813,6 +3905,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(739000000),
@ -3854,6 +3947,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(499000000),
@ -3895,6 +3989,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(291000),
@ -3936,6 +4031,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(2600000000),
@ -3977,6 +4073,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(36000000),
@ -4018,6 +4115,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(8500000),
@ -4059,6 +4157,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(27000000),
@ -4100,6 +4199,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(101000000),

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(8),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(66000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 2 days ago"),
view_count: Some(553000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 days ago"),
view_count: Some(729000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 days ago"),
view_count: Some(629000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 1 year ago"),
view_count: Some(1400000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 1 year ago"),
view_count: Some(1000000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 1 year ago"),
view_count: Some(780000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 2 years ago"),
view_count: Some(913000),
@ -451,6 +461,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 53 years ago"),
view_count: Some(0),
@ -492,6 +503,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 53 years ago"),
view_count: Some(0),
@ -533,6 +545,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 53 years ago"),
view_count: Some(0),
@ -574,6 +587,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 2 years ago"),
view_count: Some(34000),
@ -615,6 +629,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(876000),
@ -656,6 +671,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(533000),
@ -697,6 +713,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(570000),
@ -738,6 +755,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(308000),
@ -779,6 +797,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(699000),
@ -820,6 +839,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(474000),
@ -861,6 +881,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(573000),
@ -902,6 +923,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(676000),
@ -943,6 +965,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(5600000),
@ -984,6 +1007,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(206000),
@ -1025,6 +1049,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(354000),
@ -1066,6 +1091,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(2400000),
@ -1107,6 +1133,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(2600000),
@ -1148,6 +1175,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(2100000),
@ -1189,6 +1217,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(2200000),
@ -1230,6 +1259,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(2100000),
@ -1271,6 +1301,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(1900000),
@ -1312,6 +1343,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(369000),
@ -1353,6 +1385,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(296000),
@ -1394,6 +1427,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(472000),
@ -1435,6 +1469,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 3 years ago"),
view_count: Some(561000),
@ -1476,6 +1511,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(259000),
@ -1517,6 +1553,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(455000),
@ -1558,6 +1595,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(97000),
@ -1599,6 +1637,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(365000),
@ -1640,6 +1679,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(123000),
@ -1681,6 +1721,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(88000),
@ -1722,6 +1763,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(246000),
@ -1763,6 +1805,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(876000),
@ -1804,6 +1847,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(149000),
@ -1845,6 +1889,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(196000),
@ -1886,6 +1931,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(192000),
@ -1927,6 +1973,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(189000),
@ -1968,6 +2015,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(110000),
@ -2009,6 +2057,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(61000),
@ -2050,6 +2099,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(75000),
@ -2091,6 +2141,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(89000),
@ -2132,6 +2183,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(73000),
@ -2173,6 +2225,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(33000),
@ -2214,6 +2267,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(96000),
@ -2255,6 +2309,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(92000),
@ -2296,6 +2351,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(82000),
@ -2337,6 +2393,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(123000),
@ -2378,6 +2435,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(89000),
@ -2419,6 +2477,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(94000),
@ -2460,6 +2519,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(148000),
@ -2501,6 +2561,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(125000),
@ -2542,6 +2603,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(52000),
@ -2583,6 +2645,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(414000),
@ -2624,6 +2687,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(150000),
@ -2665,6 +2729,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(22000),
@ -2706,6 +2771,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(326000),
@ -2747,6 +2813,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(65000),
@ -2788,6 +2855,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(58000),
@ -2829,6 +2897,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(100000),
@ -2870,6 +2939,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: None,
view_count: Some(4),
@ -2911,6 +2981,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(53000),
@ -2952,6 +3023,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(50000),
@ -2993,6 +3065,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(40000),
@ -3034,6 +3107,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(40000),
@ -3075,6 +3149,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(90000),
@ -3116,6 +3191,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(29000),
@ -3157,6 +3233,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(40000),
@ -3198,6 +3275,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(328000),
@ -3239,6 +3317,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(12000),
@ -3280,6 +3359,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(65000),
@ -3321,6 +3401,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(14000),
@ -3362,6 +3443,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(38000),
@ -3403,6 +3485,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(81000),
@ -3444,6 +3527,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(48000),
@ -3485,6 +3569,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(18000),
@ -3526,6 +3611,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(68000),
@ -3567,6 +3653,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(26000),
@ -3608,6 +3695,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(59000),
@ -3649,6 +3737,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(57000),
@ -3690,6 +3779,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(208000),
@ -3731,6 +3821,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(17000),
@ -3772,6 +3863,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(48000),
@ -3813,6 +3905,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(404000),
@ -3854,6 +3947,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(16000),
@ -3895,6 +3989,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(244000),
@ -3936,6 +4031,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(27000),
@ -3977,6 +4073,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(284000),
@ -4018,6 +4115,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(26000),
@ -4059,6 +4157,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(314000),
@ -4100,6 +4199,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("Streamed 4 years ago"),
view_count: Some(25000),

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(210000000),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(119000),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(168000000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(170000000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(161000000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(110000000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(151000000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(101000000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(83000000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(73000000),
@ -451,6 +461,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(68000000),
@ -492,6 +503,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(70000000),
@ -533,6 +545,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(78000000),
@ -574,6 +587,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(104000000),
@ -615,6 +629,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(70000000),
@ -656,6 +671,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(60000000),
@ -697,6 +713,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(76000000),
@ -738,6 +755,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(97000000),
@ -779,6 +797,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(80000000),
@ -820,6 +839,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(73000000),
@ -861,6 +881,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(66000000),
@ -902,6 +923,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(59000000),
@ -943,6 +965,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(58000000),
@ -984,6 +1007,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(90000000),
@ -1025,6 +1049,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(59000000),
@ -1066,6 +1091,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(62000000),
@ -1107,6 +1133,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(58000000),
@ -1148,6 +1175,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(75000000),
@ -1189,6 +1217,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(71000000),
@ -1230,6 +1259,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(62000000),
@ -1271,6 +1301,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(71000000),
@ -1312,6 +1343,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(52000000),
@ -1353,6 +1385,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(45000000),
@ -1394,6 +1427,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(59000000),
@ -1435,6 +1469,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(85000000),
@ -1476,6 +1511,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(47000000),
@ -1517,6 +1553,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(108000000),
@ -1558,6 +1595,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(90000000),
@ -1599,6 +1637,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(89000000),
@ -1640,6 +1679,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(61000000),
@ -1681,6 +1721,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(103000000),
@ -1722,6 +1763,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(72000000),
@ -1763,6 +1805,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(38000000),
@ -1804,6 +1847,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(49000000),
@ -1845,6 +1889,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(65000000),
@ -1886,6 +1931,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(38000000),
@ -1927,6 +1973,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(43000000),
@ -1968,6 +2015,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(47000000),
@ -2009,6 +2057,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(61000000),
@ -2050,6 +2099,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(40000000),
@ -2091,6 +2141,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(40000000),
@ -2132,6 +2183,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(46000000),
@ -2173,6 +2225,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(83000000),
@ -2214,6 +2267,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(42000000),
@ -2255,6 +2309,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(84000000),
@ -2296,6 +2351,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(34000000),
@ -2337,6 +2393,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(37000000),
@ -2378,6 +2435,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(47000000),
@ -2419,6 +2477,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(92000000),
@ -2460,6 +2519,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(56000000),
@ -2501,6 +2561,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(39000000),
@ -2542,6 +2603,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(37000000),
@ -2583,6 +2645,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(42000000),
@ -2624,6 +2687,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(35000000),
@ -2665,6 +2729,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(37000000),
@ -2706,6 +2771,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(56000000),
@ -2747,6 +2813,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(56000000),
@ -2788,6 +2855,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(25000000),
@ -2829,6 +2897,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(36000000),
@ -2870,6 +2939,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(38000000),
@ -2911,6 +2981,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(36000000),
@ -2952,6 +3023,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(28000000),
@ -2993,6 +3065,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(40000000),
@ -3034,6 +3107,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(30000000),
@ -3075,6 +3149,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(33000000),
@ -3116,6 +3191,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(27000000),
@ -3157,6 +3233,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(28000000),
@ -3198,6 +3275,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(42000000),
@ -3239,6 +3317,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(28000000),
@ -3280,6 +3359,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(37000000),
@ -3321,6 +3401,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(37000000),
@ -3362,6 +3443,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(33000000),
@ -3403,6 +3485,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(34000000),
@ -3444,6 +3527,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(36000000),
@ -3485,6 +3569,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(34000000),
@ -3526,6 +3611,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(31000000),
@ -3567,6 +3653,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(31000000),
@ -3608,6 +3695,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(26000000),
@ -3649,6 +3737,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(26000000),
@ -3690,6 +3779,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(27000000),
@ -3731,6 +3821,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(24000000),
@ -3772,6 +3863,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("14 years ago"),
view_count: Some(24000000),
@ -3813,6 +3905,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(27000000),
@ -3854,6 +3947,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(25000000),
@ -3895,6 +3989,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(31000000),
@ -3936,6 +4031,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(54000000),
@ -3977,6 +4073,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(19000000),
@ -4018,6 +4115,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(78000000),
@ -4059,6 +4157,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(19000000),
@ -4100,6 +4199,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 years ago"),
view_count: Some(99000000),

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(290000),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(414000),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(177000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(126000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(135000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(101000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(93000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(83000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(76000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(69000),
@ -451,6 +461,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(66000),
@ -492,6 +503,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(55000),
@ -533,6 +545,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(48000),
@ -574,6 +587,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(59000),
@ -615,6 +629,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(63000),
@ -656,6 +671,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(213000),
@ -697,6 +713,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(382000),
@ -738,6 +755,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(113000),
@ -779,6 +797,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(73000),
@ -820,6 +839,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(111000),
@ -861,6 +881,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(191000),
@ -902,6 +923,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(65000),
@ -943,6 +965,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(59000),
@ -984,6 +1007,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(64000),
@ -1025,6 +1049,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(58000),
@ -1066,6 +1091,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(66000),
@ -1107,6 +1133,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(44000),
@ -1148,6 +1175,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(43000),
@ -1189,6 +1217,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(39000),
@ -1230,6 +1259,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(147000),
@ -1271,6 +1301,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(78000),
@ -1312,6 +1343,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(45000),
@ -1353,6 +1385,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(34000),
@ -1394,6 +1427,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(45000),
@ -1435,6 +1469,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(39000),
@ -1476,6 +1511,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(42000),
@ -1517,6 +1553,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(39000),
@ -1558,6 +1595,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(46000),
@ -1599,6 +1637,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(51000),
@ -1640,6 +1679,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(51000),
@ -1681,6 +1721,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(57000),
@ -1722,6 +1763,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(47000),
@ -1763,6 +1805,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(63000),
@ -1804,6 +1847,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(253000),
@ -1845,6 +1889,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(96000),
@ -1886,6 +1931,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(248000),
@ -1927,6 +1973,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(124000),
@ -1968,6 +2015,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(40000),
@ -2009,6 +2057,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(161000),
@ -2050,6 +2099,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(49000),
@ -2091,6 +2141,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(41000),
@ -2132,6 +2183,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(191000),
@ -2173,6 +2225,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(33000),
@ -2214,6 +2267,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(43000),
@ -2255,6 +2309,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(255000),
@ -2296,6 +2351,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(104000),
@ -2337,6 +2393,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(126000),
@ -2378,6 +2435,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(265000),
@ -2419,6 +2477,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(105000),
@ -2460,6 +2519,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(69000),
@ -2501,6 +2561,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(73000),
@ -2542,6 +2603,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(127000),
@ -2583,6 +2645,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(43000),
@ -2624,6 +2687,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(171000),
@ -2665,6 +2729,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(146000),
@ -2706,6 +2771,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 years ago"),
view_count: Some(139000),

View file

@ -41,6 +41,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(37000000),
@ -82,6 +83,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(72000000),
@ -123,6 +125,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(32000000),
@ -164,6 +167,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(40000000),
@ -205,6 +209,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(491000000),
@ -246,6 +251,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(27000000),
@ -287,6 +293,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(18000000),
@ -328,6 +335,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 years ago"),
view_count: Some(259000000),
@ -369,6 +377,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(361000000),
@ -410,6 +419,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 years ago"),
view_count: Some(313000000),
@ -451,6 +461,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(104000000),
@ -492,6 +503,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(76000000),
@ -533,6 +545,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(66000000),
@ -574,6 +587,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(6200000),
@ -615,6 +629,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(265000000),
@ -656,6 +671,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(283000000),
@ -697,6 +713,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(279000000),
@ -738,6 +755,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(76000000),
@ -779,6 +797,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(31000000),
@ -820,6 +839,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("12 years ago"),
view_count: Some(210000000),
@ -861,6 +881,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(13000000),
@ -902,6 +923,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(58000000),
@ -943,6 +965,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(14000000),
@ -984,6 +1007,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(12000000),
@ -1025,6 +1049,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(62000000),
@ -1066,6 +1091,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(5500000),
@ -1107,6 +1133,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(78000000),
@ -1148,6 +1175,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(17000000),
@ -1189,6 +1217,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(15000000),
@ -1230,6 +1259,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(8800000),
@ -1271,6 +1301,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(22000000),
@ -1312,6 +1343,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(112000000),
@ -1353,6 +1385,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(29000000),
@ -1394,6 +1427,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(23000000),
@ -1435,6 +1469,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("13 years ago"),
view_count: Some(90000000),
@ -1476,6 +1511,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(6100000),
@ -1517,6 +1553,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(23000000),
@ -1558,6 +1595,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("15 years ago"),
view_count: Some(74000000),
@ -1599,6 +1637,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(2800000),
@ -1640,6 +1679,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(4900000),
@ -1681,6 +1721,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(7300000),
@ -1722,6 +1763,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(39000000),
@ -1763,6 +1805,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 years ago"),
view_count: Some(27000000),
@ -1804,6 +1847,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 years ago"),
view_count: Some(38000000),
@ -1845,6 +1889,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(1900000),
@ -1886,6 +1931,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(8800000),
@ -1927,6 +1973,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(2500000),
@ -1968,6 +2015,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(6300000),
@ -2009,6 +2057,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(5600000),
@ -2050,6 +2099,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(1100000),
@ -2091,6 +2141,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(1200000),
@ -2132,6 +2183,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(1700000),
@ -2173,6 +2225,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(7100000),
@ -2214,6 +2267,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(1400000),
@ -2255,6 +2309,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(3600000),
@ -2296,6 +2351,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(635000),
@ -2337,6 +2393,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(5700000),
@ -2378,6 +2435,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(3700000),
@ -2419,6 +2477,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(497000),
@ -2460,6 +2519,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(484000),
@ -2501,6 +2561,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(1400000),
@ -2542,6 +2603,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(3100000),
@ -2583,6 +2645,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(960000),
@ -2624,6 +2687,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(1800000),
@ -2665,6 +2729,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(2700000),
@ -2706,6 +2771,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(528000),
@ -2747,6 +2813,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(237000),
@ -2788,6 +2855,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(211000),
@ -2829,6 +2897,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(195000),
@ -2870,6 +2939,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(303000),
@ -2911,6 +2981,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(255000),
@ -2952,6 +3023,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(102000),
@ -2993,6 +3065,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(222000),
@ -3034,6 +3107,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(693000),
@ -3075,6 +3149,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 years ago"),
view_count: Some(613000),
@ -3116,6 +3191,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(125000),
@ -3157,6 +3233,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(143000),
@ -3198,6 +3275,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(252000),
@ -3239,6 +3317,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(100000),
@ -3280,6 +3359,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(97000),
@ -3321,6 +3401,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(88000),
@ -3362,6 +3443,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 years ago"),
view_count: Some(151000),
@ -3403,6 +3485,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(26000),
@ -3444,6 +3527,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(16000),
@ -3485,6 +3569,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(125000),
@ -3526,6 +3611,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 years ago"),
view_count: Some(108000),
@ -3567,6 +3653,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(13000),
@ -3608,6 +3695,7 @@ Playlist(
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(4500),

View file

@ -26,6 +26,346 @@ SearchResult(
subscriber_count: Some(2920000),
short_description: "Hi, I\'m Tina, aka Doobydobap! Food is the medium I use to tell stories and connect with people who share the same passion as I\u{a0}...",
)),
Video(VideoItem(
id: "N5AKQflK1TU",
name: "When you impulse buy...",
duration: Some(60),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/N5AKQflK1TU/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLAsKUEXxvFyA6J9cUPJlYYtRBjxmg",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 day ago"),
view_count: Some(858993),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #jam https://doobydobap.com/recipe/hongsi_jam Instagram @doobydobap Join my discord!"),
)),
Video(VideoItem(
id: "OzIFALQ_YtA",
name: "taste testing gam!",
duration: Some(60),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/OzIFALQ_YtA/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLD1E-eWjZrzHcfzh-DBWeZ6ewxNNg",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 days ago"),
view_count: Some(1000180),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #fruit #mukbang Instagram @doobydobap Join my discord! https://discord.gg/doobyverse www.doobydobap.com for\u{a0}..."),
)),
Video(VideoItem(
id: "dAcJILbc_0Q",
name: "How to: Korean rice wine 🍶 (makgeolli)",
duration: Some(59),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/dAcJILbc_0Q/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCi9qIkFstiJzKf9YdwdLEKzsZfZA",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("5 days ago"),
view_count: Some(1325816),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts Instagram @doobydobap Join my discord! https://discord.gg/doobyverse www.doobydobap.com for recipes & stories."),
)),
Video(VideoItem(
id: "9NuhKCv3crg",
name: "the end.",
duration: Some(982),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/9NuhKCv3crg/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB3RO6rSdCdoNvVoOIuXHuQLMAhjg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9NuhKCv3crg/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCGnhU_OdOXdc1jI-o8oDVXsyARaQ",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 days ago"),
view_count: Some(974475),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("or the start of something new~~~~~ Thank you for your patience on the vlog, it took some time to adjust to my new normal. Excited\u{a0}..."),
)),
Video(VideoItem(
id: "GvutfmW26JQ",
name: "👹stay sour 🍋",
duration: Some(52),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/GvutfmW26JQ/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLATzHy4VrMbKmNT14yfqCUBvElmpQ",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 days ago"),
view_count: Some(1096013),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("Ingredients: ** Citrus Filling** 1 cup mandarin juice or any orange-y citrus in season! 6 eggs 1 1/2 cup sugar ⅓ cup flour zest of 1\u{a0}..."),
)),
Video(VideoItem(
id: "MwWdlNamxN0",
name: "what I do with leftovers",
duration: Some(60),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/MwWdlNamxN0/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLDQFiOrRxYkYaYaJleuwExGzK0A8Q",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 days ago"),
view_count: Some(2735502),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #friedrice #cooking Instagram @doobydobap Join my discord! https://discord.gg/doobyverse www.doobydobap.com for\u{a0}..."),
)),
Video(VideoItem(
id: "FsYaHsohjBc",
name: "osechi ft. slim shady",
duration: Some(52),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/FsYaHsohjBc/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBuuMnmUl-er211GWmxJoIacRMWPQ",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(1168881),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #cooking Instagram @doobydobap Join my discord! https://discord.gg/doobyverse www.doobydobap.com for recipes\u{a0}..."),
)),
Video(VideoItem(
id: "38Gd6TdmNVs",
name: "KOREAN BARBECUE l doob gourmand ep.3",
duration: Some(525),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/38Gd6TdmNVs/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDsNWReQCqk65JFrXXAd6rxMUI_Bw",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/38Gd6TdmNVs/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA46ZJUIjqXr6u27TG5kiThPUj0EQ",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(354486),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("I haven\'t done a doob gourmand series in so so long! I hope you enjoyed it, let me know what kind of food you\'re interested in\u{a0}..."),
)),
Video(VideoItem(
id: "o04Yo2qxqcc",
name: "trailer l doob gourmand ep.3 k bbq",
duration: Some(53),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/o04Yo2qxqcc/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLAAqXMMzlzLMIFNEAMwgDbQ1NkuSw",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(639926),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #bbq #korean ... a snippet from my doob gourmand, coming soon! Instagram @doobydobap Join my discord!"),
)),
Video(VideoItem(
id: "JBUZE0mIlg8",
name: "small but sure joy",
duration: Some(29),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/JBUZE0mIlg8/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCRBlyIUBUm_aypWz4tGkrDNJxIZw",
width: 405,
height: 720,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(1231893),
is_live: false,
is_short: true,
is_upcoming: false,
short_description: Some("shorts #food #korea Instagram @doobydobap Join my discord! https://discord.gg/doobyverse www.doobydobap.com for\u{a0}..."),
)),
Video(VideoItem(
id: "1VW7iXRIrc8",
name: "Alone, in the City of Love",
@ -55,6 +395,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(531580),
@ -92,6 +433,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 days ago"),
view_count: Some(974475),
@ -129,6 +471,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1034415),
@ -166,6 +509,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(831908),
@ -174,6 +518,386 @@ SearchResult(
is_upcoming: false,
short_description: Some("I could palpably feel how I\'m so much happier than before when I was reviewing my footage All the finalized recipes will be\u{a0}..."),
)),
Video(VideoItem(
id: "ExHRTtm8QEA",
name: "Mother, an Inventor? EP 456 | Atashin\'chi | [ENG sub]",
duration: Some(418),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ExHRTtm8QEA/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAge-bKNb6AanyqxV7ak4Kfn-3nYw",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ExHRTtm8QEA/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBFFYvASoliDr52srhWeMpcNf1oJw",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCkwJXqFl-9VVvK9udYCFjMw",
name: "【アニメ】あたしンち公式チャンネル",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-wrmP4MaWt-SDzrcSiAeN7QTR2VgWBmt9Zr3TD=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("11 months ago"),
view_count: Some(386384),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("▼Subscribe to the official channel here \nhttps://www.youtube.com/c/atashinchi?sub_confirmation=1\n#Atashinchi ..."),
)),
Video(VideoItem(
id: "8mxdUQadX6Y",
name: "wholesome days in korea :\'\')",
duration: Some(497),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/8mxdUQadX6Y/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDoP9fZds83zk9TdFK0ZDDoV01c2g",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/8mxdUQadX6Y/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAbM5vfd7RzivOeKK4OG3ngMpCqwA",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCTZHeY_cugi1rAAPoH-sMkA",
name: "dobochobo",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/VvcHqBmCDRXWVRlgWqRM4U69j0cde17bs9vQDn3qEMAK62dTb93MnBtpBlNX-eh2g8NX-BVEoQ=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: none,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("17 hours ago"),
view_count: Some(19274),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("a short n sweet vlog of some of my last days in seoul - visiting my grandma, people watching at hangang, and spending time with\u{a0}..."),
)),
Video(VideoItem(
id: "gXFw55sYoRE",
name: "Kbbq for One",
duration: Some(874),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/gXFw55sYoRE/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAvmd1zOXlDXmwCni86QaKInsHiRg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/gXFw55sYoRE/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDS6cGKpyTFEFvd-Y-kpTOqHhFcrg",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("9 months ago"),
view_count: Some(864777),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Watch till the end to hear about my type ;) doobymart.com Go get your 돈역마염 T-shirts before Christmas! Instagram\u{a0}..."),
)),
Video(VideoItem(
id: "Spiq_AjCXs8",
name: "Tea and Biscuits... the British Obsession",
duration: Some(578),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/Spiq_AjCXs8/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCDDN75ZCzIOVIElVqHWVANBzIVxg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Spiq_AjCXs8/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD2TrmSLHMNt7hDoR5jsmWMTcD7Uw",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCOgGAfSUy5LvEyVS_LF5kdw",
name: "JOLLY",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-2Z-LMvcKYcD3r83tRBuYsFJuau3d3rJr4AqG5fw=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 year ago"),
view_count: Some(956121),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Tea and Biscuits. A British institution. British people consume more than a jolly 8 million biscuits every day... but which one is the\u{a0}..."),
)),
Video(VideoItem(
id: "IxFmWHjcdYM",
name: "Golden Fried Rice from Kaguya-Sama: Love Is War | Anime with Alvin",
duration: Some(447),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/IxFmWHjcdYM/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCu1oJLIA6yl336DVuRFeMACbrYMg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/IxFmWHjcdYM/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC9oNa5mB_qbZFjr9GQCPzdWZWB5Q",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCJHA_jMfCvEnv-3kRjTCQXw",
name: "Babish Culinary Universe",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu8y65Kqbg0e4OUZClxeu5qteQZEQqjenCHW3wYg=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("20 hours ago"),
view_count: Some(262149),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Save up to 40% on your SimpliSafe system. Visit https://SimpliSafe.com/babish to customize yours! Try SimpliSafe risk-free."),
)),
Video(VideoItem(
id: "djgrv_7HbsM",
name: "When British People Try French Snacks...",
duration: Some(816),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/djgrv_7HbsM/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLALhZG-LeI394jh6ZN2fNs3Spm9jg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/djgrv_7HbsM/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAE1Ygy4wMYxkl8GsFvZ6eVAyAiRA",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCOgGAfSUy5LvEyVS_LF5kdw",
name: "JOLLY",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-2Z-LMvcKYcD3r83tRBuYsFJuau3d3rJr4AqG5fw=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(2347800),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Today we try some Jolly French Snacks, and are reminded that French food is, well, jolly good. Buy Josh\'s autobiography (written\u{a0}..."),
)),
Video(VideoItem(
id: "EqLHh9vJIKA",
name: "Best Friends Cooking Battle (ft. Celebrity Chef)",
duration: Some(1344),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/EqLHh9vJIKA/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAHKkitgyRgsAM_YaLa-LFZBeFfew",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/EqLHh9vJIKA/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB3ms2FhtfcwsnkleaIGI0475j4vQ",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCOgGAfSUy5LvEyVS_LF5kdw",
name: "JOLLY",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-2Z-LMvcKYcD3r83tRBuYsFJuau3d3rJr4AqG5fw=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(773583),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("If you want to send us anything to open, our PO Box is open again! The address is: Box 51, 1 Rockley Road, London, W14 0DJ\u{a0}..."),
)),
Video(VideoItem(
id: "1oPq2UUiM7s",
name: "The Ultimate Full English Breakfast with Sorted Food!",
duration: Some(530),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/1oPq2UUiM7s/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCEmg7zT9mNRDtvV0XI6Wwp03MTAA",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/1oPq2UUiM7s/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD8HE0GLPGBzMc0V_8ycCrWEiQ0tA",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCOgGAfSUy5LvEyVS_LF5kdw",
name: "JOLLY",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-2Z-LMvcKYcD3r83tRBuYsFJuau3d3rJr4AqG5fw=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(882756),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Today we\'re joined by Sorted Food to settle the great debate - what is in the ULTIMATE Full English?! Check out their channel\u{a0}..."),
)),
Video(VideoItem(
id: "0uTLaUsK_fM",
name: "The Ultimate Snack World-Cup!!",
duration: Some(1133),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/0uTLaUsK_fM/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAKHz14GlQnRbdPEVCKzoGZ77OpAg",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/0uTLaUsK_fM/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCbKuNiDGuNTS-KTVatbAo0O9LQuw",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCOgGAfSUy5LvEyVS_LF5kdw",
name: "JOLLY",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu-2Z-LMvcKYcD3r83tRBuYsFJuau3d3rJr4AqG5fw=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(752836),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("If you want to send us anything to open, our PO Box is open again! The address is: Box 51, 1 Rockley Road, London, W14 0DJ\u{a0}..."),
)),
Video(VideoItem(
id: "6c58-749p6Y",
name: "Old Friends & New",
duration: Some(774),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/6c58-749p6Y/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB2Jhsz_feWcNW07yWtjrumbMgtnw",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/6c58-749p6Y/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDagCO86W02BzWwG3yYwtlvLUbAuw",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCh8gHdtzO2tXd593_bjErWg",
name: "Doobydobap",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(426393),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("Realized I have a typo that says perogis instead of peroni oop But for real, I\'m so thankful for Bobbi bc she was one of the few/\u{a0}..."),
)),
Video(VideoItem(
id: "38Gd6TdmNVs",
name: "KOREAN BARBECUE l doob gourmand ep.3",
@ -203,6 +927,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 weeks ago"),
view_count: Some(354486),
@ -240,6 +965,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("1 month ago"),
view_count: Some(524950),
@ -277,6 +1003,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 weeks ago"),
view_count: Some(528595),
@ -314,6 +1041,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(717515),
@ -351,6 +1079,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 months ago"),
view_count: Some(624386),
@ -388,6 +1117,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(696942),
@ -425,6 +1155,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(923749),
@ -462,6 +1193,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(1282467),
@ -499,6 +1231,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(1649656),
@ -536,6 +1269,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(1085725),
@ -544,6 +1278,44 @@ SearchResult(
is_upcoming: false,
short_description: Some("A busy, but calm week for me here in Seoul living alone. Planning on exploring more parts of Korea, please let me know in the\u{a0}..."),
)),
Video(VideoItem(
id: "T4NOt727wqI",
name: "20 Comfort Foods From Around The World",
duration: Some(722),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/T4NOt727wqI/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBpte9rWpo0EXWj53uMxatkyAumag",
width: 360,
height: 202,
),
Thumbnail(
url: "https://i.ytimg.com/vi/T4NOt727wqI/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB1U3YAMWUe4_RXBpWnVP_-XE3hvA",
width: 720,
height: 404,
),
],
channel: Some(ChannelTag(
id: "UCwiTOchWeKjrJZw7S1H__1g",
name: "Food Insider",
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu80hN5x1GVlHZ3VevK1qrMF2ocDLTs6t56GoAXoHg=s68-c-k-c0x00ffffff-no-rj",
width: 68,
height: 68,
),
],
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("2 years ago"),
view_count: Some(5628269),
is_live: false,
is_short: false,
is_upcoming: false,
short_description: Some("In a time when much of the world is facing lockdown because of the coronavirus pandemic, unable to see family and friends in\u{a0}..."),
)),
Video(VideoItem(
id: "dkMtSrjDLO0",
name: "How to make Naruto\'s favorite ramen",
@ -573,6 +1345,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("10 months ago"),
view_count: Some(1327833),
@ -610,6 +1383,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(1052801),
@ -647,6 +1421,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(1137136),
@ -684,6 +1459,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(928967),
@ -721,6 +1497,7 @@ SearchResult(
verification: verified,
subscriber_count: None,
)),
channels_feat: [],
publish_date: "[date]",
publish_date_txt: Some("8 months ago"),
view_count: Some(1077297),

Some files were not shown because too many files have changed in this diff Show more