use bytes::Bytes;
use url::Url;
use crate::Client;
use crate::data::{Lyrics, LyricsList};
use crate::error::Error;
impl Client {
pub async fn stream(
&self,
id: &str,
max_bit_rate: Option<i32>,
format: Option<&str>,
time_offset: Option<i32>,
estimated_content_length: Option<bool>,
) -> Result<Bytes, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(br) = max_bit_rate {
params.push(("maxBitRate", br.to_string()));
}
if let Some(f) = format {
params.push(("format", f.to_string()));
}
if let Some(t) = time_offset {
params.push(("timeOffset", t.to_string()));
}
if let Some(e) = estimated_content_length {
params.push(("estimateContentLength", e.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.get_bytes("stream", ¶m_refs).await
}
pub fn stream_url(
&self,
id: &str,
max_bit_rate: Option<i32>,
format: Option<&str>,
) -> Result<Url, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(br) = max_bit_rate {
params.push(("maxBitRate", br.to_string()));
}
if let Some(f) = format {
params.push(("format", f.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.build_url("stream", ¶m_refs)
}
pub async fn download(&self, id: &str) -> Result<Bytes, Error> {
self.get_bytes("download", &[("id", id)]).await
}
pub fn hls_url(
&self,
id: &str,
bit_rate: Option<&str>,
audio_track: Option<&str>,
) -> Result<Url, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(br) = bit_rate {
params.push(("bitRate", br.to_string()));
}
if let Some(at) = audio_track {
params.push(("audioTrack", at.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.build_url("hls.m3u8", ¶m_refs)
}
pub async fn get_captions(&self, id: &str, format: Option<&str>) -> Result<Bytes, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(f) = format {
params.push(("format", f.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.get_bytes("getCaptions", ¶m_refs).await
}
pub async fn get_cover_art(&self, id: &str, size: Option<i32>) -> Result<Bytes, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(s) = size {
params.push(("size", s.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.get_bytes("getCoverArt", ¶m_refs).await
}
pub fn cover_art_url(&self, id: &str, size: Option<i32>) -> Result<Url, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(s) = size {
params.push(("size", s.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
self.build_url("getCoverArt", ¶m_refs)
}
pub async fn get_lyrics(
&self,
artist: Option<&str>,
title: Option<&str>,
) -> Result<Lyrics, Error> {
let mut params = Vec::new();
if let Some(a) = artist {
params.push(("artist", a));
}
if let Some(t) = title {
params.push(("title", t));
}
let data = self.get_response("getLyrics", ¶ms).await?;
let lyrics = data
.get("lyrics")
.cloned()
.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::new()));
Ok(serde_json::from_value(lyrics)?)
}
pub async fn get_lyrics_by_song_id(
&self,
id: &str,
enhanced: Option<bool>,
) -> Result<LyricsList, Error> {
let mut params = vec![("id", id.to_string())];
if let Some(e) = enhanced {
params.push(("enhanced", e.to_string()));
}
let param_refs: Vec<(&str, &str)> = params.iter().map(|(k, v)| (*k, v.as_str())).collect();
let data = self.get_response("getLyricsBySongId", ¶m_refs).await?;
let lyrics = data
.get("lyricsList")
.cloned()
.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::new()));
Ok(serde_json::from_value(lyrics)?)
}
pub async fn get_avatar(&self, username: &str) -> Result<Bytes, Error> {
self.get_bytes("getAvatar", &[("username", username)]).await
}
}