Skip to content

[Bug]: Song cover art endpoint returning MPEG-4 file #3859

@Baspla

Description

@Baspla

I confirm that:

  • I have searched the existing open AND closed issues to see if an issue already exists for the bug I've encountered
  • I'm using the latest version (your issue may have been fixed already)

Version

0.55.1 (beb768c)

Current Behavior

I noticed that some songs don't have a cover, even between different songs of the same album.
/rest/getCoverArt returns a MPEG-4 file instead of a jpeg.

Expected Behavior

It should return the album cover art as a jpeg

Steps To Reproduce

  1. clear cache
  2. request /rest/getCoverArt for affected song
  3. recieve application/octet-stream instead of image

Environment

- OS: Debian 12 (Raspberry Pi 5) running Docker deluan/navidrome:0.55.1
- Browser: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0
- Client: all (direct API call)

How Navidrome is installed?

Docker

Configuration

services:
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1000
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: debug
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
      ND_DEFAULTLANGUAGE: de
      ND_LASTFM_APIKEY: ...
      ND_LASTFM_SECRET: ...
      ND_LASTFM_LANGUAGE: de
      ND_IMAGECACHESIZE: 200MB
      ND_CONFIGFILE: /data/navidrome.toml
    volumes:
      - ".../data:/data"
      - ".../music:/music:ro"

Relevant log output

navidrome-1  | time="2025-03-20T20:57:15Z" level=debug msg="API: New request /rest/getCoverArt" client=NavidromeUI requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 username=tim version=1.8.0
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Cache MISS" cache=Image key=media_file-f8fa0adee8d6d273b42bb3da0fe78f13.1741797138000.true.300.75 requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Cache MISS" cache=Image key=media_file-f8fa0adee8d6d273b42bb3da0fe78f13.1741797138000.true requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Found embedded image" path="/music/Imagine Dragons - Natural.m4a" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 type=cover
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Could not find a front image. Getting the first one" path="/music/Imagine Dragons - Natural.m4a" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 type=cover
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Failed trying to extract artwork" artID=mf-f8fa0adee8d6d273b42bb3da0fe78f13_0 elapsed="371.462µs" error="could not load embedded image from /music/Imagine Dragons - Natural.m4a" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 source=Reader.fromTag
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Executing ffmpeg command" cmd="[`/usr/bin/ffmpeg`,`-i`,`/music/Imagine Dragons - Natural.m4a`,`-an`,`-vcodec`,`copy`,`-f`,`image2pipe`,`-`]" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | time="2025-03-20T20:57:15Z" level=debug msg="Found media_file artwork" artID=mf-f8fa0adee8d6d273b42bb3da0fe78f13_0 elapsed=1.3ms path="/music/Imagine Dragons - Natural.m4a" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 source=Reader.fromFFmpegTag.func2
navidrome-1  | ffmpeg version 6.1.2 Copyright (c) 2000-2024 the FFmpeg developers
navidrome-1  |   built with gcc 14.2.0 (Alpine 14.2.0)
navidrome-1  |   configuration: --prefix=/usr --disable-librtmp --disable-lzma --disable-static --disable-stripping --enable-avfilter --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libmp3lame --enable-libopenmpt --enable-libopus --enable-libplacebo --enable-libpulse --enable-librav1e --enable-librist --enable-libsoxr --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-lto=auto --enable-lv2 --enable-openssl --enable-pic --enable-postproc --enable-pthreads --enable-shared --enable-vaapi --enable-vdpau --enable-version3 --enable-vulkan --optflags=-O3 --enable-libjxl --enable-libsvtav1
navidrome-1  |   libavutil      58. 29.100 / 58. 29.100
navidrome-1  |   libavcodec     60. 31.102 / 60. 31.102
navidrome-1  |   libavformat    60. 16.100 / 60. 16.100
navidrome-1  |   libavdevice    60.  3.100 / 60.  3.100
navidrome-1  |   libavfilter     9. 12.100 /  9. 12.100
navidrome-1  |   libswscale      7.  5.100 /  7.  5.100
navidrome-1  |   libswresample   4. 12.100 /  4. 12.100
navidrome-1  |   libpostproc    57.  3.100 / 57.  3.100
navidrome-1  | [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fff80de7610] stream 0, timescale not set
navidrome-1  | Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/music/Imagine Dragons - Natural.m4a':
navidrome-1  |   Metadata:
navidrome-1  |     major_brand     : M4V
navidrome-1  |     minor_version   : 512
navidrome-1  |     compatible_brands: M4V isomiso2avc1
navidrome-1  |     track           : 1/15
navidrome-1  |     disc            : 1/1
navidrome-1  |     rating          : 2
navidrome-1  |     date            : 2018-11-09
navidrome-1  |     WOAS            : https://open.spotify.com/track/2FY7b99s15jUprqC0M5NCT
navidrome-1  |     encoder         : Kid Ina Korner / Interscope
navidrome-1  |     title           : Natural
navidrome-1  |     copyright       : © 2018 KIDinaKORNER/Interscope Records
navidrome-1  |     comment         : https://music.youtube.com/watch?v=pXu6JC6-d_o
navidrome-1  |     artist          : Imagine Dragons
navidrome-1  |     album_artist    : Imagine Dragons
navidrome-1  |     album           : Origins (Deluxe)
navidrome-1  |   Duration: 00:03:09.47, start: 0.000000, bitrate: 182 kb/s
navidrome-1  |   Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 360x360 [SAR 1:1 DAR 1:1], 38 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
navidrome-1  |     Metadata:
navidrome-1  |       handler_name    : ISO Media file produced by Company. Created on: 03/19/2025.
navidrome-1  |       vendor_id       : [0][0][0][0]
navidrome-1  |   Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
navidrome-1  |     Metadata:
navidrome-1  |       handler_name    : ISO Media file produced by Company. Created on: 03/19/2025.
navidrome-1  |       vendor_id       : [0][0][0][0]
navidrome-1  |   Stream #0:2[0x0]: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 640x640 [SAR 118:118 DAR 1:1], 90k tbr, 90k tbn (attached pic)
navidrome-1  | Output #0, image2pipe, to 'pipe:':
navidrome-1  |   Metadata:
navidrome-1  |     major_brand     : M4V
navidrome-1  |     minor_version   : 512
navidrome-1  |     compatible_brands: M4V isomiso2avc1
navidrome-1  |     track           : 1/15
navidrome-1  |     disc            : 1/1
navidrome-1  |     rating          : 2
navidrome-1  |     date            : 2018-11-09
navidrome-1  |     WOAS            : https://open.spotify.com/track/2FY7b99s15jUprqC0M5NCT
navidrome-1  |     album           : Origins (Deluxe)
navidrome-1  |     title           : Natural
navidrome-1  |     copyright       : © 2018 KIDinaKORNER/Interscope Records
navidrome-1  |     comment         : https://music.youtube.com/watch?v=pXu6JC6-d_o
navidrome-1  |     artist          : Imagine Dragons
navidrome-1  |     album_artist    : Imagine Dragons
navidrome-1  |     encoder         : Lavf60.16.100
navidrome-1  |   Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 360x360 [SAR 1:1 DAR 1:1], q=2-31, 38 kb/s, 25 fps, 25 tbr, 25 tbn (default)
navidrome-1  |     Metadata:
navidrome-1  |       handler_name    : ISO Media file produced by Company. Created on: 03/19/2025.
navidrome-1  |       vendor_id       : [0][0][0][0]
navidrome-1  | Stream mapping:
navidrome-1  |   Stream #0:0 -> #0:0 (copy)
navidrome-1  | Press [q] to stop, [?] for help
time="2025-03-20T20:57:15Z" level=trace msg="Image smaller than requested size" artID=mf-f8fa0adee8d6d273b42bb3da0fe78f13_0 original=0 requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 resized=300
navidrome-1  | time="2025-03-20T20:57:15Z" level=warning msg="Could not resize image. Will return image as is" artID=mf-f8fa0adee8d6d273b42bb3da0fe78f13_0 error="image: unknown format" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 size=300
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="Cache HIT" cache=Image key=media_file-f8fa0adee8d6d273b42bb3da0fe78f13.1741797138000.true requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | [out#0/image2pipe @ 0x7fff804efe60] video:900kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
navidrome-1  | size=     900kB time=00:03:09.32 bitrate=  38.9kbits/s speed=2.96e+03x
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="File successfully stored in cache" cache=Image key=media_file-f8fa0adee8d6d273b42bb3da0fe78f13.1741797138000.true requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | time="2025-03-20T20:57:15Z" level=trace msg="File successfully stored in cache" cache=Image key=media_file-f8fa0adee8d6d273b42bb3da0fe78f13.1741797138000.true.300.75 requestId=a3517c1f4bbe/9z6D8Tvi9W-000001
navidrome-1  | time="2025-03-20T20:57:15Z" level=debug msg="HTTP: GET http://100.70.228.90:4533/rest/getCoverArt?u=tim&t=[REDACTED]&s=[REDACTED]&f=json&v=1.8.0&c=NavidromeUI&id=mf-f8fa0adee8d6d273b42bb3da0fe78f13&_=2025-03-12T16%3A32%3A18Z&size=300" elapsedTime=303.2ms httpStatus=200 remoteAddr="100.114.102.44:49253" requestId=a3517c1f4bbe/9z6D8Tvi9W-000001 responseSize=921623 userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0"

Anything else?

After some investigation i noticed that the /rest/getCoverArt endpoint returns a file for those songs that:

  • is much larger then a regular cover image (20 kb vs 900 kb)
  • has no file ending but is of the type application/octet-stream
  • starts with the line �¯��ÿÿ«ÜE齿ÙH·–,Ø Ù#îïx264 - core 161 r3048 b86ae3c - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=11 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 € ZÎeˆ„ �÷ :“ÿ�ÑHÑ3ø=Vëû²ŽÒâÕ:r¡M�4%‰�¯ÊCµ�+º2?† GW0rQ×Ç�ÅÌ 3ÇeùšÛ

This leads me to guess that navidrome for some reason returns a music file instead of the cover image here.
This occurs for several songs without any discernible pattern.
The songs are all .m4a files.

Code of Conduct

  • I agree to follow Navidrome's Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions