navidrome/core/artwork
Deluan 6cd12e6070 fix(artwork): treat an unreadable upload as a failure, not a miss
resolveLocalFile swallowed every os.Open error, so uploads, playlist
sidecars, a local M3U image and the artist image folder still had the
bug that was fixed for folder and embedded sources: a permission or
transient I/O error on a file that exists read as "no image here". The
worker then settled the item absent and dropped its queue row.

Uploads outrank every other source, so an unreadable one now stops the
chain rather than letting a lower-priority image be persisted in its
place. A genuinely missing file stays a clean miss.

Reported by Codex on #5847.
2026-07-25 13:36:23 -04:00
..
blurhash feat(artwork): import blurhash encoder from #5797 2026-07-22 15:53:32 -04:00
e2e fix(artwork): register the GIF decoder in core/artwork 2026-07-25 10:02:18 -04:00
agent_images.go feat(artwork): log external image-lookup failures at debug 2026-07-24 18:15:07 -04:00
agent_images_test.go perf(artwork): drain local and external artwork in separate pools 2026-07-25 13:32:07 -04:00
animation.go feat(artwork): preserve animated image artwork during resize (#5184) 2026-03-13 18:11:12 -04:00
animation_test.go feat(artwork): preserve animated image artwork during resize (#5184) 2026-03-13 18:11:12 -04:00
artwork_suite_test.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
benchmark_decode_test.go perf(artwork): improve image serving performance with WebP encoding and optimized pipeline (#5181) 2026-03-13 09:35:59 -04:00
benchmark_encode_test.go perf(artwork): improve image serving performance with WebP encoding and optimized pipeline (#5181) 2026-03-13 09:35:59 -04:00
benchmark_helpers_test.go chore: go fix 2026-05-28 22:13:05 -03:00
benchmark_pipeline_test.go feat(artwork): preserve animated image artwork during resize (#5184) 2026-03-13 18:11:12 -04:00
benchmark_tag_test.go perf(artwork): improve image serving performance with WebP encoding and optimized pipeline (#5181) 2026-03-13 09:35:59 -04:00
disc.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
disc_test.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
folders_album.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
folders_artist.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
housekeeping.go feat(artwork): make artwork re-resolution targeted, not blunt 2026-07-24 20:42:14 -04:00
housekeeping_test.go feat(artwork): make artwork re-resolution targeted, not blunt 2026-07-24 20:42:14 -04:00
image_cache.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
image_store.go fix(artwork): make the prune sweep cancellable 2026-07-25 10:16:00 -04:00
image_store_test.go fix(artwork): make the prune sweep cancellable 2026-07-25 10:16:00 -04:00
library_fs.go fix(artwork): preserve the drive when normalizing Windows file:// library paths 2026-07-23 14:08:08 -04:00
library_fs_test.go fix(artwork): open library-backed artwork through its on-disk root 2026-07-23 14:08:08 -04:00
playlist_cover.go fix(artwork): serve a local playlist ExternalImageURL as a file-backed reference 2026-07-23 14:08:08 -04:00
processor.go perf(artwork): precache from the bytes just acquired 2026-07-25 11:47:40 -04:00
processor_test.go fix(artwork): treat an unreadable upload as a failure, not a miss 2026-07-25 13:36:23 -04:00
prune.go fix(artwork): make the prune sweep cancellable 2026-07-25 10:16:00 -04:00
prune_test.go refactor(artwork): thread model.Kind through the artwork API 2026-07-24 16:58:23 -04:00
refresh.go refactor(artwork): thread model.Kind through the artwork API 2026-07-24 16:58:23 -04:00
resize.go feat(artwork): state-backed serving path with provisional read-through 2026-07-23 14:08:08 -04:00
resolve.go fix(artwork): treat an unreadable upload as a failure, not a miss 2026-07-25 13:36:23 -04:00
resolve_test.go fix(artwork): serve a local playlist ExternalImageURL as a file-backed reference 2026-07-23 14:08:08 -04:00
serving.go fix(artwork): keep not-found distinct from artwork-absent 2026-07-25 10:14:22 -04:00
serving_test.go fix(artwork): keep not-found distinct from artwork-absent 2026-07-25 10:14:22 -04:00
sources.go fix(artwork): never record absent after a local I/O failure 2026-07-25 10:06:51 -04:00
sources_internal_test.go refactor(artwork): migrate readers to storage.MusicFS and add e2e suite (#5379) 2026-04-26 18:16:14 -04:00
testhelpers_test.go refactor(artwork): delete the legacy reader chain, cache warmer, and provider image methods 2026-07-23 14:08:08 -04:00
uploader.go refactor(artwork): thread model.Kind through the artwork API 2026-07-24 16:58:23 -04:00
uploader_test.go refactor(artwork): thread model.Kind through the artwork API 2026-07-24 16:58:23 -04:00
wire_providers.go refactor(artwork): move ImageUploadService to artwork.Uploader 2026-07-24 16:24:19 -04:00
worker.go perf(artwork): drain local and external artwork in separate pools 2026-07-25 13:32:07 -04:00
worker_soak_test.go perf(artwork): precache from the bytes just acquired 2026-07-25 11:47:40 -04:00
worker_test.go perf(artwork): drain local and external artwork in separate pools 2026-07-25 13:32:07 -04:00
worker_timing_test.go feat(artwork): precache on acquisition, bump on upload/radio changes, manual re-resolve API 2026-07-23 14:08:08 -04:00