feat: add channel video/playlist continuation

This commit is contained in:
ThetaDev 2022-09-26 21:26:22 +02:00
parent 6f1a1c4440
commit 6ac5bc3782
14 changed files with 19775 additions and 29 deletions

View file

@ -22,6 +22,8 @@ pub async fn download_testfiles(project_root: &Path) {
channel_videos(&testfiles).await;
channel_playlists(&testfiles).await;
channel_info(&testfiles).await;
channel_videos_cont(&testfiles).await;
channel_playlists_cont(&testfiles).await;
}
const CLIENT_TYPES: [ClientType; 5] = [
@ -245,3 +247,47 @@ async fn channel_info(testfiles: &Path) {
.await
.unwrap();
}
async fn channel_videos_cont(testfiles: &Path) {
let mut json_path = testfiles.to_path_buf();
json_path.push("channel");
json_path.push("channel_videos_cont.json");
if json_path.exists() {
return;
}
let rp = RustyPipe::new();
let videos = rp
.query()
.channel_videos("UC2DjFE7Xf11URZqWBigcVOQ")
.await
.unwrap();
let rp = rp_testfile(&json_path);
rp.query()
.channel_videos_continuation(&videos.content.ctoken.unwrap())
.await
.unwrap();
}
async fn channel_playlists_cont(testfiles: &Path) {
let mut json_path = testfiles.to_path_buf();
json_path.push("channel");
json_path.push("channel_playlists_cont.json");
if json_path.exists() {
return;
}
let rp = RustyPipe::new();
let playlists = rp
.query()
.channel_playlists("UC2DjFE7Xf11URZqWBigcVOQ")
.await
.unwrap();
let rp = rp_testfile(&json_path);
rp.query()
.channel_playlists_continuation(&playlists.content.ctoken.unwrap())
.await
.unwrap();
}

View file

@ -1,4 +1,4 @@
use anyhow::{bail, Result};
use anyhow::{anyhow, bail, Result};
use reqwest::Method;
use serde::Serialize;
use url::Url;
@ -14,7 +14,7 @@ use crate::{
use super::{
response::{self, IsLive, IsShort},
ClientType, MapResponse, RustyPipeQuery, YTContext,
ClientType, MapResponse, QContinuation, RustyPipeQuery, YTContext,
};
#[derive(Debug, Serialize)]
@ -75,6 +75,27 @@ impl RustyPipeQuery {
.await
}
pub async fn channel_videos_continuation(
&self,
ctoken: &str,
) -> Result<Paginator<ChannelVideo>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QContinuation {
context,
continuation: ctoken.to_owned(),
};
self.execute_request::<response::ChannelCont, _, _>(
ClientType::Desktop,
"channel_videos_continuation",
ctoken,
Method::POST,
"browse",
&request_body,
)
.await
}
pub async fn channel_playlists(
&self,
channel_id: &str,
@ -97,6 +118,27 @@ impl RustyPipeQuery {
.await
}
pub async fn channel_playlists_continuation(
&self,
ctoken: &str,
) -> Result<Paginator<ChannelPlaylist>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QContinuation {
context,
continuation: ctoken.to_owned(),
};
self.execute_request::<response::ChannelCont, _, _>(
ClientType::Desktop,
"channel_videos_continuation",
ctoken,
Method::POST,
"browse",
&request_body,
)
.await
}
pub async fn channel_info(&self, channel_id: &str) -> Result<Channel<ChannelInfo>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QChannel {
@ -235,6 +277,44 @@ impl MapResponse<Channel<ChannelInfo>> for response::Channel {
}
}
impl MapResponse<Paginator<ChannelVideo>> for response::ChannelCont {
fn map_response(
self,
_id: &str,
lang: Language,
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
) -> Result<MapResult<Paginator<ChannelVideo>>> {
let mut actions = self.on_response_received_actions;
let res = some_or_bail!(
actions.try_swap_remove(0),
Err(anyhow!("no received action"))
)
.append_continuation_items_action
.continuation_items;
Ok(map_videos(res, lang))
}
}
impl MapResponse<Paginator<ChannelPlaylist>> for response::ChannelCont {
fn map_response(
self,
_id: &str,
_lang: Language,
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
) -> Result<MapResult<Paginator<ChannelPlaylist>>> {
let mut actions = self.on_response_received_actions;
let res = some_or_bail!(
actions.try_swap_remove(0),
Err(anyhow!("no received action"))
)
.append_continuation_items_action
.continuation_items;
Ok(map_playlists(res))
}
}
fn map_videos(
res: MapResult<Vec<response::VideoListItem>>,
lang: Language,
@ -413,7 +493,9 @@ mod tests {
use crate::{
client::{response, MapResponse, RustyPipe},
model::{Channel, ChannelOrder, ChannelVideo, Language, Paginator},
model::{
Channel, ChannelInfo, ChannelOrder, ChannelPlaylist, ChannelVideo, Language, Paginator,
},
serializer::MapResult,
};
@ -456,6 +538,12 @@ mod tests {
)
}
}
let next = channel.content.next(rp.query()).await.unwrap().unwrap();
assert!(
!next.is_exhausted() && !next.items.is_empty(),
"no more videos"
);
}
#[tokio::test]
@ -474,6 +562,12 @@ mod tests {
!channel.content.items.is_empty() && !channel.content.is_exhausted(),
"got no playlists"
);
let next = channel.content.next(rp.query()).await.unwrap().unwrap();
assert!(
!next.is_exhausted() && !next.items.is_empty(),
"no more playlists"
);
}
#[tokio::test]
@ -563,4 +657,82 @@ mod tests {
".content.items[].publish_date" => "[date]",
});
}
#[test]
fn t_map_channel_videos_cont() {
let json_path = Path::new("testfiles/channel/channel_videos_cont.json");
let json_file = File::open(json_path).unwrap();
let channel: response::ChannelCont =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let map_res: MapResult<Paginator<ChannelVideo>> = channel
.map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None)
.unwrap();
assert!(
map_res.warnings.is_empty(),
"deserialization/mapping warnings: {:?}",
map_res.warnings
);
insta::assert_ron_snapshot!("map_channel_videos_cont", map_res.c, {
".items[].publish_date" => "[date]",
});
}
#[test]
fn t_map_channel_playlists() {
let json_path = Path::new("testfiles/channel/channel_playlists.json");
let json_file = File::open(json_path).unwrap();
let channel: response::Channel =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let map_res: MapResult<Channel<Paginator<ChannelPlaylist>>> = channel
.map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None)
.unwrap();
assert!(
map_res.warnings.is_empty(),
"deserialization/mapping warnings: {:?}",
map_res.warnings
);
insta::assert_ron_snapshot!("map_channel_playlists", map_res.c);
}
#[test]
fn t_map_channel_playlists_cont() {
let json_path = Path::new("testfiles/channel/channel_playlists_cont.json");
let json_file = File::open(json_path).unwrap();
let channel: response::ChannelCont =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let map_res: MapResult<Paginator<ChannelPlaylist>> = channel
.map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None)
.unwrap();
assert!(
map_res.warnings.is_empty(),
"deserialization/mapping warnings: {:?}",
map_res.warnings
);
insta::assert_ron_snapshot!("map_channel_playlists_cont", map_res.c);
}
#[test]
fn t_map_channel_info() {
let json_path = Path::new("testfiles/channel/channel_info.json");
let json_file = File::open(json_path).unwrap();
let channel: response::Channel =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let map_res: MapResult<Channel<ChannelInfo>> = channel
.map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None)
.unwrap();
assert!(
map_res.warnings.is_empty(),
"deserialization/mapping warnings: {:?}",
map_res.warnings
);
insta::assert_ron_snapshot!("map_channel_info", map_res.c);
}
}

View file

@ -65,13 +65,6 @@ impl ClientType {
}
}
#[derive(Clone, Debug, Serialize)]
struct YTQuery<T> {
context: YTContext,
#[serde(flatten)]
data: T,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
struct YTContext {
@ -131,6 +124,13 @@ struct ThirdParty {
embed_url: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
struct QContinuation {
context: YTContext,
continuation: String,
}
const DEFAULT_UA: &str = "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0";
const CONSENT_COOKIE: &str = "CONSENT";

View file

@ -1,6 +1,8 @@
use anyhow::Result;
use crate::model::{Comment, Paginator, PlaylistVideo, RecommendedVideo};
use crate::model::{
ChannelPlaylist, ChannelVideo, Comment, Paginator, PlaylistVideo, RecommendedVideo,
};
use super::RustyPipeQuery;
@ -92,6 +94,94 @@ impl Paginator<RecommendedVideo> {
}
}
impl Paginator<ChannelVideo> {
pub async fn next(&self, query: RustyPipeQuery) -> Result<Option<Self>> {
Ok(match &self.ctoken {
Some(ctoken) => Some(query.channel_videos_continuation(ctoken).await?),
None => None,
})
}
pub async fn extend(&mut self, query: RustyPipeQuery) -> Result<bool> {
match self.next(query).await {
Ok(Some(paginator)) => {
let mut items = paginator.items;
self.items.append(&mut items);
self.ctoken = paginator.ctoken;
Ok(true)
}
Ok(None) => Ok(false),
Err(e) => Err(e),
}
}
pub async fn extend_pages(&mut self, query: RustyPipeQuery, n_pages: usize) -> Result<()> {
for _ in 0..n_pages {
match self.extend(query.clone()).await {
Ok(false) => break,
Err(e) => return Err(e),
_ => {}
}
}
Ok(())
}
pub async fn extend_limit(&mut self, query: RustyPipeQuery, n_items: usize) -> Result<()> {
while self.items.len() < n_items {
match self.extend(query.clone()).await {
Ok(false) => break,
Err(e) => return Err(e),
_ => {}
}
}
Ok(())
}
}
impl Paginator<ChannelPlaylist> {
pub async fn next(&self, query: RustyPipeQuery) -> Result<Option<Self>> {
Ok(match &self.ctoken {
Some(ctoken) => Some(query.channel_playlists_continuation(ctoken).await?),
None => None,
})
}
pub async fn extend(&mut self, query: RustyPipeQuery) -> Result<bool> {
match self.next(query).await {
Ok(Some(paginator)) => {
let mut items = paginator.items;
self.items.append(&mut items);
self.ctoken = paginator.ctoken;
Ok(true)
}
Ok(None) => Ok(false),
Err(e) => Err(e),
}
}
pub async fn extend_pages(&mut self, query: RustyPipeQuery, n_pages: usize) -> Result<()> {
for _ in 0..n_pages {
match self.extend(query.clone()).await {
Ok(false) => break,
Err(e) => return Err(e),
_ => {}
}
}
Ok(())
}
pub async fn extend_limit(&mut self, query: RustyPipeQuery, n_items: usize) -> Result<()> {
while self.items.len() < n_items {
match self.extend(query.clone()).await {
Ok(false) => break,
Err(e) => return Err(e),
_ => {}
}
}
Ok(())
}
}
impl Paginator<Comment> {
pub async fn next(&self, query: RustyPipeQuery) -> Result<Option<Self>> {
Ok(match &self.ctoken {

View file

@ -11,7 +11,9 @@ use crate::{
util::{self, TryRemove},
};
use super::{response, ClientType, MapResponse, MapResult, RustyPipeQuery, YTContext};
use super::{
response, ClientType, MapResponse, MapResult, QContinuation, RustyPipeQuery, YTContext,
};
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
@ -20,13 +22,6 @@ struct QPlaylist {
browse_id: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
struct QPlaylistCont {
context: YTContext,
continuation: String,
}
impl RustyPipeQuery {
pub async fn playlist(self, playlist_id: &str) -> Result<Playlist> {
let context = self.get_context(ClientType::Desktop, true).await;
@ -48,7 +43,7 @@ impl RustyPipeQuery {
pub async fn playlist_continuation(self, ctoken: &str) -> Result<Paginator<PlaylistVideo>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QPlaylistCont {
let request_body = QContinuation {
context,
continuation: ctoken.to_owned(),
};

View file

@ -18,6 +18,13 @@ pub struct Channel {
pub microformat: Microformat,
}
#[serde_as]
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChannelCont {
pub on_response_received_actions: Vec<OnResponseReceivedAction>,
}
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Contents {
@ -165,3 +172,17 @@ pub struct NavigationEndpoint {
pub struct UrlEndpoint {
pub url: String,
}
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OnResponseReceivedAction {
pub append_continuation_items_action: AppendAction,
}
#[serde_as]
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AppendAction {
#[serde_as(as = "VecLogError<_>")]
pub continuation_items: MapResult<Vec<VideoListItem>>,
}

View file

@ -5,6 +5,7 @@ pub mod playlist_music;
pub mod video_details;
pub use channel::Channel;
pub use channel::ChannelCont;
pub use player::Player;
pub use playlist::Playlist;
pub use playlist::PlaylistCont;

View file

@ -0,0 +1,163 @@
---
source: src/client/channel.rs
expression: map_res.c
---
Channel(
id: "UC2DjFE7Xf11URZqWBigcVOQ",
name: "EEVblog",
subscriber_count: Some(881000),
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s48-c-k-c0x00ffffff-no-rj",
width: 48,
height: 48,
),
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s88-c-k-c0x00ffffff-no-rj",
width: 88,
height: 88,
),
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s176-c-k-c0x00ffffff-no-rj",
width: 176,
height: 176,
),
],
description: "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON\'T DO PAID VIDEO SPONSORSHIPS, DON\'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don\'t be offended if I don\'t have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA",
tags: [
"electronics",
"engineering",
"maker",
"hacker",
"design",
"circuit",
"hardware",
"pic",
"atmel",
"oscilloscope",
"multimeter",
"diy",
"hobby",
"review",
"teardown",
"microcontroller",
"arduino",
"video",
"blog",
"tutorial",
"how-to",
"interview",
"rant",
"industry",
"news",
"mailbag",
"dumpster diving",
"debunking",
],
vanity_url: Some("https://www.youtube.com/c/EevblogDave"),
banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1060,
height: 175,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1138,
height: 188,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1707,
height: 283,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2120,
height: 351,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2276,
height: 377,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2560,
height: 424,
),
],
mobile_banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 320,
height: 88,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w640-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 640,
height: 175,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w960-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 960,
height: 263,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 1280,
height: 351,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1440-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 1440,
height: 395,
),
],
tv_banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 320,
height: 180,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w854-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 854,
height: 480,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 1280,
height: 720,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1920-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 1920,
height: 1080,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 2120,
height: 1192,
),
],
content: ChannelInfo(
create_date: Some("2009-04-04T00:00:00+02:00"),
view_count: Some(186854342),
links: [
("EEVblog Web Site", "http://www.eevblog.com/"),
("Twitter", "http://www.twitter.com/eevblog"),
("Facebook", "http://www.facebook.com/EEVblog"),
("EEVdiscover", "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ"),
("The EEVblog Forum", "http://www.eevblog.com/forum"),
("EEVblog Merchandise (T-Shirts)", "http://www.eevblog.com/merch"),
("EEVblog Donations", "http://www.eevblog.com/donations/"),
("Patreon", "https://www.patreon.com/eevblog"),
("SubscribeStar", "https://www.subscribestar.com/eevblog"),
("The AmpHour Radio Show", "http://www.theamphour.com/"),
("Flickr", "http://www.flickr.com/photos/eevblog"),
("EEVblog AMAZON Store", "http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2F&tag=ee04-20&linkCode=ur2&camp=1789&creative=390957"),
("2nd EEVblog Channel", "http://www.youtube.com/EEVblog2"),
],
),
)

View file

@ -0,0 +1,510 @@
---
source: src/client/channel.rs
expression: map_res.c
---
Channel(
id: "UC2DjFE7Xf11URZqWBigcVOQ",
name: "EEVblog",
subscriber_count: Some(881000),
avatar: [
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s48-c-k-c0x00ffffff-no-rj",
width: 48,
height: 48,
),
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s88-c-k-c0x00ffffff-no-rj",
width: 88,
height: 88,
),
Thumbnail(
url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s176-c-k-c0x00ffffff-no-rj",
width: 176,
height: 176,
),
],
description: "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON\'T DO PAID VIDEO SPONSORSHIPS, DON\'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don\'t be offended if I don\'t have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA",
tags: [
"electronics",
"engineering",
"maker",
"hacker",
"design",
"circuit",
"hardware",
"pic",
"atmel",
"oscilloscope",
"multimeter",
"diy",
"hobby",
"review",
"teardown",
"microcontroller",
"arduino",
"video",
"blog",
"tutorial",
"how-to",
"interview",
"rant",
"industry",
"news",
"mailbag",
"dumpster diving",
"debunking",
],
vanity_url: Some("https://www.youtube.com/c/EevblogDave"),
banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1060,
height: 175,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1138,
height: 188,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 1707,
height: 283,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2120,
height: 351,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2276,
height: 377,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
width: 2560,
height: 424,
),
],
mobile_banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 320,
height: 88,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w640-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 640,
height: 175,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w960-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 960,
height: 263,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 1280,
height: 351,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1440-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj",
width: 1440,
height: 395,
),
],
tv_banner: [
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 320,
height: 180,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w854-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 854,
height: 480,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 1280,
height: 720,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1920-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 1920,
height: 1080,
),
Thumbnail(
url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj",
width: 2120,
height: 1192,
),
],
content: Paginator(
count: None,
items: [
ChannelPlaylist(
id: "PLvOlSehNtuHtOV3AEwhuea4TnviddKfAj",
name: "MacGyver Project",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/4yosozyeIP4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAkwsCiJjFkWhYxtcg5NgfnQbkZrA",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuvHE5GQrQJxWXHdmW2l5IF",
name: "Calculators",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/S3R4r2xvVYQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB7HH5drG-33c1SyRe9kyZBrXvm3A",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHs6wRwVSaErU0BEnLiHfnKJ",
name: "BM235",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/WPyEFB4cHkA/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAzBuQFV8T9hM8adlPvv58C9TeDug",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHu4k0ZkKFLsysSB5iava6Qu",
name: "Vibration Measurement",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/uus_cpZiqsU/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCqdsjWVFaLOkEcXgbZD2Eca8MnuQ",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtdQF-m5UFZ5GEjABadI3kI",
name: "Component Selection",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/uq1DMWtjL2U/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAbgb1Jdb5P69JGdZQ-a8asLLyYdA",
width: 480,
height: 270,
),
],
video_count: Some(4),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtlndPUSOPgsujUdq1c5Mr9",
name: "Solar Roadways",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/oIImmlfCyzo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBxApgyGu3dNXRGoqLctVUnESpEIA",
width: 480,
height: 270,
),
],
video_count: Some(18),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvD6M_7WeN071OVsZFE0_q-",
name: "Electronics Tutorials - AC Theory Series",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/rrPtvYYJ2-g/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBEVc71xxSjJ-xlA_dDQaYIjdHyUw",
width: 480,
height: 270,
),
],
video_count: Some(3),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtVLq2MDPIz82BWMIZcuwhK",
name: "Electronics Tutorial - DC Fundamentals",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/xSRe_4TQbuo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDP4V24_MG6vzvUZsHep9WFSCCY6Q",
width: 480,
height: 270,
),
],
video_count: Some(8),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvIDfW3x2p4BY6l4RYgfBJE",
name: "Oscilloscope Probing",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/OiAmER1OJh4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAXeGAvEc8y3pEsPUxWdsNIP9UmPw",
width: 480,
height: 270,
),
],
video_count: Some(13),
),
ChannelPlaylist(
id: "PLvOlSehNtuHu6Jjb8U82eKQfvKhJVl0Bu",
name: "Thermal Design",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/8ruFVmxf0zs/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCkE6yS4th9AsfNku19dhbZl4CbXA",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHs-X2Awg33PCBNrP2BGFVhC",
name: "Electric Cars",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/CPcZm1Tu5VI/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCsm8De0QaHPaeCZqxMp_F464fWzg",
width: 480,
height: 270,
),
],
video_count: Some(7),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuLODLTeq3PM-OJRP2nzNUa",
name: "Designing a better uCurrent",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/0AEVilxXAAo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCjotFuRjPPBHd2LWzt3lviPj9HaA",
width: 480,
height: 270,
),
],
video_count: Some(3),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtvTKP4RTNW1-08Kmzy1pvA",
name: "EMC Compliance & Measurement",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/lYmfVMWbIHQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBtygEqMXx7Lwe5SuBWt2q0CSahYA",
width: 480,
height: 270,
),
],
video_count: Some(8),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuUTpCrTVX7BdU68l2aVqMv",
name: "Power Counter Display Project",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/nTpE1Nw3Yy4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAbPl28_i7isizY6A1t2_c6gV8BAQ",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvm120Tq40nKrM5SUBlolN3",
name: "Live - Ask Dave",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/gQ7TTuiDH1M/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBMnucUil90WeDSIeFz8mZCOtEv9g",
width: 480,
height: 270,
),
],
video_count: Some(3),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsiF93KOLoF1KAHArmIW9lC",
name: "Padauk Microcontroller",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/r45r4rV5JOI/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCn4kGWcjBOhk3vN8QPMDa9L3mkKA",
width: 480,
height: 270,
),
],
video_count: Some(10),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvxTzBLwUFw4My4rtrNFzED",
name: "Other Debunking Videos",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/WopuF9vD7KE/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBv5buh3qMs4feQaPj6Fy6bxl_vuA",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHt2pJ7X5tumuM4Wa3r1OC7Q",
name: "Audio & Speakers",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/qHbkw0Gm7pk/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCJBYXTDttGHTm51j3bfwqxOqVFig",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtX7OearWdmqGzqiu4DHKWi",
name: "Cameras",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/g9umAQ1-an4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCB5jNm9U-rypnpthK_N321LpYWew",
width: 480,
height: 270,
),
],
video_count: Some(16),
),
ChannelPlaylist(
id: "PLvOlSehNtuHu-TaNRp27_PiXjBG5wY9Gv",
name: "Cryptocurrency",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ibPgfzd9zd8/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDe3IXT88HR3XxnxfqrpAxh6pfYMg",
width: 480,
height: 270,
),
],
video_count: Some(7),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvmK-VGcZ33ZuATmcNB8tvH",
name: "LCD Tutorial",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ZYvxgl-9tNM/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDv2WT4Chl1_H2G43AjfSFpPcKVoA",
width: 480,
height: 270,
),
],
video_count: Some(6),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvbV8x_bWQBKEg4IshWjG3U",
name: "Guest Videos",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/vr8ROiYs8AQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB3-0simU6JRFu9oztPXxqg_dgpGg",
width: 480,
height: 270,
),
],
video_count: Some(12),
),
ChannelPlaylist(
id: "PLvOlSehNtuHs5tuhiqdxQeegsLDP7TM8V",
name: "Software Development",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/-_rqzsJy_Qs/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBfgyRT22Y0kXITD5pTNU5BkKG31Q",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHu328BlpUOUDsv9Kf1Ri8Tg",
name: "John Kenny - Keysight",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ewtdnzlv0Rg/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAzFf6hh75LI2ldJq-EyV4Ke9WBtg",
width: 480,
height: 270,
),
],
video_count: Some(5),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvj_E5KUBluJJupXmideiZk",
name: "General Tech Information",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/f0uvS80YIGU/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA4L-gzgcRGOdzbQOV6Wd6hw_d6og",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsWHPg1KlSd8agKbrcn3Dwn",
name: "Microscope",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/-JDsRZ4nmbo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCnVvEd6IDEuMlyZkP8hpeTkEA4SQ",
width: 480,
height: 270,
),
],
video_count: Some(4),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuQb5djEVLzwBSTT27p2dXB",
name: "The Signal Path",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/g3y_Vr8ZJ7w/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAx4HS5YSjouN2nc6A40Bp5ffmK1Q",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHstMIbtLqlEiidVjj8ob0xp",
name: "Thermal Imaging",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/NznO-DVfLd0/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCUMV2m5W3Y3tzSQipHpoRBqnBqfw",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHugqRHdt46SN9Bmoh-D5Gp2",
name: "EEVacademy",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/hFvqEfZfMtA/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCnfuvZnlr0XbuNbDrwF0SVrbTsQg",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtqqYM7ON99sbyiokMKrwwI",
name: "Brainstorming",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/p5jpxZbGp0Y/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLC10fWKf9O9VVPVSEpEjioljWzl_Q",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
],
ctoken: Some("4qmFsgLCARIYVUMyRGpGRTdYZjExVVJacVdCaWdjVk9RGnRFZ2x3YkdGNWJHbHpkSE1ZQXlBQk1BRTRBZW9EUEVOblRrUlJhbEZUU2tKSmFWVkZlREpVTW5oVVdsZG9UMlJJVmtsa1NFWjRWMVV3TTFRd05EVlBXRTVwWlZkc2RtRXdNVXhqYm1RelUxTm5PQSUzRCUzRJoCL2Jyb3dzZS1mZWVkVUMyRGpGRTdYZjExVVJacVdCaWdjVk9RcGxheWxpc3RzMTA0"),
),
)

View file

@ -0,0 +1,370 @@
---
source: src/client/channel.rs
expression: map_res.c
---
Paginator(
count: None,
items: [
ChannelPlaylist(
id: "PLvOlSehNtuHutdg1kZkG7aAYhjoJnk2fc",
name: "Nixie Tube Display Project",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/7uogKucrPks/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAtWPSsdS1RErJHwmFaG_QOb2x6Cg",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHujYmL_-5CBUg-za2osSUVI",
name: "Mystery Teardown",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/IpdJEo9r-HQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAkNA_CI47DVgUxI1p1ZBhouoq1Qw",
width: 480,
height: 270,
),
],
video_count: Some(16),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuGQmy-eJgqB28b2AWKteuG",
name: "EEVsmoke",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/U_QoWa6qXeo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBs8GgzTlhrJoIJ82YNfJNVI_WzWg",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuSab0CmpulB2Wv8Kz0985m",
name: "EEVcomments",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/lgtooEtk9R4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLClU7VCLF3zB4RblCQmRKQGwaNi_w",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvtQ5FxEivbCGxp4t3W8zKE",
name: "Spectrum Analyser",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/1QBFIfKlvHU/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDcSzeWwuSWhdB5K5sfAEvV-2zFVA",
width: 480,
height: 270,
),
],
video_count: Some(11),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuJUxiTbVKHzWjvIVf1NVOl",
name: "Space",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ADJwChUtdDQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBqY36Hfzg4st9eK_a4NX77cKHbRw",
width: 480,
height: 270,
),
],
video_count: Some(5),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtTXTVCXVDIRKV442ynD7Pz",
name: "Lunar Rover",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ADJwChUtdDQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBqY36Hfzg4st9eK_a4NX77cKHbRw",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsma5qL7piUiM5N4IOyuQyx",
name: "Wayback Wednesday",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/QgTF32aQJUo/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLByGKIwXahA_ZqJ_5X_HAS4Keyevw",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvLb_HJBKqbgZ9IvEX-pVOF",
name: "Magazines",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/3cIkk05VHsM/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAGAbiuY2PzGsECCb8aFtjOLfJU2Q",
width: 480,
height: 270,
),
],
video_count: Some(4),
),
ChannelPlaylist(
id: "PLvOlSehNtuHugE85Y_LckT4EhrKwo7WQe",
name: "Embedded Computing",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/lPDOrFuQD3g/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB3zQ9sqeyzqdq45HmOJzojMywhRg",
width: 480,
height: 270,
),
],
video_count: Some(4),
),
ChannelPlaylist(
id: "PLvOlSehNtuHu3GsTHwHoAXlWVcL3c3dA0",
name: "High Speed Camera",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ptWr0jS-aL8/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB8ENWo_0aMfdpT-1NzJIcwRQLNJg",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvTyDxI-_RDK8UlPbJ5FNf9",
name: "Announcements & Misc",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/KdpQNYc_qRc/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDsXBDqGVxFLZcMnYXIDEcpFj62gQ",
width: 480,
height: 270,
),
],
video_count: Some(28),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtT17_AeYMe-EOS_GXCBQQ1",
name: "Interviews",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/V1eivQNtulE/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCGotwWngljm-XgCyAIC6bLThV4Mg",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsCTtj-T_vkpTTbBXW4sB51",
name: "Oscilloscope Tutorials",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/DMXiD3dKYJc/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAUHrYFlazW-GuM2J7aWw6CBwlN1Q",
width: 480,
height: 270,
),
],
video_count: Some(38),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsKCtJJ_rlRP5qE7lN-1EMX",
name: "Anti-Static ESD",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/nvgW5iWXbts/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCGbknAoNqsJK6Af1X6K3D_MBTxjg",
width: 480,
height: 270,
),
],
video_count: Some(7),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvFf9a2swL8QVMwji0wT3ha",
name: "Unboxing",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/S7NoK2fiUD4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDOeXkiWjyW-Cg8Lt8z2mngQyJk6Q",
width: 480,
height: 270,
),
],
video_count: Some(2),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtn9n6n-uB8VNCTrERwYxLZ",
name: "Power Supplies",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/UI0aVEko7ic/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBaWh0sXZgr-E5-DHsTEDmZtsVOEg",
width: 480,
height: 270,
),
],
video_count: Some(43),
),
ChannelPlaylist(
id: "PLvOlSehNtuHuo-6paPTh3ji7AEMpnSna6",
name: "CNC Milling Machine",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/tV25auv4SAE/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD3ibkSVm-5fRSkZ9WMPMjYXWzbTQ",
width: 480,
height: 270,
),
],
video_count: Some(1),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvpVeLXSGlS7EBlY3zKfIXh",
name: "Capacitors",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/xlvqUts9H9c/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBjsULWSsEWg2WM_9afnuGlJuGqXw",
width: 480,
height: 270,
),
],
video_count: Some(15),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsNGit9YgkuxsFtFNJxwgot",
name: "PCB Assembly",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/porhgJ5Znrc/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCzsh4kyVE5A71khhI1XjjIej08NQ",
width: 480,
height: 270,
),
],
video_count: Some(5),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvsggk5TwGdR2BZcoKRkQ2I",
name: "3D Printing",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/fTuL_nKSKFg/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB6NL2_MaX4bcdTi3EIGxJfpUusrg",
width: 480,
height: 270,
),
],
video_count: Some(6),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtH_DR5hAIGQ-Ty6f9TZWNV",
name: "Video Editing / PC Builds",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/YBuqISRPkEI/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCbYqDzHvixOKNI2O6-ouTfaYBXyQ",
width: 480,
height: 270,
),
],
video_count: Some(3),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvPZ1-dDC449w_r2M0R4jtc",
name: "Solar Power Systems",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/fQAd7nposJQ/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCwijls6Q9iKxYKtQHxw8EBl9Uo_A",
width: 480,
height: 270,
),
],
video_count: Some(19),
),
ChannelPlaylist(
id: "PLvOlSehNtuHtolTr61FnHtvZb6tRPrs8m",
name: "EEVblab",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/9_qhlFc-MVU/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLArBfGFU7VJj37Lg8MxvRjOGEUqcw",
width: 480,
height: 270,
),
],
video_count: Some(101),
),
ChannelPlaylist(
id: "PLvOlSehNtuHsc8y1buFPJZaD1kKzIxpWL",
name: "Repairs",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/h6D4MMWjrmM/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDOYhACPdKKTxr9WXyhQNvc49Vziw",
width: 480,
height: 270,
),
],
video_count: Some(78),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvBpmbLABRmSKv2b0C4LWV_",
name: "Debunking",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/HOZBrHqTJk4/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCVTH36iKNVL8AFH3RQ-xsFyxeWxw",
width: 480,
height: 270,
),
],
video_count: Some(73),
),
ChannelPlaylist(
id: "PLvOlSehNtuHs_8iObryqVCeqLIo5KTFQ-",
name: "Lab Bench Builds + ESD Mats",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/vuUSIt3rbyU/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAxyWgAQkMNP-vNjD1ToV74WGD9Lg",
width: 480,
height: 270,
),
],
video_count: Some(9),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvatF_8oJ2qpKxi_wWw6YN4",
name: "Reverse Engineering",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/lJVrTV_BeGg/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA0qbMgSaroaIo9tsd1LvJH9f9dDQ",
width: 480,
height: 270,
),
],
video_count: Some(10),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvwQR69zYRyxSkujQs2SgLl",
name: "Scams",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/i3B_KKyntQE/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDXYuBZWDV4J9ZGErX4MS7cOsJ6yg",
width: 480,
height: 270,
),
],
video_count: Some(5),
),
ChannelPlaylist(
id: "PLvOlSehNtuHvRvEU3VebO2JHa1I_iIAQD",
name: "Hacking / Experiments",
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/XWnylXMrMII/hqdefault.jpg?sqp=-oaymwEXCOADEI4CSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBQ2ylnRFQssVe3B-MtkVcTPfyZBg",
width: 480,
height: 270,
),
],
video_count: Some(63),
),
],
ctoken: Some("4qmFsgLCARIYVUMyRGpGRTdYZjExVVJacVdCaWdjVk9RGnRFZ2x3YkdGNWJHbHpkSE1ZQXlBQk1BRTRBZW9EUEVOblRrUlJhbEZUU2tKSmFWVkZlREpVTW5oVVdsZG9UMlJJVmtsa2JFb3lVbFpWZWxadFZtbFVla3BMVTBkRmVGTldPWEJUVlVaU1VrTm5PQSUzRCUzRJoCL2Jyb3dzZS1mZWVkVUMyRGpGRTdYZjExVVJacVdCaWdjVk9RcGxheWxpc3RzMTA0"),
)

View file

@ -0,0 +1,970 @@
---
source: src/client/channel.rs
expression: map_res.c
---
Paginator(
count: None,
items: [
ChannelVideo(
id: "R2fw2g6WFbg",
title: "EEVblog 1477 - TEARDOWN! - NEW Tektronix 2 Series Oscilloscope",
length: Some(2718),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/R2fw2g6WFbg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBwd6wqvFI0HcPpOkDW_XDzWSPH_w",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/R2fw2g6WFbg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDuoKzNwygQX0_ilJIpfo3U36mtxQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/R2fw2g6WFbg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBSHLSMeSK7A61DxrsipNANcnBXxQ",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/R2fw2g6WFbg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCxrR2pNosEHIy_xxC5tp7v2w2tPw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(80296),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "JDXKrXJloSw",
title: "EEVblog 1476 - Keithley 515A Wheatstone Bridge TEARDOWN & TUTORIAL",
length: Some(1721),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/JDXKrXJloSw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCk0u4EnX8f6ud7s704sbv5UGFZug",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/JDXKrXJloSw/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDP9mgeJI1CVTBCQ7Rn-X-j9Jycww",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/JDXKrXJloSw/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAF9cGhMzxOyWML2HjmicjFu3609g",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/JDXKrXJloSw/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBHBGp63lGpQB3NufNurz9VW4bc7g",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(36294),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "H8ot_YPi6QU",
title: "eevBLAB 98 - The Pressure Youtubers Are Under",
length: Some(431),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/H8ot_YPi6QU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBiimvgnZx6akYlMkU-hxSuIM33Mg",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/H8ot_YPi6QU/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDOpegM_mWU_d44VGhbwc22ePg9fA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/H8ot_YPi6QU/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA-GLJJARJ7Whw_zWo1pKDTDkBCpg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/H8ot_YPi6QU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBuELgu2kMxNH4CGLvSnxmCNtla_Q",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(34736),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "i1Ad5jfk_v4",
title: "EEVblog 1475 - What\'s This SMD Part?",
length: Some(1785),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/i1Ad5jfk_v4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCxhWKrpuy11lTv5po8m7OyQYxbvA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/i1Ad5jfk_v4/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDef1o7qpthU6sJMXjjwHZ3Oqf_hw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/i1Ad5jfk_v4/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDBt0YBGTSQlw9qnX8yVD2Yjnrtmw",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/i1Ad5jfk_v4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA-q__bcXjNcXEoR-vjItds77-5rQ",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("3 months ago"),
view_count: Some(73544),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "GHbo4v8pahc",
title: "eevBLAB 97 - Is Apple Serious About Right To Repair? (The Verge)",
length: Some(1186),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/GHbo4v8pahc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBKNYL8XTxa9LDJKG6L7unv3CJG9Q",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GHbo4v8pahc/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBqhk2e880tzuXjOTLpWOSKlwgiTQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GHbo4v8pahc/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAPQ78YIrVaolLCX0xvNe1FYk4tAQ",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GHbo4v8pahc/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCfHHyWth7HAPLhYU-WTZuvYv4bxA",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(67231),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "Uds-wLoaZmA",
title: "EEVblog 1474 - Can You Measure Capacitors IN Circuit?",
length: Some(1407),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/Uds-wLoaZmA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLASo0gEqEXqljW-KjeCb2jcr8Wxkw",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Uds-wLoaZmA/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD-2hcr1cWYXbn-VrWQiuEgvVw-Xw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Uds-wLoaZmA/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB1qfgnGi32Hb-dju_uTzKvp0nmvw",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Uds-wLoaZmA/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDNu1DBaHQlSXiQIG2drkpboSbHbw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(44946),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "D9J-AmCcf4U",
title: "EEVblog 1473 - How Your LCR Meter Works",
length: Some(1183),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/D9J-AmCcf4U/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBO_KDd4KRJX5K0ea3of2pm_Pp3dw",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/D9J-AmCcf4U/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCpUbV0j7sgqOX_3e2AjCIIdqUMSw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/D9J-AmCcf4U/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC2t1SJmgX5NVuN-W9qjPkXDBDyew",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/D9J-AmCcf4U/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAkSkj54WBcZLoxP4aBT9UinTitng",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(43264),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "Eoh-JKVQZwg",
title: "EEVblog 1472 - Resistor Cube Problem SOLVED",
length: Some(1196),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/Eoh-JKVQZwg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA7JkB7fkv4gOeXl4-B9VWSSsbkDw",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Eoh-JKVQZwg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCJqg51qh9_ph6Y9q9uz302AwX0GQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Eoh-JKVQZwg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCa4ITkjmkEKEIJJQRWjKhu3q_T3Q",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Eoh-JKVQZwg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDfWJzduhf5wc8vS5QT-EkhZxosHg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(98175),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "U81glZBDpIg",
title: "EEVblog 1471 - Mailbag",
length: Some(2252),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/U81glZBDpIg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfgd3GSfLFioa89tLill31Zl7gOg",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/U81glZBDpIg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBEKWSqugYCKZfsH-hN8zE_D-ROSg",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/U81glZBDpIg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBA3b2qfDKvmA_h2nMQoF7Se6-AOA",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/U81glZBDpIg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB9x4BNeYLsZ6y0zy0n-uDYA_ByCw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("4 months ago"),
view_count: Some(59376),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "gLfxznVJ2q0",
title: "Petition - Australian Standards Should be FREE",
length: Some(585),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/gLfxznVJ2q0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDCSXOJMOfUPep7AbUFPFEW2e-KFA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/gLfxznVJ2q0/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBEhu3Mi8aNdGe0DtBZwQbU0VsPBA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/gLfxznVJ2q0/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAyddn2YV5-kHe637vfTKW0YZjpjg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/gLfxznVJ2q0/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC4tGGAEnZtnTc9-kaGbQaMRpAN4Q",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(25496),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "GfihUkWPCQQ",
title: "EEVblog 1470 - AC Basics Tutorial Part 3 - Complex Numbers are EASY!",
length: Some(1468),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/GfihUkWPCQQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBTbyr1AEDanXKDJg18zCEDN5YKCg",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GfihUkWPCQQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBMI4WclkmxCxYxX-GGNlCREfYy_w",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GfihUkWPCQQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCNGFKnO9oxnQy3zMfbNV2yBUun0A",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/GfihUkWPCQQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDrGmoHSXxoZsFLkDt7TLqNSFI0Dg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(22982),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "yEG6pKUdIlg",
title: "EEVblog 1469 - AC Basics Tutorial - Part 2 - Phasors",
length: Some(1147),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/yEG6pKUdIlg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAavMqXRQQP8Qs6jPDdCaZdjj28sw",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yEG6pKUdIlg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD5SIrhW3EppC7S5D3v0C4sRRIkWw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yEG6pKUdIlg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDgNM-cIitvxxZcxx3DG1qeyXdmEA",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yEG6pKUdIlg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA55TnBHmQ90cIjynGfySBf3TAbsw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(38804),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "wPzzPGzxD00",
title: "EEVblog 1468 - Electronex Show Tour 2022",
length: Some(2850),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/wPzzPGzxD00/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA3HoFx0YDm9C54Wn8lPV-hqHmLBA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/wPzzPGzxD00/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLARDz3vlQih0JUc4kS78Co6fxi9zA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/wPzzPGzxD00/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAKMD-PPJglubTE42NBXawpGwO9bg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/wPzzPGzxD00/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBoj0usdvhlWnXadesKerqogp6zRA",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(25505),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "Tdge8vEODeY",
title: "EEVblog 1467 - Stanford Solar Power at Nightime! BUSTED",
length: Some(836),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/Tdge8vEODeY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCcLhiajXRRNS9OAmsMeX1ploYVog",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Tdge8vEODeY/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAj1doNz5lrIsCWHhCFHZCxsUUEAA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Tdge8vEODeY/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB6my3cj69pSkEXWdLSQoXQ8OTr-g",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/Tdge8vEODeY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCXIwvkXojHBQnDvuKSvAM3ePbY4Q",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(98432),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "ebQ2Im5zfT0",
title: "EEVblog 1466 - Dumpster Dive Xeon Server",
length: Some(1138),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ebQ2Im5zfT0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBfBPfDfHepn92nrxb-l3GoEUJxNg",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ebQ2Im5zfT0/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCZTC1Pr28bD1ouBcTavpaa_LmaIA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ebQ2Im5zfT0/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLABsinfBoimn2O_zp984GhuMedELA",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ebQ2Im5zfT0/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDy_rT1jU0niVvuWM0KlJpGeekZyQ",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(53410),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "UrS5ezesA9s",
title: "EEVblog 1465 - Your Multimeter Can Measure Inductors",
length: Some(596),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/UrS5ezesA9s/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDhubVMAa4lD0PEkWJwxngLFy2g5A",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/UrS5ezesA9s/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCJEKnJlGned_3v4XmiTUbrsSZLNw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/UrS5ezesA9s/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCQWi8yvRKaqMMKpG022n1USvCBWg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/UrS5ezesA9s/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAuMTY3srN7WsRMhJxsloubTzDtQg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("5 months ago"),
view_count: Some(54771),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "c5M8P6oe9xY",
title: "EEVblog 1464 - TOP 5 Jellybean Comparators",
length: Some(2399),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/c5M8P6oe9xY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBBbPtmLMOKuiIB4l1Z_VuF8ajH1g",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/c5M8P6oe9xY/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCihINW-Fv_dQ3IX_wJSD7qITrHfQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/c5M8P6oe9xY/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDLM6HB8eUy0IpmWzr1uPbjugLuew",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/c5M8P6oe9xY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA01LL_xU-hIeDpy9vSOqA1I0ICXg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(39823),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "9TDKP9RLlPs",
title: "EEVblog 1463 - Mailbag",
length: Some(2664),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/9TDKP9RLlPs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBC8e8sMlrwsvUamlxaJGvSAB1vAQ",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9TDKP9RLlPs/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDfArgKVhHFFoI394mCg_XE3Wei6g",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9TDKP9RLlPs/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDXfY9lwIVDusvOaV6ocjC7aBw5vw",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9TDKP9RLlPs/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCkTdJTeQc1cYTWMzeFl3Jq1B6Mpg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(51596),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "hwggIw2HQuQ",
title: "eevBLAB 96 - BUSTED! - Dymo Gets WORSE!",
length: Some(347),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/hwggIw2HQuQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBrARGU_K_yrxFuO5Fx0a2sznKUCA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/hwggIw2HQuQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDK9IunmYhZL6P3R4msH7TkQWCX5A",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/hwggIw2HQuQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA4mUZjwSnMJMlAmrwEw7SPSv58KA",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/hwggIw2HQuQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDiUYwb0oj_plM5pYy2162pDjNDxw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(125391),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "xzSDJRC0F6c",
title: "EEVblog 1462 - Why Dymo Label Printers SUCK!",
length: Some(1353),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/xzSDJRC0F6c/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAG9svGIbJ61gBv2XurBBjdj7eWaA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/xzSDJRC0F6c/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDoqZA8Gx8gY_FLjeoRIRKMG7wjbQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/xzSDJRC0F6c/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDATV03jYmr-LvD-D4UEKwlUxVluw",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/xzSDJRC0F6c/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC5m7sv2ryiTWCPca7mKgKnLpv6Sg",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(120457),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "9wuyPZjjR9k",
title: "EEVblog 1461 - The MOSFET Search CHALLENGE",
length: Some(3505),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/9wuyPZjjR9k/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBhLudpzPSKR-vnRpUF61-upI5W4A",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9wuyPZjjR9k/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDXplqG0PHq4OcLmke-FWCFCVd4mA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9wuyPZjjR9k/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB7mZ-ZXrWYa2KzFj2y0Yc_Zydcuw",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/9wuyPZjjR9k/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCLlZ23xsw-FySMuZn4T22qPzMm8A",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(49062),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "vyJuMGEFbjQ",
title: "EEVblog1460 - REPAIRING a LED Studio Light with a DUMPSTER LAPTOP!",
length: Some(1798),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/vyJuMGEFbjQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLConLvhiiORxzI4W53cK838-oimWA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/vyJuMGEFbjQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC8qAl36_iWoZAu17Iy8YNoN1_zfA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/vyJuMGEFbjQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDSzE9BzI0DAGRZldbXXeWXtZVVlg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/vyJuMGEFbjQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC9ymYRIGof-5xuhl4T7gv2FLvsLw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("6 months ago"),
view_count: Some(49032),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "_pETMto-9iE",
title: "EEVblog 1459 - Is it worth PARTS SALVAGING an Inkjet Printer/Scanner?",
length: Some(1588),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/_pETMto-9iE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLANwQQorgH71g8SZTkT6gi8SjkDCQ",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/_pETMto-9iE/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDl76e8qzIlOQaURaKurvsKbuSj7A",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/_pETMto-9iE/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBW6T8ujpDGxy1A4_vACQu2sloa7w",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/_pETMto-9iE/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAqS3iMeFQQNefvZS_1OkojnPYJbw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(64108),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "MvFf9RSJUhk",
title: "EEVblog 1458 - Microscope Polarising MAGIC!",
length: Some(942),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/MvFf9RSJUhk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAOkBS4oJiQHsbt_NMdXftPeUaR8A",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/MvFf9RSJUhk/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDkS_ttHQh0W85pH9hEMmAYs1Xzfw",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/MvFf9RSJUhk/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBL59K98hTe0gXIz6lXpa8SwrDB-g",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/MvFf9RSJUhk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDbj4ZsY0tTVhZjnrz1CQdxiBzEiA",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(76831),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "E6obq3T71vI",
title: "EEVblog1457 - Old School Mailbag - ESC Burnout",
length: Some(1552),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/E6obq3T71vI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA24jAiRp_-m1MJQATFhdbrRqFnHA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/E6obq3T71vI/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB_CIBq57_N9N6hx0inPbmRt4MYhA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/E6obq3T71vI/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDnYGjrGBBO2VxivmddlpqZL7G4sA",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/E6obq3T71vI/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAsmpwO5F_QjW9TPNyB1BduG21Uiw",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(49961),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "ZTwVQmUm6NY",
title: "eevBLAB 95 - Why Are Youtube Playlists So BAD?",
length: Some(865),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/ZTwVQmUm6NY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAi4YH3QhTYvY5be4zeqST3PZ7EBA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ZTwVQmUm6NY/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD5bfW8_geDmav4fZRkBIoP-DsACQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ZTwVQmUm6NY/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDLqZNDw1LK8yACqZLuMfD1wK3z6g",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/ZTwVQmUm6NY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUI2iQUNQla1I2iGfynsoVBKQwzA",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(17393),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "prQinQ4MWmU",
title: "EEVblog 1456 - Sega Toys Homestar Planetarium REPAIR",
length: Some(899),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/prQinQ4MWmU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDXaQgmCdFsIkM5Yt0Req7NWHELjQ",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/prQinQ4MWmU/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA5jjClMCi3VKxrxTwlpNycDHRILQ",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/prQinQ4MWmU/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAbk80-ceB8c8OhLDbpOR2EaEYl4A",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/prQinQ4MWmU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAGvNQs-1z44mVcygV86GMnS4Qp0w",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(38281),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "yMIzsFAztv4",
title: "EEVblog 1455 - Capacitors Produce Current During Reflow Soldering! WTF!",
length: Some(894),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/yMIzsFAztv4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDcBhR3clJQxbrPONzQJ9nUNd_0OA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yMIzsFAztv4/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBXj_xSNvJ2ydBzV4xKwi4FEIDahg",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yMIzsFAztv4/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAUUK4vBj0JJjNqCR5M7xzSxfaS8A",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/yMIzsFAztv4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBg7A2VopA3daXfdUli8s2Cj1_LlA",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(70004),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "QtqljdMwRyk",
title: "EEVblog 1454 - Water from Air AGAIN! - The Kara Pure",
length: Some(1198),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/QtqljdMwRyk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDERzxdJPJQ7T_UhqojqFaACgzFvA",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/QtqljdMwRyk/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDdaa0lEaeOHA8BGRVvXW_PbD79rA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/QtqljdMwRyk/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDAkiwvdVZm0hhcoQSYxX5eFkWVhg",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/QtqljdMwRyk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDIOLza0s7w6gM2M84n_ql8eMzT6g",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(93700),
is_live: false,
is_short: false,
),
ChannelVideo(
id: "kcWwAweWjQg",
title: "EEVblog 1453 - Elgato Key Light TEARDOWN",
length: Some(1048),
thumbnail: [
Thumbnail(
url: "https://i.ytimg.com/vi/kcWwAweWjQg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLASIZUAaqbklehN0AG_xn6QDrREog",
width: 168,
height: 94,
),
Thumbnail(
url: "https://i.ytimg.com/vi/kcWwAweWjQg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB4BClIc7vKmndVvmJuOFXX49J5KA",
width: 196,
height: 110,
),
Thumbnail(
url: "https://i.ytimg.com/vi/kcWwAweWjQg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDJX7QLVpVrDHHM7PloZI8hqDPjEQ",
width: 246,
height: 138,
),
Thumbnail(
url: "https://i.ytimg.com/vi/kcWwAweWjQg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDWNJYB3GA5AMMB_PjBOuysLXtnhQ",
width: 336,
height: 188,
),
],
publish_date: "[date]",
publish_date_txt: Some("7 months ago"),
view_count: Some(37515),
is_live: false,
is_short: false,
),
],
ctoken: Some("4qmFsgKxARIYVUMyRGpGRTdYZjExVVJacVdCaWdjVk9RGmZFZ1oyYVdSbGIzTVlBeUFBTUFFNEFlb0ROME5uVGtSU1JXdFRRM2RwU1cxMGNUaHpTVVJ6TkhCRlFrdEVTWGRCYW1jNFVXZHpTUzFRUkVodFVWbFJhVzloY0VWclowTlZSRWslM0SaAixicm93c2UtZmVlZFVDMkRqRkU3WGYxMVVSWnFXQmlnY1ZPUXZpZGVvczEwMg%3D%3D"),
)

View file

@ -16,7 +16,7 @@ use crate::{
use super::{
response::{self, IconType, IsLive},
ClientType, MapResponse, RustyPipeQuery, YTContext,
ClientType, MapResponse, QContinuation, RustyPipeQuery, YTContext,
};
#[derive(Debug, Serialize)]
@ -30,12 +30,6 @@ struct QVideo {
racy_check_ok: bool,
}
#[derive(Debug, Serialize)]
struct QVideoCont {
context: YTContext,
continuation: String,
}
impl RustyPipeQuery {
pub async fn video_details(self, video_id: &str) -> Result<VideoDetails> {
let context = self.get_context(ClientType::Desktop, true).await;
@ -59,7 +53,7 @@ impl RustyPipeQuery {
pub async fn video_recommendations(self, ctoken: &str) -> Result<Paginator<RecommendedVideo>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QVideoCont {
let request_body = QContinuation {
context,
continuation: ctoken.to_owned(),
};
@ -77,7 +71,7 @@ impl RustyPipeQuery {
pub async fn video_comments(self, ctoken: &str) -> Result<Paginator<Comment>> {
let context = self.get_context(ClientType::Desktop, true).await;
let request_body = QVideoCont {
let request_body = QContinuation {
context,
continuation: ctoken.to_owned(),
};

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff