From 2d9bbc8049e32e4ab24e8fdff15a25bb69be4af1 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Mon, 20 Oct 2025 18:53:11 +0800 Subject: [PATCH] Media (Linux): adds media cover extraction --- src/detection/media/media_linux.c | 61 ++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/src/detection/media/media_linux.c b/src/detection/media/media_linux.c index adc600f0f..a3562fb27 100644 --- a/src/detection/media/media_linux.c +++ b/src/detection/media/media_linux.c @@ -1,3 +1,4 @@ +#include "common/io/io.h" #include "fastfetch.h" #include "detection/media/media.h" #include "util/stringUtils.h" @@ -52,21 +53,53 @@ static bool parseMprisMetadata(FFDBusData* data, DBusMessageIter* rootIterator, data->lib->ffdbus_message_iter_next(&dictIterator); - if(!ffStrStartsWith(key, "xesam:")) - FF_DBUS_ITER_CONTINUE(data, &arrayIterator) + if(ffStrStartsWith(key, "xesam:")) + { + const char* xesam = key + strlen("xesam:"); + if(ffStrEquals(xesam, "title")) + ffDBusGetString(data, &dictIterator, &result->song); + else if(ffStrEquals(xesam, "album")) + ffDBusGetString(data, &dictIterator, &result->album); + else if(ffStrEquals(xesam, "artist")) + ffDBusGetString(data, &dictIterator, &result->artist); + else if(ffStrEquals(xesam, "url")) + ffDBusGetString(data, &dictIterator, &result->url); - key += strlen("xesam:"); - if(ffStrEquals(key, "title")) - ffDBusGetString(data, &dictIterator, &result->song); - else if(ffStrEquals(key, "album")) - ffDBusGetString(data, &dictIterator, &result->album); - else if(ffStrEquals(key, "artist")) - ffDBusGetString(data, &dictIterator, &result->artist); - else if(ffStrEquals(key, "url")) - ffDBusGetString(data, &dictIterator, &result->url); - - if(result->song.length > 0 && result->artist.length > 0 && result->album.length > 0 && result->url.length > 0) - break; + if(result->song.length > 0 && result->artist.length > 0 && result->album.length > 0 && result->url.length > 0) + break; + } + else if (ffStrStartsWith(key, "mpris:")) + { + const char* xesam = key + strlen("mpris:"); + if(ffStrEquals(xesam, "artUrl")) + { + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); + ffDBusGetString(data, &dictIterator, &path); + if (ffStrbufStartsWithS(&path, "file:///")) + { + uint32_t j = 0; + for (uint32_t i = (uint32_t) strlen("file:///") - 1; i < path.length; ++i, ++j) + { + if (path.chars[i] == '%') + { + if (i + 2 >= path.length) + break; + char str[] = { path.chars[i + 1], path.chars[i + 2], 0 }; + const char decodedChar = (char) strtoul(str, NULL, 16); + path.chars[j] = decodedChar; + i += 2; + } + else + { + path.chars[j] = path.chars[i]; + } + } + path.chars[j] = '\0'; + path.length = j; + ffReadFileBuffer(path.chars, &result->cover); + } + } + } FF_DBUS_ITER_CONTINUE(data, &arrayIterator) }