Make standard metadata get handle also playlists

This commit is contained in:
HEnquist 2019-08-06 23:16:30 +02:00
parent 13458e5059
commit e7e0a8cf72

View file

@ -55,11 +55,11 @@ where
pub trait Metadata: Send + Sized + 'static { pub trait Metadata: Send + Sized + 'static {
type Message: protobuf::Message; type Message: protobuf::Message;
fn base_url() -> &'static str; fn request_url(id: SpotifyId) -> String;
fn parse(msg: &Self::Message, session: &Session) -> Self; fn parse(msg: &Self::Message, session: &Session) -> Self;
fn get(session: &Session, id: SpotifyId) -> Box<Future<Item = Self, Error = MercuryError>> { fn get(session: &Session, id: SpotifyId) -> Box<Future<Item = Self, Error = MercuryError>> {
let uri = format!("{}/{}", Self::base_url(), id.to_base16()); let uri = Self::request_url(id);
let request = session.mercury().get(uri); let request = session.mercury().get(uri);
let session = session.clone(); let session = session.clone();
@ -111,8 +111,8 @@ pub struct Artist {
impl Metadata for Track { impl Metadata for Track {
type Message = protocol::metadata::Track; type Message = protocol::metadata::Track;
fn base_url() -> &'static str { fn request_url(id: SpotifyId) -> String {
"hm://metadata/3/track" format!("hm://metadata/3/track/{}", id.to_base16())
} }
fn parse(msg: &Self::Message, session: &Session) -> Self { fn parse(msg: &Self::Message, session: &Session) -> Self {
@ -156,8 +156,8 @@ impl Metadata for Track {
impl Metadata for Album { impl Metadata for Album {
type Message = protocol::metadata::Album; type Message = protocol::metadata::Album;
fn base_url() -> &'static str { fn request_url(id: SpotifyId) -> String {
"hm://metadata/3/album" format!("hm://metadata/3/album/{}", id.to_base16())
} }
fn parse(msg: &Self::Message, _: &Session) -> Self { fn parse(msg: &Self::Message, _: &Session) -> Self {
@ -201,21 +201,8 @@ impl Metadata for Album {
impl Metadata for Playlist { impl Metadata for Playlist {
type Message = protocol::playlist4changes::SelectedListContent; type Message = protocol::playlist4changes::SelectedListContent;
fn base_url() -> &'static str { fn request_url(id: SpotifyId) -> String {
"hm://playlist/v2/playlist" format!("hm://playlist/v2/playlist/{}", id.to_base62())
}
fn get(session: &Session, id: SpotifyId) -> Box<Future<Item = Self, Error = MercuryError>> {
let uri = format!("{}/{}", Self::base_url(), id.to_base62());
let request = session.mercury().get(uri);
let session = session.clone();
Box::new(request.and_then(move |response| {
let data = response.payload.first().expect("Empty payload");
let msg: Self::Message = protobuf::parse_from_bytes(data).unwrap();
Ok(Self::parse(&msg, &session))
}))
} }
fn parse(msg: &Self::Message, _: &Session) -> Self { fn parse(msg: &Self::Message, _: &Session) -> Self {
@ -245,8 +232,8 @@ impl Metadata for Playlist {
impl Metadata for Artist { impl Metadata for Artist {
type Message = protocol::metadata::Artist; type Message = protocol::metadata::Artist;
fn base_url() -> &'static str { fn request_url(id: SpotifyId) -> String {
"hm://metadata/3/artist" format!("hm://metadata/3/artist/{}", id.to_base16())
} }
fn parse(msg: &Self::Message, session: &Session) -> Self { fn parse(msg: &Self::Message, session: &Session) -> Self {