use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct SearchResponse {
pub(crate) result: Option<SearchResultData>,
#[serde(rename = "code")]
pub(crate) code: Option<i64>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct SearchResultData {
pub(crate) songs: Option<Vec<Song>>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct Song {
pub(crate) id: i64,
pub(crate) name: String,
pub(crate) artists: Vec<Artist>,
pub(crate) album: Album,
pub(crate) duration: i64,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct Artist {
#[serde(rename = "id", default)]
pub(crate) _id: i64,
pub(crate) name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct Album {
#[serde(rename = "id", default)]
pub(crate) _id: i64,
pub(crate) name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct EapiSearchResponse {
pub(crate) result: Option<EapiSearchResultData>,
pub(crate) code: Option<i64>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct EapiSearchResultData {
pub(crate) songs: Option<Vec<EapiSong>>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct EapiSong {
pub(crate) id: i64,
pub(crate) name: String,
#[serde(rename = "ar")]
pub(crate) artists: Vec<Artist>,
#[serde(rename = "al")]
pub(crate) album: Album,
#[serde(rename = "dt")]
pub(crate) duration: i64,
}
impl From<EapiSong> for Song {
fn from(song: EapiSong) -> Self {
Self {
id: song.id,
name: song.name,
artists: song.artists,
album: song.album,
duration: song.duration,
}
}
}
impl From<EapiSearchResponse> for SearchResponse {
fn from(response: EapiSearchResponse) -> Self {
Self {
result: response.result.map(|result| SearchResultData {
songs: result
.songs
.map(|songs| songs.into_iter().map(Song::from).collect()),
}),
code: response.code,
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct LyricsResponse {
pub code: Option<i32>,
pub lrc: Option<LyricContent>,
pub tlyric: Option<LyricContent>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct LyricContent {
pub lyric: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct SyllableLyricsResponse {
pub(crate) yrc: Option<LyricContent>,
pub(crate) ytlrc: Option<LyricContent>,
pub(crate) yromalrc: Option<LyricContent>,
}