summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cli.vala2
-rw-r--r--src/player.vala47
2 files changed, 46 insertions, 3 deletions
diff --git a/src/cli.vala b/src/cli.vala
index a83c26c..b71def9 100644
--- a/src/cli.vala
+++ b/src/cli.vala
@@ -195,7 +195,7 @@ Json.Node to_json(Player p) {
.set_member_name("rate").add_double_value(p.rate)
.set_member_name("volume").add_double_value(p.volume)
.set_member_name("position").add_double_value(p.position)
- .set_member_name("cover").add_string_value(p.cover)
+ .set_member_name("cover_art").add_string_value(p.cover_art)
.set_member_name("metadata").add_value(Json.gvariant_serialize(
p.metadata != null ? p.metadata : new HashTable<string, Variant>(str_hash, str_equal)))
.end_object()
diff --git a/src/player.vala b/src/player.vala
index a4fa5f0..e377bae 100644
--- a/src/player.vala
+++ b/src/player.vala
@@ -1,5 +1,7 @@
namespace AstalMpris {
public class Player : Object {
+ private static string COVER_CACHE = Environment.get_user_cache_dir() + "/astal/mpris";
+
private IPlayer proxy;
public signal void appeared () { available = true; }
@@ -175,8 +177,8 @@ public class Player : Object {
public string composer { owned get; private set; }
public string comments { owned get; private set; }
- // cached art
- public string cover { owned get; private set; }
+ // cached cover art
+ public string cover_art { owned get; private set; }
public Player(string name) {
Object(bus_name: name.has_prefix("org.mpris.MediaPlayer2.")
@@ -256,10 +258,51 @@ public class Player : Object {
artist = join_strv("xesam:artist", ", ");
comments = join_strv("xesam:comments", "\n");
composer = join_strv("xesam:composer", ", ");
+ cache_cover.begin((_, res) => cache_cover.end(res));
notify_property("metadata");
}
}
+ private async void cache_cover() {
+ if (art_url == null)
+ return;
+
+ var file = File.new_for_uri(art_url);
+ if (file.get_path() != null) {
+ cover_art = file.get_path();
+ return;
+ }
+
+ var path = COVER_CACHE + "/" + Checksum.compute_for_string(ChecksumType.SHA1, art_url, -1);
+ if (FileUtils.test(path, FileTest.EXISTS)) {
+ cover_art = path;
+ return;
+ }
+
+ try {
+ if (!FileUtils.test(COVER_CACHE, FileTest.IS_DIR))
+ File.new_for_path(COVER_CACHE).make_directory_with_parents(null);
+
+ file.copy_async.begin(
+ File.new_for_path(path),
+ FileCopyFlags.OVERWRITE,
+ Priority.DEFAULT,
+ null,
+ null,
+ (_, res) => {
+ try {
+ file.copy_async.end(res);
+ cover_art = path;
+ } catch (Error err) {
+ critical("Failed to cache cover art %s", err.message);
+ }
+ }
+ );
+ } catch (Error err) {
+ critical(err.message);
+ }
+ }
+
public Variant? get_meta(string key) {
return metadata.lookup(key);
}