From b64d282f325443d2c78379786fc659c083130cb9 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Fri, 27 Oct 2017 19:51:37 +0200 Subject: [PATCH] [artwork] Fix for issue #427, some embedded file artwork not showing Artwork in embedded files not showing up in non-legacy mode if the artwork does not require rescaling. The bug is that we are by mistake sending a chunk of the embedded file, not the artwork in it. --- src/artwork.c | 65 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/src/artwork.c b/src/artwork.c index 8bbc9d2a..7ae53ed4 100644 --- a/src/artwork.c +++ b/src/artwork.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -323,15 +324,16 @@ rescale_calculate(int *target_w, int *target_h, int width, int height, int max_w /* Get an artwork file from the filesystem. Will rescale if needed. * - * @out evbuf Image data - * @in path Path to the artwork (alternative to inbuf) - * @in inbuf Buffer with the artwork (alternative to path) - * @in max_w Requested width - * @in max_h Requested height - * @return ART_FMT_* on success, ART_E_ERROR on error + * @out evbuf Image data + * @in path Path to the artwork file (alternative to inbuf) + * @in inbuf Buffer with the artwork (alternative to path) + * @in max_w Requested width + * @in max_h Requested height + * @in is_embedded Whether the artwork in file is embedded or raw jpeg/png + * @return ART_FMT_* on success, ART_E_ERROR on error */ static int -artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_w, int max_h) +artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_w, int max_h, bool is_embedded) { struct decode_ctx *xcode_decode; struct encode_ctx *xcode_encode; @@ -348,7 +350,10 @@ artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_ xcode_decode = transcode_decode_setup(XCODE_JPEG, DATA_KIND_FILE, path, inbuf, 0); // Covers XCODE_PNG too if (!xcode_decode) { - DPRINTF(E_DBG, L_ART, "No artwork found in '%s'\n", path); + if (path) + DPRINTF(E_DBG, L_ART, "No artwork found in '%s'\n", path); + else + DPRINTF(E_DBG, L_ART, "No artwork provided to artwork_get()\n"); return ART_E_NONE; } @@ -358,7 +363,13 @@ artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_ format_ok = ART_FMT_PNG; else { - DPRINTF(E_LOG, L_ART, "Artwork file '%s' not a PNG or JPEG file\n", path); + if (is_embedded) + DPRINTF(E_DBG, L_ART, "File '%s' has no PNG or JPEG artwork\n", path); + else if (path) + DPRINTF(E_LOG, L_ART, "Artwork file '%s' not a PNG or JPEG file\n", path); + else + DPRINTF(E_LOG, L_ART, "Artwork data provided to artwork_get() is not PNG or JPEG\n"); + goto fail_free_decode; } @@ -368,12 +379,25 @@ artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_ ret = rescale_calculate(&target_w, &target_h, width, height, max_w, max_h); if (ret < 0) { - // No rescaling required, just read the raw file into the evbuf - if (!path || artwork_read(evbuf, path) != 0) - goto fail_free_decode; + if (is_embedded) + { + target_w = width; + target_h = height; + } + else if (path) + { + // No rescaling required, just read the raw file into the evbuf + ret = artwork_read(evbuf, path); + if (ret < 0) + goto fail_free_decode; - transcode_decode_cleanup(&xcode_decode); - return format_ok; + transcode_decode_cleanup(&xcode_decode); + return format_ok; + } + else + { + goto fail_free_decode; + } } if (format_ok == ART_FMT_JPEG) @@ -383,7 +407,10 @@ artwork_get(struct evbuffer *evbuf, char *path, struct evbuffer *inbuf, int max_ if (!xcode_encode) { - DPRINTF(E_WARN, L_ART, "Cannot open artwork file for rescaling '%s'\n", path); + if (path) + DPRINTF(E_WARN, L_ART, "Error preparing rescaling of '%s'\n", path); + else + DPRINTF(E_WARN, L_ART, "Error preparing rescaling of artwork data\n"); goto fail_free_decode; } @@ -519,7 +546,7 @@ artwork_get_dir_image(struct evbuffer *evbuf, char *dir, int max_w, int max_h, c snprintf(out_path, PATH_MAX, "%s", path); - return artwork_get(evbuf, path, NULL, max_w, max_h); + return artwork_get(evbuf, path, NULL, max_w, max_h, false); } @@ -632,7 +659,7 @@ source_item_embedded_get(struct artwork_ctx *ctx) snprintf(ctx->path, sizeof(ctx->path), "%s", ctx->dbmfi->path); - return artwork_get(ctx->evbuf, ctx->path, NULL, ctx->max_w, ctx->max_h); + return artwork_get(ctx->evbuf, ctx->path, NULL, ctx->max_w, ctx->max_h, true); } /* Looks for basename(in_path).{png,jpg}, so if in_path is /foo/bar.mp3 it @@ -686,7 +713,7 @@ source_item_own_get(struct artwork_ctx *ctx) snprintf(ctx->path, sizeof(ctx->path), "%s", path); - return artwork_get(ctx->evbuf, path, NULL, ctx->max_w, ctx->max_h); + return artwork_get(ctx->evbuf, path, NULL, ctx->max_w, ctx->max_h, false); } /* @@ -817,7 +844,7 @@ source_item_spotify_get(struct artwork_ctx *ctx) } // For non-file input, artwork_get() will also fail if no rescaling is required - ret = artwork_get(ctx->evbuf, NULL, evbuf, ctx->max_w, ctx->max_h); + ret = artwork_get(ctx->evbuf, NULL, evbuf, ctx->max_w, ctx->max_h, false); if (ret == ART_E_ERROR) { DPRINTF(E_DBG, L_ART, "Not rescaling Spotify image\n");