made mpdart prioritize images containting keywords indicating it's album
art
This commit is contained in:
parent
6ed073347e
commit
b74f018721
2
Makefile
2
Makefile
|
@ -8,7 +8,7 @@ debug: mpdart_debug
|
||||||
mpdart_debug: mpdart.c
|
mpdart_debug: mpdart.c
|
||||||
$(CC) $(CONFIG) -Og -g -DDEBUG -o $@ mpdart.c
|
$(CC) $(CONFIG) -Og -g -DDEBUG -o $@ mpdart.c
|
||||||
clean:
|
clean:
|
||||||
rm -f mpdart
|
rm -f mpdart mpdart_debug
|
||||||
install: mpdart
|
install: mpdart
|
||||||
install -Dm755 mpdart $(DESTDIR)$(PREFIX)/bin/mpdart
|
install -Dm755 mpdart $(DESTDIR)$(PREFIX)/bin/mpdart
|
||||||
uninstall:
|
uninstall:
|
||||||
|
|
72
mpdart.c
72
mpdart.c
|
@ -16,18 +16,23 @@
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
# undef DEBUG
|
# undef DEBUG
|
||||||
# define DEBUG(msg) printf("%d: %s", __LINE__, msg)
|
# define DEBUG(msg) printf("%d: %s\n", __LINE__, msg)
|
||||||
#else
|
#else
|
||||||
# define DEBUG(_)
|
# define DEBUG(_)
|
||||||
#endif
|
#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
|
#ifndef DEFAULTSIZE
|
||||||
#define DEFAULTSIZE 256
|
#define DEFAULTSIZE 256
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TODO image metadata images */
|
/* 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 */
|
/* mpd globals */
|
||||||
struct mpd_connection* connection = 0;
|
struct mpd_connection* connection = 0;
|
||||||
int mpd_fd = 0;
|
int mpd_fd = 0;
|
||||||
|
@ -73,6 +78,39 @@ void* xmalloc(size_t size) {
|
||||||
return ret;
|
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 */
|
/* returns char pointer instead of writing to predefined one */
|
||||||
char* asprintf(const char* fmt, ...) {
|
char* asprintf(const char* fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -218,21 +256,29 @@ void update_mpd_song(void) {
|
||||||
if (!dir) {
|
if (!dir) {
|
||||||
warn("Unable to open dir");
|
warn("Unable to open dir");
|
||||||
} else {
|
} else {
|
||||||
|
size_t name_cnt = 0;
|
||||||
|
size_t name_cap = 20;
|
||||||
|
char** names = xmalloc(sizeof(char*) * name_cap);
|
||||||
struct dirent* ent;
|
struct dirent* ent;
|
||||||
while (ent = readdir(dir)) {
|
while (ent = readdir(dir)) {
|
||||||
char* extension = strrchr(ent->d_name, '.');
|
if (is_image_name(ent->d_name)) {
|
||||||
/* TODO add more extensions and match multiple extension
|
name_cnt++;
|
||||||
and select one based on list of strings such as cover COVER
|
if (name_cnt > name_cap) {
|
||||||
art album etc */
|
name_cap *= 2;
|
||||||
if (extension && (!strcmp(extension, ".jpg") || !strcmp(extension, ".png"))) {
|
names = xrealloc(names, sizeof(char*) * name_cap);
|
||||||
/* reuse pointer, is now filename, not extension */
|
}
|
||||||
extension = asprintf("%s/%s", dirname, ent->d_name);
|
names[name_cnt-1] = ent->d_name;
|
||||||
DEBUG(extension);
|
|
||||||
imlib_update(extension);
|
|
||||||
updated = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
if (!updated)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user