Files
fastfetch/src/modules/media/media.c
T

191 lines
6.1 KiB
C
Raw Normal View History

#include "common/printing.h"
2023-06-10 15:01:54 +08:00
#include "common/jsonconfig.h"
2022-09-19 20:05:23 +08:00
#include "detection/media/media.h"
2023-06-07 16:10:14 +08:00
#include "modules/media/media.h"
#include "util/stringUtils.h"
2022-02-13 23:51:13 +01:00
#include <ctype.h>
#define FF_MEDIA_NUM_FORMAT_ARGS 5
2023-06-07 16:10:14 +08:00
static inline bool shouldIgnoreChar(char c)
{
return isblank(c) || c == '-' || c == '.';
}
static bool artistInSongTitle(const FFstrbuf* song, const FFstrbuf* artist)
{
uint32_t artistIndex = 0;
uint32_t songIndex = 0;
while(true)
{
2023-06-07 16:10:14 +08:00
while(shouldIgnoreChar(song->chars[songIndex]))
++songIndex;
2023-06-07 16:10:14 +08:00
while(shouldIgnoreChar(artist->chars[artistIndex]))
++artistIndex;
if(artist->chars[artistIndex] == '\0')
return true;
if(song->chars[songIndex] == '\0')
return false;
if(tolower(song->chars[songIndex]) != tolower(artist->chars[artistIndex]))
return false;
++artistIndex;
++songIndex;
}
//Unreachable
return false;
}
2022-02-13 23:51:13 +01:00
void ffPrintMedia(FFMediaOptions* options)
2022-02-13 23:51:13 +01:00
{
const FFMediaResult* media = ffDetectMedia();
2022-02-13 23:51:13 +01:00
if(media->error.length > 0)
2022-02-13 23:51:13 +01:00
{
ffPrintError(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", media->error.chars);
2022-02-13 23:51:13 +01:00
return;
}
FF_STRBUF_AUTO_DESTROY songPretty = ffStrbufCreateCopy(&media->song);
const char* removeStrings[] = {
2022-08-28 17:39:01 +02:00
"(Official Music Video)", "(Official Video)", "(Music Video)", "(Official HD Video)",
"[Official Music Video]", "[Official Video]", "[Music Video]", "[Official HD Video]",
"| Official Music Video", "| Official Video", "| Music Video", "| Official HD Video",
2022-03-23 16:07:47 +01:00
"[Official Audio]", "[Audio]", "(Audio)", "| Official Audio", "| Audio", "| OFFICIAL AUDIO",
"(Lyric Video)", "(Official Lyric Video)", "(Lyrics)",
"[Lyric Video]", "[Official Lyric Video]", "[Lyrics]",
"| Lyric Video", "| Official Lyric Video", "| Lyrics",
};
ffStrbufRemoveStrings(&songPretty, sizeof(removeStrings) / sizeof(removeStrings[0]), removeStrings);
ffStrbufTrimRight(&songPretty, ' ');
if(songPretty.length == 0)
ffStrbufAppend(&songPretty, &media->song);
2023-06-07 16:10:14 +08:00
if(options->moduleArgs.outputFormat.length == 0)
2022-02-13 23:51:13 +01:00
{
//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);
ffStrbufRemoveIgnCaseEndS(&artistPretty, " - Topic");
ffStrbufRemoveIgnCaseEndS(&artistPretty, "VEVO");
ffStrbufTrimRight(&artistPretty, ' ');
if(artistInSongTitle(&songPretty, &artistPretty))
ffStrbufClear(&artistPretty);
ffPrintLogoAndKey(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
2022-02-13 23:51:13 +01:00
if(artistPretty.length > 0)
2022-02-13 23:51:13 +01:00
{
ffStrbufWriteTo(&artistPretty, stdout);
2022-02-13 23:51:13 +01:00
fputs(" - ", stdout);
}
2022-09-20 17:46:01 +08:00
if (media->status.length > 0)
ffStrbufAppendF(&songPretty, " (%s)", media->status.chars);
ffStrbufPutTo(&songPretty, stdout);
2022-02-13 23:51:13 +01:00
}
else
{
FF_PRINT_FORMAT_CHECKED(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, FF_MEDIA_NUM_FORMAT_ARGS, ((FFformatarg[]) {
{FF_FORMAT_ARG_TYPE_STRBUF, &songPretty},
2022-02-13 23:51:13 +01:00
{FF_FORMAT_ARG_TYPE_STRBUF, &media->song},
{FF_FORMAT_ARG_TYPE_STRBUF, &media->artist},
2022-09-20 17:46:01 +08:00
{FF_FORMAT_ARG_TYPE_STRBUF, &media->album},
{FF_FORMAT_ARG_TYPE_STRBUF, &media->status}
}));
2022-02-13 23:51:13 +01:00
}
}
2023-06-07 16:10:14 +08:00
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;
}
2023-08-17 10:56:54 +08:00
void ffParseMediaJsonObject(FFMediaOptions* options, yyjson_val* module)
2023-06-07 16:10:14 +08:00
{
2023-08-17 16:09:41 +08:00
yyjson_val *key_, *val;
size_t idx, max;
yyjson_obj_foreach(module, idx, max, key_, val)
2023-06-07 16:10:14 +08:00
{
2023-08-17 16:09:41 +08:00
const char* key = yyjson_get_str(key_);
if(ffStrEqualsIgnCase(key, "type"))
continue;
2023-06-10 15:01:54 +08:00
2023-08-17 16:09:41 +08:00
if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs))
continue;
2023-06-07 16:10:14 +08:00
ffPrintError(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key);
2023-06-07 16:10:14 +08:00
}
}
2023-09-06 15:48:39 +08:00
2023-10-24 14:41:29 +08:00
void ffGenerateMediaJsonConfig(FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
{
__attribute__((__cleanup__(ffDestroyMediaOptions))) FFMediaOptions defaultOptions;
ffInitMediaOptions(&defaultOptions);
ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs);
}
2023-10-23 10:14:22 +08:00
void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
2023-09-06 15:48:39 +08:00
{
const FFMediaResult* media = ffDetectMedia();
if(media->error.length > 0)
{
yyjson_mut_obj_add_strbuf(doc, module, "error", &media->error);
return;
}
yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
yyjson_mut_obj_add_strbuf(doc, obj, "song", &media->song);
yyjson_mut_obj_add_strbuf(doc, obj, "artist", &media->artist);
yyjson_mut_obj_add_strbuf(doc, obj, "album", &media->album);
yyjson_mut_obj_add_strbuf(doc, obj, "status", &media->status);
}
2023-10-07 13:40:40 +08:00
void ffPrintMediaHelpFormat(void)
{
FF_PRINT_MODULE_FORMAT_HELP_CHECKED(FF_MEDIA_MODULE_NAME, "{3} - {1} ({5})", FF_MEDIA_NUM_FORMAT_ARGS, ((const char* []) {
2023-10-07 13:40:40 +08:00
"Pretty media name",
"Media name",
"Artist name",
"Album name",
"Status",
}));
2023-10-07 13:40:40 +08:00
}
2023-10-23 13:32:18 +08:00
void ffInitMediaOptions(FFMediaOptions* options)
{
ffOptionInitModuleBaseInfo(
&options->moduleInfo,
FF_MEDIA_MODULE_NAME,
"Print playing song name",
ffParseMediaCommandOptions,
ffParseMediaJsonObject,
ffPrintMedia,
ffGenerateMediaJsonResult,
ffPrintMediaHelpFormat,
2023-10-24 14:41:29 +08:00
ffGenerateMediaJsonConfig
);
2023-10-23 13:32:18 +08:00
ffOptionInitModuleArg(&options->moduleArgs);
}
void ffDestroyMediaOptions(FFMediaOptions* options)
{
ffOptionDestroyModuleArg(&options->moduleArgs);
}