diff --git a/src/artwork.c b/src/artwork.c index 4b536ba6..b3793f2c 100644 --- a/src/artwork.c +++ b/src/artwork.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -193,7 +194,7 @@ static int source_group_dir_get(struct artwork_ctx *ctx); static int source_item_cache_get(struct artwork_ctx *ctx); static int source_item_embedded_get(struct artwork_ctx *ctx); static int source_item_own_get(struct artwork_ctx *ctx); -static int source_item_stream_get(struct artwork_ctx *ctx); +static int source_item_artwork_url_get(struct artwork_ctx *ctx); static int source_item_pipe_get(struct artwork_ctx *ctx); static int source_item_spotifywebapi_track_get(struct artwork_ctx *ctx); static int source_item_ownpl_get(struct artwork_ctx *ctx); @@ -254,7 +255,7 @@ static struct artwork_source artwork_item_source[] = }, { .name = "stream", - .handler = source_item_stream_get, + .handler = source_item_artwork_url_get, .data_kinds = (1 << DATA_KIND_HTTP), .media_kinds = MEDIA_KIND_MUSIC, .cache = STASH, @@ -1503,25 +1504,15 @@ source_item_own_get(struct artwork_ctx *ctx) } /* - * Downloads the artwork pointed to by the ICY metadata tag in an internet radio - * stream (the StreamUrl tag). The path will be converted back to the id, which - * is given to the player. If the id is currently being played, and there is a - * valid ICY metadata artwork URL available, it will be returned to this - * function, which will then use the http client to get the artwork. + * Downloads the artwork from the location pointed to by queue_item->artwork_url */ static int -source_item_stream_get(struct artwork_ctx *ctx) +source_item_artwork_url_get(struct artwork_ctx *ctx) { struct db_queue_item *queue_item; - char *url; - char *ext; - int len; int ret; - - DPRINTF(E_SPAM, L_ART, "Trying internet stream artwork in %s\n", ctx->dbmfi->path); - - ret = ART_E_NONE; + DPRINTF(E_SPAM, L_ART, "Trying artwork url for %s\n", ctx->dbmfi->path); queue_item = db_queue_fetch_byfileid(ctx->id); if (!queue_item || !queue_item->artwork_url) @@ -1530,24 +1521,12 @@ source_item_stream_get(struct artwork_ctx *ctx) return ART_E_NONE; } - url = strdup(queue_item->artwork_url); + ret = artwork_get_byurl(ctx->evbuf, queue_item->artwork_url, ctx->max_w, ctx->max_h); + + snprintf(ctx->path, sizeof(ctx->path), "%s", queue_item->artwork_url); + free_queue_item(queue_item, 0); - len = strlen(url); - if ((len < 14) || (len > PATH_MAX)) // Can't be shorter than http://a/1.jpg - goto out_url; - - ext = strrchr(url, '.'); - if (!ext) - goto out_url; - if ((strcmp(ext, ".jpg") != 0) && (strcmp(ext, ".png") != 0)) - goto out_url; - - ret = artwork_get_byurl(ctx->evbuf, url, ctx->max_w, ctx->max_h); - - out_url: - free(url); - return ret; } @@ -2024,7 +2003,7 @@ artwork_get_group(struct evbuffer *evbuf, int id, int max_w, int max_h) } /* Checks if the file is an artwork file */ -int +bool artwork_file_is_artwork(const char *filename) { cfg_t *lib; @@ -2039,7 +2018,7 @@ artwork_file_is_artwork(const char *filename) for (i = 0; i < n; i++) { - for (j = 0; j < (sizeof(cover_extension) / sizeof(cover_extension[0])); j++) + for (j = 0; j < ARRAY_SIZE(cover_extension); j++) { ret = snprintf(artwork, sizeof(artwork), "%s.%s", cfg_getnstr(lib, "artwork_basenames", i), cover_extension[j]); if ((ret < 0) || (ret >= sizeof(artwork))) @@ -2049,12 +2028,42 @@ artwork_file_is_artwork(const char *filename) } if (strcmp(artwork, filename) == 0) - return 1; + return true; } - if (j < (sizeof(cover_extension) / sizeof(cover_extension[0]))) + if (j < ARRAY_SIZE(cover_extension)) break; } - return 0; + return false; +} + +bool +artwork_extension_is_artwork(const char *path) +{ + char *ext; + int len; + int i; + + ext = strrchr(path, '.'); + if (!ext) + return false; + + ext++; + + for (i = 0; i < ARRAY_SIZE(cover_extension); i++) + { + len = strlen(cover_extension[i]); + + if (strncasecmp(cover_extension[i], ext, len) != 0) + continue; + + // Check that after the extension we either have the end or "?" + if (ext[len] != '\0' && ext[len] != '?') + continue; + + return true; + } + + return false; } diff --git a/src/artwork.h b/src/artwork.h index 57b23a7a..40025797 100644 --- a/src/artwork.h +++ b/src/artwork.h @@ -9,6 +9,7 @@ #define ART_DEFAULT_WIDTH 600 #include +#include /* * Get the artwork image for an individual item (track) @@ -38,9 +39,20 @@ artwork_get_group(struct evbuffer *evbuf, int id, int max_w, int max_h); * Checks if the file is an artwork file (based on user config) * * @in filename Name of the file - * @return 1 if true, 0 if false + * @return true/false */ -int +bool artwork_file_is_artwork(const char *filename); +/* + * Checks if the path (or URL) has file extension that is recognized as a + * supported file type (e.g. ".jpg"). Also supports URL-encoded paths, e.g. + * http://foo.com/bar.jpg?something + * + * @in path Path to the file (can also be a URL) + * @return true/false + */ +bool +artwork_extension_is_artwork(const char *path); + #endif /* !__ARTWORK_H__ */