From fde86657f28698a7ca43a98f5faf79940a93d15a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 16:10:14 +0800 Subject: [PATCH] Media: add JSON config support --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 6 +-- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/{ => media}/media.c | 60 ++++++++++++++++++++++++----- src/modules/media/media.h | 15 ++++++++ src/modules/media/option.h | 11 ++++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 11 files changed, 88 insertions(+), 18 deletions(-) rename src/modules/{ => media}/media.c (62%) create mode 100644 src/modules/media/media.h create mode 100644 src/modules/media/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 329c1dfc0..e2853d537 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -300,7 +300,7 @@ set(LIBFASTFETCH_SRC src/modules/shell/shell.c src/modules/sound/sound.c src/modules/swap/swap.c - src/modules/media.c + src/modules/media/media.c src/modules/terminal/terminal.c src/modules/terminalfont/terminalfont.c src/modules/theme.c diff --git a/src/common/init.c b/src/common/init.c index bc9dbb11d..55167ad97 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -94,7 +94,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); initModuleArg(&instance->config.player); - initModuleArg(&instance->config.media); + ffInitMediaOptions(&instance->config.media); ffInitDateTimeOptions(&instance->config.dateTime); ffInitVulkanOptions(&instance->config.vulkan); ffInitWallpaperOptions(&instance->config.wallpaper); @@ -314,7 +314,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); destroyModuleArg(&instance->config.player); - destroyModuleArg(&instance->config.media); + ffDestroyMediaOptions(&instance->config.media); ffDestroyDateTimeOptions(&instance->config.dateTime); ffDestroyVulkanOptions(&instance->config.vulkan); ffDestroyOpenGLOptions(&instance->config.openGL); diff --git a/src/fastfetch.c b/src/fastfetch.c index 0622c78f4..89f692119 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1012,7 +1012,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {} - else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {} + else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} else if(ffParseDateTimeCommandOptions(&instance->config.dateTime, key, value)) {} else if(ffParseVulkanCommandOptions(&instance->config.vulkan, key, value)) {} else if(ffParseOpenGLCommandOptions(&instance->config.openGL, key, value)) {} @@ -1232,8 +1232,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintWeather(instance); else if(strcasecmp(line, "player") == 0) ffPrintPlayer(instance); - else if(strcasecmp(line, "media") == 0) - ffPrintMedia(instance); + else if(strcasecmp(line, FF_MEDIA_MODULE_NAME) == 0) + ffPrintMedia(instance, &instance->config.media); else if(strcasecmp(line, FF_DATETIME_MODULE_NAME) == 0) ffPrintDateTime(instance, &instance->config.dateTime); else if(strcasecmp(line, FF_COLORS_MODULE_NAME) == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 16c496657..3c17da838 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -86,7 +86,7 @@ typedef struct FFconfig FFModuleArgs publicIP; FFModuleArgs weather; FFModuleArgs player; - FFModuleArgs media; + FFMediaOptions media; FFDateTimeOptions dateTime; FFVulkanOptions vulkan; FFOpenGLOptions openGL; @@ -191,7 +191,6 @@ void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); void ffPrintPlayer(FFinstance* instance); -void ffPrintMedia(FFinstance* instance); void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index dd11217a1..4a286181a 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -51,7 +51,7 @@ int main(int argc, char** argv) ffPrintBattery(&instance, &instance.config.battery); ffPrintPowerAdapter(&instance, &instance.config.powerAdapter); //ffPrintPlayer(&instance); - //ffPrintMedia(&instance); + //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); //ffPrintPublicIp(&instance); //ffPrintWifi(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 852ea6c8e..489d7f718 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -97,6 +97,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o case 'M': { return + tryModule(instance, type, module, FF_MEDIA_MODULE_NAME, ffParseMediaJsonObject) || tryModule(instance, type, module, FF_MEMORY_MODULE_NAME, ffParseMemoryJsonObject) || false; } diff --git a/src/modules/media.c b/src/modules/media/media.c similarity index 62% rename from src/modules/media.c rename to src/modules/media/media.c index 74be335e0..9021aaf7c 100644 --- a/src/modules/media.c +++ b/src/modules/media/media.c @@ -1,13 +1,13 @@ #include "fastfetch.h" #include "common/printing.h" #include "detection/media/media.h" +#include "modules/media/media.h" #include -#define FF_MEDIA_MODULE_NAME "Media" #define FF_MEDIA_NUM_FORMAT_ARGS 5 -static bool shouldIgoreChar(char c) +static inline bool shouldIgnoreChar(char c) { return isblank(c) || c == '-' || c == '.'; } @@ -19,10 +19,10 @@ static bool artistInSongTitle(const FFstrbuf* song, const FFstrbuf* artist) while(true) { - while(shouldIgoreChar(song->chars[songIndex])) + while(shouldIgnoreChar(song->chars[songIndex])) ++songIndex; - while(shouldIgoreChar(artist->chars[artistIndex])) + while(shouldIgnoreChar(artist->chars[artistIndex])) ++artistIndex; if(artist->chars[artistIndex] == '\0') @@ -42,13 +42,13 @@ static bool artistInSongTitle(const FFstrbuf* song, const FFstrbuf* artist) return false; } -void ffPrintMedia(FFinstance* instance) +void ffPrintMedia(FFinstance* instance, FFMediaOptions* options) { const FFMediaResult* media = ffDetectMedia(instance); if(media->error.length > 0) { - ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media, "%s", media->error.chars); + ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, "%s", media->error.chars); return; } @@ -68,7 +68,7 @@ void ffPrintMedia(FFinstance* instance) if(songPretty.length == 0) ffStrbufAppend(&songPretty, &media->song); - if(instance->config.media.outputFormat.length == 0) + if(options->moduleArgs.outputFormat.length == 0) { //We don't expose artistPretty to the format, as it might be empty (when the think that the artist is already in the song title) FF_STRBUF_AUTO_DESTROY artistPretty = ffStrbufCreateCopy(&media->artist); @@ -79,7 +79,7 @@ void ffPrintMedia(FFinstance* instance) if(artistInSongTitle(&songPretty, &artistPretty)) ffStrbufClear(&artistPretty); - ffPrintLogoAndKey(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media.key); + ffPrintLogoAndKey(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs.key); if(artistPretty.length > 0) { @@ -94,7 +94,7 @@ void ffPrintMedia(FFinstance* instance) } else { - ffPrintFormat(instance, FF_MEDIA_MODULE_NAME, 0, &instance->config.media, FF_MEDIA_NUM_FORMAT_ARGS, (FFformatarg[]){ + ffPrintFormat(instance, FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_MEDIA_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &songPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->song}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->artist}, @@ -103,3 +103,45 @@ void ffPrintMedia(FFinstance* instance) }); } } + +void ffInitMediaOptions(FFMediaOptions* options) +{ + options->moduleName = FF_MEDIA_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_MEDIA_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyMediaOptions(FFMediaOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +void ffParseMediaJsonObject(FFinstance* instance, json_object* module) +{ + FFMediaOptions __attribute__((__cleanup__(ffDestroyMediaOptions))) options; + ffInitMediaOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_MEDIA_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintMedia(instance, &options); +} +#endif diff --git a/src/modules/media/media.h b/src/modules/media/media.h new file mode 100644 index 000000000..59c6cbb42 --- /dev/null +++ b/src/modules/media/media.h @@ -0,0 +1,15 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_MEDIA_MODULE_NAME "Media" + +void ffPrintMedia(FFinstance* instance, FFMediaOptions* options); +void ffInitMediaOptions(FFMediaOptions* options); +bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const char* value); +void ffDestroyMediaOptions(FFMediaOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParseMediaJsonObject(FFinstance* instance, json_object* module); +#endif diff --git a/src/modules/media/option.h b/src/modules/media/option.h new file mode 100644 index 000000000..8498c6e9b --- /dev/null +++ b/src/modules/media/option.h @@ -0,0 +1,11 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFMediaOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFMediaOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 2c893f5a6..2966d52c1 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -26,6 +26,7 @@ #include "modules/kernel/kernel.h" #include "modules/locale/locale.h" #include "modules/localip/localip.h" +#include "modules/media/media.h" #include "modules/memory/memory.h" #include "modules/opengl/opengl.h" #include "modules/opencl/opencl.h" diff --git a/src/modules/options.h b/src/modules/options.h index 142aaebf8..e20258d2d 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -24,6 +24,7 @@ #include "modules/kernel/option.h" #include "modules/locale/option.h" #include "modules/localip/option.h" +#include "modules/media/option.h" #include "modules/memory/option.h" #include "modules/opengl/option.h" #include "modules/opencl/option.h"