feat: music search filter/cont, refactored paginator
This commit is contained in:
parent
d29bbd8b25
commit
dac2b17dc2
38 changed files with 65313 additions and 247 deletions
|
|
@ -40,6 +40,10 @@ pub async fn download_testfiles(project_root: &Path) {
|
|||
music_playlist_cont(&testfiles).await;
|
||||
music_album(&testfiles).await;
|
||||
music_search(&testfiles).await;
|
||||
music_search_tracks(&testfiles).await;
|
||||
music_search_albums(&testfiles).await;
|
||||
music_search_artists(&testfiles).await;
|
||||
music_search_playlists(&testfiles).await;
|
||||
}
|
||||
|
||||
const CLIENT_TYPES: [ClientType; 5] = [
|
||||
|
|
@ -532,3 +536,65 @@ async fn music_search(testfiles: &Path) {
|
|||
rp.query().music_search(query).await.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
async fn music_search_tracks(testfiles: &Path) {
|
||||
for (name, query, videos) in [
|
||||
("default", "black mamba", false),
|
||||
("videos", "black mamba", true),
|
||||
("typo", "liblingsmensch", false),
|
||||
] {
|
||||
let mut json_path = testfiles.to_path_buf();
|
||||
json_path.push("music_search");
|
||||
json_path.push(format!("tracks_{}.json", name));
|
||||
if json_path.exists() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let rp = rp_testfile(&json_path);
|
||||
rp.query().music_search_tracks(query, videos).await.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
async fn music_search_albums(testfiles: &Path) {
|
||||
let mut json_path = testfiles.to_path_buf();
|
||||
json_path.push("music_search");
|
||||
json_path.push("albums.json");
|
||||
if json_path.exists() {
|
||||
return;
|
||||
}
|
||||
|
||||
let rp = rp_testfile(&json_path);
|
||||
rp.query().music_search_albums("black mamba").await.unwrap();
|
||||
}
|
||||
|
||||
async fn music_search_artists(testfiles: &Path) {
|
||||
let mut json_path = testfiles.to_path_buf();
|
||||
json_path.push("music_search");
|
||||
json_path.push("artists.json");
|
||||
if json_path.exists() {
|
||||
return;
|
||||
}
|
||||
|
||||
let rp = rp_testfile(&json_path);
|
||||
rp.query()
|
||||
.music_search_artists("black mamba")
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
async fn music_search_playlists(testfiles: &Path) {
|
||||
for (name, community) in [("ytm", false), ("community", true)] {
|
||||
let mut json_path = testfiles.to_path_buf();
|
||||
json_path.push("music_search");
|
||||
json_path.push(format!("playlists_{}.json", name));
|
||||
if json_path.exists() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let rp = rp_testfile(&json_path);
|
||||
rp.query()
|
||||
.music_search_playlists("pop", community)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use std::borrow::Cow;
|
|||
|
||||
use crate::{
|
||||
error::{Error, ExtractionError},
|
||||
model::{ChannelId, MusicAlbum, MusicPlaylist, Paginator, TrackItem},
|
||||
model::{ChannelId, MusicAlbum, MusicPlaylist, Paginator},
|
||||
serializer::MapResult,
|
||||
util::{self, TryRemove},
|
||||
};
|
||||
|
|
@ -12,7 +12,7 @@ use super::{
|
|||
self,
|
||||
music_item::{map_album_type, map_artists, MusicListMapper},
|
||||
},
|
||||
ClientType, MapResponse, QBrowse, QContinuation, RustyPipeQuery,
|
||||
ClientType, MapResponse, QBrowse, RustyPipeQuery,
|
||||
};
|
||||
|
||||
impl RustyPipeQuery {
|
||||
|
|
@ -33,26 +33,6 @@ impl RustyPipeQuery {
|
|||
.await
|
||||
}
|
||||
|
||||
pub async fn music_playlist_continuation(
|
||||
&self,
|
||||
ctoken: &str,
|
||||
) -> Result<Paginator<TrackItem>, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QContinuation {
|
||||
context,
|
||||
continuation: ctoken,
|
||||
};
|
||||
|
||||
self.execute_request::<response::MusicPlaylistCont, _, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_playlist_continuation",
|
||||
ctoken,
|
||||
"browse",
|
||||
&request_body,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn music_album(&self, album_id: &str) -> Result<MusicAlbum, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QBrowse {
|
||||
|
|
@ -126,6 +106,7 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
|
|||
|
||||
let mut mapper = MusicListMapper::new(lang);
|
||||
mapper.map_response(shelf.contents);
|
||||
let map_res = mapper.conv_items();
|
||||
|
||||
let ctoken = shelf
|
||||
.continuations
|
||||
|
|
@ -137,7 +118,7 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
|
|||
.second_subtitle
|
||||
.first()
|
||||
.and_then(|txt| util::parse_numeric::<u64>(txt).ok()),
|
||||
None => Some(mapper.tracks.len() as u64),
|
||||
None => Some(map_res.c.len() as u64),
|
||||
};
|
||||
|
||||
Ok(MapResult {
|
||||
|
|
@ -149,32 +130,15 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
|
|||
description: header.description,
|
||||
track_count,
|
||||
from_ytm,
|
||||
tracks: Paginator::new(track_count, mapper.tracks, ctoken),
|
||||
tracks: Paginator::new_ext(
|
||||
track_count,
|
||||
map_res.c,
|
||||
ctoken,
|
||||
None,
|
||||
crate::param::ContinuationEndpoint::MusicBrowse,
|
||||
),
|
||||
},
|
||||
warnings: mapper.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl MapResponse<Paginator<TrackItem>> for response::MusicPlaylistCont {
|
||||
fn map_response(
|
||||
self,
|
||||
_id: &str,
|
||||
lang: crate::param::Language,
|
||||
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
|
||||
) -> Result<MapResult<Paginator<TrackItem>>, ExtractionError> {
|
||||
let mut mapper = MusicListMapper::new(lang);
|
||||
let mut shelf = self.continuation_contents.music_playlist_shelf_continuation;
|
||||
mapper.map_response(shelf.contents);
|
||||
|
||||
let ctoken = shelf
|
||||
.continuations
|
||||
.try_swap_remove(0)
|
||||
.map(|cont| cont.next_continuation_data.continuation);
|
||||
|
||||
Ok(MapResult {
|
||||
c: Paginator::new(None, mapper.tracks, ctoken),
|
||||
warnings: mapper.warnings,
|
||||
warnings: map_res.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -247,9 +211,15 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
|
|||
}
|
||||
};
|
||||
mapper.map_response(shelf.contents);
|
||||
let tracks_res = mapper.conv_items();
|
||||
let mut warnings = tracks_res.warnings;
|
||||
|
||||
let mut variants_mapper = MusicListMapper::new(lang);
|
||||
if let Some(res) = album_variants {
|
||||
mapper.map_response(res)
|
||||
variants_mapper.map_response(res);
|
||||
}
|
||||
let mut variants_res = variants_mapper.conv_items();
|
||||
warnings.append(&mut variants_res.warnings);
|
||||
|
||||
Ok(MapResult {
|
||||
c: MusicAlbum {
|
||||
|
|
@ -262,10 +232,10 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
|
|||
album_type,
|
||||
year,
|
||||
by_va,
|
||||
tracks: mapper.tracks,
|
||||
variants: mapper.albums,
|
||||
tracks: tracks_res.c,
|
||||
variants: variants_res.c,
|
||||
},
|
||||
warnings: mapper.warnings,
|
||||
warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -303,23 +273,6 @@ mod tests {
|
|||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn map_music_playlist_cont() {
|
||||
let json_path = Path::new("testfiles/music_playlist/playlist_cont.json");
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let playlist: response::MusicPlaylistCont =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res = playlist.map_response("", Language::En, None).unwrap();
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
insta::assert_ron_snapshot!("map_music_playlist_cont", map_res.c);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::one_artist("one_artist", "MPREb_nlBWQROfvjo")]
|
||||
#[case::various_artists("various_artists", "MPREb_8QkDeEIawvX")]
|
||||
|
|
|
|||
|
|
@ -5,7 +5,10 @@ use serde::Serialize;
|
|||
use crate::{
|
||||
client::response::music_item::MusicListMapper,
|
||||
error::{Error, ExtractionError},
|
||||
model::MusicSearchResult,
|
||||
model::{
|
||||
AlbumItem, ArtistItem, FromYtItem, MusicPlaylistItem, MusicSearchFiltered,
|
||||
MusicSearchResult, Paginator, TrackItem,
|
||||
},
|
||||
serializer::MapResult,
|
||||
util::TryRemove,
|
||||
};
|
||||
|
|
@ -55,6 +58,98 @@ impl RustyPipeQuery {
|
|||
)
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn music_search_tracks(
|
||||
&self,
|
||||
query: &str,
|
||||
videos: bool,
|
||||
) -> Result<MusicSearchFiltered<TrackItem>, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QSearch {
|
||||
context,
|
||||
query,
|
||||
params: Some(match videos {
|
||||
true => Params::Videos,
|
||||
false => Params::Tracks,
|
||||
}),
|
||||
};
|
||||
|
||||
self.execute_request::<response::MusicSearch, _, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_search_tracks",
|
||||
query,
|
||||
"search",
|
||||
&request_body,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn music_search_albums(
|
||||
&self,
|
||||
query: &str,
|
||||
) -> Result<MusicSearchFiltered<AlbumItem>, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QSearch {
|
||||
context,
|
||||
query,
|
||||
params: Some(Params::Albums),
|
||||
};
|
||||
|
||||
self.execute_request::<response::MusicSearch, _, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_search_albums",
|
||||
query,
|
||||
"search",
|
||||
&request_body,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn music_search_artists(
|
||||
&self,
|
||||
query: &str,
|
||||
) -> Result<MusicSearchFiltered<ArtistItem>, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QSearch {
|
||||
context,
|
||||
query,
|
||||
params: Some(Params::Artists),
|
||||
};
|
||||
|
||||
self.execute_request::<response::MusicSearch, _, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_search_albums",
|
||||
query,
|
||||
"search",
|
||||
&request_body,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
pub async fn music_search_playlists(
|
||||
&self,
|
||||
query: &str,
|
||||
community: bool,
|
||||
) -> Result<MusicSearchFiltered<MusicPlaylistItem>, Error> {
|
||||
let context = self.get_context(ClientType::DesktopMusic, true, None).await;
|
||||
let request_body = QSearch {
|
||||
context,
|
||||
query,
|
||||
params: Some(match community {
|
||||
true => Params::CommunityPlaylists,
|
||||
false => Params::FeaturedPlaylists,
|
||||
}),
|
||||
};
|
||||
|
||||
self.execute_request::<response::MusicSearch, _, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_playlists",
|
||||
query,
|
||||
"search",
|
||||
&request_body,
|
||||
)
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
impl MapResponse<MusicSearchResult> for response::MusicSearch {
|
||||
|
|
@ -76,15 +171,16 @@ impl MapResponse<MusicSearchResult> for response::MusicSearch {
|
|||
.contents;
|
||||
|
||||
let mut corrected_query = None;
|
||||
// let mut ctoken = None;
|
||||
let mut order = Vec::new();
|
||||
let mut mapper = MusicListMapper::new(lang);
|
||||
|
||||
sections.into_iter().for_each(|section| match section {
|
||||
response::music_search::ItemSection::MusicShelfRenderer(shelf) => {
|
||||
mapper.map_response(shelf.contents);
|
||||
// if let Some(cont) = shelf.continuations.try_swap_remove(0) {
|
||||
// ctoken = Some(cont.next_continuation_data.continuation);
|
||||
// }
|
||||
if let Some(etype) = mapper.map_response(shelf.contents) {
|
||||
if !order.contains(&etype) {
|
||||
order.push(etype);
|
||||
}
|
||||
}
|
||||
}
|
||||
response::music_search::ItemSection::ItemSectionRenderer { mut contents } => {
|
||||
if let Some(corrected) = contents.try_swap_remove(0) {
|
||||
|
|
@ -94,15 +190,73 @@ impl MapResponse<MusicSearchResult> for response::MusicSearch {
|
|||
response::music_search::ItemSection::None => {}
|
||||
});
|
||||
|
||||
let map_res = mapper.group_items();
|
||||
|
||||
Ok(MapResult {
|
||||
c: MusicSearchResult {
|
||||
tracks: mapper.tracks,
|
||||
albums: mapper.albums,
|
||||
artists: mapper.artists,
|
||||
playlists: mapper.playlists,
|
||||
tracks: map_res.c.tracks,
|
||||
albums: map_res.c.albums,
|
||||
artists: map_res.c.artists,
|
||||
playlists: map_res.c.playlists,
|
||||
corrected_query,
|
||||
order,
|
||||
},
|
||||
warnings: map_res.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: FromYtItem> MapResponse<MusicSearchFiltered<T>> for response::MusicSearch {
|
||||
fn map_response(
|
||||
self,
|
||||
_id: &str,
|
||||
lang: crate::param::Language,
|
||||
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
|
||||
) -> Result<MapResult<MusicSearchFiltered<T>>, ExtractionError> {
|
||||
// dbg!(&self);
|
||||
|
||||
let mut tabs = self.contents.tabbed_search_results_renderer.contents;
|
||||
let sections = tabs
|
||||
.try_swap_remove(0)
|
||||
.ok_or(ExtractionError::InvalidData(Cow::Borrowed("no tab")))?
|
||||
.tab_renderer
|
||||
.content
|
||||
.section_list_renderer
|
||||
.contents;
|
||||
|
||||
let mut corrected_query = None;
|
||||
let mut ctoken = None;
|
||||
let mut mapper = MusicListMapper::new(lang);
|
||||
|
||||
sections.into_iter().for_each(|section| match section {
|
||||
response::music_search::ItemSection::MusicShelfRenderer(mut shelf) => {
|
||||
mapper.map_response(shelf.contents);
|
||||
if let Some(cont) = shelf.continuations.try_swap_remove(0) {
|
||||
ctoken = Some(cont.next_continuation_data.continuation);
|
||||
}
|
||||
}
|
||||
response::music_search::ItemSection::ItemSectionRenderer { mut contents } => {
|
||||
if let Some(corrected) = contents.try_swap_remove(0) {
|
||||
corrected_query = Some(corrected.showing_results_for_renderer.corrected_query)
|
||||
}
|
||||
}
|
||||
response::music_search::ItemSection::None => {}
|
||||
});
|
||||
|
||||
let map_res = mapper.conv_items();
|
||||
|
||||
Ok(MapResult {
|
||||
c: MusicSearchFiltered {
|
||||
items: Paginator::new_ext(
|
||||
None,
|
||||
map_res.c,
|
||||
ctoken,
|
||||
None,
|
||||
crate::param::ContinuationEndpoint::MusicSearch,
|
||||
),
|
||||
corrected_query,
|
||||
},
|
||||
warnings: mapper.warnings,
|
||||
warnings: map_res.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -113,7 +267,10 @@ mod tests {
|
|||
|
||||
use crate::{
|
||||
client::{response, MapResponse},
|
||||
model::MusicSearchResult,
|
||||
model::{
|
||||
AlbumItem, ArtistItem, MusicPlaylistItem, MusicSearchFiltered, MusicSearchResult,
|
||||
TrackItem,
|
||||
},
|
||||
param::Language,
|
||||
serializer::MapResult,
|
||||
};
|
||||
|
|
@ -141,4 +298,89 @@ mod tests {
|
|||
|
||||
insta::assert_ron_snapshot!(format!("map_music_search_{}", name), map_res.c);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::default("default")]
|
||||
#[case::typo("typo")]
|
||||
#[case::videos("videos")]
|
||||
fn map_music_search_tracks(#[case] name: &str) {
|
||||
let filename = format!("testfiles/music_search/tracks_{}.json", name);
|
||||
let json_path = Path::new(&filename);
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let search: response::MusicSearch =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<MusicSearchFiltered<TrackItem>> =
|
||||
search.map_response("", Language::En, None).unwrap();
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
|
||||
insta::assert_ron_snapshot!(format!("map_music_search_tracks_{}", name), map_res.c);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn map_music_search_albums() {
|
||||
let filename = "testfiles/music_search/albums.json";
|
||||
let json_path = Path::new(&filename);
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let search: response::MusicSearch =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<MusicSearchFiltered<AlbumItem>> =
|
||||
search.map_response("", Language::En, None).unwrap();
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
|
||||
insta::assert_ron_snapshot!("map_music_search_albums", map_res.c);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn map_music_search_artists() {
|
||||
let filename = "testfiles/music_search/artists.json";
|
||||
let json_path = Path::new(&filename);
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let search: response::MusicSearch =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<MusicSearchFiltered<ArtistItem>> =
|
||||
search.map_response("", Language::En, None).unwrap();
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
|
||||
insta::assert_ron_snapshot!("map_music_search_artists", map_res.c);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::ytm("ytm")]
|
||||
#[case::community("community")]
|
||||
fn map_music_search_playlists(#[case] name: &str) {
|
||||
let filename = format!("testfiles/music_search/playlists_{}.json", name);
|
||||
let json_path = Path::new(&filename);
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let search: response::MusicSearch =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<MusicSearchFiltered<MusicPlaylistItem>> =
|
||||
search.map_response("", Language::En, None).unwrap();
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
|
||||
insta::assert_ron_snapshot!(format!("map_music_search_playlists_{}", name), map_res.c);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,59 +1,98 @@
|
|||
use std::borrow::Cow;
|
||||
|
||||
use crate::error::{Error, ExtractionError};
|
||||
use crate::model::{Comment, Paginator, PlaylistVideo, TrackItem, YouTubeItem};
|
||||
use crate::model::{Comment, FromYtItem, MusicItem, Paginator, PlaylistVideo, YouTubeItem};
|
||||
use crate::param::ContinuationEndpoint;
|
||||
use crate::serializer::MapResult;
|
||||
use crate::util::TryRemove;
|
||||
|
||||
use super::response::music_item::MusicListMapper;
|
||||
use super::{response, ClientType, MapResponse, QContinuation, RustyPipeQuery};
|
||||
|
||||
impl RustyPipeQuery {
|
||||
pub async fn continuation<T: TryFrom<YouTubeItem>>(
|
||||
pub async fn continuation<T: FromYtItem>(
|
||||
&self,
|
||||
ctoken: &str,
|
||||
endpoint: ContinuationEndpoint,
|
||||
visitor_data: Option<&str>,
|
||||
) -> Result<Paginator<T>, Error> {
|
||||
let context = self
|
||||
.get_context(ClientType::Desktop, true, visitor_data)
|
||||
.await;
|
||||
let request_body = QContinuation {
|
||||
context,
|
||||
continuation: ctoken,
|
||||
};
|
||||
if endpoint.is_music() {
|
||||
let context = self
|
||||
.get_context(ClientType::DesktopMusic, true, visitor_data)
|
||||
.await;
|
||||
let request_body = QContinuation {
|
||||
context,
|
||||
continuation: ctoken,
|
||||
};
|
||||
|
||||
let p = self
|
||||
.execute_request::<response::Continuation, Paginator<YouTubeItem>, _>(
|
||||
ClientType::Desktop,
|
||||
"continuation",
|
||||
ctoken,
|
||||
endpoint.as_str(),
|
||||
&request_body,
|
||||
)
|
||||
.await?;
|
||||
let p = self
|
||||
.execute_request::<response::MusicContinuation, Paginator<MusicItem>, _>(
|
||||
ClientType::DesktopMusic,
|
||||
"music_continuation",
|
||||
ctoken,
|
||||
endpoint.as_str(),
|
||||
&request_body,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(Paginator {
|
||||
count: p.count,
|
||||
items: p
|
||||
.items
|
||||
.into_iter()
|
||||
.filter_map(|item| T::try_from(item).ok())
|
||||
.collect(),
|
||||
ctoken: p.ctoken,
|
||||
visitor_data: p.visitor_data,
|
||||
endpoint,
|
||||
})
|
||||
Ok(map_ytm_paginator(p, endpoint))
|
||||
} else {
|
||||
let context = self
|
||||
.get_context(ClientType::Desktop, true, visitor_data)
|
||||
.await;
|
||||
let request_body = QContinuation {
|
||||
context,
|
||||
continuation: ctoken,
|
||||
};
|
||||
|
||||
let p = self
|
||||
.execute_request::<response::Continuation, Paginator<YouTubeItem>, _>(
|
||||
ClientType::Desktop,
|
||||
"continuation",
|
||||
ctoken,
|
||||
endpoint.as_str(),
|
||||
&request_body,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(map_yt_paginator(p, endpoint))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: TryFrom<YouTubeItem>> MapResponse<Paginator<T>> for response::Continuation {
|
||||
fn map_yt_paginator<T: FromYtItem>(
|
||||
p: Paginator<YouTubeItem>,
|
||||
endpoint: ContinuationEndpoint,
|
||||
) -> Paginator<T> {
|
||||
Paginator {
|
||||
count: p.count,
|
||||
items: p.items.into_iter().filter_map(T::from_yt_item).collect(),
|
||||
ctoken: p.ctoken,
|
||||
visitor_data: p.visitor_data,
|
||||
endpoint,
|
||||
}
|
||||
}
|
||||
|
||||
fn map_ytm_paginator<T: FromYtItem>(
|
||||
p: Paginator<MusicItem>,
|
||||
endpoint: ContinuationEndpoint,
|
||||
) -> Paginator<T> {
|
||||
Paginator {
|
||||
count: p.count,
|
||||
items: p.items.into_iter().filter_map(T::from_ytm_item).collect(),
|
||||
ctoken: p.ctoken,
|
||||
visitor_data: p.visitor_data,
|
||||
endpoint,
|
||||
}
|
||||
}
|
||||
|
||||
impl MapResponse<Paginator<YouTubeItem>> for response::Continuation {
|
||||
fn map_response(
|
||||
self,
|
||||
_id: &str,
|
||||
lang: crate::param::Language,
|
||||
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
|
||||
) -> Result<MapResult<Paginator<T>>, ExtractionError> {
|
||||
) -> Result<MapResult<Paginator<YouTubeItem>>, ExtractionError> {
|
||||
let items = self
|
||||
.on_response_received_actions
|
||||
.and_then(|mut actions| {
|
||||
|
|
@ -73,21 +112,37 @@ impl<T: TryFrom<YouTubeItem>> MapResponse<Paginator<T>> for response::Continuati
|
|||
mapper.map_response(items);
|
||||
|
||||
Ok(MapResult {
|
||||
c: Paginator::new(
|
||||
self.estimated_results,
|
||||
mapper
|
||||
.items
|
||||
.into_iter()
|
||||
.filter_map(|item| T::try_from(item).ok())
|
||||
.collect(),
|
||||
mapper.ctoken,
|
||||
),
|
||||
c: Paginator::new(self.estimated_results, mapper.items, mapper.ctoken),
|
||||
warnings: mapper.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: TryFrom<YouTubeItem>> Paginator<T> {
|
||||
impl MapResponse<Paginator<MusicItem>> for response::MusicContinuation {
|
||||
fn map_response(
|
||||
self,
|
||||
_id: &str,
|
||||
lang: crate::param::Language,
|
||||
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
|
||||
) -> Result<MapResult<Paginator<MusicItem>>, ExtractionError> {
|
||||
let mut mapper = MusicListMapper::new(lang);
|
||||
let mut shelf = self.continuation_contents.music_playlist_shelf_continuation;
|
||||
mapper.map_response(shelf.contents);
|
||||
let map_res = mapper.items();
|
||||
|
||||
let ctoken = shelf
|
||||
.continuations
|
||||
.try_swap_remove(0)
|
||||
.map(|cont| cont.next_continuation_data.continuation);
|
||||
|
||||
Ok(MapResult {
|
||||
c: Paginator::new(None, map_res.c, ctoken),
|
||||
warnings: map_res.warnings,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: FromYtItem> Paginator<T> {
|
||||
pub async fn next(&self, query: &RustyPipeQuery) -> Result<Option<Self>, Error> {
|
||||
Ok(match &self.ctoken {
|
||||
Some(ctoken) => Some(
|
||||
|
|
@ -165,15 +220,6 @@ impl Paginator<PlaylistVideo> {
|
|||
}
|
||||
}
|
||||
|
||||
impl Paginator<TrackItem> {
|
||||
pub async fn next(&self, query: &RustyPipeQuery) -> Result<Option<Self>, Error> {
|
||||
Ok(match &self.ctoken {
|
||||
Some(ctoken) => Some(query.music_playlist_continuation(ctoken).await?),
|
||||
None => None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! paginator {
|
||||
($entity_type:ty) => {
|
||||
impl Paginator<$entity_type> {
|
||||
|
|
@ -225,7 +271,6 @@ macro_rules! paginator {
|
|||
|
||||
paginator!(Comment);
|
||||
paginator!(PlaylistVideo);
|
||||
paginator!(TrackItem);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
|
@ -233,12 +278,9 @@ mod tests {
|
|||
|
||||
use rstest::rstest;
|
||||
|
||||
use crate::{
|
||||
client::{response, MapResponse},
|
||||
model::{Paginator, PlaylistItem, YouTubeItem},
|
||||
param::Language,
|
||||
serializer::MapResult,
|
||||
};
|
||||
use super::*;
|
||||
use crate::model::{PlaylistItem, TrackItem};
|
||||
use crate::param::Language;
|
||||
|
||||
#[rstest]
|
||||
#[case("search", "search/cont")]
|
||||
|
|
@ -273,14 +315,38 @@ mod tests {
|
|||
|
||||
let items: response::Continuation =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<Paginator<PlaylistItem>> =
|
||||
let map_res: MapResult<Paginator<YouTubeItem>> =
|
||||
items.map_response("", Language::En, None).unwrap();
|
||||
let paginator: Paginator<PlaylistItem> =
|
||||
map_yt_paginator(map_res.c, ContinuationEndpoint::Browse);
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
insta::assert_ron_snapshot!(format!("map_{}", name), map_res.c);
|
||||
insta::assert_ron_snapshot!(format!("map_{}", name), paginator);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("playlist_tracks", "music_playlist/playlist_cont")]
|
||||
fn map_continuation_tracks(#[case] name: &str, #[case] path: &str) {
|
||||
let filename = format!("testfiles/{}.json", path);
|
||||
let json_path = Path::new(&filename);
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
|
||||
let items: response::MusicContinuation =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
let map_res: MapResult<Paginator<MusicItem>> =
|
||||
items.map_response("", Language::En, None).unwrap();
|
||||
let paginator: Paginator<TrackItem> =
|
||||
map_ytm_paginator(map_res.c, ContinuationEndpoint::MusicBrowse);
|
||||
|
||||
assert!(
|
||||
map_res.warnings.is_empty(),
|
||||
"deserialization/mapping warnings: {:?}",
|
||||
map_res.warnings
|
||||
);
|
||||
insta::assert_ron_snapshot!(format!("map_{}", name), paginator);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ pub(crate) mod video_details;
|
|||
pub(crate) mod video_item;
|
||||
|
||||
pub(crate) use channel::Channel;
|
||||
pub(crate) use music_item::MusicContinuation;
|
||||
pub(crate) use music_playlist::MusicPlaylist;
|
||||
pub(crate) use music_playlist::MusicPlaylistCont;
|
||||
pub(crate) use music_search::MusicSearch;
|
||||
pub(crate) use player::Player;
|
||||
pub(crate) use playlist::Playlist;
|
||||
|
|
@ -207,13 +207,13 @@ pub(crate) struct RichGridContinuation {
|
|||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct MusicContinuation {
|
||||
pub next_continuation_data: MusicContinuationData,
|
||||
pub(crate) struct MusicContinuationData {
|
||||
pub next_continuation_data: MusicContinuationDataInner,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct MusicContinuationData {
|
||||
pub(crate) struct MusicContinuationDataInner {
|
||||
pub continuation: String,
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@ use serde::Deserialize;
|
|||
use serde_with::{serde_as, DefaultOnError, VecSkipError};
|
||||
|
||||
use crate::{
|
||||
model::{self, AlbumItem, AlbumType, ArtistItem, ChannelId, MusicPlaylistItem, TrackItem},
|
||||
model::{
|
||||
self, AlbumId, AlbumItem, AlbumType, ArtistItem, ChannelId, FromYtItem, MusicEntityType,
|
||||
MusicItem, MusicPlaylistItem, TrackItem,
|
||||
},
|
||||
param::Language,
|
||||
serializer::{
|
||||
text::{Text, TextComponents},
|
||||
|
|
@ -13,7 +16,7 @@ use crate::{
|
|||
|
||||
use super::{
|
||||
url_endpoint::{NavigationEndpoint, PageType},
|
||||
MusicContinuation, ThumbnailsWrap,
|
||||
MusicContinuationData, ThumbnailsWrap,
|
||||
};
|
||||
|
||||
#[serde_as]
|
||||
|
|
@ -23,16 +26,16 @@ pub(crate) struct MusicShelf {
|
|||
/// Playlist ID (only for playlists)
|
||||
pub playlist_id: Option<String>,
|
||||
#[serde_as(as = "VecLogError<_>")]
|
||||
pub contents: MapResult<Vec<MusicItem>>,
|
||||
pub contents: MapResult<Vec<MusicResponseItem>>,
|
||||
/// Continuation token for fetching more (>100) playlist items
|
||||
#[serde(default)]
|
||||
#[serde_as(as = "VecSkipError<_>")]
|
||||
pub continuations: Vec<MusicContinuation>,
|
||||
pub continuations: Vec<MusicContinuationData>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) enum MusicItem {
|
||||
pub(crate) enum MusicResponseItem {
|
||||
MusicResponsiveListItemRenderer(ListMusicItem),
|
||||
MusicTwoRowItemRenderer(CoverMusicItem),
|
||||
}
|
||||
|
|
@ -52,11 +55,15 @@ pub(crate) struct ListMusicItem {
|
|||
/// `[<"Der Himmel reißt auf">]` Album track (title)
|
||||
///
|
||||
/// `[<"Girls">], ["Song", " • ", <"aespa">, " • ", <"Girls - The 2nd Mini Album">, " • ", "4:01"]`
|
||||
/// Search track (title, artist, album, duration)
|
||||
/// Search track (title, artist, album, duration).
|
||||
///
|
||||
/// Info: "Song" label is missing in the "Songs" tab
|
||||
///
|
||||
/// `[<"Black Mamba">], ["Video", " • ", <"aespa">, " • ", "235M views", " • ", "3:50"]`
|
||||
/// Search video (title, artist, view count, duration)
|
||||
///
|
||||
/// Info: "Video" label is missing in the "Videos" tab
|
||||
///
|
||||
/// `["Next Level"], ["Single", " • ", <"aespa">, " • ", "2021"]`
|
||||
/// Search album (title, type, artist, year)
|
||||
///
|
||||
|
|
@ -64,6 +71,8 @@ pub(crate) struct ListMusicItem {
|
|||
///
|
||||
/// `["aespa - All Songs & MV"], ["Playlist", " • ", <"Jerwen">, " • ", "49 songs"]`
|
||||
/// Search playlist (title, creator, track count)
|
||||
///
|
||||
/// Info: "Playlist" label is missing in the "Playlists" tab
|
||||
pub flex_columns: Vec<MusicColumn>,
|
||||
/// Track duration (playlist/album tracks)
|
||||
///
|
||||
|
|
@ -162,6 +171,19 @@ impl From<MusicThumbnailRenderer> for Vec<model::Thumbnail> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Music list continuation response model
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct MusicContinuation {
|
||||
pub continuation_contents: ContinuationContents,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct ContinuationContents {
|
||||
pub music_playlist_shelf_continuation: MusicShelf,
|
||||
}
|
||||
|
||||
/*
|
||||
#MAPPER
|
||||
*/
|
||||
|
|
@ -171,13 +193,16 @@ pub(crate) struct MusicListMapper {
|
|||
lang: Language,
|
||||
o_artists: Option<(Vec<ChannelId>, String)>,
|
||||
artist_page: bool,
|
||||
items: Vec<MusicItem>,
|
||||
warnings: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct GroupedMusicItems {
|
||||
pub tracks: Vec<TrackItem>,
|
||||
pub albums: Vec<AlbumItem>,
|
||||
pub artists: Vec<ArtistItem>,
|
||||
pub playlists: Vec<MusicPlaylistItem>,
|
||||
|
||||
pub warnings: Vec<String>,
|
||||
}
|
||||
|
||||
impl MusicListMapper {
|
||||
|
|
@ -186,10 +211,7 @@ impl MusicListMapper {
|
|||
lang,
|
||||
o_artists: None,
|
||||
artist_page: false,
|
||||
tracks: Vec::new(),
|
||||
albums: Vec::new(),
|
||||
artists: Vec::new(),
|
||||
playlists: Vec::new(),
|
||||
items: Vec::new(),
|
||||
warnings: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
|
@ -204,17 +226,14 @@ impl MusicListMapper {
|
|||
lang,
|
||||
o_artists: Some((artists, artists_txt)),
|
||||
artist_page,
|
||||
tracks: Vec::new(),
|
||||
albums: Vec::new(),
|
||||
artists: Vec::new(),
|
||||
playlists: Vec::new(),
|
||||
items: Vec::new(),
|
||||
warnings: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn map_item(&mut self, item: MusicItem) -> Result<(), String> {
|
||||
fn map_item(&mut self, item: MusicResponseItem) -> Result<MusicEntityType, String> {
|
||||
match item {
|
||||
MusicItem::MusicResponsiveListItemRenderer(item) => {
|
||||
MusicResponseItem::MusicResponsiveListItemRenderer(item) => {
|
||||
let mut columns = item.flex_columns.into_iter();
|
||||
let title = columns.next().map(|col| col.renderer.text.to_string());
|
||||
let c2 = columns.next();
|
||||
|
|
@ -246,13 +265,13 @@ impl MusicListMapper {
|
|||
util::parse_large_numstr(&p.to_string(), self.lang)
|
||||
});
|
||||
|
||||
self.artists.push(ArtistItem {
|
||||
self.items.push(MusicItem::Artist(ArtistItem {
|
||||
id,
|
||||
name: title,
|
||||
avatar: item.thumbnail.into(),
|
||||
subscriber_count,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Artist)
|
||||
}
|
||||
PageType::Album => {
|
||||
let album_type = subtitle_p1
|
||||
|
|
@ -264,7 +283,7 @@ impl MusicListMapper {
|
|||
let year = subtitle_p3
|
||||
.and_then(|st| util::parse_numeric(&st.to_string()).ok());
|
||||
|
||||
self.albums.push(AlbumItem {
|
||||
self.items.push(MusicItem::Album(AlbumItem {
|
||||
id,
|
||||
name: title,
|
||||
cover: item.thumbnail.into(),
|
||||
|
|
@ -272,31 +291,37 @@ impl MusicListMapper {
|
|||
artists_txt,
|
||||
album_type,
|
||||
year,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Album)
|
||||
}
|
||||
PageType::Playlist => {
|
||||
let from_ytm = subtitle_p2
|
||||
// Part 1 may be the "Playlist" label
|
||||
let (channel_p, tcount_p) = match subtitle_p3 {
|
||||
Some(_) => (subtitle_p2, subtitle_p3),
|
||||
None => (subtitle_p1, subtitle_p2),
|
||||
};
|
||||
|
||||
let from_ytm = channel_p
|
||||
.as_ref()
|
||||
.and_then(|p| {
|
||||
p.0.first().map(|txt| txt.as_str() == util::YT_MUSIC_NAME)
|
||||
})
|
||||
.unwrap_or_default();
|
||||
let channel = subtitle_p2.and_then(|p| {
|
||||
let channel = channel_p.and_then(|p| {
|
||||
p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok())
|
||||
});
|
||||
let track_count = subtitle_p3
|
||||
.and_then(|p| util::parse_numeric(&p.to_string()).ok());
|
||||
let track_count =
|
||||
tcount_p.and_then(|p| util::parse_numeric(&p.to_string()).ok());
|
||||
|
||||
self.playlists.push(MusicPlaylistItem {
|
||||
self.items.push(MusicItem::Playlist(MusicPlaylistItem {
|
||||
id,
|
||||
name: title,
|
||||
thumbnail: item.thumbnail.into(),
|
||||
channel,
|
||||
track_count,
|
||||
from_ytm,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Playlist)
|
||||
}
|
||||
PageType::Channel => {
|
||||
Err(format!("channel items unsupported. id: {}", id))
|
||||
|
|
@ -336,7 +361,9 @@ impl MusicListMapper {
|
|||
.split(util::DOT_SEPARATOR)
|
||||
.into_iter();
|
||||
// Skip first part (track type)
|
||||
subtitle_parts.next();
|
||||
if subtitle_parts.len() > 3 {
|
||||
subtitle_parts.next();
|
||||
}
|
||||
(
|
||||
subtitle_parts.next(),
|
||||
subtitle_parts.next(),
|
||||
|
|
@ -367,8 +394,7 @@ impl MusicListMapper {
|
|||
),
|
||||
(_, false) => (
|
||||
album_p.and_then(|p| {
|
||||
p.0.into_iter()
|
||||
.find_map(|c| model::AlbumId::try_from(c).ok())
|
||||
p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok())
|
||||
}),
|
||||
None,
|
||||
),
|
||||
|
|
@ -393,7 +419,7 @@ impl MusicListMapper {
|
|||
}
|
||||
}
|
||||
|
||||
self.tracks.push(TrackItem {
|
||||
self.items.push(MusicItem::Track(TrackItem {
|
||||
id,
|
||||
title,
|
||||
duration,
|
||||
|
|
@ -403,12 +429,12 @@ impl MusicListMapper {
|
|||
album,
|
||||
view_count,
|
||||
is_video,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Track)
|
||||
}
|
||||
}
|
||||
}
|
||||
MusicItem::MusicTwoRowItemRenderer(item) => {
|
||||
MusicResponseItem::MusicTwoRowItemRenderer(item) => {
|
||||
let mut subtitle_parts = item.subtitle.split(util::DOT_SEPARATOR).into_iter();
|
||||
let subtitle_p1 = subtitle_parts.next();
|
||||
let subtitle_p2 = subtitle_parts.next();
|
||||
|
|
@ -455,7 +481,7 @@ impl MusicListMapper {
|
|||
}
|
||||
};
|
||||
|
||||
self.albums.push(AlbumItem {
|
||||
self.items.push(MusicItem::Album(AlbumItem {
|
||||
id,
|
||||
name: item.title,
|
||||
cover: item.thumbnail_renderer.into(),
|
||||
|
|
@ -463,8 +489,8 @@ impl MusicListMapper {
|
|||
artists_txt,
|
||||
year,
|
||||
album_type,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Album)
|
||||
}
|
||||
PageType::Playlist => {
|
||||
// TODO: make component to string zero-copy if len=1
|
||||
|
|
@ -480,27 +506,27 @@ impl MusicListMapper {
|
|||
let track_count =
|
||||
subtitle_p3.and_then(|p| util::parse_numeric(&p.to_string()).ok());
|
||||
|
||||
self.playlists.push(MusicPlaylistItem {
|
||||
self.items.push(MusicItem::Playlist(MusicPlaylistItem {
|
||||
id,
|
||||
name: item.title,
|
||||
thumbnail: item.thumbnail_renderer.into(),
|
||||
channel,
|
||||
track_count,
|
||||
from_ytm,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Playlist)
|
||||
}
|
||||
PageType::Artist => {
|
||||
let subscriber_count = subtitle_p1
|
||||
.and_then(|p| util::parse_large_numstr(&p.to_string(), self.lang));
|
||||
|
||||
self.artists.push(ArtistItem {
|
||||
self.items.push(MusicItem::Artist(ArtistItem {
|
||||
id,
|
||||
name: item.title,
|
||||
avatar: item.thumbnail_renderer.into(),
|
||||
subscriber_count,
|
||||
});
|
||||
Ok(())
|
||||
}));
|
||||
Ok(MusicEntityType::Artist)
|
||||
}
|
||||
PageType::Channel => Err(format!("channel items unsupported. id: {}", id)),
|
||||
}
|
||||
|
|
@ -508,13 +534,63 @@ impl MusicListMapper {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn map_response(&mut self, mut res: MapResult<Vec<MusicItem>>) {
|
||||
pub fn map_response(
|
||||
&mut self,
|
||||
mut res: MapResult<Vec<MusicResponseItem>>,
|
||||
) -> Option<MusicEntityType> {
|
||||
let mut etype = None;
|
||||
self.warnings.append(&mut res.warnings);
|
||||
res.c.into_iter().for_each(|item| {
|
||||
if let Err(e) = self.map_item(item) {
|
||||
self.warnings.push(e);
|
||||
res.c
|
||||
.into_iter()
|
||||
.for_each(|item| match self.map_item(item) {
|
||||
Ok(t) => etype = Some(t),
|
||||
Err(e) => self.warnings.push(e),
|
||||
});
|
||||
etype
|
||||
}
|
||||
|
||||
pub fn items(self) -> MapResult<Vec<MusicItem>> {
|
||||
MapResult {
|
||||
c: self.items,
|
||||
warnings: self.warnings,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn conv_items<T: FromYtItem>(self) -> MapResult<Vec<T>> {
|
||||
MapResult {
|
||||
c: self
|
||||
.items
|
||||
.into_iter()
|
||||
.filter_map(T::from_ytm_item)
|
||||
.collect(),
|
||||
warnings: self.warnings,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn group_items(self) -> MapResult<GroupedMusicItems> {
|
||||
let mut tracks = Vec::new();
|
||||
let mut albums = Vec::new();
|
||||
let mut artists = Vec::new();
|
||||
let mut playlists = Vec::new();
|
||||
|
||||
for item in self.items {
|
||||
match item {
|
||||
MusicItem::Track(track) => tracks.push(track),
|
||||
MusicItem::Album(album) => albums.push(album),
|
||||
MusicItem::Artist(artist) => artists.push(artist),
|
||||
MusicItem::Playlist(playlist) => playlists.push(playlist),
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
MapResult {
|
||||
c: GroupedMusicItems {
|
||||
tracks,
|
||||
albums,
|
||||
artists,
|
||||
playlists,
|
||||
},
|
||||
warnings: self.warnings,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ use crate::serializer::{
|
|||
MapResult, VecLogError,
|
||||
};
|
||||
|
||||
use super::music_item::{MusicContentsRenderer, MusicItem, MusicShelf, MusicThumbnailRenderer};
|
||||
use super::music_item::{
|
||||
MusicContentsRenderer, MusicResponseItem, MusicShelf, MusicThumbnailRenderer,
|
||||
};
|
||||
use super::{ContentsRenderer, Tab};
|
||||
|
||||
/// Response model for YouTube Music playlists and albums
|
||||
|
|
@ -18,12 +20,6 @@ pub(crate) struct MusicPlaylist {
|
|||
pub header: Header,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct MusicPlaylistCont {
|
||||
pub continuation_contents: ContinuationContents,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct Contents {
|
||||
|
|
@ -45,7 +41,7 @@ pub(crate) enum ItemSection {
|
|||
MusicShelfRenderer(MusicShelf),
|
||||
MusicCarouselShelfRenderer {
|
||||
#[serde_as(as = "VecLogError<_>")]
|
||||
contents: MapResult<Vec<MusicItem>>,
|
||||
contents: MapResult<Vec<MusicResponseItem>>,
|
||||
},
|
||||
#[serde(other, deserialize_with = "ignore_any")]
|
||||
None,
|
||||
|
|
@ -129,9 +125,3 @@ pub(crate) struct PlaylistEndpoint {
|
|||
pub(crate) struct PlaylistWatchEndpoint {
|
||||
pub playlist_id: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct ContinuationContents {
|
||||
pub music_playlist_shelf_continuation: MusicShelf,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ use crate::serializer::{
|
|||
|
||||
use super::{
|
||||
url_endpoint::BrowseEndpoint, ContinuationEndpoint, ContinuationItemRenderer, Icon,
|
||||
MusicContinuation, Thumbnails,
|
||||
MusicContinuationData, Thumbnails,
|
||||
};
|
||||
use super::{ChannelBadge, ResponseContext, YouTubeListItem};
|
||||
|
||||
|
|
@ -308,7 +308,7 @@ pub(crate) struct RecommendationResults {
|
|||
#[serde_as(as = "Option<VecLogError<_>>")]
|
||||
pub results: Option<MapResult<Vec<YouTubeListItem>>>,
|
||||
#[serde_as(as = "Option<VecSkipError<_>>")]
|
||||
pub continuations: Option<Vec<MusicContinuation>>,
|
||||
pub continuations: Option<Vec<MusicContinuationData>>,
|
||||
}
|
||||
|
||||
/// The engagement panels are displayed below the video and contain chapter markers
|
||||
|
|
|
|||
|
|
@ -107,7 +107,13 @@ impl MapResponse<SearchResult> for response::Search {
|
|||
|
||||
Ok(MapResult {
|
||||
c: SearchResult {
|
||||
items: Paginator::new(self.estimated_results, mapper.items, mapper.ctoken),
|
||||
items: Paginator::new_ext(
|
||||
self.estimated_results,
|
||||
mapper.items,
|
||||
mapper.ctoken,
|
||||
None,
|
||||
crate::param::ContinuationEndpoint::Search,
|
||||
),
|
||||
corrected_query: mapper.corrected_query,
|
||||
visitor_data: self.response_context.visitor_data,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -2266,6 +2266,6 @@ MusicPlaylist(
|
|||
),
|
||||
],
|
||||
ctoken: Some("4qmFsgI-EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFmVnWlFWRHBEUjFtU0FRTUl1Z1ElM0Q%3D"),
|
||||
endpoint: browse,
|
||||
endpoint: music_browse,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1156,6 +1156,6 @@ MusicPlaylist(
|
|||
),
|
||||
],
|
||||
ctoken: None,
|
||||
endpoint: browse,
|
||||
endpoint: music_browse,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2046,6 +2046,6 @@ MusicPlaylist(
|
|||
),
|
||||
],
|
||||
ctoken: None,
|
||||
endpoint: browse,
|
||||
endpoint: music_browse,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,722 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
AlbumItem(
|
||||
id: "MPREb_OpHWHwyNOuY",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
),
|
||||
],
|
||||
artists_txt: "aespa",
|
||||
album_type: Single,
|
||||
year: Some(2020),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_pvdHyqvGjbI",
|
||||
name: "Girls - The 2nd Mini Album",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
),
|
||||
],
|
||||
artists_txt: "aespa",
|
||||
album_type: Album,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_CznUTKnATw6",
|
||||
name: "Black Mamba (feat. Foolio)",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCZK5n7V2-iPHfUXLV2tDvzw",
|
||||
name: "Cojack",
|
||||
),
|
||||
],
|
||||
artists_txt: "Cojack",
|
||||
album_type: Single,
|
||||
year: Some(2020),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_Sx4uifBuKyD",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCudOYmRtW3uylYtqY1aAD0A",
|
||||
name: "Montana Of 300",
|
||||
),
|
||||
],
|
||||
artists_txt: "Montana Of 300",
|
||||
album_type: Single,
|
||||
year: Some(2020),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_PdIIalyOQXF",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC8whsREta_7Fu-EjRq2Ys-A",
|
||||
name: "Alpha Wolf",
|
||||
),
|
||||
],
|
||||
artists_txt: "Alpha Wolf",
|
||||
album_type: Single,
|
||||
year: Some(2018),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_9KdyuqvufOL",
|
||||
name: "BLACK MAMBA",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/k8Cu4k-k6xsK8-RzJKQGnW2CAby1HpxintJvIij9UtWSJpfaLoYn86C-Kg0C0cXKmNY2ikDaZqOfgg4N2g=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/k8Cu4k-k6xsK8-RzJKQGnW2CAby1HpxintJvIij9UtWSJpfaLoYn86C-Kg0C0cXKmNY2ikDaZqOfgg4N2g=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/k8Cu4k-k6xsK8-RzJKQGnW2CAby1HpxintJvIij9UtWSJpfaLoYn86C-Kg0C0cXKmNY2ikDaZqOfgg4N2g=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/k8Cu4k-k6xsK8-RzJKQGnW2CAby1HpxintJvIij9UtWSJpfaLoYn86C-Kg0C0cXKmNY2ikDaZqOfgg4N2g=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCRy7ecValgvorRe_8dum9lA",
|
||||
name: "ESKIIMO",
|
||||
),
|
||||
],
|
||||
artists_txt: "ESKIIMO",
|
||||
album_type: Ep,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_VDjWCOUvD7s",
|
||||
name: "Anti Venom",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/8pJynr17yAyhW8QL20jk_XdhBBokDmt6-HtrTo2IGiwe6nOsalsd64vNtXYM_vl8-iMxyqULJ3psnf_2Yg=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/8pJynr17yAyhW8QL20jk_XdhBBokDmt6-HtrTo2IGiwe6nOsalsd64vNtXYM_vl8-iMxyqULJ3psnf_2Yg=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/8pJynr17yAyhW8QL20jk_XdhBBokDmt6-HtrTo2IGiwe6nOsalsd64vNtXYM_vl8-iMxyqULJ3psnf_2Yg=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/8pJynr17yAyhW8QL20jk_XdhBBokDmt6-HtrTo2IGiwe6nOsalsd64vNtXYM_vl8-iMxyqULJ3psnf_2Yg=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCdkNrc_l73BHYKRhDqxBo9w",
|
||||
name: "Black Mamba Man",
|
||||
),
|
||||
],
|
||||
artists_txt: "Black Mamba Man",
|
||||
album_type: Album,
|
||||
year: Some(2017),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_xjJaY8xb2Rw",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ujbtua0R_mf-THSu5c299qRGmxs_KPKDNYNRTjsgMqjtTlCUJZPsqYN_cGi2S6jgY1helBWuzcgExN4=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ujbtua0R_mf-THSu5c299qRGmxs_KPKDNYNRTjsgMqjtTlCUJZPsqYN_cGi2S6jgY1helBWuzcgExN4=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ujbtua0R_mf-THSu5c299qRGmxs_KPKDNYNRTjsgMqjtTlCUJZPsqYN_cGi2S6jgY1helBWuzcgExN4=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ujbtua0R_mf-THSu5c299qRGmxs_KPKDNYNRTjsgMqjtTlCUJZPsqYN_cGi2S6jgY1helBWuzcgExN4=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCn09cNujyKjEA1NxD5Aj_mQ",
|
||||
name: "Paride Saraceni",
|
||||
),
|
||||
],
|
||||
artists_txt: "Paride Saraceni",
|
||||
album_type: Single,
|
||||
year: Some(2019),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_CH1VEbx7Lle",
|
||||
name: "Addis Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCYAFIwL4uBWQHBrBiohx1vw",
|
||||
name: "Addis Black Mamba",
|
||||
),
|
||||
],
|
||||
artists_txt: "Addis Black Mamba",
|
||||
album_type: Single,
|
||||
year: Some(2019),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_IfiMtX5CnWJ",
|
||||
name: "Killing fame",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mMjDp4UhZn-ekqF6NhEZuBh0cUTmgDq-jbp7TuNIGWMYAyWyd1MMR2HwCtKsZm4izKDM9jLXq9XIRo0tCA=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mMjDp4UhZn-ekqF6NhEZuBh0cUTmgDq-jbp7TuNIGWMYAyWyd1MMR2HwCtKsZm4izKDM9jLXq9XIRo0tCA=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mMjDp4UhZn-ekqF6NhEZuBh0cUTmgDq-jbp7TuNIGWMYAyWyd1MMR2HwCtKsZm4izKDM9jLXq9XIRo0tCA=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mMjDp4UhZn-ekqF6NhEZuBh0cUTmgDq-jbp7TuNIGWMYAyWyd1MMR2HwCtKsZm4izKDM9jLXq9XIRo0tCA=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCs04jfHH78YUziFA52P97LA",
|
||||
name: "R. Black Mamba",
|
||||
),
|
||||
ChannelId(
|
||||
id: "UCsOfYy8UlBPRYkC5lgRaatA",
|
||||
name: "Lonzzo",
|
||||
),
|
||||
ChannelId(
|
||||
id: "UCEwg585uC9nBoL8KA7ayjPA",
|
||||
name: "24.Gz",
|
||||
),
|
||||
],
|
||||
artists_txt: "R. Black Mamba, Lonzzo & 24.Gz",
|
||||
album_type: Single,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_DeCImAQRYMO",
|
||||
name: "Black Mamba (Orchestra Version)",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCZwE-b-kzA4pQaCQXwOQnlg",
|
||||
name: "Seoul Philharmonic Orchestra",
|
||||
),
|
||||
],
|
||||
artists_txt: "Seoul Philharmonic Orchestra",
|
||||
album_type: Single,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_vXAHel98vo2",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/9LGEIxmbTKdJOOriPVgEY0KHPijrMUrjBD60Us-UvJf60PZC24-5c8xrMgE27ExiviVKCwzYSMLlC24fSQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/9LGEIxmbTKdJOOriPVgEY0KHPijrMUrjBD60Us-UvJf60PZC24-5c8xrMgE27ExiviVKCwzYSMLlC24fSQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/9LGEIxmbTKdJOOriPVgEY0KHPijrMUrjBD60Us-UvJf60PZC24-5c8xrMgE27ExiviVKCwzYSMLlC24fSQ=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/9LGEIxmbTKdJOOriPVgEY0KHPijrMUrjBD60Us-UvJf60PZC24-5c8xrMgE27ExiviVKCwzYSMLlC24fSQ=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC_SI7sOel-qMTvSe-lGHX8w",
|
||||
name: "Hever Jara",
|
||||
),
|
||||
],
|
||||
artists_txt: "Hever Jara",
|
||||
album_type: Single,
|
||||
year: Some(2018),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_iAemzaCGXuo",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/4np4p7SY1vDGvm6a5FWbjgZ06odig4eWv-A9gxmrk1UHqSwhNksRBMji2rmWcMSgssItBLekes9soYAH=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/4np4p7SY1vDGvm6a5FWbjgZ06odig4eWv-A9gxmrk1UHqSwhNksRBMji2rmWcMSgssItBLekes9soYAH=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/4np4p7SY1vDGvm6a5FWbjgZ06odig4eWv-A9gxmrk1UHqSwhNksRBMji2rmWcMSgssItBLekes9soYAH=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/4np4p7SY1vDGvm6a5FWbjgZ06odig4eWv-A9gxmrk1UHqSwhNksRBMji2rmWcMSgssItBLekes9soYAH=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCMZowOoC3u_ntr9o52ekeZw",
|
||||
name: "Yung FN",
|
||||
),
|
||||
],
|
||||
artists_txt: "Yung FN",
|
||||
album_type: Single,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_CbIA5po2cn4",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/yHLKcDqfL62EB0Zc4_xu9-Y8X-xbUW7rljIwoYhZSqpP1F4_myznQPmaIhgQQPnJijHvjK3_HwxBJpk=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/yHLKcDqfL62EB0Zc4_xu9-Y8X-xbUW7rljIwoYhZSqpP1F4_myznQPmaIhgQQPnJijHvjK3_HwxBJpk=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/yHLKcDqfL62EB0Zc4_xu9-Y8X-xbUW7rljIwoYhZSqpP1F4_myznQPmaIhgQQPnJijHvjK3_HwxBJpk=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/yHLKcDqfL62EB0Zc4_xu9-Y8X-xbUW7rljIwoYhZSqpP1F4_myznQPmaIhgQQPnJijHvjK3_HwxBJpk=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCX6v_euBwliDYV2NMTouuSA",
|
||||
name: "Hobino",
|
||||
),
|
||||
],
|
||||
artists_txt: "Hobino",
|
||||
album_type: Single,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_yrsxU7t0h6l",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/2cJawayDujRRcl8OKABi82_aa4sH6EGLAqxlx976Syzh86c9inNlY2xch5s4GWEo5iSXVq8VdS_59l8=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/2cJawayDujRRcl8OKABi82_aa4sH6EGLAqxlx976Syzh86c9inNlY2xch5s4GWEo5iSXVq8VdS_59l8=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/2cJawayDujRRcl8OKABi82_aa4sH6EGLAqxlx976Syzh86c9inNlY2xch5s4GWEo5iSXVq8VdS_59l8=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/2cJawayDujRRcl8OKABi82_aa4sH6EGLAqxlx976Syzh86c9inNlY2xch5s4GWEo5iSXVq8VdS_59l8=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCAlOD5s3Ro27M61-2Z_UB7w",
|
||||
name: "Tee See Connection",
|
||||
),
|
||||
],
|
||||
artists_txt: "Tee See Connection",
|
||||
album_type: Single,
|
||||
year: Some(2013),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_fETChb2O2uR",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MwPaFKuMpJTP9csDP0Wn5z1_KvXCKj4BfOWyHw2NTdXWI7V_E9TUiYjfcbh7rdC8Ba1S0GqHF-AlBx7g=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MwPaFKuMpJTP9csDP0Wn5z1_KvXCKj4BfOWyHw2NTdXWI7V_E9TUiYjfcbh7rdC8Ba1S0GqHF-AlBx7g=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MwPaFKuMpJTP9csDP0Wn5z1_KvXCKj4BfOWyHw2NTdXWI7V_E9TUiYjfcbh7rdC8Ba1S0GqHF-AlBx7g=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MwPaFKuMpJTP9csDP0Wn5z1_KvXCKj4BfOWyHw2NTdXWI7V_E9TUiYjfcbh7rdC8Ba1S0GqHF-AlBx7g=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC77rFNJxH8Y2VwSYp8ZTXHA",
|
||||
name: "Franco Vitola",
|
||||
),
|
||||
],
|
||||
artists_txt: "Franco Vitola",
|
||||
album_type: Single,
|
||||
year: Some(2020),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_VcRKLYVgy11",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zrjvi7zCzuP-10RIaB63k2Riy59MU2ghsifk7Zquc9_m-g1bQHCcKS_eNosZy3e_oK0wi5blz7hwKKrh=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zrjvi7zCzuP-10RIaB63k2Riy59MU2ghsifk7Zquc9_m-g1bQHCcKS_eNosZy3e_oK0wi5blz7hwKKrh=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zrjvi7zCzuP-10RIaB63k2Riy59MU2ghsifk7Zquc9_m-g1bQHCcKS_eNosZy3e_oK0wi5blz7hwKKrh=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zrjvi7zCzuP-10RIaB63k2Riy59MU2ghsifk7Zquc9_m-g1bQHCcKS_eNosZy3e_oK0wi5blz7hwKKrh=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCxX9tNcQgCBuU56ezupriqg",
|
||||
name: "Black Mamba",
|
||||
),
|
||||
],
|
||||
artists_txt: "Black Mamba",
|
||||
album_type: Album,
|
||||
year: Some(2011),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_grtT3Ze8U2Z",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uP7fOWCer3tlszDLH_8CEarOb4XVNqShpJ5DQBJWWT3HaTF2m8bt6BUvCm_11iSz4CARMLpVekK2Ug=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uP7fOWCer3tlszDLH_8CEarOb4XVNqShpJ5DQBJWWT3HaTF2m8bt6BUvCm_11iSz4CARMLpVekK2Ug=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uP7fOWCer3tlszDLH_8CEarOb4XVNqShpJ5DQBJWWT3HaTF2m8bt6BUvCm_11iSz4CARMLpVekK2Ug=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uP7fOWCer3tlszDLH_8CEarOb4XVNqShpJ5DQBJWWT3HaTF2m8bt6BUvCm_11iSz4CARMLpVekK2Ug=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC6Y8G45J9Uv2EsLLOatymOw",
|
||||
name: "WookTheCrook",
|
||||
),
|
||||
],
|
||||
artists_txt: "WookTheCrook",
|
||||
album_type: Single,
|
||||
year: Some(2022),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_hXasyBrDJm7",
|
||||
name: "The Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ByZsPc5CHoZwtn-cl7e_nbhiVkWxoFJ2RHkNUvLTiowT8228-aVd6r2XT08Z8a32Qa7d-0-Go44sxkdf=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ByZsPc5CHoZwtn-cl7e_nbhiVkWxoFJ2RHkNUvLTiowT8228-aVd6r2XT08Z8a32Qa7d-0-Go44sxkdf=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ByZsPc5CHoZwtn-cl7e_nbhiVkWxoFJ2RHkNUvLTiowT8228-aVd6r2XT08Z8a32Qa7d-0-Go44sxkdf=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ByZsPc5CHoZwtn-cl7e_nbhiVkWxoFJ2RHkNUvLTiowT8228-aVd6r2XT08Z8a32Qa7d-0-Go44sxkdf=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCaDT20-B3U8h-tPg_VMvntw",
|
||||
name: "The Black Mamba",
|
||||
),
|
||||
],
|
||||
artists_txt: "The Black Mamba",
|
||||
album_type: Album,
|
||||
year: Some(2012),
|
||||
),
|
||||
AlbumItem(
|
||||
id: "MPREb_jDiEDfz09CY",
|
||||
name: "Black Mamba",
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/QXKgvSug589atLxKgP_GIPYxUnjBH-exHP_9zipceGOmSxmUSdQgxmwDI6k5jvqQdQc4t4Oc0b1NEkll=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/QXKgvSug589atLxKgP_GIPYxUnjBH-exHP_9zipceGOmSxmUSdQgxmwDI6k5jvqQdQc4t4Oc0b1NEkll=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/QXKgvSug589atLxKgP_GIPYxUnjBH-exHP_9zipceGOmSxmUSdQgxmwDI6k5jvqQdQc4t4Oc0b1NEkll=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/QXKgvSug589atLxKgP_GIPYxUnjBH-exHP_9zipceGOmSxmUSdQgxmwDI6k5jvqQdQc4t4Oc0b1NEkll=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCJq1MEuNM0SidXn5pMqqHBA",
|
||||
name: "Voltage",
|
||||
),
|
||||
],
|
||||
artists_txt: "Voltage",
|
||||
album_type: Single,
|
||||
year: Some(2019),
|
||||
),
|
||||
],
|
||||
ctoken: Some("EoIGEgtibGFjayBtYW1iYRryBUVnV0tBUUlZQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVJoVlEyRjJabUpWTlc0emFEaHZXR2RSUzBkTlZqTkhXbEdDQVJoVlEzbE1XR2hVTWxGU1ZYRlJVbUZUY2tST1RVSmZNMmVDQVJoVlEyZG1SR2RXWVRsbE9EWm1TVTVZYTE5elpWOWxlWGVDQVJoVlEzZGlNekEyT0ZkQ1dYTlJjbkl5WDBSS1pIRlRaWGVDQVJoVlEwZEhWVVkwWHpjMFZuWkxSbmR1Y0ZCRU1FWndPRUdDQVJoVlEyaHBaMVprUkhVM1owTkpZWEJ0ZUZSeGEyZG1RM2VDQVJoVlEyd3laVFpzVXkwdGQzYzNabnBLWVMxV2QxQkJNbWVDQVJoVlF6Z3RhbmxoVkdsSU9VWlViVGRRZG10RllYa3hWVUdDQVJoVlF5MDBOSGRNWm04eldISmplbGROZFdsQ1JWbHJWVUdDQVJoVlEzWnVjVmw1UVdSUGJWRnZVMlpMZEV0SldYVm5NbEdDQVJoVlEyWmlhMFpCTjFSU01tMXhRbU5WVVZCWFZFaDBWWGVDQVJoVlEzcHlkM2RGZUhZeWQxUmFkUzFrVldobU9DMVdUbmVDQVJoVlEySmpNa2xCYmxOTE0zcDBWR0YyVGtkTFJrRk5UWGVDQVJoVlF6UnlSVGRPTW5sR2VrVXdNVVozY1ZwdVdrWm5RVUdDQVJoVlEwRTBORFF4YlZGaGNHazNTbU5RWmpkVVkxOHdSVUdDQVJoVlEzZHBZVjl1ZUc5QlkwRjFiVmgzUmpVeVVHeDFYMmVDQVJoVlF6QlZVMWhDU1VOcmJHbGlhSGxVUkhKaWVHUldMVkdDQVJoVlF6bERMV1pwVG1JM1FWWjJjRGRWZGxKdlEyMTJjMUdDQVJoVlEwZFZkMUJHWVVaMFdVRXRiamRhVERSSFlubHlYM2VDQVJoVlEySkdiRTR5Y0RCT1owbERlbVZYVFRNd1pIQTFaMmMlM0QY8erQLg%3D%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -0,0 +1,354 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
ArtistItem(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w60-h60-p-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w120-h120-p-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(4120000),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCaDT20-B3U8h-tPg_VMvntw",
|
||||
name: "The Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(2640),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCLcwLJIGBDDvbfq8JERV6Ag",
|
||||
name: "Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(9),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCxX9tNcQgCBuU56ezupriqg",
|
||||
name: "Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IDUShs34Xb5MdCLxYoLzOas8gLET79TgvLhaarlaNlBJfiWergRjWxFptuBcGt3bVp2zsuBmBV1F_WmO=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IDUShs34Xb5MdCLxYoLzOas8gLET79TgvLhaarlaNlBJfiWergRjWxFptuBcGt3bVp2zsuBmBV1F_WmO=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(266),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCRpi1gBlax4sK3dNNxIxxFg",
|
||||
name: "Black Mamba Official",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0iyEdaYwlSjWkL516U_yDhCNh0ybcMIIcxBLtzRU32z8-K6-lY4n7dLy4QLWjDVeG28_uPaMRLRipzz=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0iyEdaYwlSjWkL516U_yDhCNh0ybcMIIcxBLtzRU32z8-K6-lY4n7dLy4QLWjDVeG28_uPaMRLRipzz=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(94),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCmv0BSLywph2xUVzL1B8Z5w",
|
||||
name: "Ladysmith Black Mambazo",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tuS_P7aTxOxw1wrm46sE78kl66L8B2466egIf7n1M4QZ50hpKAnVqfwxxq8j_0j0gr68JYr-mEtdUHJ2=w60-h60-p-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tuS_P7aTxOxw1wrm46sE78kl66L8B2466egIf7n1M4QZ50hpKAnVqfwxxq8j_0j0gr68JYr-mEtdUHJ2=w120-h120-p-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(14700),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCdkNrc_l73BHYKRhDqxBo9w",
|
||||
name: "Black Mamba Man",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/a-/ACNPEu9AGdkyIbtHOsHiGL_9MHUkTckGmOljmnBAz9z9Rw=w60-h60-l90-rj-dcpVGObakG",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/a-/ACNPEu9AGdkyIbtHOsHiGL_9MHUkTckGmOljmnBAz9z9Rw=w120-h120-l90-rj-dcpVGObakG",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(2660),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCXL-mycQdd2cESIUNb7b8-Q",
|
||||
name: "Black Mamba Queen",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/H9PBOtO21MFaQWGrQ-PuypRpo2JmQt-8lUtO7p3tkXwL23dGH3xT7audwyQTFRcDQciPPn7XlsXK86Lr=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/H9PBOtO21MFaQWGrQ-PuypRpo2JmQt-8lUtO7p3tkXwL23dGH3xT7audwyQTFRcDQciPPn7XlsXK86Lr=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(16),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCs04jfHH78YUziFA52P97LA",
|
||||
name: "R. Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/spK0WDkuFgwfcu9rs1MUCu84YaNWLkwWkrZYoAfxtDdaXWxia84rMLkwFmDiLA5XqTnvYrjg0lqVWY8=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/spK0WDkuFgwfcu9rs1MUCu84YaNWLkwWkrZYoAfxtDdaXWxia84rMLkwFmDiLA5XqTnvYrjg0lqVWY8=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(38),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCcogSfIDHsBhCED4YTd8oOg",
|
||||
name: "Bionik & Black Mamba feat. Afrob & D-Flame",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Q97HzPcy6_fzfzxk57vig3UgcELHHoDGG9lZN6fgAc9KVpZQIJGyxCNMlz37jRQn1gJDqHENwmIYSF5i=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Q97HzPcy6_fzfzxk57vig3UgcELHHoDGG9lZN6fgAc9KVpZQIJGyxCNMlz37jRQn1gJDqHENwmIYSF5i=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(1),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCasuQMoX2yjpp8jQF_rJFhw",
|
||||
name: "Matao",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/xmsKa7XppwIdfTT2553JUduDXYkLAvYOc2yqeDhdga8SHXS3PjMzLWQxRFGiGPpS3GIKzNutk3Ldu6r3=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/xmsKa7XppwIdfTT2553JUduDXYkLAvYOc2yqeDhdga8SHXS3PjMzLWQxRFGiGPpS3GIKzNutk3Ldu6r3=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(2),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCDHWJXxzaqUiFUcX-49jmaQ",
|
||||
name: "Black Pumas",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/aFSb7LPmBgdLtRxxk-ToHBSEVFAISlR_wGA3eszYdoxyCFDMlqDG6l70iUnoM8ef9Uk-1ovJgKyFGRg8=w60-h60-p-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/aFSb7LPmBgdLtRxxk-ToHBSEVFAISlR_wGA3eszYdoxyCFDMlqDG6l70iUnoM8ef9Uk-1ovJgKyFGRg8=w120-h120-p-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(656000),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCC7VZvZHG4UOP4wtbzyl4kA",
|
||||
name: "Black Mamba 2.0",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/w8l4Tq6UbmRH8q-Xd5Op1oywE0H6iZTYjbTYdfhCB1g2Hz7NRiLapql4qOUMKDvBebDY_DTUTyV0CH1_1g=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/w8l4Tq6UbmRH8q-Xd5Op1oywE0H6iZTYjbTYdfhCB1g2Hz7NRiLapql4qOUMKDvBebDY_DTUTyV0CH1_1g=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(2),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UC_TOO0jbQBRgeP0DoZMtEKQ",
|
||||
name: "Ana and The Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/DAAztELhO8SV8Ja1wJQYp4qPOe6T1WJlc0nqNqF5zdxPgKvktnUuAV1Xq6Ud5fQOw3Pymx6k7s6LfmmebQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/DAAztELhO8SV8Ja1wJQYp4qPOe6T1WJlc0nqNqF5zdxPgKvktnUuAV1Xq6Ud5fQOw3Pymx6k7s6LfmmebQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(12),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UC1RJ4atUIi5UAYj-1-vNJtg",
|
||||
name: "Mr. Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-cqt-vX_yWEVaS6eN-FMtE0CdsLr5b9IknyOLfSXSgLaqVtpx7AYBDXfzGz3s7FmlSoSTMEXiGCtxSuCwQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-cqt-vX_yWEVaS6eN-FMtE0CdsLr5b9IknyOLfSXSgLaqVtpx7AYBDXfzGz3s7FmlSoSTMEXiGCtxSuCwQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(12),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UC-J22tQNMWvBwWxe9OqvVaw",
|
||||
name: "BLVCK MAMBA",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/W4Ij0kltncrSYRGhSmPDbfz2WOJVsqCK5GO4obZYdLO36fVC-yNzLe_a3BpadfBIwn_wdh4BHg8r8b9N=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/W4Ij0kltncrSYRGhSmPDbfz2WOJVsqCK5GO4obZYdLO36fVC-yNzLe_a3BpadfBIwn_wdh4BHg8r8b9N=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(52),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCYAFIwL4uBWQHBrBiohx1vw",
|
||||
name: "Addis Black Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xonj-vCCYYjIKSATlqbbPJCKM6jJBrn4belO7YBm1fmW-sv71KT7Dvhp-RGEd_zjkupkpbHgmvRcq_U=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(3),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCcp64GnNBBnA0TLBQBzOTzg",
|
||||
name: "Blackmamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-eB3_6oU13574GvFZuxPEiVRt6L3a5sxc1bOI81wrH2ApPBW1FkiasjUW9kG57HT9lzvx7THUhzOX_Dywg=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-eB3_6oU13574GvFZuxPEiVRt6L3a5sxc1bOI81wrH2ApPBW1FkiasjUW9kG57HT9lzvx7THUhzOX_Dywg=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(33),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCUwuDw3pGLVIvX0qEIUN7jw",
|
||||
name: "Blck Mamba",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/AzBKfAN0U1gI_jwMGdDgP2TGiywSP88qCpB7Bse1LsU-9HM7hqxlpqhohm-JGqJ69EKvVUgC4lSH8fTEgA=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/AzBKfAN0U1gI_jwMGdDgP2TGiywSP88qCpB7Bse1LsU-9HM7hqxlpqhohm-JGqJ69EKvVUgC4lSH8fTEgA=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(1),
|
||||
),
|
||||
ArtistItem(
|
||||
id: "UCrlOxtIAzzIpkcOT4YM0e7A",
|
||||
name: "The Black Mambas",
|
||||
avatar: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lpnIQ3IbuHooCDHqCQYREfDSOxq-pO241iBI6enu8-h-ZoXTc4WN3RDAKmYqGv6wE08iwFglXqjZNBtM=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lpnIQ3IbuHooCDHqCQYREfDSOxq-pO241iBI6enu8-h-ZoXTc4WN3RDAKmYqGv6wE08iwFglXqjZNBtM=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
subscriber_count: Some(27),
|
||||
),
|
||||
],
|
||||
ctoken: Some("EoIGEgtibGFjayBtYW1iYRryBUVnV0tBUUlnQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVJoVlEwVmtXa0ZrYm01TGNXSmhTRTlzZGpodVRUWlBkRUdDQVJoVlEyRkVWREl3TFVJelZUaG9MWFJRWjE5V1RYWnVkSGVDQVJoVlEweGpkMHhLU1VkQ1JFUjJZbVp4T0VwRlVsWTJRV2VDQVJoVlEzaFlPWFJPWTFGblEwSjFWVFUyWlhwMWNISnBjV2VDQVJoVlExSndhVEZuUW14aGVEUnpTek5rVGs1NFNYaDRSbWVDQVJoVlEyMTJNRUpUVEhsM2NHZ3llRlZXZWt3eFFqaGFOWGVDQVJoVlEyUnJUbkpqWDJ3M00wSklXVXRTYUVSeGVFSnZPWGVDQVJoVlExaE1MVzE1WTFGa1pESmpSVk5KVlU1aU4ySTRMVkdDQVJoVlEzTXdOR3BtU0VnM09GbFZlbWxHUVRVeVVEazNURUdDQVJoVlEyTnZaMU5tU1VSSWMwSm9RMFZFTkZsVVpEaHZUMmVDQVJoVlEyRnpkVkZOYjFneWVXcHdjRGhxVVVaZmNrcEdhSGVDQVJoVlEwUklWMHBZZUhwaGNWVnBSbFZqV0MwME9XcHRZVkdDQVJoVlEwTTNWbHAyV2toSE5GVlBVRFIzZEdKNmVXdzBhMEdDQVJoVlExOVVUMDh3YW1KUlFsSm5aVkF3Ukc5YVRYUkZTMUdDQVJoVlF6RlNTalJoZEZWSmFUVlZRVmxxTFRFdGRrNUtkR2VDQVJoVlF5MUtNakowVVU1TlYzWkNkMWQ0WlRsUGNYWldZWGVDQVJoVlExbEJSa2wzVERSMVFsZFJTRUp5UW1sdmFIZ3hkbmVDQVJoVlEyTndOalJIYms1Q1FtNUJNRlJNUWxGQ2VrOVVlbWVDQVJoVlExVjNkVVIzTTNCSFRGWkpkbGd3Y1VWSlZVNDNhbmVDQVJoVlEzSnNUM2gwU1VGNmVrbHdhMk5QVkRSWlRUQmxOMEUlM0QY8erQLg%3D%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -431,4 +431,10 @@ MusicSearchResult(
|
|||
),
|
||||
],
|
||||
corrected_query: None,
|
||||
order: [
|
||||
Track,
|
||||
Album,
|
||||
Artist,
|
||||
Playlist,
|
||||
],
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,554 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLDIoUOhQQPlVr3qepMVRsDe4T8vNQsvno",
|
||||
name: "Türkçe Pop Şarkılar 2022 - Yeni Hit Şarkılar 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eby39tamByr1zw-_QJtUyRhc8T19NZWiHqcoWWsi7ALb6FKJRQqjzLgwohvCmNMqwmGwcSI5GA=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eby39tamByr1zw-_QJtUyRhc8T19NZWiHqcoWWsi7ALb6FKJRQqjzLgwohvCmNMqwmGwcSI5GA=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eby39tamByr1zw-_QJtUyRhc8T19NZWiHqcoWWsi7ALb6FKJRQqjzLgwohvCmNMqwmGwcSI5GA=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCX9oPuvJYZsG8wnHTwOBVPA",
|
||||
name: "Chillax",
|
||||
)),
|
||||
track_count: Some(220),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLI_7Mg2Z_-4Lf7IYeiTEOV8HBn-nMqz5N",
|
||||
name: "Pop 2022 ♫ Mix Pop En Ingles (English Pop Songs 2022)",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/mx1Gz-YSxRA4LefldgbLlIKPzGrZtT1m5T8oYX_jpI8dH2JhwRYvukFV8u9fEgcypBbaYR8Lqg=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/mx1Gz-YSxRA4LefldgbLlIKPzGrZtT1m5T8oYX_jpI8dH2JhwRYvukFV8u9fEgcypBbaYR8Lqg=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/mx1Gz-YSxRA4LefldgbLlIKPzGrZtT1m5T8oYX_jpI8dH2JhwRYvukFV8u9fEgcypBbaYR8Lqg=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UC8Ojfs-1VLiAO_MosLwvjpQ",
|
||||
name: "Redlist - Ultimate Music",
|
||||
)),
|
||||
track_count: Some(70),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLTC7VQ12-9raqhLCx1S1E_ic35t94dj28",
|
||||
name: "Pop & Pop Rock Hits 🔥 2012 - 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/WYgJLD76pO1o8S3ZGE045VB_ae_eYyXEKC5s8DwcMIGivWMLxKhH5kCc8zezPKojRcDeRuFANg=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/WYgJLD76pO1o8S3ZGE045VB_ae_eYyXEKC5s8DwcMIGivWMLxKhH5kCc8zezPKojRcDeRuFANg=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/WYgJLD76pO1o8S3ZGE045VB_ae_eYyXEKC5s8DwcMIGivWMLxKhH5kCc8zezPKojRcDeRuFANg=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCE2DEoWWdlUlZsOpolWOgog",
|
||||
name: "Jeff Co",
|
||||
)),
|
||||
track_count: Some(321),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLPssMy7y6ygl-Kzi9Mc7TVFFPWwyAXIwW",
|
||||
name: "Bester deutscher Pop/Best of German Pop music",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/OLk8-06LH-XBxHRj9_XfEkTxy2695DKiP66iOfMUqIXfZViPGsEYKw2TPbu1PA6Uj6lQEWoRKgs=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/OLk8-06LH-XBxHRj9_XfEkTxy2695DKiP66iOfMUqIXfZViPGsEYKw2TPbu1PA6Uj6lQEWoRKgs=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/OLk8-06LH-XBxHRj9_XfEkTxy2695DKiP66iOfMUqIXfZViPGsEYKw2TPbu1PA6Uj6lQEWoRKgs=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCf7eNY2yY-cRuYshHmg4IIg",
|
||||
name: "Frank Denker",
|
||||
)),
|
||||
track_count: Some(106),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj",
|
||||
name: "Pop Music Playlist - Timeless Pop Songs (Updated Weekly 2022)",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/cBQ40Y5m4N2IIK8fQnBMIM0PkWK15IqV8v6TpTrNbjlHaHAwhaG_o7VWYx55iTzr7fZr-Ns07Z4_=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/cBQ40Y5m4N2IIK8fQnBMIM0PkWK15IqV8v6TpTrNbjlHaHAwhaG_o7VWYx55iTzr7fZr-Ns07Z4_=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/cBQ40Y5m4N2IIK8fQnBMIM0PkWK15IqV8v6TpTrNbjlHaHAwhaG_o7VWYx55iTzr7fZr-Ns07Z4_=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCs72iRpTEuwV3y6pdWYLgiw",
|
||||
name: "Redlist - Just Hits",
|
||||
)),
|
||||
track_count: Some(204),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLX6L4t7t6ZanfCJ1wBxRdGZ_mk9ygmKqo",
|
||||
name: "Deutsch Pop Hits NEU 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eVEkTvmjzvkJtNLl68kFcNA3I9TSZmbkKv0pK6ICekXC7U_0PurMBIOuyA3n6s1Zi9JlMWcGBiw=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eVEkTvmjzvkJtNLl68kFcNA3I9TSZmbkKv0pK6ICekXC7U_0PurMBIOuyA3n6s1Zi9JlMWcGBiw=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/eVEkTvmjzvkJtNLl68kFcNA3I9TSZmbkKv0pK6ICekXC7U_0PurMBIOuyA3n6s1Zi9JlMWcGBiw=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCesP91XKnuZVd6OJN06hokg",
|
||||
name: "Startup Records",
|
||||
)),
|
||||
track_count: Some(164),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPL1jMjCxDqxLvomtUMbqa_4pAjMmzpfgUy",
|
||||
name: "Top 100 Músicas Internacionais Pop 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Z6pSgDb_FYtmLGwUfiR21hebCHjdxvNiqe9mg42p2bIcykZsAQsozzL3KbL15A8U0KCZNNmTV8c=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Z6pSgDb_FYtmLGwUfiR21hebCHjdxvNiqe9mg42p2bIcykZsAQsozzL3KbL15A8U0KCZNNmTV8c=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Z6pSgDb_FYtmLGwUfiR21hebCHjdxvNiqe9mg42p2bIcykZsAQsozzL3KbL15A8U0KCZNNmTV8c=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCHuFqDbnqNhBsZB3KBj_Y0g",
|
||||
name: "Redlist - Músicas Internacionais",
|
||||
)),
|
||||
track_count: Some(102),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLgRdph0qPLy53IhYrQLPpATDDA2TpFey5",
|
||||
name: "Teen-Pop 90-2000",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Yo6ErZb73SqWyd-dYyoPh2i0JQQZPrRIoAsAbA7xVMmRkJVJizbEpewmz6Z0eVPSfzrOZOptev67=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Yo6ErZb73SqWyd-dYyoPh2i0JQQZPrRIoAsAbA7xVMmRkJVJizbEpewmz6Z0eVPSfzrOZOptev67=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/Yo6ErZb73SqWyd-dYyoPh2i0JQQZPrRIoAsAbA7xVMmRkJVJizbEpewmz6Z0eVPSfzrOZOptev67=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCv9O2E_G8U46Paz8828THJw",
|
||||
name: "Victor Vaz",
|
||||
)),
|
||||
track_count: Some(50),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLV9Y77TQ4I9dXpIF-r54ZTLM5T7C4k5jf",
|
||||
name: "Most Popular Soft Pop Songs of 2022 Playlist - Best Soft Pop Music Hits of the Year 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/6tFXET3tJ1qFCWfQU4UPx3O17LFwkDXw8j5eYwZTxcDL1xHN9Pm0HRZ3pfVyRpBfgBFN8-Espw=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/6tFXET3tJ1qFCWfQU4UPx3O17LFwkDXw8j5eYwZTxcDL1xHN9Pm0HRZ3pfVyRpBfgBFN8-Espw=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/6tFXET3tJ1qFCWfQU4UPx3O17LFwkDXw8j5eYwZTxcDL1xHN9Pm0HRZ3pfVyRpBfgBFN8-Espw=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCkX96b0MIXbisaGNCYXSRCQ",
|
||||
name: "Redlist - Music Tops",
|
||||
)),
|
||||
track_count: Some(50),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLlYKDqBVDxX2TXAf8ruuF3FVZgzF3wCTx",
|
||||
name: "Pop 2022 ♫ Best Pop Songs Playlist 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/b0lbuJ3s4IBr_ASchbgoWHWrK_6UW19UeYNM7RIgIwXpqKANhZ1VtiQWrRkOhB0DwaFZ0Sb5tA=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/b0lbuJ3s4IBr_ASchbgoWHWrK_6UW19UeYNM7RIgIwXpqKANhZ1VtiQWrRkOhB0DwaFZ0Sb5tA=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/b0lbuJ3s4IBr_ASchbgoWHWrK_6UW19UeYNM7RIgIwXpqKANhZ1VtiQWrRkOhB0DwaFZ0Sb5tA=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCRnu4ZIsaCCDOJdFKIJgirw",
|
||||
name: "Redlist - Fresh Hits",
|
||||
)),
|
||||
track_count: Some(100),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLMC9KNkIncKvYin_USF1qoJQnIyMAfRxl",
|
||||
name: "Best Pop Songs of All Time: Playlist of Good Songs (Throwback Hits & Pop Music 2022)",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lab1mInCWYTAs9zb3ODN4kY9VSTGCtu7uPeDEUtaVA1oY8RS61fSTJp8NfNyDqdF8x18DEatEg=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lab1mInCWYTAs9zb3ODN4kY9VSTGCtu7uPeDEUtaVA1oY8RS61fSTJp8NfNyDqdF8x18DEatEg=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lab1mInCWYTAs9zb3ODN4kY9VSTGCtu7uPeDEUtaVA1oY8RS61fSTJp8NfNyDqdF8x18DEatEg=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCs72iRpTEuwV3y6pdWYLgiw",
|
||||
name: "Redlist - Just Hits",
|
||||
)),
|
||||
track_count: Some(180),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLKUA473MWUv2jmkqIxzQR3YL4kuPArj4G",
|
||||
name: "Best Pop Music for Office – Good Songs for Work: Pop Hits Collection (Playlist Updated in 2022)",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/XZnCmA_a-xfqe0qNNMihiHvsObQjDj9V7fEwkql-aCWqBU0AgcUh8hvwxOCVWfCUtDczSXxtHA=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/XZnCmA_a-xfqe0qNNMihiHvsObQjDj9V7fEwkql-aCWqBU0AgcUh8hvwxOCVWfCUtDczSXxtHA=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/XZnCmA_a-xfqe0qNNMihiHvsObQjDj9V7fEwkql-aCWqBU0AgcUh8hvwxOCVWfCUtDczSXxtHA=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCGUHgJb6ZaJoOqQ6FHgV6zw",
|
||||
name: "Redlist - World Songs",
|
||||
)),
|
||||
track_count: Some(91),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLkqz3S84Tw-RfPS9HHi3MRmrinOBKxIr8",
|
||||
name: "Top POP Hits 2022 – Biggest Pop Music Videos - Vevo",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/uqVHr8UYHJw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kw4JL-GoUF0tjvyvhOv5CmjVKKMw",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/uqVHr8UYHJw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mozaM7uKI0tPeSWNItsEQN-P_LjA",
|
||||
width: 800,
|
||||
height: 450,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/uqVHr8UYHJw/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nd91L12knKM8uDXcxV4QBu0PhvQw",
|
||||
width: 853,
|
||||
height: 480,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCPVhZsC2od1xjGhgEc2NEPQ",
|
||||
name: "Vevo Playlists",
|
||||
)),
|
||||
track_count: Some(82),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLEBX04z4REEaHbC7ghEqFwwL4ptIw8qaZ",
|
||||
name: "Playlist Pop Rock 2022 ♫ Musique Pop Rock 2022 Nouveauté",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/yiClASfoEb277CTCtbPJjovTmBEgBV3kCRpO77WMwgtn4sgZbbORkk6gph8nHb2HT-bzyYBfOoQ=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/yiClASfoEb277CTCtbPJjovTmBEgBV3kCRpO77WMwgtn4sgZbbORkk6gph8nHb2HT-bzyYBfOoQ=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/yiClASfoEb277CTCtbPJjovTmBEgBV3kCRpO77WMwgtn4sgZbbORkk6gph8nHb2HT-bzyYBfOoQ=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCNAPgBbQ2iXE94osjz3-m_A",
|
||||
name: "Redlist - Top Hits",
|
||||
)),
|
||||
track_count: Some(42),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLMC9KNkIncKtGvr2kFRuXBVmBev6cAJ2u",
|
||||
name: "Best Pop Music Videos - Top Pop Hits Playlist",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lwheB4DwnODwPOyRdtKa6hXINFyoLt3ibdu1FusA2jk6PeMPlfwR5gZnZm8YAkKD6wUzV0P-ORGI=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lwheB4DwnODwPOyRdtKa6hXINFyoLt3ibdu1FusA2jk6PeMPlfwR5gZnZm8YAkKD6wUzV0P-ORGI=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/lwheB4DwnODwPOyRdtKa6hXINFyoLt3ibdu1FusA2jk6PeMPlfwR5gZnZm8YAkKD6wUzV0P-ORGI=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCs72iRpTEuwV3y6pdWYLgiw",
|
||||
name: "Redlist - Just Hits",
|
||||
)),
|
||||
track_count: Some(254),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPL9NY5axt700FjL6HlEhqlMFT1gjMGVBgy",
|
||||
name: "Pop Music Songs 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/9wlcmWOCA_8hrPRUHdfdmWrTHY8VytJhr_yYq0YMff00nhQ2wWjEso9B3_FxyZ5YzSlFpoRsCgs=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/9wlcmWOCA_8hrPRUHdfdmWrTHY8VytJhr_yYq0YMff00nhQ2wWjEso9B3_FxyZ5YzSlFpoRsCgs=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/9wlcmWOCA_8hrPRUHdfdmWrTHY8VytJhr_yYq0YMff00nhQ2wWjEso9B3_FxyZ5YzSlFpoRsCgs=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UC1crMgATGeegnQTZTImZuqA",
|
||||
name: "AXEG UK",
|
||||
)),
|
||||
track_count: Some(236),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLTariUrSxayvzHkCnEiX5-NSeFgLTqzHE",
|
||||
name: "Pop Music Playlist 2022",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/uAzNqOxCc7BYsY2HbbiYSMMacz-BVxawaDSYmF4TtNUAzA_1O_o-P8TNcy_yUIQSRAot5fhEucXg=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/uAzNqOxCc7BYsY2HbbiYSMMacz-BVxawaDSYmF4TtNUAzA_1O_o-P8TNcy_yUIQSRAot5fhEucXg=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/uAzNqOxCc7BYsY2HbbiYSMMacz-BVxawaDSYmF4TtNUAzA_1O_o-P8TNcy_yUIQSRAot5fhEucXg=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCSjPP6ccJ3MbsK7v-NfhFtw",
|
||||
name: "Redlist Grama",
|
||||
)),
|
||||
track_count: Some(150),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLB8HqqmpyIBcPirb5lDm-ol01trE6dOuM",
|
||||
name: "Mix Internacional 2022 ♫ As Mais Tocadas 2022 Internacionais (Playlist Musicas Pop As Melhores)",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/2M3mr2akjDVvJG6spMWyt7wroBZ9QEVx88nRyiySutzl22LK5nHQrkeXNM3cKRSFS6kKYCPrLw=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/2M3mr2akjDVvJG6spMWyt7wroBZ9QEVx88nRyiySutzl22LK5nHQrkeXNM3cKRSFS6kKYCPrLw=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/2M3mr2akjDVvJG6spMWyt7wroBZ9QEVx88nRyiySutzl22LK5nHQrkeXNM3cKRSFS6kKYCPrLw=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCdeukGMkFDh8Zs662Z-d2pA",
|
||||
name: "Redlist - Melhores Músicas",
|
||||
)),
|
||||
track_count: Some(101),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLkqz3S84Tw-Qlth8bNBpXGO7L4J1PkCW7",
|
||||
name: "POP INTERNATIONAL HOTLIST - Pop Hits 2022- Brandneue Pop Videos | Vevo Playlist",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/w29k1xhegDYHDxG2YQfJHu_8Z0YMkP6NF_PWFeNL2asKWpcUYfpAJ2mGHT3z7MY_zpz22Hqk3vQ=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/w29k1xhegDYHDxG2YQfJHu_8Z0YMkP6NF_PWFeNL2asKWpcUYfpAJ2mGHT3z7MY_zpz22Hqk3vQ=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/w29k1xhegDYHDxG2YQfJHu_8Z0YMkP6NF_PWFeNL2asKWpcUYfpAJ2mGHT3z7MY_zpz22Hqk3vQ=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCPVhZsC2od1xjGhgEc2NEPQ",
|
||||
name: "Vevo Playlists",
|
||||
)),
|
||||
track_count: Some(261),
|
||||
from_ytm: false,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLPLkqz3S84Tw-SvUSUY5Ov8LTP3KWuWxFab",
|
||||
name: "Cheesy Sing-Along Pop Hits!",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/y5JJakpTWUBECBzvG30lI_tSWYerxTGOYEDhqx3Rx_KY3Vu1rfZqgmeQqqJaWwd_7M7m1FIFdGg=s192",
|
||||
width: 192,
|
||||
height: 192,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/y5JJakpTWUBECBzvG30lI_tSWYerxTGOYEDhqx3Rx_KY3Vu1rfZqgmeQqqJaWwd_7M7m1FIFdGg=s576",
|
||||
width: 576,
|
||||
height: 576,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://yt3.ggpht.com/y5JJakpTWUBECBzvG30lI_tSWYerxTGOYEDhqx3Rx_KY3Vu1rfZqgmeQqqJaWwd_7M7m1FIFdGg=s1200",
|
||||
width: 1200,
|
||||
height: 1200,
|
||||
),
|
||||
],
|
||||
channel: Some(ChannelId(
|
||||
id: "UCPVhZsC2od1xjGhgEc2NEPQ",
|
||||
name: "Vevo Playlists",
|
||||
)),
|
||||
track_count: Some(52),
|
||||
from_ytm: false,
|
||||
),
|
||||
],
|
||||
ctoken: Some("EoQIEgNwb3Aa_AdFZ2VLQVFRb0FFQUJTQlJxREJBREVBUVFDUkFPRUFvUUJZSUJJbEJNUkVsdlZVOW9VVkZRYkZaeU0zRmxjRTFXVW5ORVpUUlVPSFpPVVhOMmJtLUNBU0pRVEVsZk4wMW5NbHBmTFRSTVpqZEpXV1ZwVkVWUFZqaElRbTR0YmsxeGVqVk9nZ0VpVUV4VVF6ZFdVVEV5TFRseVlYRm9URU40TVZNeFJWOXBZek0xZERrMFpHb3lPSUlCSWxCTVVITnpUWGszZVRaNVoyd3RTM3BwT1Uxak4xUldSa1pRVjNkNVFWaEpkMWVDQVNKUVRFMURPVXRPYTBsdVkwdDBVSHBuV1MwMWNtMW9kbW8zWm1GNE9HWmtlRzlxZ2dFaVVFeFlOa3cwZERkME5scGhibVpEU2pGM1FuaFNaRWRhWDIxck9YbG5iVXR4YjRJQklsQk1NV3BOYWtONFJIRjRUSFp2YlhSVlRXSnhZVjgwY0VGcVRXMTZjR1puVlhtQ0FTSlFUR2RTWkhCb01IRlFUSGsxTTBsb1dYSlJURkJ3UVZSRVJFRXlWSEJHWlhrMWdnRWlVRXhXT1ZrM04xUlJORWs1WkZod1NVWXRjalUwV2xSTVRUVlVOME0wYXpWcVpvSUJJbEJNYkZsTFJIRkNWa1I0V0RKVVdFRm1PSEoxZFVZelJsWmFaM3BHTTNkRFZIaUNBU0pRVEUxRE9VdE9hMGx1WTB0MldXbHVYMVZUUmpGeGIwcFJia2w1VFVGbVVuaHNnZ0VpVUV4TFZVRTBOek5OVjFWMk1tcHRhM0ZKZUhwUlVqTlpURFJyZFZCQmNtbzBSNElCSWxCTWEzRjZNMU00TkZSM0xWSm1VRk01U0VocE0wMVNiWEpwYms5Q1MzaEpjamlDQVNKUVRFVkNXREEwZWpSU1JVVmhTR0pETjJkb1JYRkdkM2RNTkhCMFNYYzRjV0ZhZ2dFaVVFeE5RemxMVG10SmJtTkxkRWQyY2pKclJsSjFXRUpXYlVKbGRqWmpRVW95ZFlJQklsQk1PVTVaTldGNGREY3dNRVpxVERaSWJFVm9jV3hOUmxReFoycE5SMVpDWjNtQ0FTSlFURlJoY21sVmNsTjRZWGwyZWtoclEyNUZhVmcxTFU1VFpVWm5URlJ4ZWtoRmdnRWlVRXhDT0VoeGNXMXdlVWxDWTFCcGNtSTFiRVJ0TFc5c01ERjBja1UyWkU5MVRZSUJJbEJNYTNGNk0xTTRORlIzTFZGc2RHZzRZazVDY0ZoSFR6ZE1ORW94VUd0RFZ6ZUNBU0pRVEd0eGVqTlRPRFJVZHkxVGRsVlRWVmsxVDNZNFRGUlFNMHRYZFZkNFJtRmkY8erQLg%3D%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -0,0 +1,594 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nmS3YoxSwVVQk9lEQJ0UX4ZCjXsW_psU8",
|
||||
name: "Pop\'s Biggest Hits",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ih5QdpqpkVNRXtD-joBWj3jo1woxAXJFyAoA3hWYNWAKX0M9B825HH2VOh7aDX-unf67oyCyJGN9TljR=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ih5QdpqpkVNRXtD-joBWj3jo1woxAXJFyAoA3hWYNWAKX0M9B825HH2VOh7aDX-unf67oyCyJGN9TljR=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ih5QdpqpkVNRXtD-joBWj3jo1woxAXJFyAoA3hWYNWAKX0M9B825HH2VOh7aDX-unf67oyCyJGN9TljR=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ih5QdpqpkVNRXtD-joBWj3jo1woxAXJFyAoA3hWYNWAKX0M9B825HH2VOh7aDX-unf67oyCyJGN9TljR=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(225),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nfs_t4FUu00E5ED6lveEBBX1VMYe1mFjk",
|
||||
name: "Dance-Pop Bangers",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/371QuBVeCF9Q2wygw9z69I1GqwXXpmrSHsgmbhc1YofGXEloyB2EiV5vFx_GEDu23J2ieG9CTNOa7A=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/371QuBVeCF9Q2wygw9z69I1GqwXXpmrSHsgmbhc1YofGXEloyB2EiV5vFx_GEDu23J2ieG9CTNOa7A=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/371QuBVeCF9Q2wygw9z69I1GqwXXpmrSHsgmbhc1YofGXEloyB2EiV5vFx_GEDu23J2ieG9CTNOa7A=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/371QuBVeCF9Q2wygw9z69I1GqwXXpmrSHsgmbhc1YofGXEloyB2EiV5vFx_GEDu23J2ieG9CTNOa7A=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(100),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nH_fdBVCcbNaVwi_tmZajZRq-ekddiuFY",
|
||||
name: "Pop Meets Country",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/x1x_b4tyMHZQFxDr_LnYp39BTeMf9lgCT3EIsWAgaiFSvF1zBtVeUmwoXCixITsWU4tV85BwZh1yx6Q=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/x1x_b4tyMHZQFxDr_LnYp39BTeMf9lgCT3EIsWAgaiFSvF1zBtVeUmwoXCixITsWU4tV85BwZh1yx6Q=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/x1x_b4tyMHZQFxDr_LnYp39BTeMf9lgCT3EIsWAgaiFSvF1zBtVeUmwoXCixITsWU4tV85BwZh1yx6Q=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/x1x_b4tyMHZQFxDr_LnYp39BTeMf9lgCT3EIsWAgaiFSvF1zBtVeUmwoXCixITsWU4tV85BwZh1yx6Q=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(92),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_lb6CVU6S4uVugLVNTU9WhqfaomWAgnho4",
|
||||
name: "Shout-Out Pop Hits",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/BJQlF3li_vQMpYuC7JKQan3Qehp4OxW9tBRf1Ik7C5fX4J8boxXZRhJn5ubf3jxGA8UFUHEhnrODPQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/BJQlF3li_vQMpYuC7JKQan3Qehp4OxW9tBRf1Ik7C5fX4J8boxXZRhJn5ubf3jxGA8UFUHEhnrODPQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/BJQlF3li_vQMpYuC7JKQan3Qehp4OxW9tBRf1Ik7C5fX4J8boxXZRhJn5ubf3jxGA8UFUHEhnrODPQ=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/BJQlF3li_vQMpYuC7JKQan3Qehp4OxW9tBRf1Ik7C5fX4J8boxXZRhJn5ubf3jxGA8UFUHEhnrODPQ=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(50),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_mfdqvCAl8wodlx2P2_Ai2gNkiRDAufkkI",
|
||||
name: "Happy Pop Hits",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-ZNC3w71iSs1df7ogBe-LmZj98AzwhHVxJpQVe-nO5VKw8s2M3B8g_7v0mih9NV2dRwX8_a0znewkJI=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-ZNC3w71iSs1df7ogBe-LmZj98AzwhHVxJpQVe-nO5VKw8s2M3B8g_7v0mih9NV2dRwX8_a0znewkJI=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-ZNC3w71iSs1df7ogBe-LmZj98AzwhHVxJpQVe-nO5VKw8s2M3B8g_7v0mih9NV2dRwX8_a0znewkJI=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/-ZNC3w71iSs1df7ogBe-LmZj98AzwhHVxJpQVe-nO5VKw8s2M3B8g_7v0mih9NV2dRwX8_a0znewkJI=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(59),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nHSqCJjDrW9HBhCNdF6tWPdnOMngOv0wA",
|
||||
name: "Pop Gold",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/rAUuEbLF7CYEYBXU3yAY4npMCzTgPxMhlD-ygH9iv_SuDXGDuDvO0Z4MTh33xAI6o3UnpWFe26MS_hBZ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/rAUuEbLF7CYEYBXU3yAY4npMCzTgPxMhlD-ygH9iv_SuDXGDuDvO0Z4MTh33xAI6o3UnpWFe26MS_hBZ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/rAUuEbLF7CYEYBXU3yAY4npMCzTgPxMhlD-ygH9iv_SuDXGDuDvO0Z4MTh33xAI6o3UnpWFe26MS_hBZ=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/rAUuEbLF7CYEYBXU3yAY4npMCzTgPxMhlD-ygH9iv_SuDXGDuDvO0Z4MTh33xAI6o3UnpWFe26MS_hBZ=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(100),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_kLB769E3eFSzgy4fbpu6-1YPLh90b0JAY",
|
||||
name: "Pop Hotlist",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tGSasOiGlg7ulpPNtR8_UvNdj1Wm9HyLKU1brC_ICOaJPYQXBh4GfhW1OcjGc_7A3eOxAtWzeFKgMow=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tGSasOiGlg7ulpPNtR8_UvNdj1Wm9HyLKU1brC_ICOaJPYQXBh4GfhW1OcjGc_7A3eOxAtWzeFKgMow=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tGSasOiGlg7ulpPNtR8_UvNdj1Wm9HyLKU1brC_ICOaJPYQXBh4GfhW1OcjGc_7A3eOxAtWzeFKgMow=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/tGSasOiGlg7ulpPNtR8_UvNdj1Wm9HyLKU1brC_ICOaJPYQXBh4GfhW1OcjGc_7A3eOxAtWzeFKgMow=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(54),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_m_0U5VQNyyzwwH1lRi7cPAAGXqNQnAOqY",
|
||||
name: "Laid-Back Sofa Pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IKBTW8jZAxhiUfUkM9u-BLTuuFYrO2833EMuUmH4od_9Acn2pOhh0xOda0iSxo_C24TW3EHGPkkXF2o=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IKBTW8jZAxhiUfUkM9u-BLTuuFYrO2833EMuUmH4od_9Acn2pOhh0xOda0iSxo_C24TW3EHGPkkXF2o=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IKBTW8jZAxhiUfUkM9u-BLTuuFYrO2833EMuUmH4od_9Acn2pOhh0xOda0iSxo_C24TW3EHGPkkXF2o=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IKBTW8jZAxhiUfUkM9u-BLTuuFYrO2833EMuUmH4od_9Acn2pOhh0xOda0iSxo_C24TW3EHGPkkXF2o=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(67),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_mHW5bcduhjB-PkTePAe6EoRMj1xNT8gzY",
|
||||
name: "K-Pop Girl Crush",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1INaodXPz__Ijahn-kmKe7_K7t7nduKH2QO38PWe-w-jQunKDJpwO_ic6ugIpgfLjmUx5ZEH76uZURc=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1INaodXPz__Ijahn-kmKe7_K7t7nduKH2QO38PWe-w-jQunKDJpwO_ic6ugIpgfLjmUx5ZEH76uZURc=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1INaodXPz__Ijahn-kmKe7_K7t7nduKH2QO38PWe-w-jQunKDJpwO_ic6ugIpgfLjmUx5ZEH76uZURc=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1INaodXPz__Ijahn-kmKe7_K7t7nduKH2QO38PWe-w-jQunKDJpwO_ic6ugIpgfLjmUx5ZEH76uZURc=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(88),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nWFLXjO1mIJnP4wAmxjfDS40Zmu6nF9DU",
|
||||
name: "Se Habla Pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/YAoTwD_eJcM7Lt6rzJ76y87SoF9LoCq1Kb-1dLZwfUGgA7diG7yRk9E1myosRk74w1p6i8wtlM7FGt4=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/YAoTwD_eJcM7Lt6rzJ76y87SoF9LoCq1Kb-1dLZwfUGgA7diG7yRk9E1myosRk74w1p6i8wtlM7FGt4=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/YAoTwD_eJcM7Lt6rzJ76y87SoF9LoCq1Kb-1dLZwfUGgA7diG7yRk9E1myosRk74w1p6i8wtlM7FGt4=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/YAoTwD_eJcM7Lt6rzJ76y87SoF9LoCq1Kb-1dLZwfUGgA7diG7yRk9E1myosRk74w1p6i8wtlM7FGt4=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(61),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_lHu_HYAQ0A-OfCwhuky240HOdM1UduuyA",
|
||||
name: "Presenting Pop Smoke",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uEZTcfN-VPGwLuR6aBA-8kYaxK9rRWyOw87If4AThJHzH2vj_9maLZGdQMQnISwb7uLQGh0RR2vu3bE=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uEZTcfN-VPGwLuR6aBA-8kYaxK9rRWyOw87If4AThJHzH2vj_9maLZGdQMQnISwb7uLQGh0RR2vu3bE=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uEZTcfN-VPGwLuR6aBA-8kYaxK9rRWyOw87If4AThJHzH2vj_9maLZGdQMQnISwb7uLQGh0RR2vu3bE=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/uEZTcfN-VPGwLuR6aBA-8kYaxK9rRWyOw87If4AThJHzH2vj_9maLZGdQMQnISwb7uLQGh0RR2vu3bE=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(48),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_lw21MuKaqFsDBIPZSbRmZcoDrHmV_c6uY",
|
||||
name: "Happy latin pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0NAfiHpB5GlIwYDdGPwmebUUtDTjLzV5-IZ9WeKlJAysp4iRL_53yL7jqFkk2TiH7m0zxhV0eb2XR61=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0NAfiHpB5GlIwYDdGPwmebUUtDTjLzV5-IZ9WeKlJAysp4iRL_53yL7jqFkk2TiH7m0zxhV0eb2XR61=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0NAfiHpB5GlIwYDdGPwmebUUtDTjLzV5-IZ9WeKlJAysp4iRL_53yL7jqFkk2TiH7m0zxhV0eb2XR61=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/g0NAfiHpB5GlIwYDdGPwmebUUtDTjLzV5-IZ9WeKlJAysp4iRL_53yL7jqFkk2TiH7m0zxhV0eb2XR61=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(53),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_lY6JFrs7W9yIhFjUN_yxQ_ubkjcrqQaVs",
|
||||
name: "Bedroom Pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/6zXQhY27q_lJNTYl2SbPZIQCzQ6pUBI2S_u7YuoxBfdsSTtVhyAri0n4bxzCmRQLJBrOpQFwYAvn6Zs=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/6zXQhY27q_lJNTYl2SbPZIQCzQ6pUBI2S_u7YuoxBfdsSTtVhyAri0n4bxzCmRQLJBrOpQFwYAvn6Zs=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/6zXQhY27q_lJNTYl2SbPZIQCzQ6pUBI2S_u7YuoxBfdsSTtVhyAri0n4bxzCmRQLJBrOpQFwYAvn6Zs=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/6zXQhY27q_lJNTYl2SbPZIQCzQ6pUBI2S_u7YuoxBfdsSTtVhyAri0n4bxzCmRQLJBrOpQFwYAvn6Zs=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(176),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nbK9qSkqYZvtMXH1fLCMmC1yn8HEm0W90",
|
||||
name: "J-Hits!",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fbxl4SPlkBHzHHXYzg2eAKIfi__2B_2JjvHf9n4kfEQECDXHCCT9xiVRXAedzLVcZZ3YVF6CKd_URBo=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fbxl4SPlkBHzHHXYzg2eAKIfi__2B_2JjvHf9n4kfEQECDXHCCT9xiVRXAedzLVcZZ3YVF6CKd_URBo=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fbxl4SPlkBHzHHXYzg2eAKIfi__2B_2JjvHf9n4kfEQECDXHCCT9xiVRXAedzLVcZZ3YVF6CKd_URBo=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fbxl4SPlkBHzHHXYzg2eAKIfi__2B_2JjvHf9n4kfEQECDXHCCT9xiVRXAedzLVcZZ3YVF6CKd_URBo=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(50),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_kIcfhFcnJ9fdkKHw96Gvr6Q0_bAyWiZbM",
|
||||
name: "Reiwa Era J-Pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/kc7Pu6tjxFx43I-hd4X7Sv9CD09SfGR-rVBvl5NliXVDqOVcDR8idwzfZRMCE0iKGanYib_bfGDqxJI=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/kc7Pu6tjxFx43I-hd4X7Sv9CD09SfGR-rVBvl5NliXVDqOVcDR8idwzfZRMCE0iKGanYib_bfGDqxJI=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/kc7Pu6tjxFx43I-hd4X7Sv9CD09SfGR-rVBvl5NliXVDqOVcDR8idwzfZRMCE0iKGanYib_bfGDqxJI=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/kc7Pu6tjxFx43I-hd4X7Sv9CD09SfGR-rVBvl5NliXVDqOVcDR8idwzfZRMCE0iKGanYib_bfGDqxJI=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(78),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nDL8KeBrUagwyISwNmyEiSfYgz1gVCesg",
|
||||
name: "Mellow Pop Classics",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/XyREm3Y-HafFR_mxyJF99Pd9zerLQiJ0q62_XEnzPK2g30m_V04iVdzAwyP1T9-_3ruclUASulQFjSY=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/XyREm3Y-HafFR_mxyJF99Pd9zerLQiJ0q62_XEnzPK2g30m_V04iVdzAwyP1T9-_3ruclUASulQFjSY=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/XyREm3Y-HafFR_mxyJF99Pd9zerLQiJ0q62_XEnzPK2g30m_V04iVdzAwyP1T9-_3ruclUASulQFjSY=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/XyREm3Y-HafFR_mxyJF99Pd9zerLQiJ0q62_XEnzPK2g30m_V04iVdzAwyP1T9-_3ruclUASulQFjSY=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(50),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_l7K78k4EkjcFojhd1617rmUjY-aet6-t0",
|
||||
name: "K-Pop Party Hits",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IpuPGdpvBPCS9KEeqDCN3O9omG9_xWBVl-oBCQgWz6EXLyfWLrtkb_UXoN9TvN7CvYa2lXg4ycVMWtk=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IpuPGdpvBPCS9KEeqDCN3O9omG9_xWBVl-oBCQgWz6EXLyfWLrtkb_UXoN9TvN7CvYa2lXg4ycVMWtk=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IpuPGdpvBPCS9KEeqDCN3O9omG9_xWBVl-oBCQgWz6EXLyfWLrtkb_UXoN9TvN7CvYa2lXg4ycVMWtk=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IpuPGdpvBPCS9KEeqDCN3O9omG9_xWBVl-oBCQgWz6EXLyfWLrtkb_UXoN9TvN7CvYa2lXg4ycVMWtk=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(106),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nCVF_zUZizzRcojIUuYmaXxMoPgg2WMDo",
|
||||
name: "Klangfarbe: German Pop Hits",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oy8vZ8tPHIRAfKqOJcHXS9obZpb9VCIvkesRlJq7AuiWRME5PesStIGJgQmtLTu_0LB0v0_srB61VLs=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oy8vZ8tPHIRAfKqOJcHXS9obZpb9VCIvkesRlJq7AuiWRME5PesStIGJgQmtLTu_0LB0v0_srB61VLs=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oy8vZ8tPHIRAfKqOJcHXS9obZpb9VCIvkesRlJq7AuiWRME5PesStIGJgQmtLTu_0LB0v0_srB61VLs=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oy8vZ8tPHIRAfKqOJcHXS9obZpb9VCIvkesRlJq7AuiWRME5PesStIGJgQmtLTu_0LB0v0_srB61VLs=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(55),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_nGKsW16ocmP8l8wL1oMIyR53cu4N5fyKI",
|
||||
name: "GIF Pop BR",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ft-u97TMfiDgycVnHbIUZo6bx3Mrx-F1x-XnhZ-Y4p7Z6gjhY7fcwf3ssi-I80dqDICMwfq5dfMP0Bs=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ft-u97TMfiDgycVnHbIUZo6bx3Mrx-F1x-XnhZ-Y4p7Z6gjhY7fcwf3ssi-I80dqDICMwfq5dfMP0Bs=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ft-u97TMfiDgycVnHbIUZo6bx3Mrx-F1x-XnhZ-Y4p7Z6gjhY7fcwf3ssi-I80dqDICMwfq5dfMP0Bs=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ft-u97TMfiDgycVnHbIUZo6bx3Mrx-F1x-XnhZ-Y4p7Z6gjhY7fcwf3ssi-I80dqDICMwfq5dfMP0Bs=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(50),
|
||||
from_ytm: true,
|
||||
),
|
||||
MusicPlaylistItem(
|
||||
id: "VLRDCLAK5uy_mVJ3RRi_YBfUJnZnQxLAedQQcXHujbUcg",
|
||||
name: "Pump-Up Pop",
|
||||
thumbnail: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/jzUe3KUHUMCHGN5o02havVoL481hvjMJ1Yjgyej8xPYwCfGwPKrPlcUmBr0p9HjbxSSzR8ZvzsVsuY3r=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/jzUe3KUHUMCHGN5o02havVoL481hvjMJ1Yjgyej8xPYwCfGwPKrPlcUmBr0p9HjbxSSzR8ZvzsVsuY3r=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/jzUe3KUHUMCHGN5o02havVoL481hvjMJ1Yjgyej8xPYwCfGwPKrPlcUmBr0p9HjbxSSzR8ZvzsVsuY3r=w226-h226-l90-rj",
|
||||
width: 226,
|
||||
height: 226,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/jzUe3KUHUMCHGN5o02havVoL481hvjMJ1Yjgyej8xPYwCfGwPKrPlcUmBr0p9HjbxSSzR8ZvzsVsuY3r=w544-h544-l90-rj",
|
||||
width: 544,
|
||||
height: 544,
|
||||
),
|
||||
],
|
||||
channel: None,
|
||||
track_count: Some(100),
|
||||
from_ytm: true,
|
||||
),
|
||||
],
|
||||
ctoken: Some("EvQJEgNwb3Aa7AlFZ2VLQVFRb0FEZ0JTQlJxREJBREVBUVFDUkFPRUFvUUJZSUJLMUpFUTB4QlN6VjFlVjl1YlZNeldXOTRVM2RXVmxGck9XeEZVVW93VlZnMFdrTnFXSE5YWDNCelZUaUNBU3RTUkVOTVFVczFkWGxmYm1aelgzUTBSbFYxTURCRk5VVkVObXgyWlVWQ1FsZ3hWazFaWlRGdFJtcHJnZ0VyVWtSRFRFRkxOWFY1WDI1SVgyWmtRbFpEWTJKT1lWWjNhVjkwYlZwaGFscFNjUzFsYTJSa2FYVkdXWUlCSzFKRVEweEJTelYxZVY5c1lqWkRWbFUyVXpSMVZuVm5URlpPVkZVNVYyaHhabUZ2YlZkQloyNW9ielNDQVN0U1JFTk1RVXMxZFhsZmJXWmtjWFpEUVd3NGQyOWtiSGd5VURKZlFXa3laMDVyYVZKRVFYVm1hMnRKZ2dFclVrUkRURUZMTlhWNVgyNUlVM0ZEU21wRWNsYzVTRUpvUTA1a1JqWjBWMUJrYms5TmJtZFBkakIzUVlJQksxSkVRMHhCU3pWMWVWOXJURUkzTmpsRk0yVkdVM3BuZVRSbVluQjFOaTB4V1ZCTWFEa3dZakJLUVZtQ0FTdFNSRU5NUVVzMWRYbGZiVjh3VlRWV1VVNTVlWHAzZDBneGJGSnBOMk5RUVVGSFdIRk9VVzVCVDNGWmdnRXJVa1JEVEVGTE5YVjVYMjFJVnpWaVkyUjFhR3BDTFZCclZHVlFRV1UyUlc5U1RXb3hlRTVVT0dkNldZSUJLMUpFUTB4QlN6VjFlVjl1VjBaTVdHcFBNVzFKU201UU5IZEJiWGhxWmtSVE5EQmFiWFUyYmtZNVJGV0NBU3RTUkVOTVFVczFkWGxmYkVoMVgwaFpRVkV3UVMxUFprTjNhSFZyZVRJME1FaFBaRTB4VldSMWRYbEJnZ0VyVWtSRFRFRkxOWFY1WDJ4M01qRk5kVXRoY1VaelJFSkpVRnBUWWxKdFdtTnZSSEpJYlZaZll6WjFXWUlCSzFKRVEweEJTelYxZVY5c1dUWktSbkp6TjFjNWVVbG9SbXBWVGw5NWVGRmZkV0pyYW1OeWNWRmhWbk9DQVN0U1JFTk1RVXMxZFhsZmJtSkxPWEZUYTNGWlduWjBUVmhJTVdaTVEwMXRRekY1YmpoSVJXMHdWemt3Z2dFclVrUkRURUZMTlhWNVgydEpZMlpvUm1OdVNqbG1aR3RMU0hjNU5rZDJjalpSTUY5aVFYbFhhVnBpVFlJQksxSkVRMHhCU3pWMWVWOXVSRXc0UzJWQ2NsVmhaM2Q1U1ZOM1RtMTVSV2xUWmxsbmVqRm5Wa05sYzJlQ0FTdFNSRU5NUVVzMWRYbGZiRGRMTnpock5FVnJhbU5HYjJwb1pERTJNVGR5YlZWcVdTMWhaWFEyTFhRd2dnRXJVa1JEVEVGTE5YVjVYMjVEVmtaZmVsVmFhWHA2VW1OdmFrbFZkVmx0WVZoNFRXOVFaMmN5VjAxRWI0SUJLMUpFUTB4QlN6VjFlVjl1UjB0elZ6RTJiMk50VURoc09IZE1NVzlOU1hsU05UTmpkVFJPTldaNVMwbUNBU3RTUkVOTVFVczFkWGxmYlZaS00xSlNhVjlaUW1aVlNtNWFibEY0VEVGbFpGRlJZMWhJZFdwaVZXTm4Y8erQLg%3D%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -0,0 +1,621 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
TrackItem(
|
||||
id: "BL-aIpCLWnU",
|
||||
title: "Black Mamba",
|
||||
duration: 175,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("aespa"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_OpHWHwyNOuY",
|
||||
name: "Black Mamba",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "cATe8Toht70",
|
||||
title: "Black Mamba",
|
||||
duration: 74,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCfCNL5oajlQBAlyjWv1ChVw",
|
||||
name: "Hans Zimmer",
|
||||
),
|
||||
ChannelId(
|
||||
id: "UCvTXGTZf9EvuCAwZOkoR2iQ",
|
||||
name: "Lorne Balfe",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Hans Zimmer & Lorne Balfe"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_UmDOhLpDsc0",
|
||||
name: "Megamind (Music from the Motion Picture)",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "0I1UpXSYdOQ",
|
||||
title: "Black Mamba (Orchestra Version)",
|
||||
duration: 291,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/iVzSchJFVKNSREbIRye25Y-EJXocz-dsR9xpOZ4qBejfZS4IYjDhlUhGCXmYH-0xdGXE6wL1zxxPlu_0aQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCZwE-b-kzA4pQaCQXwOQnlg",
|
||||
name: "Seoul Philharmonic Orchestra",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Seoul Philharmonic Orchestra"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_DeCImAQRYMO",
|
||||
name: "Black Mamba (Orchestra Version)",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "9G2tG8V5_PY",
|
||||
title: "Black Mamba",
|
||||
duration: 210,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/EsVdgKC0gQx9FqkAxd6VfwHNC6Me2nX0_k-s26069NgyVeDs7kSOKKq1q5Ze9SJj1uHkknONpeLc1m4VdA=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC8whsREta_7Fu-EjRq2Ys-A",
|
||||
name: "Alpha Wolf",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Alpha Wolf"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_PdIIalyOQXF",
|
||||
name: "Black Mamba",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "WwNKyoizf8k",
|
||||
title: "BLACK MAMBA",
|
||||
duration: 182,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCz6yr3CgFGrrrPDa2asbWMQ",
|
||||
name: "Bayamon PR Tribe",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Bayamon PR Tribe"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_RV0PGHyGfkp",
|
||||
name: "LISTEN ME",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "kS1o36LXQkc",
|
||||
title: "Black Mamba",
|
||||
duration: 299,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MxQNc8FHi_NrLkA_OKNOPB0vUPlaN1k4gPUd5qHzY1kd8vVNUu3sJGnJTgUPG05S3p-551sHyRCXNK8=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/MxQNc8FHi_NrLkA_OKNOPB0vUPlaN1k4gPUd5qHzY1kd8vVNUu3sJGnJTgUPG05S3p-551sHyRCXNK8=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC7sFWdsZTzfR507dbonTlyQ",
|
||||
name: "Jethro Tull",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Jethro Tull"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_uC4NIfLr7VS",
|
||||
name: "J-Tull Dot Com",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "UQQ6L1j6mXE",
|
||||
title: "Black Mamba",
|
||||
duration: 122,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fttA1FSkkhNfn_s-HleFYEm-bPpKhAhsbTKnjqjNxKIwGB_bqHtXotzeUwriCWd7Sgj-L0J-Skia67bM=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/fttA1FSkkhNfn_s-HleFYEm-bPpKhAhsbTKnjqjNxKIwGB_bqHtXotzeUwriCWd7Sgj-L0J-Skia67bM=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCzqRJ5qy_ekVd9jfaAlb7nA",
|
||||
name: "FREE FLOW FLAVA",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("FREE FLOW FLAVA"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_4gkEob83yi2",
|
||||
name: "Hidden Tape",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "9l9dCro-7l8",
|
||||
title: "Black Mamba",
|
||||
duration: 246,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/eWk4BziW2TljgowoSlCobR6zt5u_akVNuKMlIH5XBYp14XqTxEwsdWTGYNvLj-YnbDEelIj-d3FC8Atp=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/eWk4BziW2TljgowoSlCobR6zt5u_akVNuKMlIH5XBYp14XqTxEwsdWTGYNvLj-YnbDEelIj-d3FC8Atp=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCi8RICptUr15gPmPjEuIEDQ",
|
||||
name: "Ashkabad",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Ashkabad"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_SU8gaBGZv2T",
|
||||
name: "Reptile",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "S_PRpDtgUfI",
|
||||
title: "Black Mamba",
|
||||
duration: 286,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/lS8hPUJ0lZkX3FsVu400p9izEBRfZnAzjR9GSXx0T2wjSYmZIcJG8QLMX0mqErvrKA7lJb-lrfy-_Oo=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCudOYmRtW3uylYtqY1aAD0A",
|
||||
name: "Montana Of 300",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Montana Of 300"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_Sx4uifBuKyD",
|
||||
name: "Black Mamba",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "Xt_ReZc0gnw",
|
||||
title: "Black Mamba",
|
||||
duration: 179,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/VQpE33G21kT_nICA168zKpPMCApANoYfL9vTBUbn5oQTl5udE-kmCLUVRYZppLejvq4-EFoChp9qWmKq=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/VQpE33G21kT_nICA168zKpPMCApANoYfL9vTBUbn5oQTl5udE-kmCLUVRYZppLejvq4-EFoChp9qWmKq=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCoNSQrGCiSZscyBwQTsMK2g",
|
||||
name: "Dj Zapy & Dj Uragun",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Dj Zapy & Dj Uragun"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_nfwzSf4mnx4",
|
||||
name: "Black Mamba",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "diN3WCxpqis",
|
||||
title: "Black Mamba",
|
||||
duration: 376,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1ThxS5gEjktWjom7UT4gBBGiS3V9fdzZeNUEBWUKJg84a8ldY-vXoQtGQEQnReVoiXiVCu_mfN-WXTjU=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/1ThxS5gEjktWjom7UT4gBBGiS3V9fdzZeNUEBWUKJg84a8ldY-vXoQtGQEQnReVoiXiVCu_mfN-WXTjU=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCkjmrFnxpkxI4cVVwhc_mMw",
|
||||
name: "Alex Torres y Los Reyes Latinos",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Alex Torres y Los Reyes Latinos"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_9SbptcWbS7a",
|
||||
name: "Elementos",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "9q3FfH_57Rc",
|
||||
title: "Black Mamba",
|
||||
duration: 213,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/70aMvzcO0Gn3UhDVyq_oL7ond89jbpX5o3TpzNPQMdjPYnq7r0q4we4GqMD5f5DfW-S08Kou8jc9pK0B=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/70aMvzcO0Gn3UhDVyq_oL7ond89jbpX5o3TpzNPQMdjPYnq7r0q4we4GqMD5f5DfW-S08Kou8jc9pK0B=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [],
|
||||
artists_txt: Some("C.JERRY"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_0lYy8bzdAWJ",
|
||||
name: "Bleem多维视角",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "U29V08A9yBs",
|
||||
title: "BLCK MAMBA",
|
||||
duration: 166,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/m0oD-sysVTuLunVkCNvdXz2dG_Aj978B1oq13Dr91e4H4I4RIJtD1VqGX6rjIH-xtCfFEMlpK33-Rc8=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/m0oD-sysVTuLunVkCNvdXz2dG_Aj978B1oq13Dr91e4H4I4RIJtD1VqGX6rjIH-xtCfFEMlpK33-Rc8=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC_PI4ScqWXzHuYP2TNqw6vg",
|
||||
name: "Nerissima Serpe",
|
||||
),
|
||||
ChannelId(
|
||||
id: "UCugPYAOw4Ig_6043IZslywQ",
|
||||
name: "Fri2",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Nerissima Serpe & Fri2"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_6cqJGhzYwwg",
|
||||
name: "BLCK MAMBA",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "HHEKbGlLoEM",
|
||||
title: "Black Mamba",
|
||||
duration: 215,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ENvv-CqUxK-cm2JAXVANMohQglRc3701a3sAz3CQwZZk_-ZlF4kKCQA050ErWZzqFWHLEccbTnjEfJY=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ENvv-CqUxK-cm2JAXVANMohQglRc3701a3sAz3CQwZZk_-ZlF4kKCQA050ErWZzqFWHLEccbTnjEfJY=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCr8Gk2ECkAhRzNWCqKg62bA",
|
||||
name: "Biodizzy",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Biodizzy"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_11tzMasyq5O",
|
||||
name: "Mathomo Mayo",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "qE_dGvQG1rU",
|
||||
title: "Told Black",
|
||||
duration: 106,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/usurlrzRxEMLWxWvfDdBIilrAZfO06NUXfF01yRQX_wBJWbtb_PrSL_V7dVPs1BPqekuaE2Q9dpTl3D4=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/usurlrzRxEMLWxWvfDdBIilrAZfO06NUXfF01yRQX_wBJWbtb_PrSL_V7dVPs1BPqekuaE2Q9dpTl3D4=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC6LdZsjHDoy88JtQnEz4z4A",
|
||||
name: "Mamba Cinco",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Mamba Cinco"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_BBP23Ry1SBL",
|
||||
name: "Told Black",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "1tyPs3ccT7E",
|
||||
title: "Black Mamba",
|
||||
duration: 414,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ELMwnT1kiPKvyKJ5KJPe2Pi0bj4b-unO9Y3ZEMuPvfAveo49dvR3sx9o9376r62p2BsG6Fap6pBJP1Fc=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/ELMwnT1kiPKvyKJ5KJPe2Pi0bj4b-unO9Y3ZEMuPvfAveo49dvR3sx9o9376r62p2BsG6Fap6pBJP1Fc=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCX1lJbaUf3IEGhNi1_KCEZw",
|
||||
name: "Vagabond",
|
||||
),
|
||||
ChannelId(
|
||||
id: "UCt4qpUnoWz3aUM5DYDBod0A",
|
||||
name: "Brisk",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Vagabond & Brisk"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_aLZJtqNevjw",
|
||||
name: "Night & Dayz / Black Mamba",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "6pSmQ-MHKbg",
|
||||
title: "Black Mamba Jiu Jitsu (feat. Blackwolf SR & OnenD)",
|
||||
duration: 188,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xf1QDfhBnHjeynm3CWUQpjvic8Dq_UT_zObuEvGUTUFst1dR9DtX-ge9EVtwMC95s786KHtHJFiO2k8=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Xf1QDfhBnHjeynm3CWUQpjvic8Dq_UT_zObuEvGUTUFst1dR9DtX-ge9EVtwMC95s786KHtHJFiO2k8=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCoJXsT1SzLsZZgg5P0yaVQw",
|
||||
name: "Ghost Tribe",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Ghost Tribe"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_fzz3cs4IkeX",
|
||||
name: "Black Mamba Jiu Jitsu",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "rNsISA-kWzM",
|
||||
title: "Black Mamba Dub",
|
||||
duration: 248,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zRVppSgdih64UOcY_0-sZacnxhMkII4v4OotgFbV1SVbLT3qk4NmfQRXwhxszMJKTmb3uo8MzOwkyQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/zRVppSgdih64UOcY_0-sZacnxhMkII4v4OotgFbV1SVbLT3qk4NmfQRXwhxszMJKTmb3uo8MzOwkyQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCxoJ3pl32f39kmTvIR_NWOg",
|
||||
name: "Akae Beka",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Akae Beka"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_iuN0lQwEmRp",
|
||||
name: "Kings Dub",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "AdvPpJVvyEg",
|
||||
title: "Black Mamba",
|
||||
duration: 126,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ue_Q3bgiMyvB_Rk8g0nCyTJHebz_A7f6twQkaRLX-iaHug2j5MmIwS9iHHW94S5x7gOwymGNngIDOXE=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Ue_Q3bgiMyvB_Rk8g0nCyTJHebz_A7f6twQkaRLX-iaHug2j5MmIwS9iHHW94S5x7gOwymGNngIDOXE=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC7RJTtpE3qwbw6-Idq9PTIg",
|
||||
name: "Shockwave-Sound",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Shockwave-Sound"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_Kg4Ff883GH0",
|
||||
name: "Out on the Road",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "7q7o-kjIKpo",
|
||||
title: "Black Mamba",
|
||||
duration: 126,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/LlHQjoVTK0nbngamfjjKdBmEn1LwsO1riYNEf_GhC3xACa4AUw47FSYGOUXkLVCcev2ccfxqX_nHeNM3=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/LlHQjoVTK0nbngamfjjKdBmEn1LwsO1riYNEf_GhC3xACa4AUw47FSYGOUXkLVCcev2ccfxqX_nHeNM3=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCfGf1P_mK274Rp3OKFTgbBQ",
|
||||
name: "Dubb Bankroll",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Dubb Bankroll"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_VGZMM6pmzrt",
|
||||
name: "Area 51",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
],
|
||||
ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0Q1RDMWhTWEJEVEZkdVZZSUJDMk5CVkdVNFZHOW9kRGN3Z2dFTE1Fa3hWWEJZVTFsa1QxR0NBUXM1UnpKMFJ6aFdOVjlRV1lJQkMxZDNUa3Q1YjJsNlpqaHJnZ0VMYTFNeGJ6TTJURmhSYTJPQ0FRdFZVVkUyVERGcU5tMVlSWUlCQ3psc09XUkRjbTh0TjJ3NGdnRUxVMTlRVW5CRWRHZFZaa21DQVF0WWRGOVNaVnBqTUdkdWQ0SUJDMlJwVGpOWFEzaHdjV2x6Z2dFTE9YRXpSbVpJWHpVM1VtT0NBUXRWTWpsV01EaEJPWGxDYzRJQkMwaElSVXRpUjJ4TWIwVk5nZ0VMY1VWZlpFZDJVVWN4Y2xXQ0FRdEVXak14Y0hoNVdXaFNhNElCQ3pad1UyMVJMVTFJUzJKbmdnRUxjazV6U1ZOQkxXdFhlazJDQVF0QlpIWlFjRXBXZG5sRlo0SUJDemR4TjI4dGEycEpTM0J2GPHq0C4%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -0,0 +1,604 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
TrackItem(
|
||||
id: "6485PhOtHzY",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 191,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCIh4j8fXWf2U0ro0qnGU8Mg",
|
||||
name: "Namika",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Namika"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_RXHxrUFfrvQ",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "pt0YvfnhGgI",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 524,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCCpID8TTjkkjLCwBybAfHSg",
|
||||
name: "Boris Brejcha",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Boris Brejcha"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_VFqQlfPhsFW",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "VinJmH-uidY",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 203,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/frjY96Y5A4eZ9tQOmMZm7zqqRr19W4Q3xz7Y2DcAiaCB0Eyp22u3_DfP8qP4NNqrxZFPA1pC3DBC91T3=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/frjY96Y5A4eZ9tQOmMZm7zqqRr19W4Q3xz7Y2DcAiaCB0Eyp22u3_DfP8qP4NNqrxZFPA1pC3DBC91T3=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCMLbHQGqUHeNAqjOL1qXZXg",
|
||||
name: "Lumbematz",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Lumbematz"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_14GKjCEauSE",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "YmSmymHRnEE",
|
||||
title: "Lieblingsmensch (Edit)",
|
||||
duration: 220,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCCpID8TTjkkjLCwBybAfHSg",
|
||||
name: "Boris Brejcha",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Boris Brejcha"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_AlIjxpnBKtn",
|
||||
name: "Lieblingsmensch (Edit)",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "TgfIbiHCOLo",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 211,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IGfkF3S_lPTLb9988SHZegHEAnuT_mT9BrZg8ZssbuYWWkfL5fvoxXlpOvRZr7ajNSdJSFfAhK0xnGCD=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/IGfkF3S_lPTLb9988SHZegHEAnuT_mT9BrZg8ZssbuYWWkfL5fvoxXlpOvRZr7ajNSdJSFfAhK0xnGCD=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCTJBrv8T8AxavAynvB3_DSw",
|
||||
name: "Seer",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Seer"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_t2Laj9ENdVn",
|
||||
name: "echt seerisch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "lCi6N_uq3vE",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 209,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mUCPnu_MO_s46GVCkRnCI8wIx1AvTdexxqpr78ZXHurucPeNFJ_tBtTAJ6IFkaOVMdfmYWPp1ibTU5xd=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/mUCPnu_MO_s46GVCkRnCI8wIx1AvTdexxqpr78ZXHurucPeNFJ_tBtTAJ6IFkaOVMdfmYWPp1ibTU5xd=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCtoec88rzlhABHeo_4d-H8g",
|
||||
name: "Dame",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Dame"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_9ILis64aD76",
|
||||
name: "Notiz an mich",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "QIjqe2B3RdQ",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 184,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Y_1W369gCVOjE4aYEj_Q8gkX9GjjQG08Pf8yl_4f4DZKcnBzncueRCFhfTnElQE7nDWo0et6fYtH9xs=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Y_1W369gCVOjE4aYEj_Q8gkX9GjjQG08Pf8yl_4f4DZKcnBzncueRCFhfTnElQE7nDWo0et6fYtH9xs=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UClOpZVfE5v-fFtM8vqFud-g",
|
||||
name: "KIDZ BOP Kids",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("KIDZ BOP Kids"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_vxdAMBsmm1s",
|
||||
name: "KIDZ BOP Ultimate Playlist",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "q2pUotlXPeM",
|
||||
title: "Lieblingsmensch (Beatgees Remix)",
|
||||
duration: 199,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCIh4j8fXWf2U0ro0qnGU8Mg",
|
||||
name: "Namika",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Namika"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_V5f8YfHKp2j",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "0yPnvetCm-U",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 174,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCvfUKCnUBfsZAVHgF-pYmJg",
|
||||
name: "Voyce",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Voyce"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_SpT32xAd4YR",
|
||||
name: "Gegenstück EP",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "EU5Vly60VGU",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 205,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/SpQwKRYlYv8LRubMGRjCDdbHfcGEjh30Ta97f1iUPXKpy6pfudCGdf-GJQiKfR8zT7p7mkZ6UFR1V8vE=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/SpQwKRYlYv8LRubMGRjCDdbHfcGEjh30Ta97f1iUPXKpy6pfudCGdf-GJQiKfR8zT7p7mkZ6UFR1V8vE=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCosvbvqFxbUniyDCUNXN5wA",
|
||||
name: "Klaus Hanslbauer",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Klaus Hanslbauer"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_oz9ZiEQcBU4",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "UnxQ0TI4IMs",
|
||||
title: "Lieblingsmensch (Intrumental)",
|
||||
duration: 190,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCIh4j8fXWf2U0ro0qnGU8Mg",
|
||||
name: "Namika",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Namika"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_V5f8YfHKp2j",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "ufpny1KxwcU",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 196,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/S9htVpH2mk6tD6pG9SDcmKYvaXTzS5XfFDDGdWBJpK-QqffLTVT3V9BrA7uSiIy_vJlpyVotPcQhFdNBfw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/S9htVpH2mk6tD6pG9SDcmKYvaXTzS5XfFDDGdWBJpK-QqffLTVT3V9BrA7uSiIy_vJlpyVotPcQhFdNBfw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCk-g5nfpm8Q9gfy7DuU8PZA",
|
||||
name: "VVIER",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("VVIER"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_Oc7tpyMz6uE",
|
||||
name: "Zusammen",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "duzWgZFJNwA",
|
||||
title: "Lieblingsmensch (Übernice Remix)",
|
||||
duration: 184,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCIh4j8fXWf2U0ro0qnGU8Mg",
|
||||
name: "Namika",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Namika"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_V5f8YfHKp2j",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "rnXq-1n0lt0",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 223,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/slp9kDTF1UHk6WcR6FgWuWP2uF0R4OK0Ljeh8wu8FJ6sy3qAy-KjdGnDbb37FPlOd9sXnO8HItnGWbLgjg=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/slp9kDTF1UHk6WcR6FgWuWP2uF0R4OK0Ljeh8wu8FJ6sy3qAy-KjdGnDbb37FPlOd9sXnO8HItnGWbLgjg=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCDBvf2dl0XZQvIKPsrsDprg",
|
||||
name: "Sebó",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Sebó"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_X5boeaZWzPX",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "vHkqdC6-rOI",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 259,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/28SryO8FUVn7wv1nnY9KXRXQrcTI3WBxXvi8LP3h218aMqwpMVsJ2FW5cTiAJvLk9T6UVb1Ex4aq4BnUxQ=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/28SryO8FUVn7wv1nnY9KXRXQrcTI3WBxXvi8LP3h218aMqwpMVsJ2FW5cTiAJvLk9T6UVb1Ex4aq4BnUxQ=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC2_O7ywkwEh-crQedvyNOYg",
|
||||
name: "DIA Herbst",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("DIA Herbst"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_8f4SNZ8HDhD",
|
||||
name: "Lieblingsmensch",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "nTlceSET_b8",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 190,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/qMk9Q2DY1rwbdyJx7G2vWUgOiW1y1JEi8gRxMAorrayzPPxvjF5QbDy3lK-G3bgPyCowxNudDQPs4I-2=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/qMk9Q2DY1rwbdyJx7G2vWUgOiW1y1JEi8gRxMAorrayzPPxvjF5QbDy3lK-G3bgPyCowxNudDQPs4I-2=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [],
|
||||
artists_txt: Some("Jasmin Bick"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_6PhWrMAoiO3",
|
||||
name: "Volksmusik Sommer 2017",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "D8GhmRiIfxI",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 173,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/o2NBiflfACN6lJQFOkB-xFywBd61nmejQa_8JgEksiZ3rnpBdUp_W1T9f4sD-QbJuLyvaS4E9WPhvlc=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/o2NBiflfACN6lJQFOkB-xFywBd61nmejQa_8JgEksiZ3rnpBdUp_W1T9f4sD-QbJuLyvaS4E9WPhvlc=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCtsMcVBiK9QvtS2LH8Z6M5g",
|
||||
name: "Apres Ski",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Apres Ski"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_4HeyZ3um21Q",
|
||||
name: "Ballermann Stars - Après Ski Hits 2016 Party (Die XXL Schlager Party im Karneval und Fasching der Saison 2015 bis 2016)",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "01CS-jTaY1U",
|
||||
title: "Je Ne Parle Pas Français (Instrumental)",
|
||||
duration: 196,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/dq-4hwakOMJ_HCWEo7fHOOWg3g1X0bl4UPtwuhuEScfYwh38WeXM5zmSk9vTxClkFRynOTEH4RaUJ3q_=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/dq-4hwakOMJ_HCWEo7fHOOWg3g1X0bl4UPtwuhuEScfYwh38WeXM5zmSk9vTxClkFRynOTEH4RaUJ3q_=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC16V9XG1PfOD1E0m6G-s22A",
|
||||
name: "Trap Lion Beats",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Trap Lion Beats"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_BVRbZ6muIXJ",
|
||||
name: "25 Trap Beats, Vol. 5",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "2sKkKKKXO28",
|
||||
title: "Lieblingsmensch",
|
||||
duration: 190,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oxm4SNpnYnyfxlcD7KYOGO5Tpbunenzwi6N7nQgqyhvMjTA-YeND2Bxbozdmmc53bn30PMX0wlNSOJtYcw=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/Oxm4SNpnYnyfxlcD7KYOGO5Tpbunenzwi6N7nQgqyhvMjTA-YeND2Bxbozdmmc53bn30PMX0wlNSOJtYcw=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [],
|
||||
artists_txt: Some("Eva Florist"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_wRHz8l7GRIp",
|
||||
name: "Ballermann Raketen - Die Party Hits für Weihnachten und die Silvester Schlager Fete der Saison 2015 bis 2016",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
TrackItem(
|
||||
id: "czlgl6n9voM",
|
||||
title: "Lieblingsmensch (Live @ DELUXE MUSIC SESSION)",
|
||||
duration: 176,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/wnE86gP7vC4WtwqcD1Wh4OWgQgrCXhNgvYlu2KmdzAXpmc1JZo8NWBHL7tmTC9hzU0gEt8ZZm6WDYNbA=w60-h60-l90-rj",
|
||||
width: 60,
|
||||
height: 60,
|
||||
),
|
||||
Thumbnail(
|
||||
url: "https://lh3.googleusercontent.com/wnE86gP7vC4WtwqcD1Wh4OWgQgrCXhNgvYlu2KmdzAXpmc1JZo8NWBHL7tmTC9hzU0gEt8ZZm6WDYNbA=w120-h120-l90-rj",
|
||||
width: 120,
|
||||
height: 120,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCIh4j8fXWf2U0ro0qnGU8Mg",
|
||||
name: "Namika",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Namika"),
|
||||
album: Some(AlbumId(
|
||||
id: "MPREb_eew4y1xo5Q3",
|
||||
name: "Live @ DELUXE MUSIC SESSION",
|
||||
)),
|
||||
view_count: None,
|
||||
is_video: false,
|
||||
),
|
||||
],
|
||||
ctoken: Some("EqcDEg5saWJsaW5nc21lbnNjaBqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVFzMk5EZzFVR2hQZEVoNldZSUJDM0IwTUZsMlptNW9SMmRKZ2dFTFZtbHVTbTFJTFhWcFpGbUNBUXRaYlZOdGVXMUlVbTVGUllJQkMxUm5aa2xpYVVoRFQweHZnZ0VMYkVOcE5rNWZkWEV6ZGtXQ0FRdFJTV3B4WlRKQ00xSmtVWUlCQzNFeWNGVnZkR3hZVUdWTmdnRUxNSGxRYm5abGRFTnRMVldDQVF0RlZUVldiSGsyTUZaSFZZSUJDMVZ1ZUZFd1ZFazBTVTF6Z2dFTGRXWndibmt4UzNoM1kxV0NBUXRrZFhwWFoxcEdTazUzUVlJQkMzSnVXSEV0TVc0d2JIUXdnZ0VMZGtocmNXUkROaTF5VDBtQ0FRdHVWR3hqWlZORlZGOWlPSUlCQzBRNFIyaHRVbWxKWm5oSmdnRUxNREZEVXkxcVZHRlpNVldDQVFzeWMwdHJTMHRMV0U4eU9JSUJDMk42Ykdkc05tNDVkbTlOGPHq0C4%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: Some("lieblingsmensch"),
|
||||
)
|
||||
|
|
@ -0,0 +1,454 @@
|
|||
---
|
||||
source: src/client/music_search.rs
|
||||
expression: map_res.c
|
||||
---
|
||||
MusicSearchFiltered(
|
||||
items: Paginator(
|
||||
count: None,
|
||||
items: [
|
||||
TrackItem(
|
||||
id: "ZeerrnuLi5E",
|
||||
title: "Black Mamba",
|
||||
duration: 230,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/ZeerrnuLi5E/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3maNxpYzTFmXZBd8s1w1iE6rTBDaw",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("aespa"),
|
||||
album: None,
|
||||
view_count: Some(235000000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "vbl9KrZxOF8",
|
||||
title: "Black Mamba DJ set - Boko! Boko! | @Beatport Live",
|
||||
duration: 4447,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/vbl9KrZxOF8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nmPW2KSv4XyDSzKb1A1GYC8MDpmw",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCyEMqKQPGdj8wKVKt2-agbQ",
|
||||
name: "Beatport",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Beatport"),
|
||||
album: None,
|
||||
view_count: Some(6400),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "eMfROJt0a7Q",
|
||||
title: "aespa - \"Black Mamba\" @ KAMP LA 2022 Day 2",
|
||||
duration: 198,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/eMfROJt0a7Q/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3k-qlA2eSgHl3JKGSVUF6YLDuU09w",
|
||||
width: 320,
|
||||
height: 180,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC0PlwwXUJihXdol4I9vuE0g",
|
||||
name: "PridePKJ",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("PridePKJ"),
|
||||
album: None,
|
||||
view_count: Some(701),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "1ktLEhfkBCI",
|
||||
title: "ANKATHIE KOI - BLACK MAMBA (official)",
|
||||
duration: 230,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/1ktLEhfkBCI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k_xzZs28i_w4pNyz630i9whVDyGQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCzP_LIeF9W26F7o03k-Y9CQ",
|
||||
name: "Seayou Records",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Seayou Records"),
|
||||
album: None,
|
||||
view_count: Some(80000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "2hAlp3Khsnk",
|
||||
title: "The Black Mamba - Love Is On My Side - Portugal 🇵🇹 - Official Video - Eurovision 2021",
|
||||
duration: 189,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/2hAlp3Khsnk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nWe-5Mng_LKafQ_39Wc47rgiIaUQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCRpjHHu8ivVWs73uxHlWwFA",
|
||||
name: "Eurovision Song Contest",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Eurovision Song Contest"),
|
||||
album: None,
|
||||
view_count: Some(1100000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "CHixjhwY0ek",
|
||||
title: "aespa, Black Mamba (에스파, Black Mamba) with Goyang Philharmonic Orchestra [UN DAY CONCERT 2021]",
|
||||
duration: 238,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/CHixjhwY0ek/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nT_bNQ-v6o82RVmUPdowGPoT3sjQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCoRXPcv8XK5fAplLbk9PTww",
|
||||
name: "THE K-POP",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("THE K-POP"),
|
||||
album: None,
|
||||
view_count: Some(269000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "8YXKgZ393Ec",
|
||||
title: "Kronos - Black Mamba",
|
||||
duration: 157,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/8YXKgZ393Ec/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muPb_raK0T9xU_a0T3L-wxg7iOUg",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCsw9NVMkJfbxHTuMUMlk3mw",
|
||||
name: "Dj Kronos",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Dj Kronos"),
|
||||
album: None,
|
||||
view_count: Some(32000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "KFNznAXnjXc",
|
||||
title: "AESPA - Black Mamba (Teaser Demo/Instrumental)",
|
||||
duration: 112,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/KFNznAXnjXc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ne7MVklbB0HR0wixtu3aq0ikctEA",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCBju0pyQY7EWRvLqMkXcxBw",
|
||||
name: "1O1% MUSIC",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("1O1% MUSIC"),
|
||||
album: None,
|
||||
view_count: Some(179000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "hDhJeJZmTDA",
|
||||
title: "aespa (에스파) - Black Mamba | INK Incheon K-Pop Concert | MTV Asia",
|
||||
duration: 178,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/hDhJeJZmTDA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nE5LbHIjTYSTz-A_t662nHkN5yfQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCawCt_6XWaFxZSW5ZKcIMew",
|
||||
name: "MTV ASIA",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("MTV ASIA"),
|
||||
album: None,
|
||||
view_count: Some(69000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "6kKSDXiip_8",
|
||||
title: "aespa エスパ - Black Mamba",
|
||||
duration: 185,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/6kKSDXiip_8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mx7ocT3O3S758oGGfbKdR0QjmfGQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC_vrqgb3YLoe2MYSJm2aO-A",
|
||||
name: "K-Series : STORY & MUSIC",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("K-Series : STORY & MUSIC"),
|
||||
album: None,
|
||||
view_count: Some(28000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "vfzlr70ogaI",
|
||||
title: "aespa(에스파) - Black Mamba (Music Bank) | KBS WORLD TV 201211",
|
||||
duration: 190,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/vfzlr70ogaI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3m1NeOWJDh4HqGPPFfEnq4g2BLR3A",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UC5BMQOsAB8hKUyHu9KI6yig",
|
||||
name: "KBS WORLD TV",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("KBS WORLD TV"),
|
||||
album: None,
|
||||
view_count: Some(1300000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "Fjth6cKGI88",
|
||||
title: "aespa, Black Mamba\u{a0}(에스파, Black Mamba) [THE SHOW 201208]",
|
||||
duration: 179,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/Fjth6cKGI88/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k9DYBKdlPtxYcpLn_0oO7ikeQBtA",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCoRXPcv8XK5fAplLbk9PTww",
|
||||
name: "THE K-POP",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("THE K-POP"),
|
||||
album: None,
|
||||
view_count: Some(3000000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "fznwvW9Kn4s",
|
||||
title: "Love Is Dope",
|
||||
duration: 371,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/fznwvW9Kn4s/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nlnfAi-ia58ugtRW_mrT9NPstp7w",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCaDT20-B3U8h-tPg_VMvntw",
|
||||
name: "The Black Mamba",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("The Black Mamba"),
|
||||
album: None,
|
||||
view_count: Some(49000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "Jore0zZW-_M",
|
||||
title: "The Tunnel — Black Mamba (dj-set)",
|
||||
duration: 3881,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/Jore0zZW-_M/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ktaYDC0Dsl_VM2sQLoeHbE5TzTIw",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEAgugIw6pHGg7MRlkOU1Dw",
|
||||
name: "Studio Brussel",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Studio Brussel"),
|
||||
album: None,
|
||||
view_count: Some(29000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "_THM-2Ph-6I",
|
||||
title: "Black Mamba / Turn to Stone Cover",
|
||||
duration: 355,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/_THM-2Ph-6I/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k5xZOdoOkY9QjEe7xvhtTLyYsm0w",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCAj9gLNfM0q3MFhovVmAtBw",
|
||||
name: "Achim Müller",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Achim Müller"),
|
||||
album: None,
|
||||
view_count: Some(823),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "koJAGIUlnD0",
|
||||
title: "The Black Mamba - Love Is On My Side - Portugal 🇵🇹 - Second Semi-Final - Eurovision 2021",
|
||||
duration: 204,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/koJAGIUlnD0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kRXIHk7K8ax2DBjcZzZcqRJAzg5g",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCRpjHHu8ivVWs73uxHlWwFA",
|
||||
name: "Eurovision Song Contest",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Eurovision Song Contest"),
|
||||
album: None,
|
||||
view_count: Some(1800000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "4tvQPrHcR4w",
|
||||
title: "Black Mamba - aespa(에스파) [뮤직뱅크/Music Bank] | KBS 201211 방송",
|
||||
duration: 181,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/4tvQPrHcR4w/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n1v_80gL-nZ7CxpmU2hfXFP31HXw",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCeLPm9yH_a_QH8n6445G-Ow",
|
||||
name: "KBS Kpop",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("KBS Kpop"),
|
||||
album: None,
|
||||
view_count: Some(4400000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "CUh6MTvB_4E",
|
||||
title: "The Black Mamba - Love Is On My Side (long version)",
|
||||
duration: 343,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/CUh6MTvB_4E/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lR1QEW6JiCq8M9h9It_vjiU_3vCQ",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCaDT20-B3U8h-tPg_VMvntw",
|
||||
name: "The Black Mamba",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("The Black Mamba"),
|
||||
album: None,
|
||||
view_count: Some(1300),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "4TWR90KJl84",
|
||||
title: "Next Level",
|
||||
duration: 236,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/4TWR90KJl84/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kl3LTK647n1QMNk2ltojkKT5jR8w",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCEdZAdnnKqbaHOlv8nM6OtA",
|
||||
name: "aespa",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("aespa"),
|
||||
album: None,
|
||||
view_count: Some(249000000),
|
||||
is_video: true,
|
||||
),
|
||||
TrackItem(
|
||||
id: "Cw7eMibV-Xk",
|
||||
title: "BLACKPINK & AESPA - Pink Venom x Black Mamba (ft.Next Level) (Color Coded Lyrics) @Miggy Smallz",
|
||||
duration: 241,
|
||||
cover: [
|
||||
Thumbnail(
|
||||
url: "https://i.ytimg.com/vi/Cw7eMibV-Xk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mDFIPEb97IyOFO1AwUKBN9PK8eww",
|
||||
width: 400,
|
||||
height: 225,
|
||||
),
|
||||
],
|
||||
artists: [
|
||||
ChannelId(
|
||||
id: "UCB-TbzcDawIZVkG229eqnKg",
|
||||
name: "Sweet & Sour",
|
||||
),
|
||||
],
|
||||
artists_txt: Some("Sweet & Sour"),
|
||||
album: None,
|
||||
view_count: Some(15000),
|
||||
is_video: true,
|
||||
),
|
||||
],
|
||||
ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlRQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0YVpXVnljbTUxVEdrMVJZSUJDM1ppYkRsTGNscDRUMFk0Z2dFTFpVMW1VazlLZERCaE4xR0NBUXN4YTNSTVJXaG1hMEpEU1lJQkN6Sm9RV3h3TTB0b2MyNXJnZ0VMUTBocGVHcG9kMWt3Wld1Q0FRczRXVmhMWjFvek9UTkZZNElCQzB0R1RucHVRVmh1YWxoamdnRUxhRVJvU21WS1dtMVVSRUdDQVFzMmEwdFRSRmhwYVhCZk9JSUJDM1ptZW14eU56QnZaMkZKZ2dFTFJtcDBhRFpqUzBkSk9EaUNBUXRtZW01M2RsYzVTMjQwYzRJQkMwcHZjbVV3ZWxwWExWOU5nZ0VMWDFSSVRTMHlVR2d0TmttQ0FRdHJiMHBCUjBsVmJHNUVNSUlCQ3pSMGRsRlFja2hqVWpSM2dnRUxRMVZvTmsxVWRrSmZORVdDQVFzMFZGZFNPVEJMU213NE5JSUJDME4zTjJWTmFXSldMVmhyGPHq0C4%3D"),
|
||||
endpoint: music_search,
|
||||
),
|
||||
corrected_query: None,
|
||||
)
|
||||
|
|
@ -440,4 +440,10 @@ MusicSearchResult(
|
|||
),
|
||||
],
|
||||
corrected_query: Some("lieblingsmensch"),
|
||||
order: [
|
||||
Album,
|
||||
Track,
|
||||
Playlist,
|
||||
Artist,
|
||||
],
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: src/client/pagination.rs
|
||||
expression: map_res.c
|
||||
expression: paginator
|
||||
---
|
||||
Paginator(
|
||||
count: None,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
source: src/client/music_playlist.rs
|
||||
expression: map_res.c
|
||||
source: src/client/pagination.rs
|
||||
expression: paginator
|
||||
---
|
||||
Paginator(
|
||||
count: None,
|
||||
|
|
@ -2250,5 +2250,5 @@ Paginator(
|
|||
),
|
||||
],
|
||||
ctoken: Some("4qmFsgI8EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFGVnZFFWRHBEVGtGQ2tnRURDTG9F"),
|
||||
endpoint: browse,
|
||||
endpoint: music_browse,
|
||||
)
|
||||
|
|
@ -731,7 +731,7 @@ SearchResult(
|
|||
)),
|
||||
],
|
||||
ctoken: Some("EqsDEgpkb29ieWRvYmFwGpwDU0JTQ0FSaFZRMmc0WjBoa2RIcFBNblJZWkRVNU0xOWlha1Z5VjJlQ0FRc3hWbGMzYVZoU1NYSmpPSUlCQ3psT2RXaExRM1l6WTNKbmdnRUxhRWRpVVRKWFRUbHVUMi1DQVF0UWVFZHRVRFIyWDBFek9JSUJDek00UjJRMlZHUnRUbFp6Z2dFTFEzVjBVbDh4VTBSRWVsbUNBUXR3VWxaVFpGVjRaSE5XZDRJQkMwdFZlamR2UVhKcmMxSTBnZ0VMYzFCaU1tZDVUaTFvYmtXQ0FRdHljbWwzU0dvNFZUWTJOSUlCQzFCWWMwczVMVU5HYjBnMGdnRUxZbGhpYlZsbGJGUnVhSGVDQVFzd2IyNVdZa0YxUWtkWFNZSUJDMFpMU25SeVZXVnZiRE52Z2dFTFpHdE5kRk55YWtSTVR6Q0NBUXR5TW5sbE5ucFhNRzVpVFlJQkMwNTFaRlJpYnpKRFNrMVpnZ0VMWjBzdGFreHVkbFp6WWpDQ0FRdG1RVVpHVkU5d1ZVNVhiN0lCQmdvRUNCY1FBZyUzRCUzRBiB4OgYIgtzZWFyY2gtZmVlZA%3D%3D"),
|
||||
endpoint: browse,
|
||||
endpoint: search,
|
||||
),
|
||||
corrected_query: Some("doobydobap"),
|
||||
visitor_data: Some("Cgs4MEJMc3FmVzVadyiNy4-aBg%3D%3D"),
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ SearchResult(
|
|||
count: Some(0),
|
||||
items: [],
|
||||
ctoken: None,
|
||||
endpoint: browse,
|
||||
endpoint: search,
|
||||
),
|
||||
corrected_query: None,
|
||||
visitor_data: Some("Cgs1Q0NxX3llelBxWSi85ZGaBg%3D%3D"),
|
||||
|
|
|
|||
|
|
@ -688,7 +688,7 @@ SearchResult(
|
|||
)),
|
||||
],
|
||||
ctoken: Some("EqIJEgNwb3AamglFZ0lRQTBnVWdnRXJVa1JEVEVGTE5YVjVYMjV0VXpOWmIzaFRkMVpXVVdzNWJFVlJTakJWV0RSYVEycFljMWRmY0hOVk9JSUJLMUpFUTB4QlN6VjFlVjl0VmtvelVsSnBYMWxDWmxWS2JscHVVWGhNUVdWa1VWRmpXRWgxYW1KVlkyZUNBU3RTUkVOTVFVczFkWGxmYldaa2NYWkRRV3c0ZDI5a2JIZ3lVREpmUVdreVowNXJhVkpFUVhWbWEydEpnZ0VyVWtSRFRFRkxOWFY1WDI1SVUzRkRTbXBFY2xjNVNFSm9RMDVrUmpaMFYxQmtiazlOYm1kUGRqQjNRWUlCSzFKRVEweEJTelYxZVY5c1lqWkRWbFUyVXpSMVZuVm5URlpPVkZVNVYyaHhabUZ2YlZkQloyNW9ielNDQVN0U1JFTk1RVXMxZFhsZmJrUk1PRXRsUW5KVllXZDNlVWxUZDA1dGVVVnBVMlpaWjNveFoxWkRaWE5uZ2dFaVVFeEVTVzlWVDJoUlVWQnNWbkl6Y1dWd1RWWlNjMFJsTkZRNGRrNVJjM1p1YjRJQksxSkVRMHhCU3pWMWVWOXVabk5mZERSR1ZYVXdNRVUxUlVRMmJIWmxSVUpDV0RGV1RWbGxNVzFHYW11Q0FTdFNSRU5NUVVzMWRYbGZiVjh3VlRWV1VVNTVlWHAzZDBneGJGSnBOMk5RUVVGSFdIRk9VVzVCVDNGWmdnRXJVa1JEVEVGTE5YVjVYMjFJVnpWaVkyUjFhR3BDTFZCclZHVlFRV1UyUlc5U1RXb3hlRTVVT0dkNldZSUJLMUpFUTB4QlN6VjFlVjlyVUhGS1gwWnBSMnN0YkdKWWRHZE5ORWxHTkRKMWIydHphMU5LV21sV1ZFbUNBU0pRVEVsZk4wMW5NbHBmTFRSTVpqZEpXV1ZwVkVWUFZqaElRbTR0YmsxeGVqVk9nZ0VpVUV4WU5rdzBkRGQwTmxwaGJtWkRTakYzUW5oU1pFZGFYMjFyT1hsbmJVdHhiNElCSWxCTVRVTTVTMDVyU1c1alMzUlFlbWRaTFRWeWJXaDJhamRtWVhnNFptUjRiMnFDQVNKUVRHZFNaSEJvTUhGUVRIazFNMGxvV1hKUlRGQndRVlJFUkVFeVZIQkdaWGsxZ2dFclVrUkRURUZMTlhWNVgyNURWa1pmZWxWYWFYcDZVbU52YWtsVmRWbHRZVmg0VFc5UVoyY3lWMDFFYjRJQksxSkVRMHhCU3pWMWVWOXNXVFpLUm5Kek4xYzVlVWxvUm1wVlRsOTVlRkZmZFdKcmFtTnljVkZoVm5PQ0FTdFNSRU5NUVVzMWRYbGZiRGRMTnpock5FVnJhbU5HYjJwb1pERTJNVGR5YlZWcVdTMWhaWFEyTFhRd2dnRXJVa1JEVEVGTE5YVjVYMnhxTFhwQ1JYaFdXV3czV1U1ZlRuaFlZbTlFU1dnMFFTMTNTMGRtWjNwT1dZSUJJbEJNUkVsdlZVOW9VVkZRYkZoeGVqVlJXak5rZUMxc2FGOXdObEpqVUdWTGFuYXlBUVlLQkFnVkVBSSUzRBiB4OgYIgtzZWFyY2gtZmVlZA%3D%3D"),
|
||||
endpoint: browse,
|
||||
endpoint: search,
|
||||
),
|
||||
corrected_query: None,
|
||||
visitor_data: Some("CgstZjhyS1IyR1R6dyiX4JGaBg%3D%3D"),
|
||||
|
|
|
|||
|
|
@ -413,7 +413,7 @@ impl MapResponse<Paginator<Comment>> for response::VideoComments {
|
|||
|
||||
fn map_recommendations(
|
||||
r: MapResult<Vec<response::YouTubeListItem>>,
|
||||
continuations: Option<Vec<response::MusicContinuation>>,
|
||||
continuations: Option<Vec<response::MusicContinuationData>>,
|
||||
visitor_data: Option<String>,
|
||||
lang: Language,
|
||||
) -> MapResult<Paginator<VideoItem>> {
|
||||
|
|
|
|||
|
|
@ -1,34 +1,88 @@
|
|||
use super::{Channel, ChannelId, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem};
|
||||
use super::{
|
||||
AlbumItem, ArtistItem, Channel, ChannelId, ChannelItem, ChannelTag, MusicItem,
|
||||
MusicPlaylistItem, PlaylistItem, TrackItem, VideoItem, YouTubeItem,
|
||||
};
|
||||
|
||||
impl TryFrom<YouTubeItem> for VideoItem {
|
||||
type Error = ();
|
||||
pub trait FromYtItem: Sized {
|
||||
fn from_yt_item(_item: YouTubeItem) -> Option<Self> {
|
||||
None
|
||||
}
|
||||
fn from_ytm_item(_item: MusicItem) -> Option<Self> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn try_from(value: YouTubeItem) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
YouTubeItem::Video(video) => Ok(video),
|
||||
_ => Err(()),
|
||||
impl FromYtItem for YouTubeItem {
|
||||
fn from_yt_item(item: YouTubeItem) -> Option<Self> {
|
||||
Some(item)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromYtItem for VideoItem {
|
||||
fn from_yt_item(item: YouTubeItem) -> Option<Self> {
|
||||
match item {
|
||||
YouTubeItem::Video(video) => Some(video),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<YouTubeItem> for PlaylistItem {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(value: YouTubeItem) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
YouTubeItem::Playlist(playlist) => Ok(playlist),
|
||||
_ => Err(()),
|
||||
impl FromYtItem for PlaylistItem {
|
||||
fn from_yt_item(item: YouTubeItem) -> Option<Self> {
|
||||
match item {
|
||||
YouTubeItem::Playlist(playlist) => Some(playlist),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<YouTubeItem> for ChannelItem {
|
||||
type Error = ();
|
||||
impl FromYtItem for ChannelItem {
|
||||
fn from_yt_item(item: YouTubeItem) -> Option<Self> {
|
||||
match item {
|
||||
YouTubeItem::Channel(channel) => Some(channel),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn try_from(value: YouTubeItem) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
YouTubeItem::Channel(channel) => Ok(channel),
|
||||
_ => Err(()),
|
||||
impl FromYtItem for MusicItem {
|
||||
fn from_ytm_item(item: MusicItem) -> Option<Self> {
|
||||
Some(item)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromYtItem for TrackItem {
|
||||
fn from_ytm_item(item: MusicItem) -> Option<Self> {
|
||||
match item {
|
||||
MusicItem::Track(track) => Some(track),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromYtItem for AlbumItem {
|
||||
fn from_ytm_item(item: MusicItem) -> Option<Self> {
|
||||
match item {
|
||||
MusicItem::Album(album) => Some(album),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromYtItem for ArtistItem {
|
||||
fn from_ytm_item(item: MusicItem) -> Option<Self> {
|
||||
match item {
|
||||
MusicItem::Artist(artist) => Some(artist),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FromYtItem for MusicPlaylistItem {
|
||||
fn from_ytm_item(item: MusicItem) -> Option<Self> {
|
||||
match item {
|
||||
MusicItem::Playlist(playlist) => Some(playlist),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ mod ordering;
|
|||
mod paginator;
|
||||
pub mod richtext;
|
||||
|
||||
pub(crate) use convert::FromYtItem;
|
||||
pub use paginator::Paginator;
|
||||
use serde_with::serde_as;
|
||||
|
||||
|
|
@ -1036,4 +1037,33 @@ pub struct MusicSearchResult {
|
|||
/// for the corrected search term and displays it on top of the
|
||||
/// search results page.
|
||||
pub corrected_query: Option<String>,
|
||||
pub order: Vec<MusicEntityType>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub enum MusicItem {
|
||||
Track(TrackItem),
|
||||
Album(AlbumItem),
|
||||
Artist(ArtistItem),
|
||||
Playlist(MusicPlaylistItem),
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub enum MusicEntityType {
|
||||
Track,
|
||||
Album,
|
||||
Artist,
|
||||
Playlist,
|
||||
}
|
||||
|
||||
/// Filtered YouTube Music search result
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub struct MusicSearchFiltered<T> {
|
||||
pub items: Paginator<T>,
|
||||
/// Corrected search query
|
||||
///
|
||||
/// If the search term containes a typo, YouTube instead searches
|
||||
/// for the corrected search term and displays it on top of the
|
||||
/// search results page.
|
||||
pub corrected_query: Option<String>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,19 +9,29 @@ pub use stream_filter::StreamFilter;
|
|||
|
||||
/// YouTube API endpoint to fetch continuations from
|
||||
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
#[non_exhaustive]
|
||||
pub enum ContinuationEndpoint {
|
||||
Browse,
|
||||
Search,
|
||||
Next,
|
||||
MusicBrowse,
|
||||
MusicSearch,
|
||||
}
|
||||
|
||||
impl ContinuationEndpoint {
|
||||
pub(crate) fn as_str(self) -> &'static str {
|
||||
match self {
|
||||
ContinuationEndpoint::Browse => "browse",
|
||||
ContinuationEndpoint::Search => "search",
|
||||
ContinuationEndpoint::Browse | ContinuationEndpoint::MusicBrowse => "browse",
|
||||
ContinuationEndpoint::Search | ContinuationEndpoint::MusicSearch => "search",
|
||||
ContinuationEndpoint::Next => "next",
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn is_music(self) -> bool {
|
||||
matches!(
|
||||
self,
|
||||
ContinuationEndpoint::MusicBrowse | ContinuationEndpoint::MusicSearch
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
10019
testfiles/music_search/albums.json
Normal file
10019
testfiles/music_search/albums.json
Normal file
File diff suppressed because it is too large
Load diff
3242
testfiles/music_search/artists.json
Normal file
3242
testfiles/music_search/artists.json
Normal file
File diff suppressed because it is too large
Load diff
9130
testfiles/music_search/playlists_community.json
Normal file
9130
testfiles/music_search/playlists_community.json
Normal file
File diff suppressed because it is too large
Load diff
9010
testfiles/music_search/playlists_ytm.json
Normal file
9010
testfiles/music_search/playlists_ytm.json
Normal file
File diff suppressed because it is too large
Load diff
10224
testfiles/music_search/tracks_default.json
Normal file
10224
testfiles/music_search/tracks_default.json
Normal file
File diff suppressed because it is too large
Load diff
10131
testfiles/music_search/tracks_typo.json
Normal file
10131
testfiles/music_search/tracks_typo.json
Normal file
File diff suppressed because it is too large
Load diff
8894
testfiles/music_search/tracks_videos.json
Normal file
8894
testfiles/music_search/tracks_videos.json
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1197,6 +1197,14 @@ async fn search() {
|
|||
assert!(!result.items.is_exhausted());
|
||||
|
||||
assert_eq!(result.corrected_query.unwrap(), "doobydobap");
|
||||
|
||||
let next = result.items.next(&rp.query()).await.unwrap().unwrap();
|
||||
assert!(
|
||||
next.items.len() > 10,
|
||||
"expected > 10 continuation results, got {}",
|
||||
next.items.len()
|
||||
);
|
||||
assert!(!next.is_exhausted());
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
|
|
|
|||
Reference in a new issue