Files
fastfetch/src/modules/player/player.c
T
Ashed 995d172d3e Global: Added Finnish support (#2633)
* Global: Added fi support

* Remove a random space i accidentally added

* Fix more spaces
2026-10-03 18:35:56 +08:00

150 lines
6.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "common/printing.h"
#include "common/jsonconfig.h"
#include "common/strutil.h"
#include "detection/media/media.h"
#include "modules/player/player.h"
#include <ctype.h>
bool ffPrintPlayer(FFPlayerOptions* options) {
const FFMediaResult* media = ffDetectMedia(false);
if (media->error.length > 0) {
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Player), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", media->error.chars);
return false;
}
if (media->player.length == 0) {
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Player), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "No media player detected");
return false;
}
FF_STRBUF_AUTO_DESTROY playerPretty = ffStrbufCreate();
if (media->url.length > 0) {
// If we are on a website, prepend the website name
if (
ffStrbufIgnCaseEqualS(&media->playerId, "spotify") ||
ffStrbufIgnCaseEqualS(&media->playerId, "vlc")) {
} // do noting, surely not a website, even if the url is set
else if (ffStrbufStartsWithS(&media->url, "https://www.")) {
ffStrbufAppendS(&playerPretty, media->url.chars + 12);
} else if (ffStrbufStartsWithS(&media->url, "http://www.")) {
ffStrbufAppendS(&playerPretty, media->url.chars + 11);
} else if (ffStrbufStartsWithS(&media->url, "https://")) {
ffStrbufAppendS(&playerPretty, media->url.chars + 8);
} else if (ffStrbufStartsWithS(&media->url, "http://")) {
ffStrbufAppendS(&playerPretty, media->url.chars + 7);
}
}
// If we found a website name, make it more pretty
if (playerPretty.length > 0) {
ffStrbufSubstrBeforeFirstC(&playerPretty, '/'); // Remove the path
ffStrbufSubstrBeforeLastC(&playerPretty, '.'); // Remove the TLD
}
// Check again for length, as we may have removed everything.
bool playerPrettyIsCustom = playerPretty.length > 0;
// If we don't have subdomains, it is usually more pretty to capitalize the first letter.
if (playerPrettyIsCustom && ffStrbufFirstIndexC(&playerPretty, '.') == playerPretty.length) {
playerPretty.chars[0] = (char) toupper(playerPretty.chars[0]);
}
if (playerPrettyIsCustom) {
ffStrbufAppendS(&playerPretty, " (");
}
ffStrbufAppend(&playerPretty, &media->player);
if (playerPrettyIsCustom) {
ffStrbufAppendC(&playerPretty, ')');
}
if (options->moduleArgs.outputFormat.length == 0) {
ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(Player), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
ffStrbufPutTo(&playerPretty, stdout);
} else {
FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(Player), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
FF_ARG(playerPretty, "player"),
FF_ARG(media->player, "name"),
FF_ARG(media->playerId, "id"),
FF_ARG(media->url, "url"),
}));
}
return true;
}
void ffParsePlayerJsonObject(FFPlayerOptions* options, yyjson_val* module) {
yyjson_val *key, *val;
size_t idx, max;
yyjson_obj_foreach (module, idx, max, key, val) {
if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
continue;
}
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Player), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
}
}
[[gnu::cold]]
void ffGeneratePlayerJsonConfig(FFPlayerOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
}
bool ffGeneratePlayerJsonResult([[maybe_unused]] FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
yyjson_mut_obj_add_str(doc, module, "error", "Player module is an alias of Media module");
return false;
}
void ffInitPlayerOptions(FFPlayerOptions* options) {
ffOptionInitModuleArg(&options->moduleArgs, "󰥠");
}
void ffDestroyPlayerOptions(FFPlayerOptions* options) {
ffOptionDestroyModuleArg(&options->moduleArgs);
}
FFModuleBaseInfo ffPlayerModuleInfo = {
.name = "Player",
.description = "Print the music player name that is currently active",
.displayName = {
.en = "Media Player",
.ar = "مشغل الوسائط",
.cs = "Přehrávač médií",
.de = "Medienplayer",
.es = "Reproductor multimedia",
.fi = "Mediasoitin",
.fr = "Lecteur multimédia",
.gl = "Reprodutor multimedia",
.he = "נגן מדיה",
.id = "Pemutar Media",
.it = "Lettore multimediale",
.ja = "メディアプレイヤー",
.ko = "미디어 플레이어",
.pl = "Odtwarzacz multimediów",
.pt = "Reprodutor de mídia",
.ru = "Медиаплеер",
.tr = "Medya Oynatıcı",
.uk = "Медіаплеєр",
.vi = "Trình phát phương tiện",
.zh_CN = "媒体播放器",
.zh_TW = "媒體播放器",
},
.initOptions = (void*) ffInitPlayerOptions,
.destroyOptions = (void*) ffDestroyPlayerOptions,
.parseJsonObject = (void*) ffParsePlayerJsonObject,
.printModule = (void*) ffPrintPlayer,
.generateJsonResult = (void*) ffGeneratePlayerJsonResult,
.generateJsonConfig = (void*) ffGeneratePlayerJsonConfig,
.formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
{ "Pretty player name", "player" },
{ "Player name", "name" },
{ "Player Identifier", "id" },
{ "URL name", "url" },
})),
.defaultOrder = 47,
};