feat: music search filter/cont, refactored paginator

This commit is contained in:
ThetaDev 2022-10-31 23:05:27 +01:00
parent d29bbd8b25
commit dac2b17dc2
38 changed files with 65313 additions and 247 deletions

View file

@ -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();
}
}

View file

@ -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")]

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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,
}

View file

@ -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,
}
}
}

View file

@ -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,
}

View file

@ -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

View file

@ -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,
},

View file

@ -2266,6 +2266,6 @@ MusicPlaylist(
),
],
ctoken: Some("4qmFsgI-EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFmVnWlFWRHBEUjFtU0FRTUl1Z1ElM0Q%3D"),
endpoint: browse,
endpoint: music_browse,
),
)

View file

@ -1156,6 +1156,6 @@ MusicPlaylist(
),
],
ctoken: None,
endpoint: browse,
endpoint: music_browse,
),
)

View file

@ -2046,6 +2046,6 @@ MusicPlaylist(
),
],
ctoken: None,
endpoint: browse,
endpoint: music_browse,
),
)

View file

@ -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,
)

View file

@ -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,
)

View file

@ -431,4 +431,10 @@ MusicSearchResult(
),
],
corrected_query: None,
order: [
Track,
Album,
Artist,
Playlist,
],
)

View file

@ -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,
)

View file

@ -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,
)

View file

@ -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,
)

View file

@ -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"),
)

View file

@ -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,
)

View file

@ -440,4 +440,10 @@ MusicSearchResult(
),
],
corrected_query: Some("lieblingsmensch"),
order: [
Album,
Track,
Playlist,
Artist,
],
)

View file

@ -1,6 +1,6 @@
---
source: src/client/pagination.rs
expression: map_res.c
expression: paginator
---
Paginator(
count: None,

View file

@ -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,
)

View file

@ -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"),

View file

@ -7,7 +7,7 @@ SearchResult(
count: Some(0),
items: [],
ctoken: None,
endpoint: browse,
endpoint: search,
),
corrected_query: None,
visitor_data: Some("Cgs1Q0NxX3llelBxWSi85ZGaBg%3D%3D"),

View file

@ -688,7 +688,7 @@ SearchResult(
)),
],
ctoken: Some("EqIJEgNwb3AamglFZ0lRQTBnVWdnRXJVa1JEVEVGTE5YVjVYMjV0VXpOWmIzaFRkMVpXVVdzNWJFVlJTakJWV0RSYVEycFljMWRmY0hOVk9JSUJLMUpFUTB4QlN6VjFlVjl0VmtvelVsSnBYMWxDWmxWS2JscHVVWGhNUVdWa1VWRmpXRWgxYW1KVlkyZUNBU3RTUkVOTVFVczFkWGxmYldaa2NYWkRRV3c0ZDI5a2JIZ3lVREpmUVdreVowNXJhVkpFUVhWbWEydEpnZ0VyVWtSRFRFRkxOWFY1WDI1SVUzRkRTbXBFY2xjNVNFSm9RMDVrUmpaMFYxQmtiazlOYm1kUGRqQjNRWUlCSzFKRVEweEJTelYxZVY5c1lqWkRWbFUyVXpSMVZuVm5URlpPVkZVNVYyaHhabUZ2YlZkQloyNW9ielNDQVN0U1JFTk1RVXMxZFhsZmJrUk1PRXRsUW5KVllXZDNlVWxUZDA1dGVVVnBVMlpaWjNveFoxWkRaWE5uZ2dFaVVFeEVTVzlWVDJoUlVWQnNWbkl6Y1dWd1RWWlNjMFJsTkZRNGRrNVJjM1p1YjRJQksxSkVRMHhCU3pWMWVWOXVabk5mZERSR1ZYVXdNRVUxUlVRMmJIWmxSVUpDV0RGV1RWbGxNVzFHYW11Q0FTdFNSRU5NUVVzMWRYbGZiVjh3VlRWV1VVNTVlWHAzZDBneGJGSnBOMk5RUVVGSFdIRk9VVzVCVDNGWmdnRXJVa1JEVEVGTE5YVjVYMjFJVnpWaVkyUjFhR3BDTFZCclZHVlFRV1UyUlc5U1RXb3hlRTVVT0dkNldZSUJLMUpFUTB4QlN6VjFlVjlyVUhGS1gwWnBSMnN0YkdKWWRHZE5ORWxHTkRKMWIydHphMU5LV21sV1ZFbUNBU0pRVEVsZk4wMW5NbHBmTFRSTVpqZEpXV1ZwVkVWUFZqaElRbTR0YmsxeGVqVk9nZ0VpVUV4WU5rdzBkRGQwTmxwaGJtWkRTakYzUW5oU1pFZGFYMjFyT1hsbmJVdHhiNElCSWxCTVRVTTVTMDVyU1c1alMzUlFlbWRaTFRWeWJXaDJhamRtWVhnNFptUjRiMnFDQVNKUVRHZFNaSEJvTUhGUVRIazFNMGxvV1hKUlRGQndRVlJFUkVFeVZIQkdaWGsxZ2dFclVrUkRURUZMTlhWNVgyNURWa1pmZWxWYWFYcDZVbU52YWtsVmRWbHRZVmg0VFc5UVoyY3lWMDFFYjRJQksxSkVRMHhCU3pWMWVWOXNXVFpLUm5Kek4xYzVlVWxvUm1wVlRsOTVlRkZmZFdKcmFtTnljVkZoVm5PQ0FTdFNSRU5NUVVzMWRYbGZiRGRMTnpock5FVnJhbU5HYjJwb1pERTJNVGR5YlZWcVdTMWhaWFEyTFhRd2dnRXJVa1JEVEVGTE5YVjVYMnhxTFhwQ1JYaFdXV3czV1U1ZlRuaFlZbTlFU1dnMFFTMTNTMGRtWjNwT1dZSUJJbEJNUkVsdlZVOW9VVkZRYkZoeGVqVlJXak5rZUMxc2FGOXdObEpqVUdWTGFuYXlBUVlLQkFnVkVBSSUzRBiB4OgYIgtzZWFyY2gtZmVlZA%3D%3D"),
endpoint: browse,
endpoint: search,
),
corrected_query: None,
visitor_data: Some("CgstZjhyS1IyR1R6dyiX4JGaBg%3D%3D"),

View file

@ -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>> {

View file

@ -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,
}
}
}

View file

@ -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>,
}

View file

@ -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
)
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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]