Media (Linux): adds media cover extraction

This commit is contained in:
Carter Li
2025-10-20 18:53:11 +08:00
committed by 李通洲
parent 64afaa07e7
commit 2d9bbc8049
+47 -14
View File
@@ -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)
}