librespot_metadata/
show.rs

1use std::fmt::Debug;
2
3use crate::{
4    Metadata, RequestResult, availability::Availabilities, copyright::Copyrights,
5    episode::Episodes, image::Images, restriction::Restrictions,
6};
7
8use librespot_core::{Error, Session, SpotifyUri};
9
10use librespot_protocol as protocol;
11pub use protocol::metadata::show::ConsumptionOrder as ShowConsumptionOrder;
12pub use protocol::metadata::show::MediaType as ShowMediaType;
13
14#[derive(Debug, Clone)]
15pub struct Show {
16    pub id: SpotifyUri,
17    pub name: String,
18    pub description: String,
19    pub publisher: String,
20    pub language: String,
21    pub is_explicit: bool,
22    pub covers: Images,
23    pub episodes: Episodes,
24    pub copyrights: Copyrights,
25    pub restrictions: Restrictions,
26    pub keywords: Vec<String>,
27    pub media_type: ShowMediaType,
28    pub consumption_order: ShowConsumptionOrder,
29    pub availability: Availabilities,
30    pub trailer_uri: Option<SpotifyUri>,
31    pub has_music_and_talk: bool,
32    pub is_audiobook: bool,
33}
34
35#[async_trait]
36impl Metadata for Show {
37    type Message = protocol::metadata::Show;
38
39    async fn request(session: &Session, show_uri: &SpotifyUri) -> RequestResult {
40        let SpotifyUri::Show { .. } = show_uri else {
41            return Err(Error::invalid_argument("show_uri"));
42        };
43
44        session.spclient().get_show_metadata(show_uri).await
45    }
46
47    fn parse(msg: &Self::Message, _: &SpotifyUri) -> Result<Self, Error> {
48        Self::try_from(msg)
49    }
50}
51
52impl TryFrom<&<Self as Metadata>::Message> for Show {
53    type Error = librespot_core::Error;
54    fn try_from(show: &<Self as Metadata>::Message) -> Result<Self, Self::Error> {
55        Ok(Self {
56            id: show.try_into()?,
57            name: show.name().to_owned(),
58            description: show.description().to_owned(),
59            publisher: show.publisher().to_owned(),
60            language: show.language().to_owned(),
61            is_explicit: show.explicit(),
62            covers: show.cover_image.image.as_slice().into(),
63            episodes: show.episode.as_slice().try_into()?,
64            copyrights: show.copyright.as_slice().into(),
65            restrictions: show.restriction.as_slice().into(),
66            keywords: show.keyword.to_vec(),
67            media_type: show.media_type(),
68            consumption_order: show.consumption_order(),
69            availability: show.availability.as_slice().try_into()?,
70            trailer_uri: show
71                .trailer_uri
72                .as_deref()
73                .filter(|s| !s.is_empty())
74                .map(SpotifyUri::from_uri)
75                .transpose()?,
76            has_music_and_talk: show.music_and_talk(),
77            is_audiobook: show.is_audiobook(),
78        })
79    }
80}