Implement StatsSitewideArtists endpoint

This commit is contained in:
Koen Bolhuis 2021-01-10 21:42:40 +01:00
parent 727ba956b7
commit 22b04846b2
3 changed files with 75 additions and 10 deletions

View File

@ -9,7 +9,7 @@ pub enum Endpoint<'a> {
UserPlayingNow(&'a str), UserPlayingNow(&'a str),
UserListens(&'a str), UserListens(&'a str),
LatestImport, LatestImport,
// StatsSitewideArtists, StatsSitewideArtists,
// StatsUserListeningActivity(&'a str), // StatsUserListeningActivity(&'a str),
// StatsUserDailyActivity(&'a str), // StatsUserDailyActivity(&'a str),
// StatsUserRecordings(&'a str), // StatsUserRecordings(&'a str),
@ -33,7 +33,7 @@ impl<'a> fmt::Display for Endpoint<'a> {
Self::UserPlayingNow(user) => return write!(f, "user/{}/playing-now", user), Self::UserPlayingNow(user) => return write!(f, "user/{}/playing-now", user),
Self::UserListens(user) => return write!(f, "user/{}/listens", user), Self::UserListens(user) => return write!(f, "user/{}/listens", user),
Self::LatestImport => "latest-import", Self::LatestImport => "latest-import",
// Self::StatsSitewideArtists => "stats/sitewide/artists", Self::StatsSitewideArtists => "stats/sitewide/artists",
// Self::StatsUserListeningActivity(user) => return write!(f, "stats/user/{}/listening-activity", user), // Self::StatsUserListeningActivity(user) => return write!(f, "stats/user/{}/listening-activity", user),
// Self::StatsUserDailyActivity(user) => return write!(f, "stats/user/{}/daily-activity", user), // Self::StatsUserDailyActivity(user) => return write!(f, "stats/user/{}/daily-activity", user),
// Self::StatsUserRecordings(user) => return write!(f, "stats/user/{}/recordings", user), // Self::StatsUserRecordings(user) => return write!(f, "stats/user/{}/recordings", user),

View File

@ -102,7 +102,6 @@ impl Client {
self.get(Endpoint::UserListenCount(user_name)) self.get(Endpoint::UserListenCount(user_name))
} }
// UserPlayingNow(&'a str),
/// Endpoint: `user/{user_name}/playing-now` /// Endpoint: `user/{user_name}/playing-now`
pub fn user_playing_now(&mut self, user_name: &str) -> Result<UserPlayingNowResponse, Error> { pub fn user_playing_now(&mut self, user_name: &str) -> Result<UserPlayingNowResponse, Error> {
self.get(Endpoint::UserPlayingNow(user_name)) self.get(Endpoint::UserPlayingNow(user_name))
@ -157,13 +156,41 @@ impl Client {
self.post(Endpoint::LatestImport, token, data) self.post(Endpoint::LatestImport, token, data)
} }
// StatsSitewideArtists, /// Endpoint: `stats/sitewide/artists`
// StatsUserListeningActivity(&'a str), pub fn stats_sitewide_artists(
// StatsUserDailyActivity(&'a str), &mut self,
// StatsUserRecordings(&'a str), count: Option<u64>,
// StatsUserArtistMap(&'a str), offset: Option<u64>,
// StatsUserReleases(&'a str), range: Option<&str>
// StatsUserArtists(&'a str), ) -> Result<StatsSitewideArtistsResponse, Error> {
let endpoint = format!("{}{}", API_ROOT_URL, Endpoint::StatsSitewideArtists);
let mut request = self.agent.get(&endpoint);
if let Some(count) = count {
request = request.query("count", &count.to_string());
}
if let Some(offset) = offset {
request = request.query("offset", &offset.to_string());
}
if let Some(range) = range {
request = request.query("range", range);
}
request.call()?.into_json().map_err(Error::ResponseJson)
}
// /// Endpoint: `stats/user/{user_name}/listening-activity`
// /// Endpoint: `stats/user/{user_name}/daily-activity`
// /// Endpoint: `stats/user/{user_name}/recordings`
// /// Endpoint: `stats/user/{user_name}/artist-map`
// /// Endpoint: `stats/user/{user_name}/releases`
// /// Endpoint: `stats/user/{user_name}/artists`
/// Endpoint: `status/get-dump-info` /// Endpoint: `status/get-dump-info`
pub fn status_get_dump_info( pub fn status_get_dump_info(

View File

@ -176,6 +176,44 @@ pub struct UpdateLatestImportResponse {
pub status: String, pub status: String,
} }
// --------- stats/sitewide/artists
/// Response type for [`Client::stats_sitewide_artists`](crate::Client::stats_sitewide_artists).
#[derive(Debug, Deserialize)]
pub struct StatsSitewideArtistsResponse {
pub payload: StatsSitewideArtistsPayload,
}
/// Type of the [`StatsSitewideArtistsResponse::payload`] field.
#[derive(Debug, Deserialize)]
pub struct StatsSitewideArtistsPayload {
pub time_ranges: Vec<StatsSitewideArtistsTimeRange>,
pub offset: u64,
pub count: u64,
pub range: String,
pub last_updated: i64,
pub from_ts: i64,
pub to_ts: i64,
}
/// Type of the [`StatsSitewideArtistsPayload::time_ranges`] field.
#[derive(Debug, Deserialize)]
pub struct StatsSitewideArtistsTimeRange {
pub time_range: String,
pub artists: Vec<StatsSitewideArtistsArtist>,
pub from_ts: i64,
pub to_ts: i64,
}
/// Type of the [`StatsSitewideArtistsTimeRange::artists`] field.
#[derive(Debug, Deserialize)]
pub struct StatsSitewideArtistsArtist {
pub artist_mbids: Option<Vec<String>>,
pub artist_msid: String,
pub artist_name: String,
pub listen_count: u64,
}
// --------- status/get-dump-info // --------- status/get-dump-info
/// Response type for [`Client::status_get_dump_info`](crate::Client::status_get_dump_info). /// Response type for [`Client::status_get_dump_info`](crate::Client::status_get_dump_info).