use pandora_api_derive::PandoraJsonRequest;
use serde::{Deserialize, Serialize};
use crate::errors::Error;
use crate::json::{PandoraJsonApiRequest, PandoraSession};
#[derive(Debug, Clone, Serialize, PandoraJsonRequest)]
#[pandora_request(encrypted = true)]
#[serde(rename_all = "camelCase")]
pub struct ExplainTrack {
pub track_token: String,
}
impl<TS: ToString> From<&TS> for ExplainTrack {
fn from(track_token: &TS) -> Self {
Self {
track_token: track_token.to_string(),
}
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExplainTrackResponse {
_explanations: Vec<Explanation>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Explanation {
pub focus_trait_name: String,
pub focus_trait_id: String,
}
pub async fn explain_track(
session: &mut PandoraSession,
track_token: &str,
) -> Result<ExplainTrackResponse, Error> {
ExplainTrack::from(&track_token).response(session).await
}
pub struct TrackStartedUnsupported {}
#[cfg(test)]
mod tests {
use super::*;
use crate::json::{
station::get_playlist, tests::session_login, user::get_station_list, Partner,
};
#[tokio::test]
async fn explain_track_test() {
let partner = Partner::default();
let mut session = session_login(&partner)
.await
.expect("Failed initializing login session");
if let Some(station) = get_station_list(&mut session)
.await
.expect("Failed getting station list to look up a track to bookmark")
.stations
.first()
{
if let Some(track) = get_playlist(&mut session, &station.station_token)
.await
.expect("Failed completing request for playlist")
.items
.iter()
.flat_map(|p| p.get_track())
.next()
{
let explain_track = explain_track(&mut session, &track.track_token)
.await
.expect("Failed submitting track explanation request");
log::debug!("Track explanation: {:?}", explain_track);
} else {
panic!("Playlist request returned no explainable results.");
}
} else {
panic!("Station list request returned no results, so no explanable content.");
}
}
}