feat: add rich text extraction
- add video detail tests
This commit is contained in:
parent
3596861b77
commit
8629454b5b
18 changed files with 1784 additions and 8921 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,5 +1,6 @@
|
|||
/target
|
||||
/Cargo.lock
|
||||
*.pending-snap
|
||||
|
||||
rustypipe_reports
|
||||
rustypipe_cache.json
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ members = [".", "codegen", "cli"]
|
|||
[features]
|
||||
default = ["default-tls"]
|
||||
|
||||
html = ["askama_escape"]
|
||||
|
||||
# Reqwest TLS
|
||||
default-tls = ["reqwest/default-tls"]
|
||||
rustls-tls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
|
||||
|
|
@ -41,6 +43,7 @@ indicatif = "0.17.0"
|
|||
filenamify = "0.1.0"
|
||||
ress = "0.11.4"
|
||||
phf = "0.11.1"
|
||||
askama_escape = {version = "0.10.3", optional = true}
|
||||
|
||||
[dev-dependencies]
|
||||
env_logger = "0.9.0"
|
||||
|
|
|
|||
|
|
@ -127,8 +127,8 @@ async fn video_details(testfiles: &Path) {
|
|||
("mv", "ZeerrnuLi5E"),
|
||||
("ccommons", "0rb9CfOvojk"),
|
||||
("chapters", "nFDBxBUfE74"),
|
||||
("agegate", "XuM2onMGvTI"),
|
||||
("live", "86YLFOog4GM"),
|
||||
("agegate", "HRKu0cvrr_o"),
|
||||
] {
|
||||
let mut json_path = testfiles.to_path_buf();
|
||||
json_path.push("video_details");
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Album with unknown artists: https://music.youtube.com/playlist?list=OLAK5uy_mEX9
|
|||
Comment by artist: 3pv_rHKnwAs
|
||||
|
||||
Comments disabled: XuM2onMGvTI
|
||||
Likes hidden:
|
||||
Likes hidden + agegate: HRKu0cvrr_o
|
||||
|
||||
# Playlists
|
||||
962 Songs: PL4lEESSgxM_5O81EvKCmBIm_JT5Q7JeaI
|
||||
|
|
|
|||
|
|
@ -167,11 +167,7 @@ impl MapResponse<Playlist> for response::Playlist {
|
|||
c: Playlist {
|
||||
id: playlist_id,
|
||||
name,
|
||||
videos: Paginator {
|
||||
count: Some(n_videos),
|
||||
items: videos,
|
||||
ctoken,
|
||||
},
|
||||
videos: Paginator::new(Some(n_videos), videos, ctoken),
|
||||
video_count: n_videos,
|
||||
thumbnail: thumbnails.into(),
|
||||
description,
|
||||
|
|
@ -201,11 +197,7 @@ impl MapResponse<Paginator<PlaylistVideo>> for response::PlaylistCont {
|
|||
map_playlist_items(action.append_continuation_items_action.continuation_items.c);
|
||||
|
||||
Ok(MapResult {
|
||||
c: Paginator {
|
||||
count: None,
|
||||
items,
|
||||
ctoken,
|
||||
},
|
||||
c: Paginator::new(None, items, ctoken),
|
||||
warnings: action
|
||||
.append_continuation_items_action
|
||||
.continuation_items
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ use serde_with::{serde_as, DefaultOnError, VecSkipError};
|
|||
|
||||
use crate::serializer::{
|
||||
ignore_any,
|
||||
text::{Text, TextLink, TextLinks},
|
||||
text::{Text, TextComponent},
|
||||
};
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
|
|
@ -121,8 +121,7 @@ pub struct VideoOwner {
|
|||
#[derive(Clone, Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct VideoOwnerRenderer {
|
||||
#[serde_as(as = "TextLink")]
|
||||
pub title: TextLink,
|
||||
pub title: TextComponent,
|
||||
pub thumbnail: Thumbnails,
|
||||
#[serde_as(as = "Option<Text>")]
|
||||
pub subscriber_count_text: Option<String>,
|
||||
|
|
@ -249,8 +248,7 @@ pub struct MusicColumn {
|
|||
#[serde_as]
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
pub struct MusicColumnRenderer {
|
||||
#[serde_as(as = "TextLinks")]
|
||||
pub text: Vec<TextLink>,
|
||||
pub text: TextComponent,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use serde::Deserialize;
|
|||
use serde_with::serde_as;
|
||||
use serde_with::{json::JsonString, DefaultOnError, VecSkipError};
|
||||
|
||||
use crate::serializer::text::{Text, TextLink};
|
||||
use crate::serializer::text::{Text, TextComponent};
|
||||
use crate::serializer::{MapResult, VecLogError};
|
||||
|
||||
use super::{ContentRenderer, ContentsRenderer, Thumbnails, ThumbnailsWrap, VideoListItem};
|
||||
|
|
@ -70,8 +70,7 @@ pub struct PlaylistVideo {
|
|||
#[serde_as(as = "Text")]
|
||||
pub title: String,
|
||||
#[serde(rename = "shortBylineText")]
|
||||
#[serde_as(as = "TextLink")]
|
||||
pub channel: TextLink,
|
||||
pub channel: TextComponent,
|
||||
#[serde_as(as = "JsonString")]
|
||||
pub length_seconds: u32,
|
||||
}
|
||||
|
|
@ -94,8 +93,7 @@ pub struct HeaderRenderer {
|
|||
pub description_text: Option<String>,
|
||||
#[serde_as(as = "Text")]
|
||||
pub num_videos_text: String,
|
||||
#[serde_as(as = "Option<TextLink>")]
|
||||
pub owner_text: Option<TextLink>,
|
||||
pub owner_text: Option<TextComponent>,
|
||||
|
||||
// Alternative layout
|
||||
pub playlist_header_banner: Option<PlaylistHeaderBanner>,
|
||||
|
|
|
|||
|
|
@ -4,10 +4,11 @@ use serde::Deserialize;
|
|||
use serde_with::serde_as;
|
||||
use serde_with::{DefaultOnError, VecSkipError};
|
||||
|
||||
use crate::serializer::text::TextComponents;
|
||||
use crate::serializer::MapResult;
|
||||
use crate::serializer::{
|
||||
ignore_any,
|
||||
text::{AccessibilityText, Text, TextLink, TextLinks},
|
||||
text::{AccessibilityText, Text, TextComponent},
|
||||
VecLogError,
|
||||
};
|
||||
|
||||
|
|
@ -88,8 +89,7 @@ pub enum VideoResultsItem {
|
|||
VideoSecondaryInfoRenderer {
|
||||
owner: VideoOwner,
|
||||
#[serde(default)]
|
||||
#[serde_as(as = "Text")]
|
||||
description: String,
|
||||
description: TextComponents,
|
||||
/// Additional metadata (e.g. Creative Commons License)
|
||||
#[serde(default)]
|
||||
#[serde_as(deserialize_as = "DefaultOnError")]
|
||||
|
|
@ -210,8 +210,7 @@ pub struct MetadataRowRenderer {
|
|||
/// Text (en): `Creative Commons Attribution license (reuse allowed)`
|
||||
///
|
||||
/// URL: `https://www.youtube.com/t/creative_commons`
|
||||
#[serde_as(as = "Vec<TextLinks>")]
|
||||
pub contents: Vec<Vec<TextLink>>,
|
||||
pub contents: Vec<TextComponents>,
|
||||
}
|
||||
|
||||
/// Contains current video ID
|
||||
|
|
@ -297,8 +296,7 @@ pub struct RecommendedVideo {
|
|||
#[serde_as(as = "Text")]
|
||||
pub title: String,
|
||||
#[serde(rename = "shortBylineText")]
|
||||
#[serde_as(as = "TextLink")]
|
||||
pub channel: TextLink,
|
||||
pub channel: TextComponent,
|
||||
pub channel_thumbnail: Thumbnails,
|
||||
/// Channel verification badge
|
||||
#[serde(default)]
|
||||
|
|
@ -309,8 +307,8 @@ pub struct RecommendedVideo {
|
|||
/// (e.g. `11 months ago`)
|
||||
#[serde_as(as = "Option<Text>")]
|
||||
pub published_time_text: Option<String>,
|
||||
#[serde_as(as = "Text")]
|
||||
pub view_count_text: String,
|
||||
#[serde_as(as = "Option<Text>")]
|
||||
pub view_count_text: Option<String>,
|
||||
/// Badges are displayed on the video thumbnail and
|
||||
/// show certain video properties (e.g. active livestream)
|
||||
#[serde(default)]
|
||||
|
|
@ -560,8 +558,7 @@ pub struct CommentRenderer {
|
|||
#[serde_as(as = "DefaultOnError")]
|
||||
pub author_endpoint: Option<AuthorEndpoint>,
|
||||
/// Comment text
|
||||
#[serde_as(as = "Text")]
|
||||
pub content_text: String,
|
||||
pub content_text: TextComponents,
|
||||
/// Textual publish date (e.g. `15 minutes ago`, `2 days ago`)
|
||||
#[serde_as(as = "Text")]
|
||||
pub published_time_text: String,
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@ expression: map_res.c
|
|||
id: PL5dDx681T4bR7ZF1IuWzOv1omlRbE7PiJ
|
||||
name: Die schönsten deutschen Lieder | Beliebteste Lieder | Beste Deutsche Musik 2022
|
||||
videos:
|
||||
count: 495
|
||||
items:
|
||||
- id: Bkj3IVIO2Os
|
||||
title: Stereoact feat. Kerstin Ott - Die Immer Lacht (Official Video HD)
|
||||
length: 216
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Bkj3IVIO2Os/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCdvrHLT_gdx5zxxO6SPig0sRLshQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -28,7 +29,7 @@ videos:
|
|||
- id: lHZtcC67yrY
|
||||
title: Andreas Gabalier - Hulapalu
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/lHZtcC67yrY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDEYbpOXNx1VkAE7MDYQxK30ySK3Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -47,7 +48,7 @@ videos:
|
|||
- id: TSkVVVBS9k8
|
||||
title: "BAUSA - Was du Liebe nennst (Official Music Video) [prod. von Bausa, Jugglerz & The Cratez]"
|
||||
length: 237
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/TSkVVVBS9k8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCHZwNmGrLnYEsd6H7vzVAl0wDccw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -66,7 +67,7 @@ videos:
|
|||
- id: lc-cnCRhE7c
|
||||
title: Kay One feat. Pietro Lombardi - Señorita (prod. by Stard Ova)
|
||||
length: 250
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/lc-cnCRhE7c/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAr2qEMqH5qnJkqLU-CRGFgoDN1DQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -85,7 +86,7 @@ videos:
|
|||
- id: 3ryohiCVq3M
|
||||
title: Namika - Lieblingsmensch (Official Video)
|
||||
length: 191
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/3ryohiCVq3M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAnminoxsvobc_U0CE2lgZm9_0qeQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -104,7 +105,7 @@ videos:
|
|||
- id: BNHamTwxJ6Q
|
||||
title: "Roland Kaiser, Maite Kelly - Warum hast du nicht nein gesagt (Club Mix / Videoclip)"
|
||||
length: 217
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/BNHamTwxJ6Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA2EhfLWBk74_06c21rrSdz7tOrGQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -123,7 +124,7 @@ videos:
|
|||
- id: 5mqelmYUcI0
|
||||
title: Kay One - Louis Louis (prod. by Stard Ova)
|
||||
length: 218
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/5mqelmYUcI0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCwnyUxowXZ244j5y8alOFPC0vX-Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -142,7 +143,7 @@ videos:
|
|||
- id: k9EYjn5f_nE
|
||||
title: Andreas Bourani - Auf uns (Official Video)
|
||||
length: 244
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/k9EYjn5f_nE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCyAbU3awWGYzOrjTrmQbVV7ifNXg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -161,7 +162,7 @@ videos:
|
|||
- id: fkMg_X9lHMc
|
||||
title: "Marteria - Kids (2 Finger an den Kopf) [Offizielles Video]"
|
||||
length: 230
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fkMg_X9lHMc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC8Ugdq8rK6ypi11IMafwoaTagQ7Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -180,7 +181,7 @@ videos:
|
|||
- id: 4wOoLLDXbDY
|
||||
title: CRO - Easy (Official Version)
|
||||
length: 195
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/4wOoLLDXbDY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB8UXJLvwcuTIhh4Vi5GTeC40Up7w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -199,7 +200,7 @@ videos:
|
|||
- id: Z_mf9aCHag8
|
||||
title: "KC Rebell feat. Moé ► BIST DU REAL ◄ [ official Video 4K ] | Dagi Bee"
|
||||
length: 186
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Z_mf9aCHag8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAo2HLlXaCQEKzkHjBVsS0yqDQexQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -218,7 +219,7 @@ videos:
|
|||
- id: cZ58odQo87A
|
||||
title: SDP feat. Adel Tawil - Ich will nur dass du weißt
|
||||
length: 222
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/cZ58odQo87A/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCO8i1BvBLWn_LuKwvOwyZQNWxZgA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -237,7 +238,7 @@ videos:
|
|||
- id: 1il3RFk5Okw
|
||||
title: Mark Forster - Chöre (Willkommen bei den Hartmanns Version)
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1il3RFk5Okw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDy8VAlVslYo3IXr7Cier_CGEh3aA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -256,7 +257,7 @@ videos:
|
|||
- id: 8WQMBv2deYQ
|
||||
title: CRO - Traum (Official Version)
|
||||
length: 219
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/8WQMBv2deYQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCeZJ96xE-bI9aQybOxIbOOZj8W5g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -275,7 +276,7 @@ videos:
|
|||
- id: vGrfFzagzHs
|
||||
title: CRO - Whatever (Official Version)
|
||||
length: 207
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/vGrfFzagzHs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD5eTJevRx2iLio640dzb5l5ViNNA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -294,7 +295,7 @@ videos:
|
|||
- id: 1gDbpWC_9pE
|
||||
title: Sarah Connor - Wie schön Du bist (Official Video)
|
||||
length: 216
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1gDbpWC_9pE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDLRfYnE54l7T8UX4HYeIQqpkQJYw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -313,7 +314,7 @@ videos:
|
|||
- id: p-AWcCCbBHw
|
||||
title: "Nimo - HEUTE MIT MIR (prod. von PzY) [Official 4K Video]"
|
||||
length: 256
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/p-AWcCCbBHw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC7Mf1odYlMKp9fElxeWX5BZ6I-kQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -332,7 +333,7 @@ videos:
|
|||
- id: RPN88D_HjMU
|
||||
title: "Xavier Naidoo - Ich kenne nichts (Das so schön ist wie du) [Official Video]"
|
||||
length: 332
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RPN88D_HjMU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDNkYiCJsMDWsLD8SoTG7fGjA2h1A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -351,7 +352,7 @@ videos:
|
|||
- id: 5PST7Ld4wWU
|
||||
title: Max Giesinger - Wenn sie tanzt (Offizielles Video)
|
||||
length: 225
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/5PST7Ld4wWU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBd_J44LO8vi882xka68dBcawvkFw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -370,7 +371,7 @@ videos:
|
|||
- id: opoDBF_b-fg
|
||||
title: ALLIGATOAH - WILLST DU (OFFICIAL HD VERSION AGGRO.TV)
|
||||
length: 307
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/opoDBF_b-fg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAymd4m1ekevbFUIs-zGRuhlpfI-g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -389,7 +390,7 @@ videos:
|
|||
- id: AMT9IOyXmBM
|
||||
title: SIDO feat. Mark Forster - Einer dieser Steine (Official Video)
|
||||
length: 258
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/AMT9IOyXmBM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDvYWerCDxj5Xrgz6bz5j0Xr7-YOQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -408,7 +409,7 @@ videos:
|
|||
- id: VP5B1UmgHfc
|
||||
title: SDP feat. Sido - Ne Leiche
|
||||
length: 328
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/VP5B1UmgHfc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCs9MaUdTbxzvessh6g8U3198NLjQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -427,7 +428,7 @@ videos:
|
|||
- id: vcuQpbs0yT0
|
||||
title: KURDO - YA SALAM (prod. by Kostas Karagiozidis & Dj Tuneruno )
|
||||
length: 224
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/vcuQpbs0yT0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCDn8gtSond6Yn5MLlzZDv_IrS-zQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -446,7 +447,7 @@ videos:
|
|||
- id: LeMLVEJLruQ
|
||||
title: Gestört aber GeiL feat. Sebastian Hämer - Ich & Du (Official Video HD)
|
||||
length: 229
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/LeMLVEJLruQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDDKCM7JzUUlgc-EgWM4lOn3g6qLw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -465,7 +466,7 @@ videos:
|
|||
- id: MtDPKJSsBgc
|
||||
title: Mark Forster - Au Revoir (Videoclip) ft. Sido
|
||||
length: 227
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/MtDPKJSsBgc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDFPEql4pa1PPNZMBCe0ZHR7nfh1g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -484,7 +485,7 @@ videos:
|
|||
- id: 4tDpYxNYqPg
|
||||
title: Kerstin Ott - Scheissmelodie (Offizielles Musikvideo)
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/4tDpYxNYqPg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBmM1gywMKE8-hbZ42Wdsul8hlleg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -503,7 +504,7 @@ videos:
|
|||
- id: EkWjaoH7k6w
|
||||
title: Adel Tawil - Ist da jemand (Official Video)
|
||||
length: 251
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/EkWjaoH7k6w/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC4WbamH3V3SpCVPeC4_Rs3v3tF8w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -522,7 +523,7 @@ videos:
|
|||
- id: tERRFWuYG48
|
||||
title: Barfuß Am Klavier - AnnenMayKantereit
|
||||
length: 202
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/tERRFWuYG48/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCFhWEwvzfax4dm8E1GnztHWxUYuw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -541,7 +542,7 @@ videos:
|
|||
- id: wCcJuN47UcY
|
||||
title: Revolverheld feat. Marta Jandová - Halt Dich an mir fest (Offizielles Musikvideo)
|
||||
length: 213
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/wCcJuN47UcY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLClJVPqKtfOt9_b3ewmUj0qE5-KnQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -560,7 +561,7 @@ videos:
|
|||
- id: qdtLCfEcPL4
|
||||
title: Peter Fox - Alles neu (offizielles Video)
|
||||
length: 272
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qdtLCfEcPL4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBh-JDA8IaPBQuzf0f4o6ptRbXlTQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -579,7 +580,7 @@ videos:
|
|||
- id: wjXUBG15eZ8
|
||||
title: 257ers - Holz (Official HD Video)
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/wjXUBG15eZ8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAw3Swj8ibFWFcgpsexNE0N_w_BUQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -598,7 +599,7 @@ videos:
|
|||
- id: HBjDZMJUduo
|
||||
title: Laserkraft 3D - Nein Mann (official Video)
|
||||
length: 231
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/HBjDZMJUduo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCOR8giEhNzblFrPfgfUqwQ2UEy7g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -617,7 +618,7 @@ videos:
|
|||
- id: xkXQQ0IAbk0
|
||||
title: MIAMI YACINE - BON VOYAGE prod. by AriBeatz (Official 4K Video)
|
||||
length: 159
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/xkXQQ0IAbk0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAoi1jtQunAO2qbyn9GXNcSrgSEPg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -636,7 +637,7 @@ videos:
|
|||
- id: DraA3PUuoQc
|
||||
title: Pocahontas - AnnenMayKantereit
|
||||
length: 192
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/DraA3PUuoQc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDq-oBTOdVzgce4FdS5tHTBe3eKlA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -655,7 +656,7 @@ videos:
|
|||
- id: wMIGQp4YhuU
|
||||
title: "Xavier Naidoo - Alles kann besser werden [Official Video]"
|
||||
length: 269
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/wMIGQp4YhuU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAXuvRD27RqHtAyFm48dMnsYrUlbg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -674,7 +675,7 @@ videos:
|
|||
- id: 38lrK74voaI
|
||||
title: "Olexesh - MAGISCH feat. Edin (prod. von PzY) [Official 4K Video]"
|
||||
length: 270
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/38lrK74voaI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAVoqbTLnv6uPAj7t0HrAn5GAK_Jg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -693,7 +694,7 @@ videos:
|
|||
- id: 2qW9rOSFF1M
|
||||
title: BONEZ MC & RAF CAMORA - AN IHNEN VORBEI
|
||||
length: 220
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2qW9rOSFF1M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCLHCbKTgchLUipdthOFsHIMos8eA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -712,7 +713,7 @@ videos:
|
|||
- id: tMILH6UEfPA
|
||||
title: Veysel - Kleiner Cabrón (OFFICIAL HD VIDEO) prod. by Macloud
|
||||
length: 213
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/tMILH6UEfPA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBTUsW-P8-fIzLCRb-Xt-2Ky4I58w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -731,7 +732,7 @@ videos:
|
|||
- id: izHB2EdMngg
|
||||
title: Vanessa Mai - Ich sterb für dich
|
||||
length: 190
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/izHB2EdMngg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC5CFXBJ0W9DQQZ_tiM6gP12e1aug"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -750,7 +751,7 @@ videos:
|
|||
- id: haECT-SerHk
|
||||
title: Helene Fischer - Atemlos durch die Nacht
|
||||
length: 219
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/haECT-SerHk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB5wAkVuIyWU6lEavR0LDUJ-e9G_w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -769,7 +770,7 @@ videos:
|
|||
- id: cVikZ8Oe_XA
|
||||
title: Falco - Rock Me Amadeus (Official Video)
|
||||
length: 225
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/cVikZ8Oe_XA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBRKYqET6zOciMAnASNDuj_vEWhHA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -788,7 +789,7 @@ videos:
|
|||
- id: drFsXLChrWc
|
||||
title: 257ers - Holland (Official HD Video)
|
||||
length: 213
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/drFsXLChrWc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDHzQXboNJT9agtNoiAYeGBQT7u9Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -807,7 +808,7 @@ videos:
|
|||
- id: 1EMFt7m_8yE
|
||||
title: SDP - Ich muss immer an dich denken
|
||||
length: 217
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1EMFt7m_8yE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA5XEy3rcpbsnB5SEqfS5rZrz4zyQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -826,7 +827,7 @@ videos:
|
|||
- id: _yWU0lFghxU
|
||||
title: Seeed - Ding (official Video)
|
||||
length: 211
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_yWU0lFghxU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBo9Yn5w6pbo5JylVv3XuhFvz_-jw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -845,7 +846,7 @@ videos:
|
|||
- id: XlD-LO3ogFM
|
||||
title: Mark Forster - Wir sind groß (Lyric Video)
|
||||
length: 204
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/XlD-LO3ogFM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDtxcZ0KznZi1B8TC_zDO4EAhSi2w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -864,7 +865,7 @@ videos:
|
|||
- id: nAzjWqNfgvc
|
||||
title: Gestört aber GeiL & Koby Funk feat. Wincent Weiss - Unter Meiner Haut (Official Video HD)
|
||||
length: 218
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/nAzjWqNfgvc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAn2zwZvNQZDxYyEakap6O-qscr_w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -883,7 +884,7 @@ videos:
|
|||
- id: PySC3RGhZJU
|
||||
title: CRO - Bad Chick (Official Version)
|
||||
length: 218
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/PySC3RGhZJU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDNUnL8j0tGJ2fsmqLaE7WMEkYToQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -902,7 +903,7 @@ videos:
|
|||
- id: G-iwLoyH6ZE
|
||||
title: CAPITAL BRA - NUR NOCH GUCCI (prod. The Cratez x Hoodboyz)
|
||||
length: 232
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/G-iwLoyH6ZE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDpKgxunqERPh--nrrwYuuhRgfsgg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -921,7 +922,7 @@ videos:
|
|||
- id: fgCOUO-s8nY
|
||||
title: Jupiter Jones - Still (Videoclip)
|
||||
length: 238
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fgCOUO-s8nY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC0_6dsucrR1b1SFRH3mWIW4aG2MA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -940,7 +941,7 @@ videos:
|
|||
- id: m-Ik3yy728Y
|
||||
title: Andreas Bourani - Auf anderen Wegen (Official Video)
|
||||
length: 245
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/m-Ik3yy728Y/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBdf4h8llXdfJ-OKgHzWj3IOWlnYQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -959,7 +960,7 @@ videos:
|
|||
- id: U0_UYW5Y4cM
|
||||
title: Andreas Gabalier - I sing a Liad für Di
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/U0_UYW5Y4cM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBl8yQKNQcbq4noIXXbagrBI2cuzA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -978,7 +979,7 @@ videos:
|
|||
- id: rsrDYTEicq8
|
||||
title: RAF CAMORA - Primo (prod. X-Plosive & RAF Camora)
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/rsrDYTEicq8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAUWuhlHy43NeJWne-7SoaXRm_ctw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -997,7 +998,7 @@ videos:
|
|||
- id: 2aU4wRgl_0E
|
||||
title: "Ufo361 - \"Nice Girl 2.0\" (prod. von AT Beatz) [Official HD Video]"
|
||||
length: 169
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2aU4wRgl_0E/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBO3SHMYAWqIxyoA6XXZX9jQT6S9w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1016,7 +1017,7 @@ videos:
|
|||
- id: FzcJxJAxFtw
|
||||
title: VEYSEL & MOZZIK - TI AMO (OFFICIAL VIDEO)
|
||||
length: 267
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/FzcJxJAxFtw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC_s-2wvHOLxEip00xsF8rG2H0usA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1035,7 +1036,7 @@ videos:
|
|||
- id: 2hyibXdOp5w
|
||||
title: "XAVAS (Xavier Naidoo & Kool Savas) \"Schau nicht mehr zurück\" (Official HD Video 2012)"
|
||||
length: 234
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2hyibXdOp5w/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAd-py6tq-UGFdYc5FqW5ljYJ8HKw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1054,7 +1055,7 @@ videos:
|
|||
- id: YaKG5cUVB30
|
||||
title: Ali Bumaye - Sex ohne Grund feat. Shindy
|
||||
length: 166
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/YaKG5cUVB30/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAbouyvACS_X0A5kQOFK8h-7hBCTQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1073,7 +1074,7 @@ videos:
|
|||
- id: Ahwc-ouFeTQ
|
||||
title: "ALLIGATOAH - Willst Du (OFFICIAL VIDEO) 'Triebwerke' Album (HITBOX)"
|
||||
length: 224
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Ahwc-ouFeTQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCO4zch0lItASVd_nSl1E2_GBr1QQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1092,7 +1093,7 @@ videos:
|
|||
- id: SoImFhORKpg
|
||||
title: Bonez MC & RAF Camora feat. Gzuz & Maxwell - Kontrollieren (prod. by Beataura & RAF Camora)
|
||||
length: 232
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/SoImFhORKpg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDRnP4vZtk2hUwHQ_hDsfN3iDMe9Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1111,7 +1112,7 @@ videos:
|
|||
- id: jP4-XrbGt3M
|
||||
title: Mark Forster - Sowieso (Official Video)
|
||||
length: 161
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/jP4-XrbGt3M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAzLDUfpE6upRMnrDEqvp2BZrtCkw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1130,7 +1131,7 @@ videos:
|
|||
- id: Yy2RsG4lnm4
|
||||
title: Anna-Maria Zimmermann - 1000 Träume weit (Tornero)
|
||||
length: 254
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Yy2RsG4lnm4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBsxC15vPGdSZ5kfDo8Ibdl3v3zjQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1149,7 +1150,7 @@ videos:
|
|||
- id: 388e_8mu1t4
|
||||
title: SDP feat. Sido - Die Nacht von Freitag auf Montag
|
||||
length: 241
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/388e_8mu1t4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC1op5KQFtiQ3GJv_yt8lcCojrRWw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1168,7 +1169,7 @@ videos:
|
|||
- id: dHHtPi-j7dQ
|
||||
title: Wolkenfrei - Wolke 7 (Videoclip)
|
||||
length: 239
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/dHHtPi-j7dQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCZKYNdCzFGKh8z1XPSXT42h8EegQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1187,7 +1188,7 @@ videos:
|
|||
- id: d8ERTCVXIUE
|
||||
title: Ali As feat. Namika – Lass sie tanzen (Square Dance) // prod. ELI
|
||||
length: 251
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/d8ERTCVXIUE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDRc1pnQEIAdibeOsDU5HUkjq6tEw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1206,7 +1207,7 @@ videos:
|
|||
- id: vQXn3EzzYY4
|
||||
title: "Frei.Wild - Weil Du mich nur verarscht hast (2011) [Offizieller Videoclip]"
|
||||
length: 208
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/vQXn3EzzYY4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCqfVJX6ABnvqJSkj7Hyw6f4rV2TA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1225,7 +1226,7 @@ videos:
|
|||
- id: zA-BTpC-yvI
|
||||
title: AZET feat. RAF CAMORA - QA BONE (Official Audio)
|
||||
length: 202
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/zA-BTpC-yvI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD_asimo6lIm7XZu8P9f2k6ZRxaQw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1244,7 +1245,7 @@ videos:
|
|||
- id: rnzIN9H_G10
|
||||
title: LEA - Leiser (Pseudo Video)
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/rnzIN9H_G10/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA2pFb14I8adKkilycBZCpcF0j5xQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1263,7 +1264,7 @@ videos:
|
|||
- id: fcBbT1GTxqM
|
||||
title: Kay One - Ich brech die Herzen
|
||||
length: 229
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fcBbT1GTxqM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDPN6rEd3YDQY1_0Z_0-RLe0qr9jQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1282,7 +1283,7 @@ videos:
|
|||
- id: wCDsm_dt1cI
|
||||
title: KLUBBB3 - Du schaffst das schon (Offizielles Video)
|
||||
length: 190
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/wCDsm_dt1cI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCJisdr1A-P-lXCyrM0RoJRUyPDAQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1301,7 +1302,7 @@ videos:
|
|||
- id: 4j3AOJV1J8I
|
||||
title: 23 - Bushido & Sido feat. Peter Maffay - Erwachsen sein
|
||||
length: 218
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/4j3AOJV1J8I/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBt7kmNDbeo0vtVApiHs2J5zMaylg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1320,7 +1321,7 @@ videos:
|
|||
- id: RtuW08ZIgvg
|
||||
title: "Söhne Mannheims - Und wenn ein Lied [Official Video]"
|
||||
length: 249
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RtuW08ZIgvg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDM7u-sy9EvIS8VMTjJ9cLcM47zQA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1339,7 +1340,7 @@ videos:
|
|||
- id: cbTXqKBIQ40
|
||||
title: Philipp Poisel - Eiserner Steg (Klavier Version) - Offizielles Video
|
||||
length: 250
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/cbTXqKBIQ40/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAP3eJjTJsHQ7EHCBcY-MfAdXk3DA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1358,7 +1359,7 @@ videos:
|
|||
- id: oSd0Lph4luY
|
||||
title: MIKE SINGER - DEJA VU (Offizielles Video)
|
||||
length: 229
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/oSd0Lph4luY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDUSdlW64Vrr23hmhIBXoXWA5UuhQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1377,7 +1378,7 @@ videos:
|
|||
- id: oq0rrYrufYU
|
||||
title: JORIS - Herz über Kopf (Official Video)
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/oq0rrYrufYU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBYbbtDe_9DmmmA3qpRrk3NphV69Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1396,7 +1397,7 @@ videos:
|
|||
- id: 0-P_YkS0z8s
|
||||
title: "KC Rebell feat. Summer Cem ► AUGENBLICK ◄ [ official Video ] 4K"
|
||||
length: 208
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/0-P_YkS0z8s/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBo7ZebER3EyU-cxcGJKMYdTZqVXA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1415,7 +1416,7 @@ videos:
|
|||
- id: 4BAKb2p450Q
|
||||
title: Tim Bendzko - Nur Noch Kurz Die Welt Retten (Offizielles Video)
|
||||
length: 191
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/4BAKb2p450Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAFSTKD33XGKnmNsqH_Ttwwx5xuNg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1434,7 +1435,7 @@ videos:
|
|||
- id: yqObMM_QzVQ
|
||||
title: Casper - Im Ascheregen
|
||||
length: 303
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/yqObMM_QzVQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAwLptLmtFUDADM8VlLnD2HjG36eg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1453,7 +1454,7 @@ videos:
|
|||
- id: dlvStoOyEzE
|
||||
title: Alligatoah - Du bist schön (Official Video)
|
||||
length: 246
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/dlvStoOyEzE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfTATo6sXEoKHxikJD9t9Hg3E01g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1472,7 +1473,7 @@ videos:
|
|||
- id: VNttGAaek2U
|
||||
title: Revolverheld - Lass Uns Gehen (Offizielles Musikvideo)
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/VNttGAaek2U/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCwcuHMTixpi0vJg-4G20w5fbqI4w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1491,7 +1492,7 @@ videos:
|
|||
- id: TxZMfufRJfo
|
||||
title: Oft Gefragt - AnnenMayKantereit (Official Video)
|
||||
length: 189
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/TxZMfufRJfo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBhWEPjvLiv1Khiuod09arTjc8g7A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1510,7 +1511,7 @@ videos:
|
|||
- id: 6agT2asF4as
|
||||
title: "CAPO - MON CHÉRI ft. NIMO (prod. von Zeeko & Veteran) [Official Audio]"
|
||||
length: 230
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/6agT2asF4as/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDTUuExLM1ismMCdg3Bq7mVahWlvA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1529,7 +1530,7 @@ videos:
|
|||
- id: EcW0n83La5A
|
||||
title: DIE LOCHIS - LIEBLINGSLIED (Offizielles Video) | BEREIT FÜR @HE/RO ?
|
||||
length: 212
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/EcW0n83La5A/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDfc1-Y5K_6Jjjs4e7wJRasjkAvqg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1548,7 +1549,7 @@ videos:
|
|||
- id: _b61hg8UlZM
|
||||
title: "CAPO – Lambo Diablo GT feat. Nimo (prod. Von SOTT & Veteran & Zeeko) [Official Audio]"
|
||||
length: 285
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_b61hg8UlZM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA-DoUTVn98IhmGEOzEHPXU2zAWYQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1567,7 +1568,7 @@ videos:
|
|||
- id: kDMFranvFuQ
|
||||
title: Joel Brandenstein - Diese Liebe (Offizielles Musikvideo)
|
||||
length: 359
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/kDMFranvFuQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBVFYsYNdvEy9fuONolAtBkZRvc9A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1586,7 +1587,7 @@ videos:
|
|||
- id: 1apku0pVDeE
|
||||
title: Wincent Weiss - Feuerwerk (Official Video)
|
||||
length: 213
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1apku0pVDeE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAgkN2roTs3SdVc46CRRd4BIi4k7Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1605,7 +1606,7 @@ videos:
|
|||
- id: g6JYzOjglBs
|
||||
title: Seeed - Aufstehn (official Video)
|
||||
length: 231
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/g6JYzOjglBs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCkmBTXk2YaRyjaTgjq4bwcpzWWGA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1624,7 +1625,7 @@ videos:
|
|||
- id: GYK-NfOo7b4
|
||||
title: Seeed - Dickes B (official Video)
|
||||
length: 240
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/GYK-NfOo7b4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAavUCF3vlRnCAL2QsfDgMOh5aHaQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1643,7 +1644,7 @@ videos:
|
|||
- id: omUuR45iU0g
|
||||
title: "KC Rebell feat. Summer Cem: \"HAYVAN\" [official Video]"
|
||||
length: 291
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/omUuR45iU0g/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBNyuNT14kxJH-TQe-PUes0vkP2bw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1662,7 +1663,7 @@ videos:
|
|||
- id: w7BE3inS-NM
|
||||
title: "Adel Tawil - Bis hier und noch weiter (Official Video) ft. KC Rebell, Summer Cem"
|
||||
length: 228
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/w7BE3inS-NM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAe887jFMndrO7vV9mifoa6a1Ectg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1681,7 +1682,7 @@ videos:
|
|||
- id: FM-5BPMnhm0
|
||||
title: SDP feat. Weekend - Tanz aus der Reihe!
|
||||
length: 234
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/FM-5BPMnhm0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUFO3IacA956tmnSO4Tkq_5bJJDg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1700,7 +1701,7 @@ videos:
|
|||
- id: MnNZNfixTOw
|
||||
title: Philipp Poisel - Wie soll ein Mensch das ertragen
|
||||
length: 278
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/MnNZNfixTOw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBO1RS4_u-jFiKcuMOMWlCg9r-HAQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1719,7 +1720,7 @@ videos:
|
|||
- id: qe80EeU8cT8
|
||||
title: "Xavier Naidoo - Wann (feat. Cassandra Steen) [Official Video]"
|
||||
length: 327
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qe80EeU8cT8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLATTKLPexjqGruzgsU7M3Kldk0J2w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1738,7 +1739,7 @@ videos:
|
|||
- id: "-s2-6KYgqpQ"
|
||||
title: Alligatoah - Narben (Official Video)
|
||||
length: 264
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/-s2-6KYgqpQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDWniVg-b300HVTRYrQGrrSK1G8uw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1757,7 +1758,7 @@ videos:
|
|||
- id: RSlp874hESE
|
||||
title: "Kollegah & Farid Bang - \"ZIEH DEN RUCKSACK AUS\" [ official Video ]"
|
||||
length: 162
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RSlp874hESE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAU7YZ5dh9VaC9R5wfTKYMChxTplQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1776,7 +1777,7 @@ videos:
|
|||
- id: oTI3tRQ_-3k
|
||||
title: SDP - Wenn ich groß bin
|
||||
length: 225
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/oTI3tRQ_-3k/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDkk0a9nwy9qYSc-V0ZRSIGS_Wttg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1795,7 +1796,7 @@ videos:
|
|||
- id: _okA84gaEJw
|
||||
title: SXTN - Von Party zu Party (Official Video)
|
||||
length: 221
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_okA84gaEJw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDA6bykIGVF3WqUx3emOpgnuapb0w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1814,7 +1815,7 @@ videos:
|
|||
- id: pLHnnJRaP7Q
|
||||
title: House Rockerz - HerzRasen (Official Video HD)
|
||||
length: 207
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/pLHnnJRaP7Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDFElTxgC4PWAel2yN43ku_gWpLtw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1833,7 +1834,7 @@ videos:
|
|||
- id: H2hGrsExuyc
|
||||
title: "GZUZ \"Was Hast Du Gedacht\" (WSHH Exclusive - Official Music Video)"
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/H2hGrsExuyc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB_OAq5Mb2xjIZW5dNyKZRWJ7PLsA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1852,7 +1853,7 @@ videos:
|
|||
- id: RsZvjqG2lec
|
||||
title: Tim Bendzko - Wenn Worte meine Sprache wären (Offizielles Video)
|
||||
length: 196
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RsZvjqG2lec/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBh5wlp7smaJJU4TQy1iKD1U2sqQQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1871,7 +1872,7 @@ videos:
|
|||
- id: qYRCiQ6d35w
|
||||
title: BONEZ MC & RAF CAMORA feat GZUZ - MÖRDER
|
||||
length: 240
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qYRCiQ6d35w/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCQ3Po4qJ4Vl1g37HiYjhUn2AWS-Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1890,7 +1891,7 @@ videos:
|
|||
- id: zMPIobcM2j0
|
||||
title: ZUNA feat. AZET & NOIZY - NUMMER 1 prod. by DJ A-BOOM
|
||||
length: 212
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/zMPIobcM2j0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCUVzgKNBFY6In3YbZuWpZ60oilnQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1907,8 +1908,8 @@ videos:
|
|||
id: UCDLPHv0SrvyUzct8UYQ9R_g
|
||||
name: KMNGANG
|
||||
ctoken: 4qmFsgJhEiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFENBRjZCbEJVT2tOSFdRJTNEJTNEmgIiUEw1ZER4NjgxVDRiUjdaRjFJdVd6T3Yxb21sUmJFN1BpSg%3D%3D
|
||||
n_videos: 495
|
||||
thumbnails:
|
||||
video_count: 495
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Bkj3IVIO2Os/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLBShlXfy9oWvTy2ntoHxmuhBlZP3g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@ expression: map_res.c
|
|||
id: PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe
|
||||
name: Minecraft SHINE
|
||||
videos:
|
||||
count: 66
|
||||
items:
|
||||
- id: X82TrticM4A
|
||||
title: Minecraft SHINE (Trailer)
|
||||
length: 80
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/X82TrticM4A/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDaqqikBYqqsuVR1SPVW1HPS7a0sA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -28,7 +29,7 @@ videos:
|
|||
- id: RPGLMuxkLCs
|
||||
title: "DAS LAGERFEUERLIED - Minecraft SHINE #001 [Deutsch/HD]"
|
||||
length: 1356
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RPGLMuxkLCs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCLYpK285ZyD2y-ipNU2fC_HzhiRg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -47,7 +48,7 @@ videos:
|
|||
- id: z-ALpnnQLrk
|
||||
title: "MAGISCHES FURZMONSTER - Minecraft SHINE #002 [Deutsch/HD]"
|
||||
length: 1039
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/z-ALpnnQLrk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBLDDABxzfLeE-dQaBBNKG0CJdOWw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -66,7 +67,7 @@ videos:
|
|||
- id: _rrbTTv8zcQ
|
||||
title: "UNTERIRDISCHE RIESENPILZHÖHLEN - Minecraft SHINE #003 [Deutsch/HD]"
|
||||
length: 1447
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_rrbTTv8zcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD0Br8sAmhv9UlFtwHaK6y3PlxIpQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -85,7 +86,7 @@ videos:
|
|||
- id: JE16OKTawLw
|
||||
title: "BESTE AXT IM SPIEL GEFUNDEN?! - Minecraft SHINE #004 [Deutsch/HD]"
|
||||
length: 1238
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/JE16OKTawLw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDRk4X8dtihNq68ay7rpARzN9peiQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -104,7 +105,7 @@ videos:
|
|||
- id: RQNY0Wzm7DQ
|
||||
title: "ERZERAUSCH IM MINENSCHACHT - Minecraft SHINE #005 [Deutsch/HD]"
|
||||
length: 1405
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RQNY0Wzm7DQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDMKr2vJvhKw6bxFVsgfR9p5kRuCQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -123,7 +124,7 @@ videos:
|
|||
- id: uhy24PKBkd0
|
||||
title: "FUSIONSOFEN & ERSTER IM NETHER?! - Minecraft SHINE #006 [Deutsch/HD]"
|
||||
length: 1569
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/uhy24PKBkd0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA-pynU_AAsgCDh38L8QmHXXryZfg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -142,7 +143,7 @@ videos:
|
|||
- id: OL1hQadBHfs
|
||||
title: "EPISCHER ROGUEDUNGEON - Minecraft SHINE #007 [Deutsch/HD]"
|
||||
length: 1534
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/OL1hQadBHfs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBeyicluHNPCNdAKEUTLrHE9Rfmtg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -161,7 +162,7 @@ videos:
|
|||
- id: Zge_SUfk0r8
|
||||
title: "DIAMANTZOMBIES auf NETHEREBENE - Minecraft SHINE #008 [Deutsch/HD]"
|
||||
length: 1726
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Zge_SUfk0r8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD9jHtok-baqRLQPZowWsXeVQBA6Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -180,7 +181,7 @@ videos:
|
|||
- id: yFGIeU_IDE4
|
||||
title: "HÖLLISCHE SCHLACHT um 2 DIAMANTBLÖCKE - Minecraft SHINE #009 [Deutsch/HD]"
|
||||
length: 1669
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/yFGIeU_IDE4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCx02JGJneEQtn_YD7K8KOt3vC26w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -199,7 +200,7 @@ videos:
|
|||
- id: P6MVqfQzPIg
|
||||
title: "MAGISCHER OBSIDIANTOTEM?! - Minecraft SHINE #010 [Deutsch/HD]"
|
||||
length: 1526
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/P6MVqfQzPIg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCLRzxVNwZaMeOU1ls17wlYDsnvZA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -218,7 +219,7 @@ videos:
|
|||
- id: 9n0pLDn8Z_I
|
||||
title: "GRÜNER FEUEROGER & WITHERWARZEN - Minecraft SHINE #011 [Deutsch/HD]"
|
||||
length: 1482
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/9n0pLDn8Z_I/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBq9_4Ov8kvuTP3uuI7ie8kSCySyw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -237,7 +238,7 @@ videos:
|
|||
- id: oXbx2YtIkeQ
|
||||
title: "MYSTERIÖSES Grab & ONYX ohne ENDE!! - Minecraft SHINE #012 [Deutsch/HD]"
|
||||
length: 1518
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/oXbx2YtIkeQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBaTkueS0xkMnM6mdCK7vVmH0C-XQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -256,7 +257,7 @@ videos:
|
|||
- id: pfBBTTwxo8Q
|
||||
title: "ATLANTIS ENTDECKT!! - Minecraft SHINE #013 [Deutsch/HD]"
|
||||
length: 1479
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/pfBBTTwxo8Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCAyzmwdAwcL_ryhGWUi1AB59h8lA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -275,7 +276,7 @@ videos:
|
|||
- id: WxtRqzxSAh0
|
||||
title: "ZUSAMMENFASSUNG & Nodop's ANGRIFF - Minecraft SHINE #014 [Deutsch/HD]"
|
||||
length: 1902
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/WxtRqzxSAh0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBqT5FSFwps0oUUjwVYqrDMYhC5Nw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -294,7 +295,7 @@ videos:
|
|||
- id: ianUckvxtLw
|
||||
title: "FRIEDHOFDUNGEON mit NODÖPCHEN - Minecraft SHINE #016 [Deutsch/HD]"
|
||||
length: 1766
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ianUckvxtLw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBIR3LJOBV1CWi3qKugn4d_x8lAEg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -313,7 +314,7 @@ videos:
|
|||
- id: eb2Ghj1g1ic
|
||||
title: "Die BESTE FALLE aller ZEITEN!! - Minecraft SHINE #015 [Deutsch/HD]"
|
||||
length: 1324
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/eb2Ghj1g1ic/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDiXr6emf5xDnVWPBJvi3lVWa_Khg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -332,7 +333,7 @@ videos:
|
|||
- id: 8TpEsyVtCog
|
||||
title: "MEGAGEMETZEL zu FÜNFT - Minecraft SHINE #017 [Deutsch/HD]"
|
||||
length: 1629
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/8TpEsyVtCog/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAclomWqvh1OIkMf0TxPEhjNVrSNQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -351,7 +352,7 @@ videos:
|
|||
- id: KD_WAei4LMg
|
||||
title: "WITHER BOSSFIGHT - Minecraft SHINE #018 [Deutsch/HD]"
|
||||
length: 1645
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/KD_WAei4LMg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAEQDBO22V46yEk4yBwkE0IuVjEVA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -370,7 +371,7 @@ videos:
|
|||
- id: qfpOCrtweKk
|
||||
title: "LABERSTUNDE mit ArazhulHD - Minecraft SHINE #019 [Deutsch/HD]"
|
||||
length: 1052
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qfpOCrtweKk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC9xRR01wPaSTq0vL4_L6G-CS5KVw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -389,7 +390,7 @@ videos:
|
|||
- id: 6gv3nrOA_bQ
|
||||
title: "BUSRITUALE & Seltsame LEHRER - Minecraft SHINE #021 [Deutsch/HD]"
|
||||
length: 1769
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/6gv3nrOA_bQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB43mXOVwQ4mRzqakDHn0kHKoY0qA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -408,7 +409,7 @@ videos:
|
|||
- id: waaic6UnkU8
|
||||
title: "LEHM, LEHM und mehr LEEEHM!! - Minecraft SHINE #022 [Deutsch/HD]"
|
||||
length: 1081
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/waaic6UnkU8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC1k7ynTJNnCRrfImHqEBaTTi85Kw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -427,7 +428,7 @@ videos:
|
|||
- id: lSy4MLC_uV4
|
||||
title: "Neue DIMENSIONEN?? - Minecraft SHINE #023 [Deutsch/HD]"
|
||||
length: 1682
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/lSy4MLC_uV4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB2wug5u6lgdChlnqxRHcqFN7l0LA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -446,7 +447,7 @@ videos:
|
|||
- id: BuN8-U_quok
|
||||
title: "DUNGEONSTATUEN - Minecraft SHINE #024 [Deutsch/HD]"
|
||||
length: 1597
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/BuN8-U_quok/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAJe8jzy_ccxC-Z-k4-rVVTLT4HOw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -465,7 +466,7 @@ videos:
|
|||
- id: g_UTG10nzaQ
|
||||
title: "THYRIUMBOGEN & Dimensional DOORS - Minecraft SHINE #025 [Deutsch/HD]"
|
||||
length: 1852
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/g_UTG10nzaQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB90DMVKNRWSPO51zupoYxPoFmI8Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -484,7 +485,7 @@ videos:
|
|||
- id: kNykFWaDbGw
|
||||
title: "MEIN ERSTER PVP KILL?! - Minecraft SHINE #026 [Deutsch/HD]"
|
||||
length: 1869
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/kNykFWaDbGw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA9gJtMx-vjG3LDYC6Mog9JJ62EYw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -503,7 +504,7 @@ videos:
|
|||
- id: gJF7vxCYTgY
|
||||
title: "SPELLBOUND FARM - Minecraft SHINE #027 [Deutsch/HD]"
|
||||
length: 2161
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/gJF7vxCYTgY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBKzKHEYjsk4GnAxw1jhzHI_opNEQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -522,7 +523,7 @@ videos:
|
|||
- id: CodZMQ_Anc0
|
||||
title: "VIEEELE bunte ZAUBERPILZE - Minecraft SHINE #028 [Deutsch/HD]"
|
||||
length: 1768
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/CodZMQ_Anc0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDNdgtoMcy-lYPmsnYVOcxJnCck8g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -541,7 +542,7 @@ videos:
|
|||
- id: oKHMTKJdZ_M
|
||||
title: "STREAMUPDATE & BIOMREISE - Minecraft SHINE #029 [Deutsch/HD]"
|
||||
length: 1771
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/oKHMTKJdZ_M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDlNghAFoCRrLzfippQtyfBiDtG-A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -560,7 +561,7 @@ videos:
|
|||
- id: "--O_Eyok_eE"
|
||||
title: "AUF NACH TROPICRAFT - Minecraft SHINE #030 [Deutsch/HD]"
|
||||
length: 1661
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/--O_Eyok_eE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAjgm528b0H8-NGsHGFQSh0AA4GVw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -579,7 +580,7 @@ videos:
|
|||
- id: 2bT3ljKMSo8
|
||||
title: "SCHATZTRUHE GEFUNDEN!! - Minecraft SHINE #031 [Deutsch/HD]"
|
||||
length: 1429
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2bT3ljKMSo8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC_TanSk3-kj26i-m-433iBP893TA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -598,7 +599,7 @@ videos:
|
|||
- id: YRAX_slrbsI
|
||||
title: "ZAUBERWALD und TROPISCHER DSCHUNGEL - Minecraft SHINE #032 [Deutsch/HD]"
|
||||
length: 1257
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/YRAX_slrbsI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCQenXFcDnthdi95vSgMUNontlYhA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -617,7 +618,7 @@ videos:
|
|||
- id: aRRbCEwUSuw
|
||||
title: "MESABIOM & JOUSTS - Minecraft SHINE #033 [Deutsch/HD]"
|
||||
length: 1131
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/aRRbCEwUSuw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDxqJBg6ejA-m-emBnzhKuSw7PH0w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -636,7 +637,7 @@ videos:
|
|||
- id: 5sV8SzTbJS8
|
||||
title: "Komplette SMELTERY GEFUNDEN!! - Minecraft SHINE #034 [Deutsch/HD]"
|
||||
length: 1405
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/5sV8SzTbJS8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCQvHJJ0CEAzp9ZOT2Wt84vEFNg8A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -655,7 +656,7 @@ videos:
|
|||
- id: ZxxZlU2o1TE
|
||||
title: "ROGUEDUNGEON EXTREME - Minecraft SHINE #035 [Deutsch/HD]"
|
||||
length: 1555
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ZxxZlU2o1TE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD5Ol6GW-ybn_4pkMWAKhy0ALAMXA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -674,7 +675,7 @@ videos:
|
|||
- id: gIjo5at4AxE
|
||||
title: "LEGENDÄRER LOOT - Minecraft SHINE #036 [Deutsch/HD]"
|
||||
length: 1405
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/gIjo5at4AxE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCBinkghbbcWN5isNzwxekTYfpABQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -693,7 +694,7 @@ videos:
|
|||
- id: NSGk7-kyeEU
|
||||
title: "I BELIEVE I CAN FLY - Minecraft SHINE #037 [Deutsch/HD]"
|
||||
length: 829
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/NSGk7-kyeEU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDzQVO8fGvLFYxX31s1x14XsR2YAw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -712,7 +713,7 @@ videos:
|
|||
- id: cgJtZ7Otc4Y
|
||||
title: "ROGUEFRIEDHOF mit WITHERBOSS - Minecraft SHINE #038 [Deutsch/HD]"
|
||||
length: 1392
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/cgJtZ7Otc4Y/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDK12gzYlhFnRvOaKPfBwCe3ShVCA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -731,7 +732,7 @@ videos:
|
|||
- id: l5LQu3Q0nWY
|
||||
title: "MONSTERCALYPSE & RETTUNGSAKTION - Minecraft SHINE #039 [Deutsch/HD]"
|
||||
length: 1580
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/l5LQu3Q0nWY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAp9sggZ7r8Drcdso3H8mja_pPjOg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -750,7 +751,7 @@ videos:
|
|||
- id: YX4Z3ZlWUFc
|
||||
title: "HINTERHALT von GEGNERN!! - Minecraft SHINE #040 [Deutsch/HD]"
|
||||
length: 1847
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/YX4Z3ZlWUFc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCiPRQyCDwv4Hg1TOyAx_JQbhgYZA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -769,7 +770,7 @@ videos:
|
|||
- id: LoyvqR41lKw
|
||||
title: "CARPENTER's BLOCKS - Minecraft SHINE #041 [Deutsch/HD]"
|
||||
length: 1524
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/LoyvqR41lKw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDwYtpWH35Zh5fLrJeDYW0A1GlJUg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -788,7 +789,7 @@ videos:
|
|||
- id: HbQtMZbtx_Q
|
||||
title: "DER ETERNAL FROST!! - Minecraft SHINE #043 [Deutsch/HD]"
|
||||
length: 1514
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/HbQtMZbtx_Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLByqCDZ6hojgwcvO8ykf1EKOCAyMw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -807,7 +808,7 @@ videos:
|
|||
- id: 0DHRbP9ecgw
|
||||
title: "FROSTDUNGEONS in der OVERWORLD!! - Minecraft SHINE #044 [Deutsch/HD]"
|
||||
length: 1567
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/0DHRbP9ecgw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD9v_vTHy1VOEM3VGQ30lhEJLfmvw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -826,7 +827,7 @@ videos:
|
|||
- id: rFOFkvk-xus
|
||||
title: "BOSSRÜSTUNG XXL - Minecraft SHINE #045 [Deutsch/HD]"
|
||||
length: 2050
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/rFOFkvk-xus/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAOHW34k4C5B4IDkKsphKd7RpKJEw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -845,7 +846,7 @@ videos:
|
|||
- id: P8zxnSihJ_8
|
||||
title: "ZAUBERN & TROLLEN mit Nodop - Minecraft SHINE #046 [Deutsch/HD]"
|
||||
length: 1828
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/P8zxnSihJ_8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDKgLUdVybxHwVoOxNFvVBz2QI0aQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -864,7 +865,7 @@ videos:
|
|||
- id: RWgeHl9XkCY
|
||||
title: "NACHHILFE für BALUI - Minecraft SHINE #047 [Deutsch/HD]"
|
||||
length: 1926
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RWgeHl9XkCY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBktMkUzztN_VwIMmZ-icbRUrED3w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -883,7 +884,7 @@ videos:
|
|||
- id: I1n539enNNY
|
||||
title: "SPIELER GETÖTET!! - Minecraft SHINE #048 [Deutsch/HD]"
|
||||
length: 1836
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/I1n539enNNY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA6GMQFFds97Lr4obHmFRuKi5pscQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -902,7 +903,7 @@ videos:
|
|||
- id: 70VKekyZz5g
|
||||
title: "VORBEREITUNG auf den DRACHEN - Minecraft SHINE #049 [Deutsch/HD]"
|
||||
length: 1916
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/70VKekyZz5g/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD7nTUSM_8kz82LsnWCRNjPRv3fvA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -921,7 +922,7 @@ videos:
|
|||
- id: 2OWJ1bwFu6Y
|
||||
title: "Donnernder ENDERDRACHENKAMPF - Minecraft SHINE #050 [Deutsch/HD]"
|
||||
length: 1718
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2OWJ1bwFu6Y/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDj9YAqHRFD2Zwi9Kvr69EjDnVEBw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -940,7 +941,7 @@ videos:
|
|||
- id: zLiSA2i-niw
|
||||
title: "Superspitzhacke & Necrotic Bones - Minecraft SHINE #051 [Deutsch/HD]"
|
||||
length: 1253
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/zLiSA2i-niw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC1WmiMQp3vCS3mPRS5LfmHhDlPpw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -959,7 +960,7 @@ videos:
|
|||
- id: wyXlw7nMpko
|
||||
title: "TREMEP, das ENDERAUGE!! - Minecraft SHINE #052 [Deutsch/HD]"
|
||||
length: 1924
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/wyXlw7nMpko/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDCplxVSv6_-SIcPEPqgudEk5q30A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -978,7 +979,7 @@ videos:
|
|||
- id: NrU4fhzvFpA
|
||||
title: "TORNADO & ENDERPOKALYPSE!! - Minecraft SHINE #053 [Deutsch/HD]"
|
||||
length: 1654
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/NrU4fhzvFpA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDur1k61uW8f9d8UOA6yqSdCNWvfg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -997,7 +998,7 @@ videos:
|
|||
- id: 1xhKegaA1hQ
|
||||
title: "RIESIGE SMELTERY - Minecraft SHINE #054 [Deutsch/HD]"
|
||||
length: 1796
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1xhKegaA1hQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCM_UOeSqAu0ykS6gTds3NJ901u8Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1016,7 +1017,7 @@ videos:
|
|||
- id: 9F4lZ8psBtg
|
||||
title: "TINKER's CONSTRUCT - Minecraft SHINE #055 [Deutsch/HD]"
|
||||
length: 1514
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/9F4lZ8psBtg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBGmpBmXNSZP0X0rQSKWFzlM7DGMw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1035,7 +1036,7 @@ videos:
|
|||
- id: G3uUtejX9to
|
||||
title: "CUTLASS und HAMMERACTION - Minecraft SHINE #056 [Deutsch/HD]"
|
||||
length: 1615
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/G3uUtejX9to/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCrz9L2HWwY3_6J01GwQWs-sivnNw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1054,7 +1055,7 @@ videos:
|
|||
- id: "-0Xn5pViCss"
|
||||
title: "QUARZFESTIVAL - Minecraft SHINE #057 [Deutsch/HD]"
|
||||
length: 1353
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/-0Xn5pViCss/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC-QHkwmzqNW4mhuE7oJslYUtReRQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1073,7 +1074,7 @@ videos:
|
|||
- id: a7u71Fco99I
|
||||
title: "DUALWITHERKAMPF & EXOSUIT - Minecraft SHINE #058 [Deutsch/HD]"
|
||||
length: 1377
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/a7u71Fco99I/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC1iNJdmqZHK-ZHSre6MiBKzuPMMw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1092,7 +1093,7 @@ videos:
|
|||
- id: H6uUbvcgKdk
|
||||
title: "ALLE GETROLLT?! 1. APRIL!! - Minecraft SHINE #060 [Deutsch/HD]"
|
||||
length: 1751
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/H6uUbvcgKdk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBzSJjNn7zgtAF2kMOHcyBsbS1l-Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1111,7 +1112,7 @@ videos:
|
|||
- id: tPRTCauHtkw
|
||||
title: "THAUMELONE - Minecraft SHINE #061 [Deutsch/HD]"
|
||||
length: 1604
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/tPRTCauHtkw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCbTexd_3GA4grOauyJYk_HY9OQ8Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1130,7 +1131,7 @@ videos:
|
|||
- id: pMKAQExcarM
|
||||
title: "ICH BIN EIN MAGIER!! - Minecraft SHINE #062 [Deutsch/HD]"
|
||||
length: 1202
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/pMKAQExcarM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd_6WaCpRHtqRugrmQn7gFNo9_LQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1149,7 +1150,7 @@ videos:
|
|||
- id: 7E-z-7KCdBI
|
||||
title: "ENDER PORTER und SPELLBOUND - Minecraft SHINE #063 [Deutsch/HD]"
|
||||
length: 1715
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/7E-z-7KCdBI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBGUzE-YGbouV7fglH5XM9xIFS5mA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1168,7 +1169,7 @@ videos:
|
|||
- id: EPtbC0ZVddo
|
||||
title: "PORTABLE HOLE & Melonenstatuen - Minecraft SHINE #064 [Deutsch/HD]"
|
||||
length: 1696
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/EPtbC0ZVddo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDGPl3HlQLwqnYRjxskV1EFD3pAvA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1187,7 +1188,7 @@ videos:
|
|||
- id: TpPHng0eGJs
|
||||
title: "ZUKUNFT des PROJEKTS - Minecraft SHINE #065 [Deutsch/HD]"
|
||||
length: 1215
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/TpPHng0eGJs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDrapGS714wjdb3XLYg9KsMQBQwig"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1206,7 +1207,7 @@ videos:
|
|||
- id: rt2QFQwJYcs
|
||||
title: "GIGANTISCHER METEOR!! - Minecraft SHINE #066 [Deutsch/HD]"
|
||||
length: 1593
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/rt2QFQwJYcs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBf_L_ob5qiPVaGJdyQFyoFEwIstg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1225,7 +1226,7 @@ videos:
|
|||
- id: WPyfaztFDQ4
|
||||
title: "Der EREBUS und die GHAST QUEEN - Minecraft SHINE #067 [Deutsch/HD]"
|
||||
length: 1687
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/WPyfaztFDQ4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAeaQHeQX9MUHyne6tlJW9JeycB3A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1244,7 +1245,7 @@ videos:
|
|||
- id: 5lmumP0DaUw
|
||||
title: "MINI-BEST OF und KABOOM!! - Minecraft SHINE #069 (Finale) [Deutsch/HD]"
|
||||
length: 1044
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/5lmumP0DaUw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDys9BQ_BHV7BhDkYphDT72uJBebQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1261,8 +1262,8 @@ videos:
|
|||
id: UCQM0bS4_04-Y4JuYrgmnpZQ
|
||||
name: Chaosflo44
|
||||
ctoken: ~
|
||||
n_videos: 66
|
||||
thumbnails:
|
||||
video_count: 66
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/X82TrticM4A/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLBeSNDZEaBoP0KX9_Ayn3VO3X8rkw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@ expression: map_res.c
|
|||
id: RDCLAK5uy_kFQXdnqMaQCVx2wpUM4ZfbsGCDibZtkJk
|
||||
name: Easy Pop
|
||||
videos:
|
||||
count: 97
|
||||
items:
|
||||
- id: psuRGfAaju4
|
||||
title: Owl City - Fireflies (Official Music Video)
|
||||
length: 233
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/psuRGfAaju4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD9bUyhPoTTV2wN8BSQ1GCiZfEHRg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -28,7 +29,7 @@ videos:
|
|||
- id: PMGY8fLwess
|
||||
title: James Arthur - Falling Like The Stars
|
||||
length: 256
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/PMGY8fLwess/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCET20Nd4_3twDEy-t_LBeJFI5Lng"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -47,7 +48,7 @@ videos:
|
|||
- id: 2n5GKLdrTfk
|
||||
title: Benson Boone - In the Stars (Official Lyric Video)
|
||||
length: 217
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2n5GKLdrTfk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBgZfqXCaEvs5iiS7Uf8_th3FHi0Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -66,7 +67,7 @@ videos:
|
|||
- id: EptPhiK_q0E
|
||||
title: Coldplay X Selena Gomez - Let Somebody Go (Official Lyric Video)
|
||||
length: 242
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/EptPhiK_q0E/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDTeIH-1FQK933u9jM7C9HHRxOZyQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -85,7 +86,7 @@ videos:
|
|||
- id: qHm9MG9xw1o
|
||||
title: OneRepublic - Secrets (Official Music Video)
|
||||
length: 233
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qHm9MG9xw1o/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAEc7ChL1aU4sWnM23BEdbqUfYpoA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -104,7 +105,7 @@ videos:
|
|||
- id: XPpTgCho5ZA
|
||||
title: Maroon 5 - This Love (Official Music Video)
|
||||
length: 206
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/XPpTgCho5ZA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAJLr7-wCPWd1_-QSELXsmZxsuUQA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -123,7 +124,7 @@ videos:
|
|||
- id: 1YUBbF24H44
|
||||
title: Sabrina Carpenter - because i liked a boy (Official Video)
|
||||
length: 206
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1YUBbF24H44/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB_FDT3RYF6Db3q5vW9KsL9RCIcUA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -142,7 +143,7 @@ videos:
|
|||
- id: UAWcs5H-qgQ
|
||||
title: "Ed Sheeran - The A Team [Official Music Video]"
|
||||
length: 290
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/UAWcs5H-qgQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAQe32l8lKUCEYlEu3qvN61HJfhZQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -161,7 +162,7 @@ videos:
|
|||
- id: bqO3Y5e4Dow
|
||||
title: Michele Morrone - Hard For Me (Official Music Video)
|
||||
length: 173
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/bqO3Y5e4Dow/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCP6Zgm-3gvaYxZkCT5OS3GjJM2vQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -180,7 +181,7 @@ videos:
|
|||
- id: NgsWGfUlwJI
|
||||
title: Joji - Glimpse of Us (Official Video)
|
||||
length: 235
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/NgsWGfUlwJI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBjgFP8evTpUA81K98aQOBPFxSk7g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -199,7 +200,7 @@ videos:
|
|||
- id: AcTDlsUej2w
|
||||
title: "Sofia Carson - Come Back Home (From \"Purple Hearts\")"
|
||||
length: 204
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/AcTDlsUej2w/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBZ4neL2CBKzCLMIK_-dU9jcjgU7g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -218,7 +219,7 @@ videos:
|
|||
- id: k6ZoE4RrcDs
|
||||
title: "Ed Sheeran - Overpass Graffiti [Official Video]"
|
||||
length: 287
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/k6ZoE4RrcDs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLClylvwlo7lJP-guD59zx46AJ-FhA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -237,7 +238,7 @@ videos:
|
|||
- id: _JGGLJMpVks
|
||||
title: Billie Eilish - TV (Official Lyric Video)
|
||||
length: 282
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_JGGLJMpVks/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD2M9JavMUXxkoqzNoTG-W4y8f6ng"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -256,7 +257,7 @@ videos:
|
|||
- id: mqiH0ZSkM9I
|
||||
title: James Bay - Hold Back The River
|
||||
length: 247
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/mqiH0ZSkM9I/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDL1DI86uhS0N-7Iln6wBSdwxzSTw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -275,7 +276,7 @@ videos:
|
|||
- id: c0wUKCekI34
|
||||
title: Michele Morrone - Another Day (Official Music Video)
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/c0wUKCekI34/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDnIgpAY_IWghMmR2H5lMfpPJhhKQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -294,7 +295,7 @@ videos:
|
|||
- id: c4BLVznuWnU
|
||||
title: "Ed Sheeran - Lego House [Official Music Video]"
|
||||
length: 246
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/c4BLVznuWnU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCGv3Z17ZP7qUJBjyKS6XqEfd6vFA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -313,7 +314,7 @@ videos:
|
|||
- id: ouEezpuPc3A
|
||||
title: "Andy Grammer - \"Don't Give Up On Me\" [Official Video from the Five Feet Apart Film]"
|
||||
length: 216
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ouEezpuPc3A/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLATK7bjvuTcCR3tLGpTByugeeApBw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -332,7 +333,7 @@ videos:
|
|||
- id: i-qT5n_5Mys
|
||||
title: "Jaymes Young - Happiest Year [Official Music Video]"
|
||||
length: 278
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/i-qT5n_5Mys/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBVoIW7CvV2T6J4lKS4ke0oG5T76Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -351,7 +352,7 @@ videos:
|
|||
- id: CA1VHbdq5hY
|
||||
title: Giveon - Lie Again (Official Music Video)
|
||||
length: 236
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/CA1VHbdq5hY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDxIcgCqYhMN-NtLCF7P9SvaZF5ag"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -370,7 +371,7 @@ videos:
|
|||
- id: 74NhLkjIeMs
|
||||
title: Conan Gray - Yours
|
||||
length: 201
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/74NhLkjIeMs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA2yej0cyHG33At8O7nYsh0W0CjWQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -389,7 +390,7 @@ videos:
|
|||
- id: vNfgVjZF8_4
|
||||
title: OneRepublic - Someday (Official Music Video)
|
||||
length: 192
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/vNfgVjZF8_4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAiolwWxGplthlYKy2jJkAxw_-u2Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -408,7 +409,7 @@ videos:
|
|||
- id: 2ebfSItB0oM
|
||||
title: "Jess Glynne - Take Me Home [Official Video]"
|
||||
length: 273
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/2ebfSItB0oM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA9pxJZqzDeCmbUTo-6OXV1XZ8apg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -427,7 +428,7 @@ videos:
|
|||
- id: ilut9TzMfXs
|
||||
title: Rag’n’Bone Man & P!nk – Anywhere Away From Here (Official Video)
|
||||
length: 244
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ilut9TzMfXs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCchkk9Vv4Ricblm2o1jBEWoaxsSg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -446,7 +447,7 @@ videos:
|
|||
- id: "-oqAU5VxFWs"
|
||||
title: Counting Crows - Mr. Jones (Official Music Video)
|
||||
length: 270
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/-oqAU5VxFWs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAOiV1ty7HPrBwp-3zZq3x_VY9YbQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -465,7 +466,7 @@ videos:
|
|||
- id: aNzCDt2eidg
|
||||
title: "Birdy - Skinny Love [Official Music Video]"
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/aNzCDt2eidg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB33o_fslw86LZxcC1Jf8Oy8X94tg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -484,7 +485,7 @@ videos:
|
|||
- id: fvXn3rmhdc4
|
||||
title: Benson Boone - Better Alone (Official Music Video)
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fvXn3rmhdc4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBXyC7NRsIpcSf-3xM6lJpRjufFBg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -503,7 +504,7 @@ videos:
|
|||
- id: A48hOToMuRE
|
||||
title: Dermot Kennedy - Outnumbered
|
||||
length: 247
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/A48hOToMuRE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD331J7kou1P60yR_eWHyDtzD6ATQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -522,7 +523,7 @@ videos:
|
|||
- id: goqqohUitmw
|
||||
title: Conan Gray - People Watching (Official Video)
|
||||
length: 210
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/goqqohUitmw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBctikDTiHTYFwrnwU3twVrMoMg0w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -541,7 +542,7 @@ videos:
|
|||
- id: 8uD6s-X3590
|
||||
title: Harry Styles - Sweet Creature (Audio)
|
||||
length: 226
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/8uD6s-X3590/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAp_XOxJrJkE_utqlgE20n5FcGS4w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -560,7 +561,7 @@ videos:
|
|||
- id: ljXSjIph5ZM
|
||||
title: Niall Horan - Too Much To Ask (Official)
|
||||
length: 226
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ljXSjIph5ZM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBswSaH9Elc6hO18X9NQnbcnCTTrw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -579,7 +580,7 @@ videos:
|
|||
- id: E87oYUfI3WY
|
||||
title: "Maisie Peters - Good Enough [Official Video]"
|
||||
length: 232
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/E87oYUfI3WY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC3IhuUtf83DwUvPuQyuJbVgtAhEQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -598,7 +599,7 @@ videos:
|
|||
- id: DJFMRLIe-0o
|
||||
title: Tate McRae x Ali Gatie - lie to me
|
||||
length: 191
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/DJFMRLIe-0o/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBxB2LhvsmbZFj8u3HHpZqw_QLQYQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -617,7 +618,7 @@ videos:
|
|||
- id: tMsbeyeTtpk
|
||||
title: "Michael Bublé - I'll Never Not Love You (Official Music Video)"
|
||||
length: 245
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/tMsbeyeTtpk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDAr49jYgSm566rAeQY2EDCJf8TiA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -636,7 +637,7 @@ videos:
|
|||
- id: _LwX7GCE5rI
|
||||
title: Miley Cyrus - Slide Away (Audio)
|
||||
length: 236
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/_LwX7GCE5rI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDARZ6g8GJ5ZQJKLBn_f7EUz5zQbw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -655,7 +656,7 @@ videos:
|
|||
- id: flv8AEWrRMI
|
||||
title: "Taylor Swift - Run (Taylor's Version) (From The Vault) (Lyric Video) ft. Ed Sheeran"
|
||||
length: 241
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/flv8AEWrRMI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAM8x4zzYsoPuR89FVQpqw4LYzbZQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -674,7 +675,7 @@ videos:
|
|||
- id: bO3S8CKafbE
|
||||
title: Niall Horan - Put A Little Love On Me (Official)
|
||||
length: 235
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/bO3S8CKafbE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBkGMciyWKUevmBLwdIEfdyEUGtLQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -693,7 +694,7 @@ videos:
|
|||
- id: 26PAgklYYvo
|
||||
title: James Morrison - Broken Strings ft. Nelly Furtado (Official Video)
|
||||
length: 261
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/26PAgklYYvo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBBWaF5iUZuRhd5CXJczxE_uIhvuQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -712,7 +713,7 @@ videos:
|
|||
- id: KS2Ho8aICMk
|
||||
title: "Bazzi - Heaven [Official Audio]"
|
||||
length: 154
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/KS2Ho8aICMk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAs7ctW1niNC-sIH0bD-b52ghfhNg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -731,7 +732,7 @@ videos:
|
|||
- id: HtNS1afUOnE
|
||||
title: OneRepublic - Stop And Stare (Official Music Video)
|
||||
length: 295
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/HtNS1afUOnE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAxlKe00QtM12L4lSRNPFQwpSMyVA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -750,7 +751,7 @@ videos:
|
|||
- id: h_m-BjrxmgI
|
||||
title: "Plain White T's - Hey There Delilah (Official Video)"
|
||||
length: 243
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/h_m-BjrxmgI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCeY3aiz1d4DhTh2-WsPKTE-II4kQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -769,7 +770,7 @@ videos:
|
|||
- id: ELPOCJvDz3w
|
||||
title: Leon Bridges - Beyond (Official Video)
|
||||
length: 250
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ELPOCJvDz3w/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDzr6OL-r-WnVx3G45MWBIVoCjCgg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -788,7 +789,7 @@ videos:
|
|||
- id: 7Lna4Hu4-AQ
|
||||
title: MAX & Ali Gatie - Butterflies (Official Music Video)
|
||||
length: 195
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/7Lna4Hu4-AQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCwk82yvmb0b2bT2LQdLDCm7AdPVw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -807,7 +808,7 @@ videos:
|
|||
- id: 5qHRMFQ0pLg
|
||||
title: Dermot Kennedy - Dreamer
|
||||
length: 182
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/5qHRMFQ0pLg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA0CeUiMuMAYUlwd6OSvfGbV2fiyA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -826,7 +827,7 @@ videos:
|
|||
- id: 9f-1VOEUeDY
|
||||
title: "Maddie Zahm - If It's Not God (Official Music Video)"
|
||||
length: 243
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/9f-1VOEUeDY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDLXzcoQoO_5Cd2JYIavP2hnjeoPg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -845,7 +846,7 @@ videos:
|
|||
- id: K9qu2QMBguw
|
||||
title: "I See Fire (From \"The Hobbit - The Desolation Of Smaug\")"
|
||||
length: 301
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/K9qu2QMBguw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCws9zOceVajoYy1goACyhUMpUp0A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -864,7 +865,7 @@ videos:
|
|||
- id: X_ZOGHUWwqE
|
||||
title: Sam Smith - Kids Again
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/X_ZOGHUWwqE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA07XEXQDNHBEgYBzrUaFeuuOhgYw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -883,7 +884,7 @@ videos:
|
|||
- id: uWeqeQkjLto
|
||||
title: James Blunt - 1973 (Official Music Video)
|
||||
length: 234
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/uWeqeQkjLto/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCj5uZSFhpivKoRJhgbZl1GJ4CoAg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -902,7 +903,7 @@ videos:
|
|||
- id: Ghl_vkEV3tc
|
||||
title: Noah Cyrus - Mr. Percocet (Official Video)
|
||||
length: 193
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Ghl_vkEV3tc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDoZ_f8kKEnHOjHUaQOuGK_2rFEzA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -921,7 +922,7 @@ videos:
|
|||
- id: mHeK0Cwr9sg
|
||||
title: Family of the Year - Hero (Official Music Video)
|
||||
length: 197
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/mHeK0Cwr9sg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBNQKaAvQ3wiH3m5VvXJqLq7evrcw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -940,7 +941,7 @@ videos:
|
|||
- id: WLoWBe9BRP4
|
||||
title: Mimi Webb - Good Without (Official Music Video)
|
||||
length: 187
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/WLoWBe9BRP4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCXfMk1yjQeGOIv-JWTLz_Sv-fneA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -959,7 +960,7 @@ videos:
|
|||
- id: 7TCncxWNcPU
|
||||
title: "David Kushner - Mr. Forgettable [Official Music Video]"
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/7TCncxWNcPU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUjrfYGwMuSGUQXZ8S5NpzULk04A"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -978,7 +979,7 @@ videos:
|
|||
- id: 0Bf3CJZ4hvg
|
||||
title: James TW - When You Love Someone (Official Video)
|
||||
length: 227
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/0Bf3CJZ4hvg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDcZtU4lYU7SoyX-KWmY83qSZpKNA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -997,7 +998,7 @@ videos:
|
|||
- id: PxNYvk_0Onw
|
||||
title: "Gabrielle Aplin - Please Don't Say You Love Me (Official Video)"
|
||||
length: 208
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/PxNYvk_0Onw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAzBncBZkxQA-sIftjEl-so3MFXDQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1016,7 +1017,7 @@ videos:
|
|||
- id: 9JnLIQ5Th9s
|
||||
title: Maddie Zahm - Inevitable (Official Music Video)
|
||||
length: 228
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/9JnLIQ5Th9s/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDLj8KVI_KadpQ6cCVyQNEbmNpJbQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1035,7 +1036,7 @@ videos:
|
|||
- id: 1XYLKoEETVA
|
||||
title: Zoe Wees - Hold Me Like You Used To
|
||||
length: 193
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1XYLKoEETVA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA1vOD1X-dWXRvJME8Rbamezkj3zQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1054,7 +1055,7 @@ videos:
|
|||
- id: T8lWjQRhQXY
|
||||
title: Lady Gaga - Your Song (Official Audio)
|
||||
length: 259
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/T8lWjQRhQXY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDEnBx6NPWqKoysV_9diDiMUzsZ2g"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1073,7 +1074,7 @@ videos:
|
|||
- id: iEtGv8Ha6ck
|
||||
title: Diana Ross - All Is Well
|
||||
length: 273
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/iEtGv8Ha6ck/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDm5feXTZloBCNI93I0PluWjzoUFA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1092,7 +1093,7 @@ videos:
|
|||
- id: hCjcgoubkPM
|
||||
title: Amy Shark - Mess Her Up (Official Video)
|
||||
length: 226
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/hCjcgoubkPM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCJ7TmHDCPS_O4TuOcjvPGrH9uQig"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1111,7 +1112,7 @@ videos:
|
|||
- id: Nlg3l4MCM7k
|
||||
title: ILIRA - Flowers (Official Music Video)
|
||||
length: 215
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Nlg3l4MCM7k/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBYvh54ULaak8HAB1pb0u4Vnd9UGQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1130,7 +1131,7 @@ videos:
|
|||
- id: nwXlRq_QyTI
|
||||
title: JP Saxe - A Little Bit Yours (Official Music Video)
|
||||
length: 246
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/nwXlRq_QyTI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAeMKBjb-xLVknOBO0jnBI0nKGRrw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1149,7 +1150,7 @@ videos:
|
|||
- id: qIh5QvjiF28
|
||||
title: Milow - How Love Works (Official Video)
|
||||
length: 179
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/qIh5QvjiF28/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfjNE3fPbYbMKYjmfnXKtFph26rQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1168,7 +1169,7 @@ videos:
|
|||
- id: HRsWSIxYBBA
|
||||
title: Noah Cyrus – Ready To Go (Official Visualizer)
|
||||
length: 188
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/HRsWSIxYBBA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLApNEWE6Cxt3y-aGgkSH675OJLt1w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1187,7 +1188,7 @@ videos:
|
|||
- id: 1le0xDbrVj8
|
||||
title: Oh Wonder - True Romance
|
||||
length: 244
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/1le0xDbrVj8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLACfT_oOjcoB51P7qdJBdRJqMk6Bg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1206,7 +1207,7 @@ videos:
|
|||
- id: YJ4vr53hMuo
|
||||
title: Cat Burns ‘Go’ ft. Sam Smith (Hyde Park)
|
||||
length: 199
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/YJ4vr53hMuo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBarHpZGSNkIms8h9_3KONzZSOTnA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1225,7 +1226,7 @@ videos:
|
|||
- id: ws-li4Fy1kY
|
||||
title: "Alexander 23 - The Hardest Part [Official Lyric Video]"
|
||||
length: 204
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ws-li4Fy1kY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAb7HJhYuNtJsHtVXj817i3k7hKOA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1244,7 +1245,7 @@ videos:
|
|||
- id: fyrsExw_LUg
|
||||
title: James Bay - Bad
|
||||
length: 243
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fyrsExw_LUg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAIYoOZeb6YLJs-k7q7gUYDyEw5hQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1263,7 +1264,7 @@ videos:
|
|||
- id: ZdsER1S3t8k
|
||||
title: Noah Kahan - Hurt Somebody (Official Video)
|
||||
length: 175
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ZdsER1S3t8k/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCMXZbK3xM4AVAHT-1INttn80orFg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1282,7 +1283,7 @@ videos:
|
|||
- id: BS4t017LSoA
|
||||
title: Bad Habits (Acoustic Version)
|
||||
length: 233
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/BS4t017LSoA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAoxqVY-e_4hIjPTQ2FLvQTy2e5KQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1301,7 +1302,7 @@ videos:
|
|||
- id: 0AYzzzBaPBI
|
||||
title: flora cash - They Own This Town (Official Video)
|
||||
length: 246
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/0AYzzzBaPBI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDw2F7ryxqDLcERqtiIuz0pokrhcQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1320,7 +1321,7 @@ videos:
|
|||
- id: zM0K3LC7Aak
|
||||
title: James Arthur - Avalanche (Live Session)
|
||||
length: 220
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/zM0K3LC7Aak/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLACABCozlS3B9tiR0oHa3A13tsKzg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1339,7 +1340,7 @@ videos:
|
|||
- id: 35VK8yonvsc
|
||||
title: James Bay - Everybody Needs Someone (Official Lyric Video)
|
||||
length: 216
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/35VK8yonvsc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBm5zTCEBdVI4kL94VNJsrVw_D7Sg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1358,7 +1359,7 @@ videos:
|
|||
- id: RdFaKz71-5M
|
||||
title: Ruel - LET THE GRASS GROW (Visualizer)
|
||||
length: 181
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/RdFaKz71-5M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB2vXg0jRY42m1wZOLaDw8uhUIUvQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1377,7 +1378,7 @@ videos:
|
|||
- id: IPOC8KuYu7Q
|
||||
title: "Leon Bridges, Kevin Kaarl - Summer Moon (Official Lyric Video)"
|
||||
length: 177
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/IPOC8KuYu7Q/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDyrEi4-cQhrVny1wwVocNKV8GMKw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1396,7 +1397,7 @@ videos:
|
|||
- id: "-4szr0EMrgk"
|
||||
title: Låpsley - 32 Floors (Official Audio)
|
||||
length: 185
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/-4szr0EMrgk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDLhtl3Y4FPzUXDhDbg8grAAJciKg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1415,7 +1416,7 @@ videos:
|
|||
- id: WJJLfUwIVR4
|
||||
title: "christina perri - home [official audio]"
|
||||
length: 219
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/WJJLfUwIVR4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCjZfLCHDk9PES_FolWuRH8CosyZg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1434,7 +1435,7 @@ videos:
|
|||
- id: "-uxeu0MbNR0"
|
||||
title: "Jeremy Zucker - oh, mexico (Official Lyric Video)"
|
||||
length: 191
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/-uxeu0MbNR0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAh2ApdiwlYs3vSs_rNVURKcwVjOw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1453,7 +1454,7 @@ videos:
|
|||
- id: ELD3aRzbVQg
|
||||
title: Tom Gregory - Run To You (Official Video HD)
|
||||
length: 201
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ELD3aRzbVQg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA9S7vhfJ0vZ9jFNIPnuhZ47IV5VA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1472,7 +1473,7 @@ videos:
|
|||
- id: 726I7op9iq0
|
||||
title: AURORA - Cure For Me (Acoustic / Audio)
|
||||
length: 214
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/726I7op9iq0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBNtkXA8U9ien4iRiYTob8eCt4Bvw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1491,7 +1492,7 @@ videos:
|
|||
- id: 8CqQ47SzNU0
|
||||
title: "Sigrid, Bring Me The Horizon – Bad Life (Stripped Back)"
|
||||
length: 221
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/8CqQ47SzNU0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAn0R2h1qr__o7jbufrNQVEUaR_dQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1510,7 +1511,7 @@ videos:
|
|||
- id: NjW1S0WIiJw
|
||||
title: John Legend - Free (Official Lyric Video)
|
||||
length: 223
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/NjW1S0WIiJw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCoe2g-AJhPWV6uGi_Cb5BgOA9ggA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1529,7 +1530,7 @@ videos:
|
|||
- id: C7LUFn66OeQ
|
||||
title: Joy Oladokun with Maren Morris - Bigger Man (Official Visualizer)
|
||||
length: 187
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/C7LUFn66OeQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC0AfcbW8PtTZKyYxdUqYmAOtmqyA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1548,7 +1549,7 @@ videos:
|
|||
- id: CY0fLYnw59M
|
||||
title: "dodie - If I'm Being Honest"
|
||||
length: 310
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/CY0fLYnw59M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBZBA3Xtoc9Zmqo9sDVki-9i3FWLQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1567,7 +1568,7 @@ videos:
|
|||
- id: BxqtS-7GxFM
|
||||
title: TONES AND I - NEVER SEEN THE RAIN (ALTERNATE VERSION)
|
||||
length: 296
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/BxqtS-7GxFM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAzNbc2LI1u0U7MJeDbYJ7CGcRsOg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1586,7 +1587,7 @@ videos:
|
|||
- id: KUKt_LbaBnM
|
||||
title: Oh Wonder - Better Now (Official Audio)
|
||||
length: 200
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/KUKt_LbaBnM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBqi7ONpAild4T_KUgenSVpZnINJQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1605,7 +1606,7 @@ videos:
|
|||
- id: teHOy47KAMM
|
||||
title: "christina perri - back in time (featuring ben rector) [official audio]"
|
||||
length: 237
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/teHOy47KAMM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAlxs66GbB2CjvEMRGLdxzFMjHUlA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1624,7 +1625,7 @@ videos:
|
|||
- id: W8c224B8mV0
|
||||
title: Kina - only in the night (Official Lyric Video) ft. Sarcastic Sounds
|
||||
length: 134
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/W8c224B8mV0/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAVZN8NunTIC3uHhjjewpZ76bvAaA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1643,7 +1644,7 @@ videos:
|
|||
- id: bhL7A8k6kU8
|
||||
title: Anderson East - Madelyn (Official Video)
|
||||
length: 203
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/bhL7A8k6kU8/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDjFwOL3uhYgUyn9Y_lCG9Obu_VLw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1662,7 +1663,7 @@ videos:
|
|||
- id: mUN36hFtazE
|
||||
title: LÉON – All My Heroes (Official Audio)
|
||||
length: 206
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/mUN36hFtazE/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd5SGGSRacULlBtTL2EvVqg_7-Qw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1681,7 +1682,7 @@ videos:
|
|||
- id: Od8FfxY5mXc
|
||||
title: Love Runs Deeper (Disney supporting Make-A-Wish)
|
||||
length: 163
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Od8FfxY5mXc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLChWrr6gzvdV-G5g4Uu6bvAPDraCQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1700,7 +1701,7 @@ videos:
|
|||
- id: fNR_abEgDBQ
|
||||
title: "Chris James - Don't Forget About Me (Official Music Video)"
|
||||
length: 209
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/fNR_abEgDBQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLChZEkMF4jpDFbNxGZSGwm32ApPqg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1719,7 +1720,7 @@ videos:
|
|||
- id: NwoW26zPhLs
|
||||
title: Blake Rose - Confidence (Official Audio)
|
||||
length: 156
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/NwoW26zPhLs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAyT8JSdKlQ7i1BGrAkQIqefCPy0Q"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1738,7 +1739,7 @@ videos:
|
|||
- id: dcBZP_pt0uY
|
||||
title: "Tom Grennan - Little Bit Of Love (Strings) [Audio]"
|
||||
length: 231
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/dcBZP_pt0uY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCkKdl0vdveGOQRTVcDQSjM39eaNA"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1757,7 +1758,7 @@ videos:
|
|||
- id: m342B1Vv3tM
|
||||
title: Matt Simons ft. Betty Who - Dust (Official Lyric Video)
|
||||
length: 202
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/m342B1Vv3tM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCtlnYdNrjQmFoSByaqszmoizosdw"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1776,7 +1777,7 @@ videos:
|
|||
- id: ufxjiU7BgR4
|
||||
title: Fall Into Me
|
||||
length: 225
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/ufxjiU7BgR4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCukjpfKjBu1BlRU6okhJcCeO33vQ"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1795,7 +1796,7 @@ videos:
|
|||
- id: 7OfB_8rrtug
|
||||
title: Grace (We All Try)
|
||||
length: 206
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/7OfB_8rrtug/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC007M9IO9aWRv-SNVJkBxaGXzm-w"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1814,7 +1815,7 @@ videos:
|
|||
- id: QDULTFB8gSY
|
||||
title: Words as Weapons
|
||||
length: 199
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/QDULTFB8gSY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCfNJGl46bsXtx8TaG9S1dGBP5CSg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1833,7 +1834,7 @@ videos:
|
|||
- id: Ge2q8a3lXnM
|
||||
title: "Enough, Enough, Enough"
|
||||
length: 164
|
||||
thumbnails:
|
||||
thumbnail:
|
||||
- url: "https://i.ytimg.com/vi/Ge2q8a3lXnM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBPK6rDDcqCT82Ua3sMf_Mgp6w7gg"
|
||||
width: 168
|
||||
height: 94
|
||||
|
|
@ -1850,8 +1851,8 @@ videos:
|
|||
id: UCEgHfSqMyjn8joKaIcW_ASA
|
||||
name: Diaven - Topic
|
||||
ctoken: ~
|
||||
n_videos: 97
|
||||
thumbnails:
|
||||
video_count: 97
|
||||
thumbnail:
|
||||
- url: "https://i9.ytimg.com/s_p/RDCLAK5uy_kFQXdnqMaQCVx2wpUM4ZfbsGCDibZtkJk/mqdefault.jpg?sqp=CPDmr5gGir7X7AMGCLaHmpgG&rs=AOn4CLDg9xLeJDPeMtbWfp19VFd6vCQzqQ&v=1661371318"
|
||||
width: 180
|
||||
height: 180
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
response::video_details::ItemSection::CommentItemSection { mut contents } => {
|
||||
comment_ctoken_section = contents.try_swap_remove(0);
|
||||
}
|
||||
response::video_details::ItemSection::None => {},
|
||||
response::video_details::ItemSection::None => {}
|
||||
}
|
||||
}
|
||||
response::video_details::VideoResultsItem::None => {}
|
||||
|
|
@ -201,10 +201,11 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
.map(|c| {
|
||||
c.metadata_row_container_renderer.rows.iter().any(|cr| {
|
||||
cr.metadata_row_renderer.contents.iter().any(|links| {
|
||||
links.iter().any(|link| match link {
|
||||
crate::serializer::text::TextLink::Web { text: _, url } => {
|
||||
url == "https://www.youtube.com/t/creative_commons"
|
||||
}
|
||||
links.0.iter().any(|link| match link {
|
||||
crate::serializer::text::TextComponent::Web {
|
||||
text: _,
|
||||
url,
|
||||
} => url == "https://www.youtube.com/t/creative_commons",
|
||||
_ => false,
|
||||
})
|
||||
})
|
||||
|
|
@ -212,13 +213,13 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
(owner.video_owner_renderer, description, is_ccommons)
|
||||
(owner.video_owner_renderer, description.into(), is_ccommons)
|
||||
}
|
||||
_ => bail!("could not find secondary_info"),
|
||||
};
|
||||
|
||||
let (channel_id, channel_name) = match owner.title {
|
||||
crate::serializer::text::TextLink::Browse {
|
||||
crate::serializer::text::TextComponent::Browse {
|
||||
text,
|
||||
page_type,
|
||||
browse_id,
|
||||
|
|
@ -233,14 +234,13 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
.contents
|
||||
.two_column_watch_next_results
|
||||
.secondary_results
|
||||
.map(|sr| {
|
||||
.and_then(|sr| {
|
||||
sr.secondary_results.results.map(|r| {
|
||||
let mut res = map_recommendations(r, lang);
|
||||
warnings.append(&mut res.warnings);
|
||||
res.c
|
||||
})
|
||||
})
|
||||
.flatten()
|
||||
.unwrap_or_default();
|
||||
|
||||
let mut engagement_panels = self.engagement_panels;
|
||||
|
|
@ -289,16 +289,8 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
is_live,
|
||||
is_ccommons,
|
||||
recommended,
|
||||
top_comments: Paginator {
|
||||
count: None,
|
||||
items: Vec::new(),
|
||||
ctoken: comment_ctoken,
|
||||
},
|
||||
latest_comments: Paginator {
|
||||
count: None,
|
||||
items: Vec::new(),
|
||||
ctoken: latest_comments_ctoken,
|
||||
},
|
||||
top_comments: Paginator::new(None, Vec::new(), comment_ctoken),
|
||||
latest_comments: Paginator::new(None, Vec::new(), latest_comments_ctoken),
|
||||
},
|
||||
warnings,
|
||||
})
|
||||
|
|
@ -385,11 +377,7 @@ impl MapResponse<Paginator<Comment>> for response::VideoComments {
|
|||
});
|
||||
|
||||
Ok(MapResult {
|
||||
c: Paginator {
|
||||
count: comment_count,
|
||||
items: comments,
|
||||
ctoken,
|
||||
},
|
||||
c: Paginator::new(comment_count, comments, ctoken),
|
||||
warnings,
|
||||
})
|
||||
}
|
||||
|
|
@ -426,10 +414,9 @@ fn map_recommendations(
|
|||
timeago::parse_timeago_or_warn(lang, txt, &mut warnings)
|
||||
}),
|
||||
publish_date_txt: video.published_time_text,
|
||||
view_count: util::parse_numeric_or_warn(
|
||||
&video.view_count_text,
|
||||
&mut warnings,
|
||||
),
|
||||
view_count: video
|
||||
.view_count_text
|
||||
.and_then(|txt| util::parse_numeric_or_warn(&txt, &mut warnings)),
|
||||
is_live: video.badges.is_live(),
|
||||
}),
|
||||
Err(e) => {
|
||||
|
|
@ -449,11 +436,7 @@ fn map_recommendations(
|
|||
.collect::<Vec<_>>();
|
||||
|
||||
MapResult {
|
||||
c: Paginator {
|
||||
count: None,
|
||||
items,
|
||||
ctoken,
|
||||
},
|
||||
c: Paginator::new(None, items, ctoken),
|
||||
warnings,
|
||||
}
|
||||
}
|
||||
|
|
@ -497,7 +480,7 @@ fn map_comment(
|
|||
MapResult {
|
||||
c: Comment {
|
||||
id: c.comment_id,
|
||||
text: c.content_text,
|
||||
text: c.content_text.into(),
|
||||
author: match (c.author_endpoint, c.author_text) {
|
||||
(Some(aep), Some(name)) => Some(Channel {
|
||||
id: aep.browse_endpoint.browse_id,
|
||||
|
|
@ -528,11 +511,7 @@ fn map_comment(
|
|||
),
|
||||
reply_count: c.reply_count,
|
||||
replies: replies
|
||||
.map(|items| Paginator {
|
||||
count: Some(c.reply_count),
|
||||
items,
|
||||
ctoken: reply_ctoken,
|
||||
})
|
||||
.map(|items| Paginator::new(Some(c.reply_count), items, reply_ctoken))
|
||||
.unwrap_or_default(),
|
||||
by_owner: c.author_is_channel_owner,
|
||||
pinned: priority
|
||||
|
|
@ -550,16 +529,548 @@ fn map_comment(
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::client::RustyPipe;
|
||||
use chrono::Datelike;
|
||||
|
||||
#[test_log::test(tokio::test)]
|
||||
use crate::{client::RustyPipe, model::Verification};
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("ZeerrnuLi5E").await.unwrap();
|
||||
|
||||
// dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "ZeerrnuLi5E");
|
||||
assert_eq!(details.title, "aespa 에스파 'Black Mamba' MV");
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
- Text: "🎧Listen and download aespa's debut single \"Black Mamba\": "
|
||||
- Web:
|
||||
text: "https://smarturl.it/aespa_BlackMamba"
|
||||
url: "https://smarturl.it/aespa_BlackMamba"
|
||||
- Text: "\n🐍The Debut Stage "
|
||||
- Video:
|
||||
title: "https://youtu.be/Ky5RT5oGg0w"
|
||||
id: Ky5RT5oGg0w
|
||||
- Text: "\n\n🎟️ aespa Showcase SYNK in LA! Tickets now on sale: "
|
||||
- Web:
|
||||
text: "https://www.ticketmaster.com/event/0A..."
|
||||
url: "https://www.ticketmaster.com/event/0A005CCD9E871F6E"
|
||||
- Text: "\n\nSubscribe to aespa Official YouTube Channel!\n"
|
||||
- Web:
|
||||
text: "https://www.youtube.com/aespa?sub_con..."
|
||||
url: "https://www.youtube.com/aespa?sub_confirmation=1"
|
||||
- Text: "\n\naespa official\n"
|
||||
- Web:
|
||||
text: "https://www.youtube.com/c/aespa"
|
||||
url: "https://www.youtube.com/c/aespa"
|
||||
- Text: "\n"
|
||||
- Web:
|
||||
text: "https://www.instagram.com/aespa_official"
|
||||
url: "https://www.instagram.com/aespa_official"
|
||||
- Text: "\n"
|
||||
- Web:
|
||||
text: "https://www.tiktok.com/@aespa_official"
|
||||
url: "https://www.tiktok.com/@aespa_official"
|
||||
- Text: "\n"
|
||||
- Web:
|
||||
text: "https://twitter.com/aespa_Official"
|
||||
url: "https://twitter.com/aespa_Official"
|
||||
- Text: "\n"
|
||||
- Web:
|
||||
text: "https://www.facebook.com/aespa.official"
|
||||
url: "https://www.facebook.com/aespa.official"
|
||||
- Text: "\n"
|
||||
- Web:
|
||||
text: "https://weibo.com/aespa"
|
||||
url: "https://weibo.com/aespa"
|
||||
- Text: "\n\n"
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: "\naespa 에스파 'Black Mamba' MV ℗ SM Entertainment"
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UCEf_Bc-KVd7onSeifS3py9g");
|
||||
assert_eq!(details.channel.name, "SMTOWN");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::Verified);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 30000000, "expected >30M subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 232000000,
|
||||
"expected > 232M views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(
|
||||
details.like_count.unwrap() > 4000000,
|
||||
"expected > 4M likes, got {}",
|
||||
details.like_count.unwrap()
|
||||
);
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2020);
|
||||
assert_eq!(date.month(), 11);
|
||||
assert_eq!(date.day(), 17);
|
||||
|
||||
assert!(!details.is_live);
|
||||
assert!(!details.is_ccommons);
|
||||
|
||||
assert!(!details.recommended.items.is_empty());
|
||||
assert!(!details.recommended.is_exhausted());
|
||||
|
||||
// assert!(
|
||||
// details.top_comments.count.unwrap() > 700000,
|
||||
// "expected > 700K comments, got {}",
|
||||
// details.top_comments.count.unwrap()
|
||||
// );
|
||||
assert!(!details.top_comments.is_exhausted());
|
||||
assert!(!details.latest_comments.is_exhausted());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details_music() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("XuM2onMGvTI").await.unwrap();
|
||||
|
||||
// dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "XuM2onMGvTI");
|
||||
assert_eq!(details.title, "Gäa");
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
- Text: "Provided to YouTube by Universal Music Group\n\nGäa · Oonagh\n\nBest Of\n\n℗ An Airforce1 Records / We Love Music recording; ℗ 2014 Universal Music GmbH\n\nReleased on: 2020-08-07\n\nProducer, Associated Performer, Background Vocalist: Hardy Krech\nProducer: Mark Nissen\nAssociated Performer, Background Vocalist: Andreas Fahnert\nAssociated Performer, Background Vocalist: Velile Mchunu\nAssociated Performer, Background Vocalist: Billy King\nAssociated Performer, Background Vocalist: Alex Prince\nAssociated Performer, Flute: Sandro Friedrich\nProgrammer: Hartmut Krech\nEditor: Severin Zahler\nComposer Lyricist: Hartmut Krech\nComposer Lyricist: Mark Nissen\nAuthor: Lukas Hainer\nAuthor: Michael Boden\n\nAuto-generated by YouTube."
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UCVGvnqB-5znqPSbMGlhF4Pw");
|
||||
assert_eq!(details.channel.name, "Sentamusic");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::Artist);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 33000, "expected >33K subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 20309,
|
||||
"expected > 20309 views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(
|
||||
details.like_count.unwrap() > 145,
|
||||
"expected > 145 likes, got {}",
|
||||
details.like_count.unwrap()
|
||||
);
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2020);
|
||||
assert_eq!(date.month(), 8);
|
||||
assert_eq!(date.day(), 6);
|
||||
|
||||
assert!(!details.is_live);
|
||||
assert!(!details.is_ccommons);
|
||||
|
||||
assert!(!details.recommended.items.is_empty());
|
||||
assert!(!details.recommended.is_exhausted());
|
||||
|
||||
// Comments are disabled for this video
|
||||
assert_eq!(details.top_comments.count, Some(0));
|
||||
assert_eq!(details.latest_comments.count, Some(0));
|
||||
assert!(details.top_comments.is_empty());
|
||||
assert!(details.latest_comments.is_empty());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details_ccommons() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("0rb9CfOvojk").await.unwrap();
|
||||
|
||||
// dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "0rb9CfOvojk");
|
||||
assert_eq!(
|
||||
details.title,
|
||||
"BahnMining - Pünktlichkeit ist eine Zier (David Kriesel)"
|
||||
);
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
- Web:
|
||||
text: "https://media.ccc.de/v/36c3-10652-bah..."
|
||||
url: "https://media.ccc.de/v/36c3-10652-bahnmining_-_punktlichkeit_ist_eine_zier"
|
||||
- Text: "\n\n\n\nSeit Anfang 2019 hat David jeden einzelnen Halt jeder einzelnen Zugfahrt auf jedem einzelnen Fernbahnhof in ganz Deutschland systematisch gespeichert. Inklusive Verspätungen und allem drum und dran. Und die werden wir in einem bunten Vortrag erforschen und endlich mal wieder ein bisschen Spaß mit Daten haben.\n\nRechtlicher Hinweis: Es liegt eine schriftliche Genehmigung der Bahn vor, von ihr abgerufene Rohdaten aggregieren und für Vorträge nutzen zu dürfen. Inhaltliche Absprachen oder gar Auflagen existieren nicht.\n\nDie Bahn gibt ihre Verspätungen in \"Prozent pünktlicher Züge pro Monat\" an. Das ist so radikal zusammengefasst, dass man daraus natürlich nichts interessantes lesen kann. Jetzt stellt euch mal vor, man könnte da mal ein bisschen genauer reingucken.\n\nStellt sich raus: Das geht! Davids Datensatz umfasst knapp 25 Millionen Halte - mehr als 50.000 pro Tag. Wir haben die Rohdaten und sind in unserer Betrachtung völlig frei. \n\nDer Vortrag hat wieder mehrere rote Fäden.\n\n 1) Wir vermessen ein fast komplettes Fernverkehrsjahr der deutschen Bahn. Hier etwas Erwartungsmanagement: Sinn ist keinesfalls Bahn-Bashing oder Sensationsheischerei - wer einen Hassvortrag gegen die Bahn erwartet, ist in dieser Veranstaltung falsch. Wir werden die Daten aber nutzen, um die Bahn einmal ein bisschen kennenzulernen. Die Bahn ist eine riesige Maschine mit Millionen beweglicher Teile. Wie viele Zugfahrten gibt es überhaupt? Was sind die größten Bahnhöfe? Wir werden natürlich auch die unerfreulichen Themen ansprechen, für die sich im Moment viele interessieren: Ist das Problem mit den Zugverspätungen wirklich so schlimm, wie alle sagen? Gibt es Orte und Zeiten, an denen es besonders hapert? Und wo fallen Züge einfach aus?\n\n 2) Es gibt wieder mehrere Blicke über den Tellerrand, wie bei Davids vorherigen Vorträgen auch. Ihr werdet wieder ganz automatisch und nebenher einen allgemeinverständlichen Einblick in die heutige Datenauswerterei bekommen. (Eine verbreitete Verschwörungstheorie sagt, euch zur Auswertung öffentlicher Daten zu inspirieren, wäre sogar der Hauptzweck von Davids Vorträgen. :-) )Die Welt braucht Leute mit Ratio, die Analyse wichtiger als Kreischerei finden. Und darum beschreibt David auch, wie man so ein durchaus aufwändiges Hobbyprojekt technisch angeht, Anfängerfehler vermeidet, und verantwortungsvoll handelt.\n\nDavid Kriesel\n\n"
|
||||
- Web:
|
||||
text: "https://fahrplan.events.ccc.de/congre..."
|
||||
url: "https://fahrplan.events.ccc.de/congress/2019/Fahrplan/events/10652.html"
|
||||
- Text: "\n\n"
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UC2TXq_t06Hjdr2g_KdKpHQg");
|
||||
assert_eq!(details.channel.name, "media.ccc.de");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::None);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 170000, "expected >170K subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 2517358,
|
||||
"expected > 2517358 views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(
|
||||
details.like_count.unwrap() > 52330,
|
||||
"expected > 52330 likes, got {}",
|
||||
details.like_count.unwrap()
|
||||
);
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2019);
|
||||
assert_eq!(date.month(), 12);
|
||||
assert_eq!(date.day(), 29);
|
||||
|
||||
assert!(!details.is_live);
|
||||
assert!(details.is_ccommons);
|
||||
|
||||
assert!(!details.recommended.items.is_empty());
|
||||
assert!(!details.recommended.is_exhausted());
|
||||
|
||||
// assert!(
|
||||
// details.top_comments.count.unwrap() > 700000,
|
||||
// "expected > 700K comments, got {}",
|
||||
// details.top_comments.count.unwrap()
|
||||
// );
|
||||
assert!(!details.top_comments.is_exhausted());
|
||||
assert!(!details.latest_comments.is_exhausted());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details_chapters() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("nFDBxBUfE74").await.unwrap();
|
||||
|
||||
// dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "nFDBxBUfE74");
|
||||
assert_eq!(details.title, "The Prepper PC");
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
- Text: "Thanks to Jackery for sponsoring today's video! Check out Jackery's Solar Generator 2000 Pro and get 10% off with code LinusTechTips at "
|
||||
- Web:
|
||||
text: "https://lmg.gg/SG2000PROLTT"
|
||||
url: "https://lmg.gg/SG2000PROLTT"
|
||||
- Text: "\n\nThese days, you can game almost anywhere on the planet, anytime. But what if that planet was in the middle of an apocalypse? After you’ve stashed years of food, water, and toilet paper away, how will you pass the time? With this PC, you can be prepared to game until the whole mess to sort itself out. \n\nDiscuss on the forum: "
|
||||
- Web:
|
||||
text: "https://linustechtips.com/topic/14554..."
|
||||
url: "https://linustechtips.com/topic/1455447-the-prepper-pc-sponsored/"
|
||||
- Text: "\n\nBuy a Jackery Solar Generator 2000 Pro: "
|
||||
- Web:
|
||||
text: "https://geni.us/034L"
|
||||
url: "https://geni.us/034L"
|
||||
- Text: "\n\nBuy a Jackery Explorer 2000 Pro: "
|
||||
- Web:
|
||||
text: "https://lmg.gg/1dyF4"
|
||||
url: "https://lmg.gg/1dyF4"
|
||||
- Text: "\n\nBuy a Seasonic Fanless TX: "
|
||||
- Web:
|
||||
text: "https://geni.us/S0Wt76G"
|
||||
url: "https://geni.us/S0Wt76G"
|
||||
- Text: "\n\nBuy an Intel Core i3 (12th Gen) i3-12100: "
|
||||
- Web:
|
||||
text: "https://geni.us/hLZvxa"
|
||||
url: "https://geni.us/hLZvxa"
|
||||
- Text: "\n\nBuy an RTX 3050: "
|
||||
- Web:
|
||||
text: "https://geni.us/6A6hl"
|
||||
url: "https://geni.us/6A6hl"
|
||||
- Text: "\n\nBuy an RX 6500XT: "
|
||||
- Web:
|
||||
text: "https://geni.us/fUF1p"
|
||||
url: "https://geni.us/fUF1p"
|
||||
- Text: "\n\nPurchases made through some store links may provide some compensation to Linus Media Group.\n\n► GET MERCH: "
|
||||
- Web:
|
||||
text: "https://lttstore.com"
|
||||
url: "https://lttstore.com/"
|
||||
- Text: "\n► SUPPORT US ON FLOATPLANE: "
|
||||
- Web:
|
||||
text: "https://www.floatplane.com/ltt"
|
||||
url: "https://www.floatplane.com/ltt"
|
||||
- Text: "\n► AFFILIATES, SPONSORS & REFERRALS: "
|
||||
- Web:
|
||||
text: "https://lmg.gg/sponsors"
|
||||
url: "https://lmg.gg/sponsors"
|
||||
- Text: "\n► PODCAST GEAR: "
|
||||
- Web:
|
||||
text: "https://lmg.gg/podcastgear"
|
||||
url: "https://lmg.gg/podcastgear"
|
||||
- Text: "\n\n\nFOLLOW US \n--------------------------------------------------- \nTwitter: "
|
||||
- Web:
|
||||
text: "https://twitter.com/linustech"
|
||||
url: "https://twitter.com/linustech"
|
||||
- Text: "\nFacebook: "
|
||||
- Web:
|
||||
text: "http://www.facebook.com/LinusTech"
|
||||
url: "http://www.facebook.com/LinusTech"
|
||||
- Text: "\nInstagram: "
|
||||
- Web:
|
||||
text: "https://www.instagram.com/linustech"
|
||||
url: "https://www.instagram.com/linustech"
|
||||
- Text: "\nTikTok: "
|
||||
- Web:
|
||||
text: "https://www.tiktok.com/@linustech"
|
||||
url: "https://www.tiktok.com/@linustech"
|
||||
- Text: "\nTwitch: "
|
||||
- Web:
|
||||
text: "https://www.twitch.tv/linustech"
|
||||
url: "https://www.twitch.tv/linustech"
|
||||
- Text: "\n\nMUSIC CREDIT\n---------------------------------------------------\nIntro: Laszlo - Supernova\nVideo Link: "
|
||||
- Video:
|
||||
title: "https://www.youtube.com/watch?v=PKfxm..."
|
||||
id: PKfxmFU3lWY
|
||||
- Text: "\niTunes Download Link: "
|
||||
- Web:
|
||||
text: "https://itunes.apple.com/us/album/sup..."
|
||||
url: "https://itunes.apple.com/us/album/supernova/id936805712"
|
||||
- Text: "\nArtist Link: "
|
||||
- Web:
|
||||
text: "https://soundcloud.com/laszlomusic"
|
||||
url: "https://soundcloud.com/laszlomusic"
|
||||
- Text: "\n\nOutro: Approaching Nirvana - Sugar High\nVideo Link: "
|
||||
- Video:
|
||||
title: "https://www.youtube.com/watch?v=ngsGB..."
|
||||
id: ngsGBSCDwcI
|
||||
- Text: "\nListen on Spotify: "
|
||||
- Web:
|
||||
text: "http://spoti.fi/UxWkUw"
|
||||
url: "http://spoti.fi/UxWkUw"
|
||||
- Text: "\nArtist Link: "
|
||||
- Web:
|
||||
text: "http://www.youtube.com/approachingnir..."
|
||||
url: "http://www.youtube.com/approachingnirvana"
|
||||
- Text: "\n\nIntro animation by MBarek Abdelwassaa "
|
||||
- Web:
|
||||
text: "https://www.instagram.com/mbarek_abdel/"
|
||||
url: "https://www.instagram.com/mbarek_abdel/"
|
||||
- Text: "\nMonitor And Keyboard by vadimmihalkevich / CC BY 4.0 "
|
||||
- Web:
|
||||
text: "https://geni.us/PgGWp"
|
||||
url: "https://geni.us/PgGWp"
|
||||
- Text: "\nMechanical RGB Keyboard by BigBrotherECE / CC BY 4.0 "
|
||||
- Web:
|
||||
text: "https://geni.us/mj6pHk4"
|
||||
url: "https://geni.us/mj6pHk4"
|
||||
- Text: "\nMouse Gamer free Model By Oscar Creativo / CC BY 4.0 "
|
||||
- Web:
|
||||
text: "https://geni.us/Ps3XfE"
|
||||
url: "https://geni.us/Ps3XfE"
|
||||
- Text: "\n\nCHAPTERS\n---------------------------------------------------\n"
|
||||
- Video:
|
||||
title: "0:00"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Intro\n"
|
||||
- Video:
|
||||
title: "0:42"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " The PC Built for Super Efficiency\n"
|
||||
- Video:
|
||||
title: "2:41"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Our BURIAL ENCLOSURE?!\n"
|
||||
- Video:
|
||||
title: "3:31"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Our Power Solution (Thanks Jackery!)\n"
|
||||
- Video:
|
||||
title: "4:47"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Diggin' Holes\n"
|
||||
- Video:
|
||||
title: "5:30"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Colonoscopy?\n"
|
||||
- Video:
|
||||
title: "7:04"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Diggin' like a man\n"
|
||||
- Video:
|
||||
title: "8:29"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " The world's worst woodsman\n"
|
||||
- Video:
|
||||
title: "9:03"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Backyard cable management\n"
|
||||
- Video:
|
||||
title: "10:02"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Time to bury this boy\n"
|
||||
- Video:
|
||||
title: "10:46"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Solar Power Generation\n"
|
||||
- Video:
|
||||
title: "11:37"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Issues\n"
|
||||
- Video:
|
||||
title: "12:08"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " First Play Test\n"
|
||||
- Video:
|
||||
title: "13:20"
|
||||
id: nFDBxBUfE74
|
||||
- Text: " Conclusion"
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UCXuqSBlHAE6Xw-yeJA0Tunw");
|
||||
assert_eq!(details.channel.name, "Linus Tech Tips");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::Verified);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 14700000, "expected >14.7M subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 1157262,
|
||||
"expected > 1157262 views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(
|
||||
details.like_count.unwrap() > 54670,
|
||||
"expected > 54670 likes, got {}",
|
||||
details.like_count.unwrap()
|
||||
);
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2022);
|
||||
assert_eq!(date.month(), 9);
|
||||
assert_eq!(date.day(), 15);
|
||||
|
||||
assert!(!details.is_live);
|
||||
assert!(!details.is_ccommons);
|
||||
|
||||
assert!(!details.recommended.items.is_empty());
|
||||
assert!(!details.recommended.is_exhausted());
|
||||
|
||||
// assert!(
|
||||
// details.top_comments.count.unwrap() > 700000,
|
||||
// "expected > 700K comments, got {}",
|
||||
// details.top_comments.count.unwrap()
|
||||
// );
|
||||
assert!(!details.top_comments.is_exhausted());
|
||||
assert!(!details.latest_comments.is_exhausted());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details_live() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("86YLFOog4GM").await.unwrap();
|
||||
|
||||
// dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "86YLFOog4GM");
|
||||
assert_eq!(
|
||||
details.title,
|
||||
"🌎 Nasa Live Stream - Earth From Space : Live Views from the ISS"
|
||||
);
|
||||
// TODO: not full description
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
- Text: "Live NASA - Views Of Earth from Space\nLive video feed of Earth from the International Space Station (ISS) Cameras\n-----------------------------------------------------------------------------------------------------\nWatch our latest video - The Sun - 4K Video / Solar Flares\n"
|
||||
- Video:
|
||||
title: "https://www.youtube.com/watch?v=SEzK4..."
|
||||
id: SEzK4ZfMvUQ
|
||||
- Text: "\n-----------------------------------------------------------------------------------------------------\nNasa ISS live stream from aboard the International Space Station as it circles the earth at 240 miles above the planet, on the edge of space in low earth orbit. \n\nThe station is crewed by NASA astronauts as well as Russian Cosmonauts and a mixture of Japanese, Canadian and European astronauts as well.\n\n"
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: " "
|
||||
- Text: "\n\nThe Expedition 67 Crew are: \n Sergey Korsakov\nOleg Artemyev\nDenis Matveev\nKjell Lindgren\nRobert Hines\nJessica Watkins\nSamantha Cristoforetti\n\nYulia Peresild\nKlim Shipenko - onboard as part of a film.\n\nTHIS WILL SHOW LIVE and PRE-RECORDED FOOTAGE - depending on signal from the station or if the ISS is on the night side of Earth.\n\nWhen the feed is live the words LIVE NOW will appear in the top left hand corner of the screen.\nAs the Space Station passes into a period of night every 45 mins video is unavailable - during this time, and other breaks in transmission, recorded footage is shown .\nWhen back in daylight the live stream of earth will recommence\n\nIf you are here to talk about a flat earth then please don't bother. You can stay and watch our beautiful globe earth as it spins in space , but please don't share your nonsense beliefs in our chat.\n\nGot a question about this feed? Read our FAQ's\n"
|
||||
- Web:
|
||||
text: "https://spacevideosfaq.tumblr.com/"
|
||||
url: "https://spacevideosfaq.tumblr.com/"
|
||||
- Text: "\n\nWatch the earth roll by courtesy of the NASA Live cameras\nInternational Space Station Live Feed: Thanks to NASA for this\n"
|
||||
- Web:
|
||||
text: "http://www.nasa.gov"
|
||||
url: "http://www.nasa.gov/"
|
||||
- Text: " The ISS passes into the dark side of the earth for roughly half of each of its 90 minute orbits. During this time no video is available.\n\nMusic by Kevin Macleod \n"
|
||||
- Web:
|
||||
text: "http://incompetech.com/music/royalty-..."
|
||||
url: "http://incompetech.com/music/royalty-free/"
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UCakgsb0w7QB0VHdnCc-OVEA");
|
||||
assert_eq!(details.channel.name, "Space Videos");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::Verified);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 5500000, "expected >5.5M subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 10,
|
||||
"expected > 10 views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(
|
||||
details.like_count.unwrap() > 872290,
|
||||
"expected > 872290 likes, got {}",
|
||||
details.like_count.unwrap()
|
||||
);
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2021);
|
||||
assert_eq!(date.month(), 9);
|
||||
assert_eq!(date.day(), 23);
|
||||
|
||||
assert!(details.is_live);
|
||||
assert!(!details.is_ccommons);
|
||||
|
||||
assert!(!details.recommended.items.is_empty());
|
||||
assert!(!details.recommended.is_exhausted());
|
||||
|
||||
// No comments because livestream
|
||||
assert_eq!(details.top_comments.count, Some(0));
|
||||
assert_eq!(details.latest_comments.count, Some(0));
|
||||
assert!(details.top_comments.is_empty());
|
||||
assert!(details.latest_comments.is_empty());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_video_details_agegate() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
let details = rp.query().video_details("HRKu0cvrr_o").await.unwrap();
|
||||
|
||||
dbg!(&details);
|
||||
|
||||
assert_eq!(details.id, "HRKu0cvrr_o");
|
||||
assert_eq!(
|
||||
details.title,
|
||||
"AlphaOmegaSin Fanboy Logic: Likes/Dislikes Disabled = Point Invalid Lol wtf?"
|
||||
);
|
||||
insta::assert_yaml_snapshot!(details.description, @r###"
|
||||
---
|
||||
[]
|
||||
"###);
|
||||
|
||||
assert_eq!(details.channel.id, "UCQT2yul0lr6Ie9qNQNmw-sg");
|
||||
assert_eq!(details.channel.name, "PrinceOfFALLEN");
|
||||
assert!(!details.channel.avatar.is_empty(), "no channel avatars");
|
||||
assert_eq!(details.channel.verification, Verification::None);
|
||||
// TODO: assert!(details.channel.subscriber_count.unwrap() > 1400, "expected >1400 subs, got {}", details.channel.subscriber_count);
|
||||
|
||||
assert!(
|
||||
details.view_count > 200,
|
||||
"expected > 200 views, got {}",
|
||||
details.view_count
|
||||
);
|
||||
assert!(details.like_count.is_none(), "like count not hidden");
|
||||
|
||||
let date = details.publish_date.unwrap();
|
||||
assert_eq!(date.year(), 2019);
|
||||
assert_eq!(date.month(), 1);
|
||||
assert_eq!(date.day(), 2);
|
||||
|
||||
assert!(!details.is_live);
|
||||
assert!(!details.is_ccommons);
|
||||
|
||||
// No recommendations because agegate
|
||||
assert_eq!(details.recommended.count, Some(0));
|
||||
assert!(details.recommended.items.is_empty());
|
||||
}
|
||||
|
||||
/*
|
||||
#[test_log::test(tokio::test)]
|
||||
async fn get_video_recommendations() {
|
||||
let rp = RustyPipe::builder().strict().build();
|
||||
|
|
@ -585,4 +1096,5 @@ mod tests {
|
|||
|
||||
dbg!(&rec);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
pub mod locale;
|
||||
mod ordering;
|
||||
mod paginator;
|
||||
pub mod richtext;
|
||||
pub mod stream_filter;
|
||||
|
||||
pub use locale::{Country, Language};
|
||||
|
|
@ -11,6 +12,8 @@ use std::ops::Range;
|
|||
use chrono::{DateTime, Local};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use self::richtext::RichText;
|
||||
|
||||
/*
|
||||
#PLAYER
|
||||
*/
|
||||
|
|
@ -217,10 +220,10 @@ pub struct VideoDetails {
|
|||
/// Video title
|
||||
pub title: String,
|
||||
/// Video description
|
||||
pub description: String,
|
||||
pub description: RichText,
|
||||
/// Channel of the video
|
||||
pub channel: Channel,
|
||||
/// Number of views
|
||||
/// Number of views / current viewers in case of a livestream.
|
||||
pub view_count: u64,
|
||||
/// Number of likes
|
||||
///
|
||||
|
|
@ -332,7 +335,7 @@ pub struct Comment {
|
|||
/// Unique YouTube Comment-ID (e.g. `UgynScMrsqGSL8qvePl4AaABAg`)
|
||||
pub id: String,
|
||||
/// Comment text
|
||||
pub text: String,
|
||||
pub text: RichText,
|
||||
/// Comment author
|
||||
///
|
||||
/// There may be comments with missing authors (possibly deleted users?).
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
use std::convert::TryInto;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// The paginator is a wrapper around a list of items that are fetched
|
||||
|
|
@ -28,7 +30,7 @@ pub struct Paginator<T> {
|
|||
impl<T> Default for Paginator<T> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
count: None,
|
||||
count: Some(0),
|
||||
items: Vec::new(),
|
||||
ctoken: None,
|
||||
}
|
||||
|
|
@ -36,6 +38,17 @@ impl<T> Default for Paginator<T> {
|
|||
}
|
||||
|
||||
impl<T> Paginator<T> {
|
||||
pub(crate) fn new(count: Option<u32>, items: Vec<T>, ctoken: Option<String>) -> Self {
|
||||
Self {
|
||||
count: match ctoken {
|
||||
Some(_) => count,
|
||||
None => items.len().try_into().ok(),
|
||||
},
|
||||
items,
|
||||
ctoken,
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if the paginator is exhausted, meaning that no more
|
||||
/// items can be fetched.
|
||||
///
|
||||
|
|
|
|||
204
src/model/richtext.rs
Normal file
204
src/model/richtext.rs
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub struct RichText(pub Vec<TextComponent>);
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub enum TextComponent {
|
||||
/// Plain text
|
||||
Text(String),
|
||||
/// Web link
|
||||
Web { text: String, url: String },
|
||||
/// Link to a YouTube video
|
||||
Video { title: String, id: String },
|
||||
/// Link to a YouTube channel
|
||||
Channel { name: String, id: String },
|
||||
/// Link to a YouTube playlist
|
||||
Playlist { name: String, id: String },
|
||||
/// Link to a YouTube Music artist
|
||||
Artist { name: String, id: String },
|
||||
/// Link to a YouTube Music album
|
||||
Album { name: String, id: String },
|
||||
}
|
||||
|
||||
/// Trait for converting rich text to plain text.
|
||||
pub trait ToPlaintext {
|
||||
/// Convert rich text to plain text.
|
||||
fn to_plaintext(&self) -> String {
|
||||
self.to_plaintext_yt_host("https://www.youtube.com")
|
||||
}
|
||||
/// Convert rich text to plain text while changing YouTube links to a custom site.
|
||||
///
|
||||
/// expected yt_host format (no trailing slash): `https://example.com`
|
||||
fn to_plaintext_yt_host(&self, yt_host: &str) -> String;
|
||||
}
|
||||
|
||||
/// Trait for converting rich text to html.
|
||||
#[cfg(feature = "html")]
|
||||
pub trait ToHtml {
|
||||
/// Convert rich text to html.
|
||||
fn to_html(&self) -> String {
|
||||
self.to_html_yt_host("https://www.youtube.com")
|
||||
}
|
||||
/// Convert rich text to html while changing YouTube links to a custom site.
|
||||
///
|
||||
/// expected yt_host format (no trailing slash): `https://example.com`
|
||||
fn to_html_yt_host(&self, yt_host: &str) -> String;
|
||||
}
|
||||
|
||||
impl ToPlaintext for TextComponent {
|
||||
fn to_plaintext_yt_host(&self, yt_host: &str) -> String {
|
||||
match self {
|
||||
TextComponent::Text(text) => text.to_owned(),
|
||||
TextComponent::Web { url, .. } => url.to_owned(),
|
||||
TextComponent::Video { id, .. } => format!("{}/watch?v={}", yt_host, id),
|
||||
TextComponent::Channel { id, .. } | TextComponent::Artist { id, .. } => {
|
||||
format!("{}/channel/{}", yt_host, id)
|
||||
}
|
||||
TextComponent::Playlist { id, .. } | TextComponent::Album { id, .. } => {
|
||||
format!("{}/playlist?list={}", yt_host, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "html")]
|
||||
impl ToHtml for TextComponent {
|
||||
fn to_html_yt_host(&self, yt_host: &str) -> String {
|
||||
match self {
|
||||
TextComponent::Text(text) => askama_escape::escape(&text, askama_escape::Html)
|
||||
.to_string()
|
||||
.replace("\n", "<br>"),
|
||||
TextComponent::Web { text, url } => {
|
||||
format!(
|
||||
r#"<a href="{}" target="_blank" rel="noreferrer">{}</a>"#,
|
||||
url,
|
||||
askama_escape::escape(&text, askama_escape::Html)
|
||||
)
|
||||
}
|
||||
TextComponent::Video { title, id } => {
|
||||
format!(
|
||||
r#"<a href="{}/watch?v={}" rel="noreferrer">{}</a>"#,
|
||||
yt_host,
|
||||
id,
|
||||
askama_escape::escape(&title, askama_escape::Html)
|
||||
)
|
||||
}
|
||||
TextComponent::Channel { name, id } | TextComponent::Artist { name, id } => {
|
||||
format!(
|
||||
r#"<a href="{}/channel/{}" rel="noreferrer">{}</a>"#,
|
||||
yt_host,
|
||||
id,
|
||||
askama_escape::escape(&name, askama_escape::Html)
|
||||
)
|
||||
}
|
||||
TextComponent::Playlist { name, id } | TextComponent::Album { name, id } => {
|
||||
format!(
|
||||
r#"<a href="{}/playlist?list={}" rel="noreferrer">{}</a>"#,
|
||||
yt_host,
|
||||
id,
|
||||
askama_escape::escape(&name, askama_escape::Html)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToPlaintext for RichText {
|
||||
fn to_plaintext_yt_host(&self, yt_host: &str) -> String {
|
||||
self.0
|
||||
.iter()
|
||||
.map(|c| c.to_plaintext_yt_host(yt_host))
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "html")]
|
||||
impl ToHtml for RichText {
|
||||
fn to_html_yt_host(&self, yt_host: &str) -> String {
|
||||
self.0.iter().map(|c| c.to_html_yt_host(yt_host)).collect()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
use once_cell::sync::Lazy;
|
||||
|
||||
use crate::serializer::text;
|
||||
|
||||
static TEXT_SOURCE: Lazy<text::TextComponents> = Lazy::new(|| {
|
||||
text::TextComponents(vec![
|
||||
text::TextComponent::Text { text: "🎧Listen and download aespa's debut single \"Black Mamba\": ".to_owned() },
|
||||
text::TextComponent::Web { text: "https://smarturl.it/aespa_BlackMamba".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbFY1QmpQamJPSms0Z1FnVTlQUS00ZFhBZnBJZ3xBQ3Jtc0tuRGJBanludGoyRnphb2dZWVd3cUNnS3dEd0FnNHFOZEY1NHBJaHFmLXpaWUJwX3ZucDZxVnpGeHNGX1FpMzFkZW9jQkI2Mi1wNGJ1UVFNN3h1MnN3R3JLMzdxU01nZ01POHBGcmxHU2puSUk1WHRzQQ&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n🐍The Debut Stage ".to_owned() },
|
||||
text::TextComponent::Video { title: "https://youtu.be/Ky5RT5oGg0w".to_owned(), video_id: "Ky5RT5oGg0w".to_owned() },
|
||||
text::TextComponent::Text { text: "\n\n🎟️ aespa Showcase SYNK in LA! Tickets now on sale: ".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.ticketmaster.com/event/0A...".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbFpUMEZiaXJWWkszaVZXaEM0emxWU1JQV3NoQXxBQ3Jtc0tuU2g4VWNPNE5UY3hoSWYtamFzX0h4bUVQLVJiRy1ubDZrTnh3MUpGdDNSaUo0ZlMyT3lUM28ycUVBdHJLMndGcDhla3BkOFpxSVFfOS1QdVJPVHBUTEV1LXpOV0J2QXdhV05lV210cEJtZUJMeHdaTQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n\nSubscribe to aespa Official YouTube Channel!\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.youtube.com/aespa?sub_con...".to_owned(), url: "https://www.youtube.com/aespa?sub_confirmation=1".to_owned() },
|
||||
text::TextComponent::Text { text: "\n\naespa official\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.youtube.com/c/aespa".to_owned(), url: "https://www.youtube.com/c/aespa".to_owned() },
|
||||
text::TextComponent::Text { text: "\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.instagram.com/aespa_official".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbmE4UXZBdFM4allpdUkwaGQ1SGFBTklKYVVaQXxBQ3Jtc0tsOVg3WTM2Y0t1eE5YUm5vZjNTVjM4bncxTl9JeFdWeGJlbDZJa3BqTXZDQUdzVndPR3ZpV2ZEOGMzZ1FsT21HMEp5UllpWVZVb3djYTVzNGNFaWlmbzhmTEVmQ0RiVUxMNUM4MDV3ZGt3SHhJM3pGSQ&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.tiktok.com/@aespa_official".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa2hVUk9QQXZmMHk5ZkdEZnVKZXIyXzZvX09zZ3xBQ3Jtc0trZEhjd1lVc1NZMWs4TVY3UmpzdDhnX0lLYnZjekZqNUprWUpHV1ZOR2g0al84TlNLTEFjODktUWE3QUFFTlJ5RlpvOVNOWUdJXzF2ZHhzOHRTdGhlUG1OcmhZVkMtazBzYXJqNFVUYVBKUVI1ZzB4VQ&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://twitter.com/aespa_Official".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWFlRFFWWVpMeFRzU08ySWhJWVl0RUJpZzIxZ3xBQ3Jtc0tsekJiMUI4Zk1QdENObWpLZVppdk1nRVBkamJmX21VNGxaYjdUTEdoREx4Z3pWTm0wVHg4MWNTVmdxakNJT3VQQk5tSDVnZkNJZkhQSTF1d0ZEX3g0RUVDWjFjVzA1ZzVsTEVvMW5ISTdaZU1xYjhXSQ&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://www.facebook.com/aespa.official".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWJxUWVETWNwM0ltc0JYXzBjQ1h5dmQ2OXNzUXxBQ3Jtc0ttVy1JRHV2VVpUOUtDdUZTU0tROEtLX1k0bVFFNTdoZVpIUDhDbTkydmRmY2diR3RlQmlON1Y4NURsaU1YcTRKLXBzeGdkWWY1d0R3MzhMYXl6cE1OM0hMcEpkdXZvVXItQzRhMTVqVU1ySk93UG9Ydw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n".to_owned() },
|
||||
text::TextComponent::Web { text: "https://weibo.com/aespa".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbUZFOVFFSEtTRkU5LXluWk9uTVRHbU5tN2JGd3xBQ3Jtc0ttR003eUM4ZVBVM3JPdjdJMnZwRXpxZmJMMkhFbHYtbklJUG9LYXh5VHBXalgyWTZwc3RqcGlhT2JIR0RlNVpWUEpBajZ0X2d5ZkxEZUUyQmF4bE13NjhEdDZOak9saHdnb25qdnB3dnRiYmplbkY0MA&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E".to_owned() },
|
||||
text::TextComponent::Text { text: "\n\n".to_owned() },
|
||||
text::TextComponent::Text { text: "#aespa".to_owned() },
|
||||
text::TextComponent::Text { text: " ".to_owned() },
|
||||
text::TextComponent::Text { text: "#æspa".to_owned() },
|
||||
text::TextComponent::Text { text: " ".to_owned() },
|
||||
text::TextComponent::Text { text: "#BlackMamba".to_owned() },
|
||||
text::TextComponent::Text { text: " ".to_owned() },
|
||||
text::TextComponent::Text { text: "#블랙맘바".to_owned() },
|
||||
text::TextComponent::Text { text: " ".to_owned() },
|
||||
text::TextComponent::Text { text: "#에스파".to_owned() },
|
||||
text::TextComponent::Text { text: "\naespa 에스파 'Black Mamba' MV ℗ SM Entertainment".to_owned() },
|
||||
])
|
||||
});
|
||||
|
||||
#[test]
|
||||
fn t_to_plaintext() {
|
||||
let richtext = RichText::from(TEXT_SOURCE.clone());
|
||||
let plaintext = richtext.to_plaintext_yt_host("https://piped.kavin.rocks");
|
||||
assert_eq!(
|
||||
plaintext,
|
||||
r#"🎧Listen and download aespa's debut single "Black Mamba": https://smarturl.it/aespa_BlackMamba
|
||||
🐍The Debut Stage https://piped.kavin.rocks/watch?v=Ky5RT5oGg0w
|
||||
|
||||
🎟️ aespa Showcase SYNK in LA! Tickets now on sale: https://www.ticketmaster.com/event/0A005CCD9E871F6E
|
||||
|
||||
Subscribe to aespa Official YouTube Channel!
|
||||
https://www.youtube.com/aespa?sub_confirmation=1
|
||||
|
||||
aespa official
|
||||
https://www.youtube.com/c/aespa
|
||||
https://www.instagram.com/aespa_official
|
||||
https://www.tiktok.com/@aespa_official
|
||||
https://twitter.com/aespa_Official
|
||||
https://www.facebook.com/aespa.official
|
||||
https://weibo.com/aespa
|
||||
|
||||
#aespa #æspa #BlackMamba #블랙맘바 #에스파
|
||||
aespa 에스파 'Black Mamba' MV ℗ SM Entertainment"#
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(feature = "html")]
|
||||
#[test]
|
||||
fn t_to_html() {
|
||||
let richtext = RichText::from(TEXT_SOURCE.clone());
|
||||
let html = richtext.to_html_yt_host("https://piped.kavin.rocks");
|
||||
assert_eq!(
|
||||
html,
|
||||
"🎧Listen and download aespa's debut single "Black Mamba": <a href=\"https://smarturl.it/aespa_BlackMamba\" target=\"_blank\" rel=\"noreferrer\">https://smarturl.it/aespa_BlackMamba</a><br>🐍The Debut Stage <a href=\"https://piped.kavin.rocks/watch?v=Ky5RT5oGg0w\" rel=\"noreferrer\">https://youtu.be/Ky5RT5oGg0w</a><br><br>🎟\u{fe0f} aespa Showcase SYNK in LA! Tickets now on sale: <a href=\"https://www.ticketmaster.com/event/0A005CCD9E871F6E\" target=\"_blank\" rel=\"noreferrer\">https://www.ticketmaster.com/event/0A...</a><br><br>Subscribe to aespa Official YouTube Channel!<br><a href=\"https://www.youtube.com/aespa?sub_confirmation=1\" target=\"_blank\" rel=\"noreferrer\">https://www.youtube.com/aespa?sub_con...</a><br><br>aespa official<br><a href=\"https://www.youtube.com/c/aespa\" target=\"_blank\" rel=\"noreferrer\">https://www.youtube.com/c/aespa</a><br><a href=\"https://www.instagram.com/aespa_official\" target=\"_blank\" rel=\"noreferrer\">https://www.instagram.com/aespa_official</a><br><a href=\"https://www.tiktok.com/@aespa_official\" target=\"_blank\" rel=\"noreferrer\">https://www.tiktok.com/@aespa_official</a><br><a href=\"https://twitter.com/aespa_Official\" target=\"_blank\" rel=\"noreferrer\">https://twitter.com/aespa_Official</a><br><a href=\"https://www.facebook.com/aespa.official\" target=\"_blank\" rel=\"noreferrer\">https://www.facebook.com/aespa.official</a><br><a href=\"https://weibo.com/aespa\" target=\"_blank\" rel=\"noreferrer\">https://weibo.com/aespa</a><br><br>#aespa #æspa #BlackMamba #블랙맘바 #에스파<br>aespa 에스파 'Black Mamba' MV ℗ SM Entertainment"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,10 @@ use anyhow::anyhow;
|
|||
use serde::{Deserialize, Deserializer};
|
||||
use serde_with::{serde_as, DefaultOnError, DeserializeAs};
|
||||
|
||||
use crate::util;
|
||||
|
||||
/// # Text
|
||||
///
|
||||
/// The YouTube API has multiple ways of outputting text. This deserializer
|
||||
/// is an attempt to unify them.
|
||||
///
|
||||
|
|
@ -19,7 +23,7 @@ use serde_with::{serde_as, DefaultOnError, DeserializeAs};
|
|||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Multiple "runs" of text should be joined with spaces
|
||||
/// Multiple "runs" aka components of text should be joined together
|
||||
/// ```json
|
||||
/// {
|
||||
/// "runs": [
|
||||
|
|
@ -39,7 +43,7 @@ pub enum Text {
|
|||
text: String,
|
||||
},
|
||||
Multiple {
|
||||
#[serde_as(as = "Vec<crate::serializer::text::Text>")]
|
||||
#[serde_as(as = "Vec<Text>")]
|
||||
runs: Vec<String>,
|
||||
},
|
||||
}
|
||||
|
|
@ -70,8 +74,17 @@ impl<'de> DeserializeAs<'de, Vec<String>> for Text {
|
|||
}
|
||||
}
|
||||
|
||||
/// # TextComponent
|
||||
///
|
||||
/// Some texts on the YouTube website include links. These can be links to
|
||||
/// other YouTube entities (Channels, Videos) as well as websites.
|
||||
///
|
||||
/// Texts with links are mapped as a list of text components.
|
||||
#[derive(Default, Debug, Clone)]
|
||||
pub struct TextComponents(pub Vec<TextComponent>);
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum TextLink {
|
||||
pub enum TextComponent {
|
||||
Video {
|
||||
title: String,
|
||||
video_id: String,
|
||||
|
|
@ -85,21 +98,22 @@ pub enum TextLink {
|
|||
text: String,
|
||||
url: String,
|
||||
},
|
||||
None {
|
||||
Text {
|
||||
text: String,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct TextLinks;
|
||||
|
||||
/// YouTube's representation of a text with links. It consists of multiple
|
||||
/// runs aka components, which can be simple strings or links.
|
||||
#[derive(Deserialize)]
|
||||
struct TextLinkInternal {
|
||||
runs: Vec<TextLinkRun>,
|
||||
struct RichTextInternal {
|
||||
runs: Vec<RichTextRun>,
|
||||
}
|
||||
|
||||
/// TextLinkRun is a single component from a YouTube text with links
|
||||
#[derive(Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct TextLinkRun {
|
||||
struct RichTextRun {
|
||||
text: String,
|
||||
#[serde(default)]
|
||||
navigation_endpoint: NavigationEndpoint,
|
||||
|
|
@ -166,7 +180,7 @@ struct WebCommandMetadata {
|
|||
web_page_type: PageType,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
|
||||
pub enum PageType {
|
||||
#[serde(rename = "MUSIC_PAGE_TYPE_ARTIST")]
|
||||
Artist,
|
||||
|
|
@ -181,17 +195,18 @@ pub enum PageType {
|
|||
Playlist,
|
||||
}
|
||||
|
||||
fn map_text_linkrun(lr: &TextLinkRun) -> Option<TextLink> {
|
||||
/// Map a single component of a rich text
|
||||
fn map_richtext_run(lr: &RichTextRun) -> Option<TextComponent> {
|
||||
let text = lr.text.to_owned();
|
||||
let nav = &lr.navigation_endpoint;
|
||||
|
||||
Some(match &nav.watch_endpoint {
|
||||
Some(w) => TextLink::Video {
|
||||
Some(w) => TextComponent::Video {
|
||||
title: text,
|
||||
video_id: w.video_id.to_owned(),
|
||||
},
|
||||
None => match &nav.browse_endpoint {
|
||||
Some(b) => TextLink::Browse {
|
||||
Some(b) => TextComponent::Browse {
|
||||
text,
|
||||
page_type: match &b.browse_endpoint_context_supported_configs {
|
||||
Some(bc) => bc.browse_endpoint_context_music_config.page_type,
|
||||
|
|
@ -203,52 +218,54 @@ fn map_text_linkrun(lr: &TextLinkRun) -> Option<TextLink> {
|
|||
browse_id: b.browse_id.to_owned(),
|
||||
},
|
||||
None => match &nav.url_endpoint {
|
||||
Some(u) => TextLink::Web {
|
||||
Some(u) => TextComponent::Web {
|
||||
text,
|
||||
url: u.url.to_owned(),
|
||||
},
|
||||
None => TextLink::None { text },
|
||||
None => TextComponent::Text { text },
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
impl<'de> DeserializeAs<'de, TextLink> for TextLink {
|
||||
fn deserialize_as<D>(deserializer: D) -> Result<TextLink, D::Error>
|
||||
impl<'de> Deserialize<'de> for TextComponent {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let link = TextLinkInternal::deserialize(deserializer)?;
|
||||
let link = RichTextInternal::deserialize(deserializer)?;
|
||||
if link.runs.len() != 1 {
|
||||
return Err(serde::de::Error::invalid_length(
|
||||
link.runs.len(),
|
||||
&"1 run, use TextLinks for more",
|
||||
&"1 run, use RichText for more",
|
||||
));
|
||||
}
|
||||
|
||||
Ok(some_or_bail!(
|
||||
map_text_linkrun(&link.runs[0]),
|
||||
map_richtext_run(&link.runs[0]),
|
||||
Err(serde::de::Error::custom("missing/invalid browse endpoint"))
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> DeserializeAs<'de, Vec<TextLink>> for TextLinks {
|
||||
fn deserialize_as<D>(deserializer: D) -> Result<Vec<TextLink>, D::Error>
|
||||
impl<'de> Deserialize<'de> for TextComponents {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let link = TextLinkInternal::deserialize(deserializer)?;
|
||||
Ok(link.runs.iter().filter_map(map_text_linkrun).collect())
|
||||
let link = RichTextInternal::deserialize(deserializer)?;
|
||||
Ok(Self(
|
||||
link.runs.iter().filter_map(map_richtext_run).collect(),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<TextLink> for crate::model::ChannelId {
|
||||
impl TryFrom<TextComponent> for crate::model::ChannelId {
|
||||
type Error = anyhow::Error;
|
||||
|
||||
fn try_from(value: TextLink) -> Result<Self, Self::Error> {
|
||||
fn try_from(value: TextComponent) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
TextLink::Browse {
|
||||
TextComponent::Browse {
|
||||
text,
|
||||
page_type,
|
||||
browse_id,
|
||||
|
|
@ -264,6 +281,50 @@ impl TryFrom<TextLink> for crate::model::ChannelId {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<TextComponent> for crate::model::richtext::TextComponent {
|
||||
fn from(component: TextComponent) -> Self {
|
||||
match component {
|
||||
TextComponent::Video { title, video_id } => Self::Video {
|
||||
title,
|
||||
id: video_id,
|
||||
},
|
||||
TextComponent::Browse {
|
||||
text,
|
||||
page_type,
|
||||
browse_id,
|
||||
} => match page_type {
|
||||
PageType::Artist => Self::Artist {
|
||||
name: text,
|
||||
id: browse_id,
|
||||
},
|
||||
PageType::Album => Self::Album {
|
||||
name: text,
|
||||
id: browse_id,
|
||||
},
|
||||
PageType::Channel => Self::Channel {
|
||||
name: text,
|
||||
id: browse_id,
|
||||
},
|
||||
PageType::Playlist => Self::Playlist {
|
||||
name: text,
|
||||
id: browse_id,
|
||||
},
|
||||
},
|
||||
TextComponent::Web { text, url } => Self::Web {
|
||||
text,
|
||||
url: util::sanitize_yt_url(&url),
|
||||
},
|
||||
TextComponent::Text { text } => Self::Text(text),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<TextComponents> for crate::model::richtext::RichText {
|
||||
fn from(components: TextComponents) -> Self {
|
||||
Self(components.0.into_iter().map(TextComponent::into).collect())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct AccessibilityText {
|
||||
|
|
@ -288,7 +349,8 @@ impl<'de> DeserializeAs<'de, String> for AccessibilityText {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::TextLink;
|
||||
use super::*;
|
||||
|
||||
use rstest::rstest;
|
||||
use serde::Deserialize;
|
||||
use serde_with::serde_as;
|
||||
|
|
@ -332,14 +394,14 @@ mod tests {
|
|||
#[serde_as]
|
||||
#[derive(Deserialize)]
|
||||
struct S {
|
||||
#[serde_as(as = "crate::serializer::text::Text")]
|
||||
#[serde_as(as = "Text")]
|
||||
txt: String,
|
||||
}
|
||||
|
||||
#[serde_as]
|
||||
#[derive(Deserialize)]
|
||||
struct SVec {
|
||||
#[serde_as(as = "crate::serializer::text::Text")]
|
||||
#[serde_as(as = "Text")]
|
||||
txt: Vec<String>,
|
||||
}
|
||||
|
||||
|
|
@ -350,18 +412,14 @@ mod tests {
|
|||
assert_eq!(res_vec.txt, exp);
|
||||
}
|
||||
|
||||
#[serde_as]
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct SLink {
|
||||
#[serde_as(as = "crate::serializer::text::TextLink")]
|
||||
ln: TextLink,
|
||||
ln: TextComponent,
|
||||
}
|
||||
|
||||
#[serde_as]
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct SLinks {
|
||||
#[serde_as(as = "crate::serializer::text::TextLinks")]
|
||||
ln: Vec<TextLink>,
|
||||
ln: TextComponents,
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -475,7 +533,7 @@ mod tests {
|
|||
let res = serde_json::from_str::<SLink>(&test_json).unwrap();
|
||||
insta::assert_debug_snapshot!(res, @r###"
|
||||
SLink {
|
||||
ln: None {
|
||||
ln: Text {
|
||||
text: "Hello World",
|
||||
},
|
||||
}
|
||||
|
|
@ -559,13 +617,14 @@ mod tests {
|
|||
let res = serde_json::from_str::<SLinks>(&test_json).unwrap();
|
||||
insta::assert_debug_snapshot!(res, @r###"
|
||||
SLinks {
|
||||
ln: [
|
||||
ln: TextComponents(
|
||||
[
|
||||
Browse {
|
||||
text: "Roland Kaiser",
|
||||
page_type: Artist,
|
||||
browse_id: "UCtqi0viP-suK-okUQfaw8Ew",
|
||||
},
|
||||
None {
|
||||
Text {
|
||||
text: " & ",
|
||||
},
|
||||
Browse {
|
||||
|
|
@ -574,6 +633,7 @@ mod tests {
|
|||
browse_id: "UCY06CayCwdaOd1CnDgjy6uw",
|
||||
},
|
||||
],
|
||||
),
|
||||
}
|
||||
"###);
|
||||
}
|
||||
|
|
|
|||
66
src/util.rs
66
src/util.rs
|
|
@ -1,4 +1,4 @@
|
|||
use std::{collections::BTreeMap, str::FromStr};
|
||||
use std::{borrow::Borrow, collections::BTreeMap, str::FromStr};
|
||||
|
||||
use anyhow::Result;
|
||||
use fancy_regex::Regex;
|
||||
|
|
@ -147,6 +147,47 @@ pub fn retry_delay(
|
|||
min_retry_interval.max(jittered_delay.min(max_retry_interval))
|
||||
}
|
||||
|
||||
/// Convert YouTube redirect URLs (`https://www.youtube.com/redirect?`) into regular URLs.
|
||||
///
|
||||
/// Also strips google analytics tracking parameters
|
||||
/// (`utm_source`, `utm_medium`, `utm_campaign`, `utm_content`) because google analytics is bad.
|
||||
pub fn sanitize_yt_url(url: &str) -> String {
|
||||
let mut parsed_url = ok_or_bail!(Url::parse(url), url.to_owned());
|
||||
|
||||
// Convert redirect url
|
||||
if parsed_url.host_str().unwrap_or_default() == "www.youtube.com"
|
||||
&& parsed_url.path() == "/redirect"
|
||||
{
|
||||
if let Some((_, url)) = parsed_url.query_pairs().find(|(k, _)| k == "q") {
|
||||
parsed_url = ok_or_bail!(Url::parse(url.as_ref()), url.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
// Remove GA tracking params
|
||||
if parsed_url.query().is_some() {
|
||||
let params = parsed_url
|
||||
.query_pairs()
|
||||
.filter_map(|(k, v)| match k.borrow() {
|
||||
"utm_source" | "utm_medium" | "utm_campaign" | "utm_content" => None,
|
||||
_ => Some((k.to_string(), v.to_string())),
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
// Set empty query string if there are no parameters to prevent urls from ending with /?
|
||||
if params.is_empty() {
|
||||
parsed_url.set_query(None);
|
||||
} else {
|
||||
parsed_url
|
||||
.query_pairs_mut()
|
||||
.clear()
|
||||
.extend_pairs(params)
|
||||
.finish();
|
||||
}
|
||||
}
|
||||
|
||||
parsed_url.to_string()
|
||||
}
|
||||
|
||||
pub trait TryRemove<T> {
|
||||
/// Removes and returns the element at position `index` within the vector,
|
||||
/// shifting all elements after it to the left.
|
||||
|
|
@ -189,10 +230,10 @@ impl<T> TryRemove<T> for Vec<T> {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use rstest::rstest;
|
||||
|
||||
use super::*;
|
||||
|
||||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
#[case("1.000", 1000)]
|
||||
#[case("4 Hello World 2", 42)]
|
||||
|
|
@ -253,4 +294,23 @@ mod tests {
|
|||
assert_eq!(v.try_swap_remove(1).unwrap(), 2);
|
||||
assert_eq!(v.try_swap_remove(1), None);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case(
|
||||
"https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbXFjbjZ6bWdHc1VFLVNBN1NiRGR1QmRuR0lGZ3xBQ3Jtc0trcG1fWHpRNlE2eGNER0ZGczFlZXM5ZlctZzFSbl8wcHdieTlTb1ktSUc5OTZxVDVQamcxdS0yRjJJelFWTGdOS09nUk8xRExqbWhOSG5MTm83WG1QQzJqZTJuT2d6cGp0cEZTWmdsal80ODk0WkNESQ&q=http%3A%2F%2Fincompetech.com%2Fmusic%2Froyalty-free%2F&v=86YLFOog4GM",
|
||||
"http://incompetech.com/music/royalty-free/",
|
||||
)]
|
||||
#[case("https://www.gnu.org", "https://www.gnu.org/")]
|
||||
#[case(
|
||||
"https://www.youtube.com/watch?v=Rp2V7d69hyM",
|
||||
"https://www.youtube.com/watch?v=Rp2V7d69hyM"
|
||||
)]
|
||||
#[case(
|
||||
"https://www.youtube.com/redirect?event=product_shelf&redir_token=QUFFLUhqbDVUMUF3SndkcDFJbzMxYkNIMDRWSzRVQU84QXxBQ3Jtc0tsQWdpaUlaMzFUQmQwSGYwR3dDRDhHWld1bFFtUmlmMng0MmxtN19iVW1EeV9oSk1Xb1VlQ1UyT2xUOWhPdUZvVEZ6UWE4Unlia3pwZXhpUmd4RVg4eWZtcHFId2RJVkMyMUFIMDhiUVUzc2x6ZVNxbw&q=https%3A%2F%2Flttstore.com%2F%3Futm_medium%3Dproduct_shelf%26utm_source%3Dyoutube%26utm_content%3DYT-AERwsnLS3vZeiqL7_mR16DPg7FPBWvP7OW-zX2M1UIPlexPS8-gpk-2c3epSZ8lJ5NYbLof0MXDKhRLCSyfOn9BYJrcG8YtpTA9VU2VXUVhhl9AKi87G_-vFhj6jcGN1CWcYYvmZYbIqA93kwkeFuUh46ntDZR1Y8p5WygwVlhfxy_BZiNbzkWw%253D&v=nFDBxBUfE74",
|
||||
"https://lttstore.com/",
|
||||
)]
|
||||
fn t_sanitize_yt_url(#[case] url: &str, #[case] expect: &str) {
|
||||
let res = sanitize_yt_url(url);
|
||||
assert_eq!(res, expect);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Reference in a new issue