Navidrome: Unable to get media provider version

Issue description:

I’m connecting to my local Navidrome install and get this Symphonium error: “Unable to get media provider version. Check the port value and that this port is not used by another software on the media provider. Press Help button for information about configuring your media provider.”

Debug logs uploaded under my userid “danielschudel”.

I know my client is talking to my server:port. Server side logs are shown here:
time=“2026-01-03T06:57:49-05:00” level=debug msg=“HTTP: GET http://files.REDACTED.org:4747/rest/ping.view?u=test&p=[REDACTED]&v=1.13.1&c=Symfonium” elapsedTime=“27.146_s” httpStatus=302 remoteAddr=“192.168.65.84:45766” requestId=files/XZYvvmlZA1-000074 responseSize=30 userAgent=“Symfonium/13.6.5a (Linux;Android 15)”
time=“2026-01-03T06:57:49-05:00” level=debug msg=“HTTP: GET http://files.REDACTED.org:4747/rest/ping.view?u=dan&t=[REDACTED]&s=[REDACTED]&v=1.13.0&c=Symfonium&f=json” elapsedTime=“29.711_s” httpStatus=302 remoteAddr=“192.168.65.84:33572” requestId=files/XZYvvmlZA1-000075 responseSize=30 userAgent=“Symfonium/13.6.5a (Linux;Android 15)”
time=“2026-01-03T06:57:49-05:00” level=debug msg=“UI configuration” appConfig=“map[baseURL:/1 defaultDownloadableShare:false defaultDownsamplingFormat:opus defaultLanguage: defaultTheme:Dark defaultUIVolume:100 devActivityPanel:true devNewEventStream:true devShowArtistPage:true devSidebarPlaylists:true devUIShowConfig:true enableCoverAnimation:true enableDownloads:true enableExternalServices:true enableFavourites:true enableInspect:true enableNowPlaying:true enableReplayGain:true enableSharing:false enableStarRating:true enableTranscodingConfig:false enableUserEditing:true firstTime:false gaTrackingId: lastFMEnabled:true listenBrainzEnabled:true loginBackgroundURL:/1/backgrounds losslessFormats:FLAC,ALAC,APE,SHN,DSF,WV,WVP,TAK,WAV maxSidebarPlaylists:100 separator:/ shareURL: variousArtistsId:63sqASlAfjbGMuLP4JhnZU version:0.58.5 (0.58.5-r1) welcomeMessage:]”
time=“2026-01-03T06:57:49-05:00” level=debug msg=“HTTP: GET http://files.REDACTED.org:4747/1/app/” elapsedTime=1.4ms httpStatus=200 remoteAddr=“192.168.65.84:33572” requestId=files/XZYvvmlZA1-000076 responseSize=2592 userAgent=“Symfonium/13.6.5a (Linux;Android 15)”

Symfonium debug logs show similar data - but with a JSON exception:

2026-01-03 06:57:49.653 Verbose/SubsonicLogger: ← [417] END HTTP (14ms, 2592-byte body)
2026-01-03 06:57:49.655 Error/SubsonicLogger: Error (0/0)
xz.o: Use JsonReader.setLenient(true) to accept malformed JSON at path $
at xz.r.e(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:13)
at xz.r.i(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:720)

Guidance/help is appreciated.

Logs:

Upload description: danielschudel

Additional information:

 

 

Reproduction steps:

 

 

Media provider:

Subsonic

Screenshots:

     

Enter the proper values that correspond to your proxy settings …

Seems you do redirects and strange stuff. Enter the final proper url that seems to have /1/ or /1/app or whatever you are doing.

No proxy is in the middle. This is direct from Symfonium client to host:port on the same LAN.

Does Symfonium have issues following 302s? The 302s would be coming direct from Navidrome.

Server side log shows Symfonium requesting and URL and getting a 200 - so Symfonium is following 302s correctly.

time=“2026-01-03T06:57:49-05:00” level=debug msg=“HTTP: GET http://files.REDACTED.org:4747/1/app/” elapsedTime=1.4ms httpStatus=200 remoteAddr=“192.168.65.84:33572” requestId=files/XZYvvmlZA1-000076 responseSize=2592 userAgent=“Symfonium/13.6.5a (Linux;Android 15)”

That JSON error in the Symfonium client/debug log still sticks out like a sore thumb:

2026-01-03 06:57:49.653 Verbose/SubsonicLogger: ← [417] END HTTP (14ms, 2592-byte body)
2026-01-03 06:57:49.655 Error/SubsonicLogger: Error (0/0)
xz.o: Use JsonReader.setLenient(true) to accept malformed JSON at path $
at xz.r.e(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:13)
at xz.r.i(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:720)
at xz.r.W(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:5)
at zz.b.c(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:1)
at xz.m.a(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:5)
at m8.f.a(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:14)
at af.b.a(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:8)
at jo.r.s(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:1956)
at jo.r.m(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:445)
at com.google.android.gms.internal.play_billing.p1.w(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:38)
at b20.b0.w0(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:53)
at m8.e.b(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:1835)
at m8.b.s(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:20)
at c10.a.f(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:6)
at g20.q.y(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:7)
at b20.a.f(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:14)
at c10.a.f(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:31)
at b20.l0.run(r8-map-id-4056c0bfe4386b161c5b29e22695e8a23e9e950a74ab2019dcdf39e672b785ce:107)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1154)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:652)
at java.lang.Thread.run(Thread.java:1563)

302 are not followed for API calls, Navidrome does not 302 you have something in the middle that does.

As said if the API is under /1/ add that to the url, if it’s under /1/app then add that.

Solved.

Dumb typo in the navidrome.toml file. The ListenBrainz BaseUrl was being used as the global BaseUrl. That is where the “/1” came from.