Custom Quality String — No more fake Lossless

Hey everyone! Hope you’re all doing well.

After trying several custom strings shared in this forum, I noticed a common problem: AAC files were being displayed as Lossless, which is incorrect. AAC is always a lossy format regardless of bit depth. I listen to music directly from my device using local files, so I’m not sure if this issue also affects users streaming from servers — but it’s worth checking if you’re in the same situation.

So I built this chain with the help of Claude AI, since I wouldn’t have been able to put it together on my own. It’s based entirely on codec + bitrate/samplerate, not bit depth, to avoid that confusion.

Logic applied:

Dolby Atmos → EC3 or AC4 codec with more than 2 channels

Hi-Res Lossless → FLAC or ALAC with sample rate above 48 kHz

Lossless → FLAC or ALAC with sample rate at or below 48 kHz

MP3 High Quality → above 310 kbps

MP3 Medium Quality → 130–310 kbps

MP3 Low Quality → below 130 kbps

AAC High Quality → above 250 kbps

AAC Medium Quality → 64–250 kbps

AAC Low Quality → below 64 kbps

OPUS High Quality → above 127 kbps

OPUS Medium Quality → 96–127 kbps

OPUS Low Quality → below 96 kbps

This way lossy formats (MP3, AAC, OPUS) will never appear as Lossless, and FLAC/ALAC are correctly separated between Lossless and Hi-Res Lossless based on sample rate.

The string is formatted with \t to display the quality label centered between playback position and remaining time, just like Apple Music.

CUSTOM STRING:

%player.position%\t{Dolby Atmos%|format.channels>“2”&&format.codec+=“EC3”%}{Dolby Atmos%|format.channels>“2”&&format.codec+=“AC4”%}{Hi-Res Lossless%|format.codec+=“FLAC” && format.samplerate>“48”%}{Hi-Res Lossless%|format.codec+=“ALAC” && format.samplerate>“48”%}{Lossless%|format.codec+=“FLAC” && format.samplerate<“49”%}{Lossless%|format.codec+=“ALAC” && format.samplerate<“49”%}{High Quality%|format.codec+=“MP3” && format.bitrate>“310”%}{High Quality%|format.codec+=“AAC” && format.bitrate>“250”%}{High Quality%|format.codec+=“OPUS” && format.bitrate>“127”%}{Medium Quality%|format.codec+=“MP3” && format.bitrate[]“130”..“310”%}{Medium Quality%|format.codec+=“AAC” && format.bitrate[]“64”..“250”%}{Medium Quality%|format.codec+=“OPUS” && format.bitrate[]“96”..“127”%}{Low Quality%|format.codec+=“MP3” && format.bitrate<“130”%}{Low Quality%|format.codec+=“AAC” && format.bitrate<“64”%}{Low Quality%|format.codec+=“OPUS” && format.bitrate<“96”%}\t%player.remaining%

Note: Dolby Atmos detection is approximate since Symfonium doesn’t expose a dedicated Atmos field — it uses channel count + codec as an indicator. If anyone has Atmos files and can confirm the exact codec string reported, feedback is welcome!

Hope this helps someone else with the same issue :grinning_face:

3 Likes

version with special background/badge for song quality information:

%player.position%\t\o{Dolby Atmos%|format.channels>“2”&&format.codec+=“EC3”%}{Dolby Atmos%|format.channels>“2”&&format.codec+=“AC4”%}{Hi-Res Lossless%|format.codec+=“FLAC” && format.samplerate>“48”%}{Hi-Res Lossless%|format.codec+=“ALAC” && format.samplerate>“48”%}{Lossless%|format.codec+=“FLAC” && format.samplerate<“49”%}{Lossless%|format.codec+=“ALAC” && format.samplerate<“49”%}{High Quality%|format.codec+=“MP3” && format.bitrate>“310”%}{High Quality%|format.codec+=“AAC” && format.bitrate>“250”%}{High Quality%|format.codec+=“OPUS” && format.bitrate>“127”%}{Medium Quality%|format.codec+=“MP3” && format.bitrate[]“130”..“310”%}{Medium Quality%|format.codec+=“AAC” && format.bitrate[]“64”..“250”%}{Medium Quality%|format.codec+=“OPUS” && format.bitrate[]“96”..“127”%}{Low Quality%|format.codec+=“MP3” && format.bitrate<“130”%}{Low Quality%|format.codec+=“AAC” && format.bitrate<“64”%}{Low Quality%|format.codec+=“OPUS” && format.bitrate<“96”%}\t%player.remaining%

1 Like

When you tap on the quality information, it changes and displays the format. Toggle bool 1 must be enabled when you tap the template.

%player.position%\t\o{%format|bool1==“true”%}{Dolby Atmos%|format.channels>“2”&&format.codec+=“EC3”&&bool1!=“true”%}{Dolby Atmos%|format.channels>“2”&&format.codec+=“AC4”&&bool1!=“true”%}{Hi-Res Lossless%|format.codec+=“FLAC”&&format.samplerate>“48”&&bool1!=“true”%}{Hi-Res Lossless%|format.codec+=“ALAC”&&format.samplerate>“48”&&bool1!=“true”%}{Lossless%|format.codec+=“FLAC”&&format.samplerate<“49”&&bool1!=“true”%}{Lossless%|format.codec+=“ALAC”&&format.samplerate<“49”&&bool1!=“true”%}{High Quality%|format.codec+=“MP3”&&format.bitrate>“310”&&bool1!=“true”%}{High Quality%|format.codec+=“AAC”&&format.bitrate>“250”&&bool1!=“true”%}{High Quality%|format.codec+=“OPUS”&&format.bitrate>“127”&&bool1!=“true”%}{Medium Quality%|format.codec+=“MP3”&&format.bitrate[]“130”..“310”&&bool1!=“true”%}{Medium Quality%|format.codec+=“AAC”&&format.bitrate[]“64”..“250”&&bool1!=“true”%}{Medium Quality%|format.codec+=“OPUS”&&format.bitrate[]“96”..“127”&&bool1!=“true”%}{Low Quality%|format.codec+=“MP3”&&format.bitrate<“130”&&bool1!=“true”%}{Low Quality%|format.codec+=“AAC”&&format.bitrate<“64”&&bool1!=“true”%}{Low Quality%|format.codec+=“OPUS”&&format.bitrate<“96”&&bool1!=“true”%}\t%player.duration%

I got to see Barstool Warrior with Mike Portnoy on drums, great tune!

Hi Fer!

I’m also affected by this “Lossless” string. All my music is in AAC, but I stream from Navidrome server so it’s not a files-only issue.

I’m not sure I understood the way you fixed it. Do you apply a patch on a config or what?

Hello, I created this with Claude AI. It’s a completely new string that replaces the default one. It’s based on the %format.codec% tag, which is why it doesn’t make mistakes. The default string is based on samplerate or bitrate, if I remember correctly

Okay but where do you put that string, somewhere in the settings?

Settings → Interface → Now Playing screens

You need to edit your Now Playing Screen (NPS) to use the new strings. You’ll find a ton of options in there, it’s a bit overwhelming if you’re new :stuck_out_tongue:

Basically everything you see on the NPS is customizable. You need to find which String is currently displaying the “audio quality” info that you see right now. It’s probably somewhere under the “Controls and Information” header, with the option set to “Codec and bitrate/quality”

You want to change the option to “Custom”. Then in the new option below this, you can paste the giant block of text that Fer10 posted above. That block of text is the basically program code–it tells the app what text to show and when. You can hit the Help button in-app if you want more info on that.

Seems you also want to set the “String Tap action” to “Toggle bool1”. This lets the text change when you click. See Fer10’s post for more info on what it’ll show, I’ve only done a quick read here.

1 Like

Just wanted to share a modified version of this string that is mostly locale-free (aka not locked to English). “Dolby Atmos” will still display the same, but that’s a brand name so it should be fine.

Only small change that I made: “Medium Quality” label has been changed to “Lossy”. There was no medium option so I thought this was the closest.

All credit to Fer10, I did very little here.

%player.position%\t\o{%format|bool1==“true”%}{Dolby Atmos%|format.channels>“2”&&(format.codec+=“EC3”||format.codec+=“AC4”)&&bool1=="false"%}{%string.hires.lossless|(format.codec+=“FLAC”||format.codec+=“ALAC”)&&format.samplerate>“48”&&bool1=="false"%}{%string.lossless|(format.codec+=“FLAC”||format.codec+=“ALAC”)&&format.samplerate<“49”&&bool1=="false"%}{%string.high.quality|((format.codec+=“MP3”&&format.bitrate>“310”)||(format.codec+=“AAC”&&format.bitrate>“250”)||(format.codec+=“OPUS”&&format.bitrate>“127”))&&bool1=="false"%}{%string.lossy|((format.codec+=“MP3”&&format.bitrate[]“130”..“310”)||(format.codec+=“AAC”&&format.bitrate[]“64”..“250”)||(format.codec+=“OPUS”&&format.bitrate[]“96”..“127”))&&bool1=="false"%}{%string.low.quality|((format.codec+=“MP3”&&format.bitrate<“130”)||(format.codec+=“AAC”&&format.bitrate<“64”)||(format.codec+=“OPUS”&&format.bitrate<“96”))&&bool1=="false"%}\t%player.duration%
1 Like

It perfectly worked guys! Thank you :sparkling_heart: :handshake: