Implement StatsUserListeningActivity and StatsUserDailyActivity
This commit is contained in:
parent
7f5d67ba74
commit
9c40b2522b
|
@ -10,7 +10,7 @@ use crate::models::response::*;
|
|||
|
||||
const API_ROOT_URL: &str = "https://api.listenbrainz.org/1/";
|
||||
|
||||
/// Low-level client that more-or-less directly wraps the ListenBrainz HTTP API.
|
||||
/// Low-level client that directly wraps the ListenBrainz HTTP API.
|
||||
///
|
||||
/// Client exposes functions that map one-to-one to the API methods described
|
||||
/// in the [ListenBrainz API docs](https://listenbrainz.readthedocs.io/en/production/dev/api/).
|
||||
|
@ -175,9 +175,41 @@ impl Client {
|
|||
request.call()?.into_json().map_err(Error::ResponseJson)
|
||||
}
|
||||
|
||||
// /// Endpoint: `stats/user/{user_name}/listening-activity`
|
||||
/// Endpoint: `stats/user/{user_name}/listening-activity`
|
||||
pub fn stats_user_listening_activity(
|
||||
&mut self,
|
||||
user_name: &str,
|
||||
range: Option<&str>,
|
||||
) -> Result<StatsUserListeningActivityResponse, Error> {
|
||||
let endpoint = format!("{}{}", API_ROOT_URL,
|
||||
Endpoint::StatsUserListeningActivity(user_name));
|
||||
|
||||
// /// Endpoint: `stats/user/{user_name}/daily-activity`
|
||||
let mut request = self.agent.get(&endpoint);
|
||||
|
||||
if let Some(range) = range {
|
||||
request = request.query("range", range);
|
||||
}
|
||||
|
||||
request.call()?.into_json().map_err(Error::ResponseJson)
|
||||
}
|
||||
|
||||
/// Endpoint: `stats/user/{user_name}/daily-activity`
|
||||
pub fn stats_user_daily_activity(
|
||||
&mut self,
|
||||
user_name: &str,
|
||||
range: Option<&str>,
|
||||
) -> Result<StatsUserDailyActivityResponse, Error> {
|
||||
let endpoint = format!("{}{}", API_ROOT_URL,
|
||||
Endpoint::StatsUserDailyActivity(user_name));
|
||||
|
||||
let mut request = self.agent.get(&endpoint);
|
||||
|
||||
if let Some(range) = range {
|
||||
request = request.query("range", range);
|
||||
}
|
||||
|
||||
request.call()?.into_json().map_err(Error::ResponseJson)
|
||||
}
|
||||
|
||||
// /// Endpoint: `stats/user/{user_name}/recordings`
|
||||
|
||||
|
|
|
@ -10,8 +10,8 @@ pub enum Endpoint<'a> {
|
|||
UserListens(&'a str),
|
||||
LatestImport,
|
||||
StatsSitewideArtists,
|
||||
// StatsUserListeningActivity(&'a str),
|
||||
// StatsUserDailyActivity(&'a str),
|
||||
StatsUserListeningActivity(&'a str),
|
||||
StatsUserDailyActivity(&'a str),
|
||||
// StatsUserRecordings(&'a str),
|
||||
// StatsUserArtistMap(&'a str),
|
||||
// StatsUserReleases(&'a str),
|
||||
|
@ -34,8 +34,8 @@ impl<'a> fmt::Display for Endpoint<'a> {
|
|||
Self::UserListens(user) => return write!(f, "user/{}/listens", user),
|
||||
Self::LatestImport => "latest-import",
|
||||
Self::StatsSitewideArtists => "stats/sitewide/artists",
|
||||
// Self::StatsUserListeningActivity(user) => return write!(f, "stats/user/{}/listening-activity", user),
|
||||
// Self::StatsUserDailyActivity(user) => return write!(f, "stats/user/{}/daily-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::StatsUserRecordings(user) => return write!(f, "stats/user/{}/recordings", user),
|
||||
// Self::StatsUserArtistMap(user) => return write!(f, "stats/user/{}/artist-map", user),
|
||||
// Self::StatsUserReleases(user) => return write!(f, "stats/user/{}/releases", user),
|
||||
|
|
|
@ -214,6 +214,64 @@ pub struct StatsSitewideArtistsArtist {
|
|||
pub listen_count: u64,
|
||||
}
|
||||
|
||||
// --------- stats/user/{user_name}/listening-activity
|
||||
|
||||
/// Response type for [`Client::stats_user_listening_activity`](crate::Client::stats_user_listening_activity).
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserListeningActivityResponse {
|
||||
pub payload: StatsUserListeningActivityPayload,
|
||||
}
|
||||
|
||||
/// Type of the [`StatsUserListeningActivityResponse::payload`] field.
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserListeningActivityPayload {
|
||||
pub user_id: String,
|
||||
pub listening_activity: Vec<StatsUserListeningActivityListeningActivity>,
|
||||
pub from_ts: i64,
|
||||
pub to_ts: i64,
|
||||
pub last_updated: i64,
|
||||
}
|
||||
|
||||
/// Type of the [`StatsUserListeningActivityPayload::listening_activity`] field.
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserListeningActivityListeningActivity {
|
||||
pub listen_count: u64,
|
||||
pub from_ts: i64,
|
||||
pub to_ts: i64,
|
||||
pub time_range: String,
|
||||
}
|
||||
|
||||
// --------- stats/user/{user_name}/daily-activity
|
||||
|
||||
/// Response type for [`Client::stats_user_daily_activity`](crate::Client::stats_user_daily_activity).
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserDailyActivityResponse {
|
||||
pub payload: StatsUserDailyActivityPayload,
|
||||
}
|
||||
|
||||
/// Type of the [`StatsUserDailyActivityResponse::payload`] field.
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserDailyActivityPayload {
|
||||
pub user_id: String,
|
||||
pub daily_activity: StatsUserDailyActivityDailyActivity,
|
||||
pub from_ts: i64,
|
||||
pub to_ts: i64,
|
||||
pub stats_range: String,
|
||||
}
|
||||
|
||||
/// Type of the [`StatsUserDailyActivityPayload::daily_activity`] field.
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserDailyActivityDailyActivity {
|
||||
pub days: HashMap<String, Vec<StatsUserDailyActivityHour>>,
|
||||
}
|
||||
|
||||
/// Type of the [`StatsUserDailyActivityDailyActivity::days`] field.
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct StatsUserDailyActivityHour {
|
||||
pub hour: u8,
|
||||
pub listen_count: u64,
|
||||
}
|
||||
|
||||
// --------- status/get-dump-info
|
||||
|
||||
/// Response type for [`Client::status_get_dump_info`](crate::Client::status_get_dump_info).
|
||||
|
|
Loading…
Reference in New Issue