rustypipe/src/client/response/music_search.rs
ThetaDev b7ecd1e4a3
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
fix: support MusicCardShelfRenderer (music search results)
2023-04-09 11:51:19 +02:00

80 lines
2.2 KiB
Rust

use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, VecSkipError};
use crate::serializer::text::Text;
use super::{
music_item::{ListMusicItem, MusicCardShelf, MusicShelf},
ContentsRenderer, SectionList, Tab,
};
/// Response model for YouTube Music search
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MusicSearch {
pub contents: Contents,
}
/// Response model for YouTube Music search suggestion
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MusicSearchSuggestion {
#[serde(default)]
#[serde_as(as = "VecSkipError<_>")]
pub contents: Vec<SearchSuggestionsSection>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Contents {
pub tabbed_search_results_renderer: ContentsRenderer<Tab<SectionList<ItemSection>>>,
}
#[allow(clippy::enum_variant_names)]
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) enum ItemSection {
MusicShelfRenderer(MusicShelf),
MusicCardShelfRenderer(MusicCardShelf),
ItemSectionRenderer {
#[serde_as(as = "VecSkipError<_>")]
contents: Vec<ShowingResultsFor>,
},
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ShowingResultsFor {
pub showing_results_for_renderer: ShowingResultsForRenderer,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ShowingResultsForRenderer {
#[serde_as(as = "Text")]
pub corrected_query: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct SearchSuggestionsSection {
pub search_suggestions_section_renderer: ContentsRenderer<SearchSuggestionItem>,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) enum SearchSuggestionItem {
SearchSuggestionRenderer {
#[serde_as(as = "Text")]
suggestion: String,
},
MusicResponsiveListItemRenderer(Box<ListMusicItem>),
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}