Skip to content

Commit

Permalink
Pretty song output, if the media is a browser playing a video
Browse files Browse the repository at this point in the history
  • Loading branch information
LinusDierheimer committed Mar 23, 2022
1 parent 4895c68 commit d647f9e
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 43 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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
)

Expand Down
34 changes: 0 additions & 34 deletions src/detection/media.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#include "fastfetch.h"

#include <ctype.h>
#include <string.h>
#include <pthread.h>

Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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;
}
3 changes: 2 additions & 1 deletion src/fastfetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 0 additions & 1 deletion src/fastfetch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
41 changes: 39 additions & 2 deletions src/modules/player.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "fastfetch.h"

#include <ctype.h>

#define FF_PLAYER_MODULE_NAME "Media Player"
#define FF_PLAYER_NUM_FORMAT_ARGS 3

Expand All @@ -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}
});
Expand Down
72 changes: 68 additions & 4 deletions src/modules/song.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,44 @@
#include "fastfetch.h"

#include <ctype.h>

#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)
{
Expand All @@ -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);
}

Expand All @@ -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},
Expand Down

0 comments on commit d647f9e

Please sign in to comment.