summaryrefslogtreecommitdiff
path: root/plugins/artwork
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-02-17 20:49:51 +0100
committerGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-02-17 20:49:51 +0100
commitdc71a9bbf6774ea2bf768466389009e957c787d6 (patch)
treea3bb90aa49ad77e400a766fc3c1f58350c6a395b /plugins/artwork
parentfaca996ed66ef665f419087192381077c90b6995 (diff)
artwork: embedded covers from untagged files; also added escaping of album/artist tags for naming cache files
Diffstat (limited to 'plugins/artwork')
-rw-r--r--plugins/artwork/artwork.c59
1 files changed, 50 insertions, 9 deletions
diff --git a/plugins/artwork/artwork.c b/plugins/artwork/artwork.c
index 5362a5df..7c1766bc 100644
--- a/plugins/artwork/artwork.c
+++ b/plugins/artwork/artwork.c
@@ -120,11 +120,33 @@ static time_t artwork_reset_time;
static char artwork_filemask[200];
static const char *get_default_cover (void) {
- return default_cover;
+return default_cover;
+}
+
+static int
+esc_char (char c) {
+ if (c < 1
+ || (c >= 'a' && c <= 'z')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9')
+ || c == ' '
+ || c == '_'
+ || c == '-') {
+ return c;
+ }
+ return '_';
}
int
make_cache_dir_path (char *path, int size, const char *artist, int img_size) {
+ char esc_artist[PATH_MAX];
+ int i;
+
+ for (i = 0; artist[i]; i++) {
+ esc_artist[i] = esc_char (artist[i]);
+ }
+ esc_artist[i] = 0;
+
const char *cache = getenv ("XDG_CACHE_HOME");
int sz;
@@ -136,7 +158,7 @@ make_cache_dir_path (char *path, int size, const char *artist, int img_size) {
}
path += sz;
- sz += snprintf (path, size-sz, "%s", artist);
+ sz += snprintf (path, size-sz, "%s", esc_artist);
for (char *p = path; *p; p++) {
if (*p == '/') {
*p = '_';
@@ -148,10 +170,22 @@ make_cache_dir_path (char *path, int size, const char *artist, int img_size) {
void
make_cache_path (char *path, int size, const char *album, const char *artist, int img_size) {
char *p = path;
+ char esc_album[PATH_MAX];
+ const char *palbum = album;
+ size_t l = strlen (album);
+ if (l > 200) {
+ palbum = album + l - 200;
+ }
+ int i;
+ for (i = 0; palbum[i]; i++) {
+ esc_album[i] = esc_char (palbum[i]);
+ }
+ esc_album[i] = 0;
+
int sz = make_cache_dir_path (path, size, artist, img_size);
size -= sz;
path += sz;
- sz = snprintf (path, size, "/%s.jpg", album);
+ sz = snprintf (path, size, "/%s.jpg", esc_album);
for (char *p = path+1; *p; p++) {
if (*p == '/') {
*p = '_';
@@ -912,7 +946,7 @@ fetcher_thread (void *none)
trace ("artwork: corrupted id3v2 APIC frame\n");
continue;
}
- if (strcasecmp (data, "image/jpeg") && strcasecmp (data, "image/png")) {
+ if (strcasecmp (data, "image/jpeg") && strcasecmp (data, "image/png") && strcasecmp (data, "image/gif")) {
trace ("artwork: unsupported mime type: %s\n", data);
continue;
}
@@ -1270,12 +1304,19 @@ get_album_art (const char *fname, const char *artist, const char *album, int siz
if (!*artist || !*album)
{
- trace ("artist or album is empty, give up\n");
- //give up
- if (callback) {
- callback (NULL, NULL, NULL, user_data);
+ if (fname) {
+ // album=escape(path), artist=uknown
+ artist = "Unknown artist";
+ album = fname;
+ }
+ else {
+ trace ("artist or album is empty, give up\n");
+ //give up
+ if (callback) {
+ callback (NULL, NULL, NULL, user_data);
+ }
+ return NULL;
}
- return NULL;
}
if (!deadbeef->is_local_file (fname)) {