From d647f9e3f250e1bc368478a6930724409d25079e Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Wed, 23 Mar 2022 15:43:30 +0100 Subject: [PATCH] Pretty song output, if the media is a browser playing a video --- CMakeLists.txt | 2 +- src/detection/media.c | 34 -------------------- src/fastfetch.c | 3 +- src/fastfetch.h | 1 - src/modules/player.c | 41 ++++++++++++++++++++++-- src/modules/song.c | 72 ++++++++++++++++++++++++++++++++++++++++--- 6 files changed, 110 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 349a88543..ed9dc0a51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.1.0) # Threads::Threads project(fastfetch - VERSION 1.1.2 + VERSION 1.2.0 LANGUAGES C ) diff --git a/src/detection/media.c b/src/detection/media.c index bca8a5d64..aecb6b818 100644 --- a/src/detection/media.c +++ b/src/detection/media.c @@ -1,6 +1,5 @@ #include "fastfetch.h" -#include #include #include @@ -316,28 +315,6 @@ static void getMedia(FFinstance* instance, FFMediaResult* result) getBestBus(result, &data); dlclose(dbus); - - //If we are on a website, prepend the website name - if(ffStrbufStartsWithS(&result->url, "https://www.")) - ffStrbufAppendS(&result->playerPretty, result->url.chars + 12); - else if(ffStrbufStartsWithS(&result->url, "http://www.")) - ffStrbufAppendS(&result->playerPretty, result->url.chars + 11); - else if(ffStrbufStartsWithS(&result->url, "https://")) - ffStrbufAppendS(&result->playerPretty, result->url.chars + 8); - else if(ffStrbufStartsWithS(&result->url, "http://")) - ffStrbufAppendS(&result->playerPretty, result->url.chars + 7); - - //If we found a website name, make it more pretty - if(result->playerPretty.length > 0) - { - ffStrbufSubstrBeforeFirstC(&result->playerPretty, '/'); //Remove the path - ffStrbufSubstrBeforeLastC(&result->playerPretty, '.'); //Remove the TLD - } - - //Check again for length, as we may have removed everything. - //If we don't have subdomains, it is usually more pretty to capitalize the first letter. - if(result->playerPretty.length > 0 && ffStrbufFirstIndexC(&result->playerPretty, '.') == result->playerPretty.length) - result->playerPretty.chars[0] = (char) toupper(result->playerPretty.chars[0]); } #endif @@ -358,7 +335,6 @@ const FFMediaResult* ffDetectMedia(FFinstance* instance) ffStrbufInit(&result.busNameShort); ffStrbufInit(&result.player); - ffStrbufInit(&result.playerPretty); ffStrbufInit(&result.song); ffStrbufInit(&result.artist); ffStrbufInit(&result.album); @@ -381,16 +357,6 @@ const FFMediaResult* ffDetectMedia(FFinstance* instance) if(result.player.length == 0) ffStrbufAppend(&result.player, &result.busNameShort); - bool hasCustomPrettyName = result.playerPretty.length > 0; - - if(hasCustomPrettyName) - ffStrbufAppendS(&result.playerPretty, " ("); - - ffStrbufAppend(&result.playerPretty, &result.player); - - if(hasCustomPrettyName) - ffStrbufAppendC(&result.playerPretty, ')'); - pthread_mutex_unlock(&mutex); return &result; } diff --git a/src/fastfetch.c b/src/fastfetch.c index 25886a0bd..85cee00fb 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -312,7 +312,8 @@ static inline void printCommandHelp(const char* command) } else if(strcasecmp(command, "song-format") == 0) { - constructAndPrintCommandHelpFormat("song", "{2} - {3} - {1}", 4, + constructAndPrintCommandHelpFormat("song", "{3} - {4} - {1}", 5, + "Song name pretty", "Song name", "Artist name", "Album name", diff --git a/src/fastfetch.h b/src/fastfetch.h index 25bbafa16..76a5eed3a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -259,7 +259,6 @@ typedef struct FFMediaResult { FFstrbuf busNameShort; //e.g. plasma-browser-integration FFstrbuf player; // e.g. Google Chrome - FFstrbuf playerPretty; // e.g. YouTube (Google Chrome) FFstrbuf song; FFstrbuf artist; FFstrbuf album; diff --git a/src/modules/player.c b/src/modules/player.c index 3a2bd45ae..2da9f9d9b 100644 --- a/src/modules/player.c +++ b/src/modules/player.c @@ -1,5 +1,7 @@ #include "fastfetch.h" +#include + #define FF_PLAYER_MODULE_NAME "Media Player" #define FF_PLAYER_NUM_FORMAT_ARGS 3 @@ -13,15 +15,50 @@ void ffPrintPlayer(FFinstance* instance) return; } + FFstrbuf playerPretty; + ffStrbufInit(&playerPretty); + + //If we are on a website, prepend the website name + 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(instance->config.playerFormat.length == 0) { ffPrintLogoAndKey(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.playerKey); - ffStrbufPutTo(&media->playerPretty, stdout); + ffStrbufPutTo(&playerPretty, stdout); } else { ffPrintFormatString(instance, FF_PLAYER_MODULE_NAME, 0, &instance->config.playerKey, &instance->config.playerFormat, NULL, FF_PLAYER_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &media->playerPretty}, + {FF_FORMAT_ARG_TYPE_STRBUF, &playerPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->player}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->busNameShort} }); diff --git a/src/modules/song.c b/src/modules/song.c index c81783e15..2e5a087e9 100644 --- a/src/modules/song.c +++ b/src/modules/song.c @@ -1,7 +1,44 @@ #include "fastfetch.h" +#include + #define FF_SONG_MODULE_NAME "Song" -#define FF_SONG_NUM_FORMAT_ARGS 4 +#define FF_SONG_NUM_FORMAT_ARGS 5 + +static bool shouldIgoreChar(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) + { + while(shouldIgoreChar(song->chars[songIndex])) + ++songIndex; + + while(shouldIgoreChar(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; +} void ffPrintSong(FFinstance* instance) { @@ -13,13 +50,39 @@ void ffPrintSong(FFinstance* instance) return; } + FFstrbuf songPretty; + ffStrbufInitCopy(&songPretty, &media->song); + const char* removeStrings[] = { + "(Official Music Video)", "(Official Video)", "(Music Video)", + "[Official Music Video]", "[Official Video]", "[Music Video]", + "| Official Music Video", "| Official Video", "| Music Video", + "[Official Audio]", "[Audio]", "(Audio)", "| Official Audio", "| Audio", "| OFFICIAL AUDIO", + "(Lyric Video)", "(Official Lyric Video)", "(Lyrics)", + "(dirty version)", "(dirty)", "(Clean)", "(Clean Version)", + }; + ffStrbufRemoveStringsA(&songPretty, sizeof(removeStrings) / sizeof(removeStrings[0]), removeStrings); + ffStrbufTrimRight(&songPretty, ' '); + + if(songPretty.length == 0) + ffStrbufAppend(&songPretty, &media->song); + if(instance->config.songFormat.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) + FFstrbuf artistPretty; + ffStrbufInitCopy(&artistPretty, &media->artist); + ffStrbufRemoveIgnCaseEndS(&artistPretty, " - Topic"); + ffStrbufRemoveIgnCaseEndS(&artistPretty, "VEVO"); + ffStrbufTrimRight(&artistPretty, ' '); + + if(artistInSongTitle(&songPretty, &artistPretty)) + ffStrbufClear(&artistPretty); + ffPrintLogoAndKey(instance, FF_SONG_MODULE_NAME, 0, &instance->config.songKey); - if(media->artist.length > 0) + if(artistPretty.length > 0) { - ffStrbufWriteTo(&media->artist, stdout); + ffStrbufWriteTo(&artistPretty, stdout); fputs(" - ", stdout); } @@ -29,11 +92,12 @@ void ffPrintSong(FFinstance* instance) fputs(" - ", stdout); } - ffStrbufPutTo(&media->song, stdout); + ffStrbufPutTo(&songPretty, stdout); } else { ffPrintFormatString(instance, FF_SONG_MODULE_NAME, 0, &instance->config.songKey, &instance->config.songFormat, NULL, FF_SONG_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &songPretty}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->song}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->artist}, {FF_FORMAT_ARG_TYPE_STRBUF, &media->album},