File artwork not displayed for two classes of valid JPEG (one affects folder and embedded art, one embedded-only)

Roon Server 2.7.0 on Docker Synology, DSM 7.4; remote on iPadOS 26.5.2

This is a courtesy report from a user new to current Roon software - I last used Roon a few years back as part of a review. As I copied part of my library over to Roon to gain some experience with the latest software I noticed that my cover images were sometimes missing or in a few cases not my curated version despite selecting the option to prefer my own artwork.

So, this sent me into a bit of a rabbit hole to determine the pattern since my artwork has been heavily curated over a decade+. What I found is described in technical detail and I have already remediated my library to make it compatible with Roon fully. The failure is silent and the fix on Roon’s side is likely small should they deem it worthwhile, so I wanted to document it. To be precise about the file class up front: these are **fully valid JPEGs** (the marker ordering is spec-legal per ITU T.81, and every other decoder I tested renders them); what they lack is the JFIF/Exif APP marker convention that format sniffers commonly key on. Unusual in the wild, but deterministic — anyone running the same tool combination produces byte-identical results.

Symptom (finding 1): JPEGs with no APP0/APP1 marker whose first marker after SOI is the SOF0 frame header — the file begins `FF D8 FF C0` — are not displayed as artwork in either context: embedded covers show no file-art candidate in the Album Editor’s artwork section, and the same file placed as cover.jpg in the album folder is likewise ignored. The embedded PICTURE block is valid (type 3, image/jpeg, correct dimensions) and the image decodes in every other player, computer application, utility I have ever used. Roon appears to identify image type by magic bytes and does not recognize this opening.

How such files arise: metadata strippers (e.g. `exiftool -all=`) remove the JFIF APP0 segment along with real metadata. Applied to JPEGs whose encoder orders the frame header before the tables — observed with Pixelmator Pro exports, which encode through Apple’s imaging frameworks — the result opens `FF D8 FF C0`. In my library, a legacy artwork toolchain had produced ~6,000 such covers over the years — invisible everywhere until Roon.

Variant testing: I built a five-file test kit from the same synthetic artwork (byte-level constructions; happy to supply the files) and tested each both as a folder image (cover.jpg) and embedded in FLAC PICTURE blocks, in separate albums to avoid cache effects.

Results:

Test file Construction Folder art Embedded in FLAC
1 — clean JFIF, terminates at EOI works works
2 — FF D8 FF C0 no APP marker, SOF0 first (Apple enc + strip) FAILS FAILS
3 — FF D8 FF DB no APP marker, DQT first (libjpeg + strip) works works
4 — FF D8 FF EE APP14/Adobe first (Photoshop + strip) works works
5 — trailing bytes clean JFIF + 4 bytes (00 0A 00 00) after EOI works FAILS

This localizes the two rules: the `FF D8 FF C0` rejection is in the shared image-identification layer (both paths refuse it), while the terminate-at-EOI requirement is specific to the embedded-art extractor — plausibly a validation of parsed stream length against the PICTURE block’s declared data length, which folder files never face. All five files decode correctly in every other application tested; files 2–5 are spec-legal JPEG (the marker ordering rules only require tables before the scan, and trailing bytes after EOI are ignored by conforming decoders).

Real-world incidence in my library (10,233 albums): ~6,000 covers with the `FF D8 FF C0` opening (a legacy toolchain stripped JFIF headers from JPEGs for years) and 172 covers with small trailing pads (2–4 bytes, a legacy tagger’s text-terminator bug). Both populations are now remediated on my side; the numbers are to show these file classes can occur at scale in curated libraries, not as one-off corruption.

Why these failures may go unreported (hypothesis)

One observation that may explain why neither issue may have surfaced before despite existing in the wild for years: when file-art extraction fails, Roon silently falls back to its own database artwork, so for any *identified* album the failure is invisible — the user just sees art and never knows it is not theirs. The only visible symptom is a blank cover on an album Roon cannot identify, which is how I caught it. The users most likely to be affected (curated libraries heavy on audiophile pressings and obscure releases Roon cannot identify) are the only ones who ever see a symptom.

A per-album indicator of artwork source — or an option to disable the database-art fallback entirely — would make this class of failure self-diagnosing.

Hope this is useful to someone.

Interesting - FWIW, have produced most of my album artwork for years with Pixelmator Pro and have never experienced this.

Also, are you aware that if your import settings for album art are set to “prefer file” that Roon will do as you describe, and never fall back to the online artwork database? I’m so persnickety about album art that I never want anything other than my own.

Hi,

Thanks for the reply. I am aware of that setting and that is how I have Roon configured. However, if Roon in the three failure scenarios I described can’t read the artwork it will use its own or show a blank if it has none.

Pixelmator Pro does not introduce the primary issue the open source exiftool does. I had a cover art workflow that included Pixelmator actions but ended with stripping EXIF data from the image.

I will provide a really easy reproducible test case.

  1. Create or take an existing image and use exiftool on it - command line like this

    exiftool -all= -overwrite_original image-name.jpg

  2. Use that image with Roon either embedded or as a jpg inside the folder. Roon will either give you no image or fallback to its own database if it can match one.

In the screen shot attached I created a 1000x1000 jpg in Pixelmator pro and applied to a test album. I then duplicated the jpg and ran exiftool and applied to the same album duplicated with a different name for ease of observation. The same image is in both but Roon can’t read the JPG after the exiftool strip despite it being a valid JPG.

Roon is the outlier - Tools like JRiver, Swinsian, MP3Tag, Yate, dBpoweramp, PerfectTUNES, Audirvana, music players like Aurenders, etc - you name it read that JPG fine.

I don’t think the issue is necessarily the JPEG, but how the image is inserted into the music file. Unlike the other tools you mention, Roon checks the integrity of the file before decoding.

Since you have done some research and this subject is quite topical at the moment—there a a couple of other active threads—it would be useful to open a Technical Support Reques since Roon staff do not routinely read this category.

In the example above the image is external sitting in the folder. Roon refuses it in folder or embedded. I have opened a support ticket before I posted this will work that. I tested both styles outlined in original post.

You have no Support requests in the community.

When I submitted it said it could take 48 hours to appear? Apologies new to this community but I did use the same link you provided. Took me through somewhat of a menu driven approach before I submitted the title and up to three screenshots.

Once the ticket is generated, a new topic is created in Support. New users’ posts require approval, but the wait shouldn’t be long unless a direct reply from Roon staff is necessary (Roon support operates Monday to Friday.)

I see. Your original post doesn’t make that clear, because it says:

At any rate, what are your goals for running exiftool? From where I sit, I don’t think there is any real benefit, and there are obviously drawbacks.

FWIW, Roon, once you’ve set your Import settings and performed a Force Rescan of your library (once), will never “use its own” artwork.

Thanks, I just created it yesterday will check again tomorrow.