diff options
author | Aylur <[email protected]> | 2024-07-14 02:31:48 +0200 |
---|---|---|
committer | Aylur <[email protected]> | 2024-07-14 02:31:48 +0200 |
commit | 0e1008aaa2335d7fe0a17315e32c171ef5894efd (patch) | |
tree | 822354ea2ae7dbc5d266992e43cd1121a544dda1 | |
parent | 33ad109d13d26b147a97397e497e1e1e5f89ac8c (diff) |
cache cover art
-rw-r--r-- | src/cli.vala | 2 | ||||
-rw-r--r-- | src/player.vala | 47 |
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); } |