use config::MusicService;
pub struct ServerConn {
pub service: MusicService,
pub url: String,
pub token: String,
pub user_id: String,
pub device_id: String,
}
impl ServerConn {
pub fn resolve(config: &config::AppConfig) -> Option<Self> {
let server = config.server.as_ref()?;
let token = server.access_token.clone()?;
let user_id = match server.service {
MusicService::YtMusic => server.user_id.clone().unwrap_or_default(),
_ => server.user_id.clone()?,
};
Some(Self {
service: server.service,
url: server.url.clone(),
token,
user_id,
device_id: config.device_id.clone(),
})
}
}
pub fn parse_item_id(path: &str) -> Option<&str> {
path.split(':').nth(1).filter(|s| !s.trim().is_empty())
}
#[cfg(test)]
mod tests {
use super::*;
fn cfg(service: &str, token: Option<&str>, user_id: Option<&str>) -> config::AppConfig {
let mut server = serde_json::json!({
"name": "test",
"url": "http://localhost",
"service": service,
});
if let Some(t) = token {
server["access_token"] = t.into();
}
if let Some(u) = user_id {
server["user_id"] = u.into();
}
config::AppConfig {
server: Some(serde_json::from_value(server).unwrap()),
..Default::default()
}
}
#[test]
fn parse_item_id_cases() {
assert_eq!(parse_item_id("jellyfin:abc"), Some("abc"));
assert_eq!(parse_item_id("x:abc:def"), Some("abc"));
assert_eq!(parse_item_id("nocolon"), None);
assert_eq!(parse_item_id("x:"), None);
assert_eq!(parse_item_id("x: "), None);
}
#[test]
fn resolve_none_without_server_or_token() {
assert!(ServerConn::resolve(&config::AppConfig::default()).is_none());
assert!(ServerConn::resolve(&cfg("Jellyfin", None, Some("u"))).is_none());
}
#[test]
fn resolve_requires_user_id_except_ytmusic() {
assert!(ServerConn::resolve(&cfg("Jellyfin", Some("t"), None)).is_none());
assert!(ServerConn::resolve(&cfg("Subsonic", Some("t"), None)).is_none());
assert!(ServerConn::resolve(&cfg("Custom", Some("t"), None)).is_none());
let c = ServerConn::resolve(&cfg("Jellyfin", Some("t"), Some("u"))).unwrap();
assert_eq!(c.user_id, "u");
assert_eq!(c.token, "t");
let yt = ServerConn::resolve(&cfg("YtMusic", Some("cookie"), None)).unwrap();
assert_eq!(yt.token, "cookie");
assert!(yt.user_id.is_empty());
}
}