Compare commits
No commits in common. "0aa79840922a1bbfce959037c2961e09a219db3b" and "c9966ea70e432eb4e6dd58982eaa5d05901a83fc" have entirely different histories.
0aa7984092
...
c9966ea70e
1 changed files with 114 additions and 36 deletions
|
@ -1,13 +1,123 @@
|
||||||
use crate::ui::Window;
|
use crate::{model::Song, ui::Window};
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
use gtk::glib::SendWeakRef;
|
use gtk::glib::SendWeakRef;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use tracing::{event, Level};
|
use tracing::{event, Level};
|
||||||
use zbus::object_server::{InterfaceRef, SignalEmitter};
|
use zbus::object_server::{InterfaceRef, SignalEmitter};
|
||||||
use zbus::zvariant::{ObjectPath, OwnedValue, Value};
|
use zbus::zvariant::{ObjectPath, OwnedObjectPath, OwnedValue, Value};
|
||||||
|
|
||||||
pub const MICROSECONDS: f64 = 1e6; // in a second
|
pub const MICROSECONDS: f64 = 1e6; // in a second
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct MetadataMap {
|
||||||
|
// mpris
|
||||||
|
track_id: Option<OwnedObjectPath>,
|
||||||
|
length: Option<i64>,
|
||||||
|
art_url: Option<String>,
|
||||||
|
// xesam
|
||||||
|
album: Option<String>,
|
||||||
|
//album_artist: Option<Vec<String>>,
|
||||||
|
artist: Option<Vec<String>>,
|
||||||
|
//as_text: Option<String>,
|
||||||
|
//audio_bpm: Option<i32>,
|
||||||
|
//auto_rating: Option<f32>,
|
||||||
|
//comment: Option<Vec<String>>,
|
||||||
|
//composer: Option<Vec<String>>,
|
||||||
|
content_created: Option<chrono::NaiveDateTime>,
|
||||||
|
//disc_number: Option<i32>,
|
||||||
|
//first_used: Option<chrono::DateTime>,
|
||||||
|
genre: Option<Vec<String>>,
|
||||||
|
//last_used: Option<chrono::DateTime>,
|
||||||
|
//lyricist: Option<Vec<String>>,
|
||||||
|
title: Option<String>,
|
||||||
|
track_number: Option<i32>,
|
||||||
|
//url: Option<String>,
|
||||||
|
//use_count: Option<String>,
|
||||||
|
user_rating: Option<f32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MetadataMap {
|
||||||
|
pub fn from_playbin_song(song: Option<&Song>) -> Self {
|
||||||
|
song.map(|song| MetadataMap {
|
||||||
|
// use a unique growing counter to identify tracks
|
||||||
|
track_id: Some({
|
||||||
|
format!("/eu/callcc/audrey/Track/{}", song.counter())
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
}),
|
||||||
|
length: Some(song.duration() * MICROSECONDS as i64),
|
||||||
|
art_url: Some(
|
||||||
|
url::Url::from_file_path(audrey::globals::art_path())
|
||||||
|
.unwrap()
|
||||||
|
.to_string(),
|
||||||
|
),
|
||||||
|
album: Some(song.album()),
|
||||||
|
artist: Some(vec![song.artist()]),
|
||||||
|
//content_created: song.year().map(|year| chrono::NaiveDate::from_yo_opt(year, 1).unwrap()), // FIXME: replace this unwrap with Some(Err) -> None
|
||||||
|
//genre: Some(song.genre.iter().collect()),
|
||||||
|
title: Some(song.title()),
|
||||||
|
//track_number: song.track().map(|u| u as i32),
|
||||||
|
//user_rating: Some(if song.starred().is_none() { 0.0 } else { 1.0 }),
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_hash_map(&self) -> HashMap<&'static str, OwnedValue> {
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
|
||||||
|
if let Some(track_id) = &self.track_id {
|
||||||
|
map.insert(
|
||||||
|
"mpris:trackid",
|
||||||
|
Value::new(track_id.as_ref()).try_into().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if let Some(art_url) = &self.art_url {
|
||||||
|
map.insert(
|
||||||
|
"mpris:artUrl",
|
||||||
|
Value::new(art_url.to_string()).try_into().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if let Some(length) = &self.length {
|
||||||
|
map.insert("mpris:length", Value::new(length).try_into().unwrap());
|
||||||
|
}
|
||||||
|
if let Some(album) = &self.album {
|
||||||
|
map.insert("xesam:album", Value::new(album).try_into().unwrap());
|
||||||
|
}
|
||||||
|
if let Some(artist) = &self.artist {
|
||||||
|
map.insert("xesam:artist", Value::new(artist).try_into().unwrap());
|
||||||
|
}
|
||||||
|
if let Some(content_created) = &self.content_created {
|
||||||
|
map.insert(
|
||||||
|
"xesam:contentCreated",
|
||||||
|
Value::new(content_created.format("%+").to_string())
|
||||||
|
.try_into()
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if let Some(genre) = &self.genre {
|
||||||
|
map.insert("xesam:genre", Value::new(genre).try_into().unwrap());
|
||||||
|
}
|
||||||
|
if let Some(track_number) = self.track_number {
|
||||||
|
map.insert(
|
||||||
|
"xesam:trackNumber",
|
||||||
|
Value::new(track_number).try_into().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if let Some(title) = &self.title {
|
||||||
|
map.insert("xesam:title", Value::new(title).try_into().unwrap());
|
||||||
|
}
|
||||||
|
if let Some(user_rating) = self.user_rating {
|
||||||
|
map.insert(
|
||||||
|
"xesam:userRating",
|
||||||
|
Value::new(user_rating).try_into().unwrap(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
map
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Player {
|
pub struct Player {
|
||||||
window: SendWeakRef<Window>,
|
window: SendWeakRef<Window>,
|
||||||
}
|
}
|
||||||
|
@ -154,40 +264,8 @@ impl Player {
|
||||||
|
|
||||||
#[zbus(property)]
|
#[zbus(property)]
|
||||||
fn metadata(&self) -> HashMap<&'static str, OwnedValue> {
|
fn metadata(&self) -> HashMap<&'static str, OwnedValue> {
|
||||||
let mut map = HashMap::new();
|
// TODO: no need to MetadataMap wrapper anymore
|
||||||
|
MetadataMap::from_playbin_song(self.window().song().as_ref()).as_hash_map()
|
||||||
if let Some(song) = self.window().song() {
|
|
||||||
map.insert(
|
|
||||||
"mpris:trackid",
|
|
||||||
Value::new(format!("/eu/callcc/audrey/Track/{}", song.counter()))
|
|
||||||
.try_into()
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
map.insert(
|
|
||||||
"mpris:length",
|
|
||||||
Value::new((self.window().duration() * MICROSECONDS) as i64)
|
|
||||||
.try_into()
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
map.insert(
|
|
||||||
"mpris:artUrl",
|
|
||||||
Value::new(
|
|
||||||
url::Url::from_file_path(audrey::globals::art_path())
|
|
||||||
.unwrap()
|
|
||||||
.to_string(),
|
|
||||||
)
|
|
||||||
.try_into()
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
map.insert("xesam:album", Value::new(song.album()).try_into().unwrap());
|
|
||||||
map.insert(
|
|
||||||
"xesam:artist",
|
|
||||||
Value::new(vec![song.artist()]).try_into().unwrap(),
|
|
||||||
);
|
|
||||||
map.insert("xesam:title", Value::new(song.title()).try_into().unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
map
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[zbus(property)]
|
#[zbus(property)]
|
||||||
|
|
Loading…
Reference in a new issue