From b74f01872184b5398b48e6ff66a3749ab86e261c Mon Sep 17 00:00:00 2001 From: depsterr Date: Sat, 6 Mar 2021 19:28:19 +0100 Subject: [PATCH] made mpdart prioritize images containting keywords indicating it's album art --- Makefile | 2 +- mpdart.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 60 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 2204be9..ff8f5fd 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ debug: mpdart_debug mpdart_debug: mpdart.c $(CC) $(CONFIG) -Og -g -DDEBUG -o $@ mpdart.c clean: - rm -f mpdart + rm -f mpdart mpdart_debug install: mpdart install -Dm755 mpdart $(DESTDIR)$(PREFIX)/bin/mpdart uninstall: diff --git a/mpdart.c b/mpdart.c index 3a8377f..5686b08 100644 --- a/mpdart.c +++ b/mpdart.c @@ -16,18 +16,23 @@ #ifdef DEBUG # undef DEBUG -# define DEBUG(msg) printf("%d: %s", __LINE__, msg) +# define DEBUG(msg) printf("%d: %s\n", __LINE__, msg) #else # define DEBUG(_) #endif -/* let user define a size on the compiler command line if they want to */ +/* let user define a defualt window size on the compiler command line if they want to */ #ifndef DEFAULTSIZE #define DEFAULTSIZE 256 #endif /* TODO image metadata images */ +/* Image filename end priority list */ +const char* name_priority[] = { "front", "Front", "cover", "Cover", 0 }; +const size_t name_priority_lengths[] = { 9, 9, 9, 9, 0 }; +const char* image_extensions[] = { ".png", ".jpg", 0 }; + /* mpd globals */ struct mpd_connection* connection = 0; int mpd_fd = 0; @@ -73,6 +78,39 @@ void* xmalloc(size_t size) { return ret; } +/* error checking realloc */ +void* xrealloc(void* ptr, size_t size) { + void* ret = realloc(ptr, size); + if (!ret) + die("Unable to reallocate memory"); + return ret; +} + +/* return 1 if a filename is an image name, otherwise return 0 */ +/* this fucks up if you name a folder .jpg or .png, but at that point you had it coming */ +int is_image_name(char* f) { + char* extension = strrchr(f, '.'); + for (int n = 0; image_extensions[n]; n++) { + if (!strcmp(extension, image_extensions[n])) + return 1; + } + return 0; +} + +/* returns the name most likely to refer to album art */ +char* most_relevant_name(char** names, size_t name_cnt) { + for (int n = 0; name_priority[n]; n++) { + DEBUG(name_priority[n]); + for (int i = 0; i < name_cnt; i++) { + DEBUG(names[i]); + if (strstr(names[i], name_priority[n])) + return names[i]; + } + } + return names[0]; +} + + /* returns char pointer instead of writing to predefined one */ char* asprintf(const char* fmt, ...) { va_list ap; @@ -218,21 +256,29 @@ void update_mpd_song(void) { if (!dir) { warn("Unable to open dir"); } else { + size_t name_cnt = 0; + size_t name_cap = 20; + char** names = xmalloc(sizeof(char*) * name_cap); struct dirent* ent; while (ent = readdir(dir)) { - char* extension = strrchr(ent->d_name, '.'); - /* TODO add more extensions and match multiple extension - and select one based on list of strings such as cover COVER - art album etc */ - if (extension && (!strcmp(extension, ".jpg") || !strcmp(extension, ".png"))) { - /* reuse pointer, is now filename, not extension */ - extension = asprintf("%s/%s", dirname, ent->d_name); - DEBUG(extension); - imlib_update(extension); - updated = true; - break; + if (is_image_name(ent->d_name)) { + name_cnt++; + if (name_cnt > name_cap) { + name_cap *= 2; + names = xrealloc(names, sizeof(char*) * name_cap); + } + names[name_cnt-1] = ent->d_name; } } + + if (name_cnt > 0) { + char* name = most_relevant_name(names, name_cnt); + name = asprintf("%s/%s", dirname, name); + DEBUG(name); + imlib_update(name); + updated = true; + } + free(names); } if (!updated)