Login crash when forcing low quality remotely (Jellyfin 12.1)

Hey team — running into a repeatable crash and wanted to flag it since it seems like a gap in the Jellyfin 12 support added in 8.5.2.

Setup: Infuse 8.5.5 on iOS and MacOS, connecting to a Jellyfin 12.1.0 server remotely (through a Cloudflare Tunnel, if relevant). Direct Play works fine. But if I manually force a lower quality (to make it transcode), playback fails within a few seconds with “An error occurred - failed to make a request.”

On the server side, I can see Jellyfin throwing an unhandled exception right when this happens, at the exact moment Infuse re-authenticates:

System.ArgumentNullException: Value cannot be null. (Parameter 'request.App')
   at Emby.Server.Implementations.Session.SessionManager.AuthenticateNewSessionInternal
   at Jellyfin.Api.Controllers.UserController.AuthenticateUserByName
URL "POST" "/Users/AuthenticateByName"

This looks like the same root cause as jellyfin/jellyfin#15730 — Jellyfin 12 now requires an App field on login that some clients don’t send, and instead of a clean error it crashes. That issue’s been marked “Not A Bug” on Jellyfin’s end, with the expectation that clients update. I know 8.5.2 added “Jellyfin 12 support,” so I was surprised to still hit this on 8.5.5 — my guess is the specific re-auth that happens when switching quality mid-session isn’t going through the updated login path yet.

Happy to grab more logs or test a build if that’d help track it down. Thanks for looking into it!

One clarification on the trigger, since I want to be precise about what I actually confirmed vs. what’s a guess: the crash itself is in /Users/AuthenticateByName — a full re-login call, which happens before Jellyfin even decides Direct Play vs. transcode. So it’s not really inside the transcode logic.

Looking at my server logs more closely, I noticed Infuse does a fresh logout/re-login (Logging out access token... / Creating new access token) fairly often, not just when I force quality — so I can’t say for certain that forcing low quality is what triggers the vulnerable re-login path specifically. My best guess is that forcing quality causes a full reconnect/renegotiation with the server that goes through an older login code path missing the App field, while a normal session that already has a valid cached token skips re-login entirely and never hits it — but that’s speculation on my end, since I don’t have visibility into Infuse’s client-side logic. Just flagging that in case it’s useful for narrowing down the actual trigger on your side.

When Infuse logs into Jellyfin, have you noticed that it sends multiple AuthenticateByName requests to generate several API keys? I noticed the AuthenticateByName field and remembered that when adding an Emby server, Infuse also sends multiple AuthenticateByName API requests.

Can you send in a report from Infuse (and post the code here) so we can take a deeper look?

i’ve sent logs to you

Don’t forget

Ran a cleaner A/B test, same app session, about 40 seconds apart. Two findings: it’s specific to HDR/Dolby Vision content, and the server logs no error at all when it fails. I’ll show where the chain stops.

Working case — Friends S05E10 (SDR H.264 .mkv), forced transcode:

[17:45:56.485] SessionManager: User "server" stopped playback of '"The One with the Inappropriate Sister"' at "1180846"ms ("Infuse-Library" "8.5.5")
[17:45:56.609] MediaInfoHelper: User policy for "server". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[17:45:56.766] MediaInfoHelper: User policy for "server". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[17:45:57.423] TranscodeManager: "/usr/lib/jellyfin-ffmpeg/ffmpeg" ... -codec:v:0 h264_nvenc ...     <-- transcode starts
[17:45:58.827] TranscodeManager: FFmpeg exited with code 0
[17:45:58.832] TranscodeManager: "/usr/lib/jellyfin-ffmpeg/ffmpeg" ... -ss 00:19:40.179 ...          <-- seek, respawn
[17:45:59.535] SessionManager: User "server" started playback of '"The One with the Inappropriate Sister"'  <-- playing
[17:46:08.090] SessionManager: User "server" stopped playback at "1186381"ms

Chain completes: PlaybackInfo → ffmpeg spawned → playback started.

Failing case — The Perfect Neighbor (4K HEVC Dolby Vision P8.1 .mp4), forced transcode:

[17:46:21.380] MediaInfoHelper: User policy for "server". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[17:46:28.163] SessionManager: User "server" started playback of '"The Perfect Neighbor"' ("Infuse-Library" "8.5.5")
[17:46:38.412] SessionManager: User "server" stopped playback of '"The Perfect Neighbor"' at "5547"ms
[17:46:38.491] MediaInfoHelper: User policy for "server". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True   <-- quality switch
[17:46:38.634] MediaInfoHelper: User policy for "server". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
                                                                    <-- chain stops here. nothing follows.

This is where it breaks. The two PlaybackInfo negotiations come through, and then nothing. No TranscodeManager line, no ffmpeg, no started playback. The error appeared in Infuse at that exact moment.

And critically — I checked the window unfiltered: 48 log lines between 17:44 and 17:50, zero [WRN], zero [ERR], zero [FTL]. Jellyfin doesn’t consider anything to have gone wrong. It answered the PlaybackInfo request and was never asked for a stream. So whatever rejection happened, it happened inside Infuse and was never sent to the server.

Control — the server transcodes this exact file fine. Jellyfin Web did it earlier the same day at 10:21:31, tonemapping included:

-vf setparams=color_primaries=bt2020:color_trc=smpte2084:colorspace=bt2020nc,scale_cuda=w=960:h=540,tonemap_cuda=format=yuv420p:p=bt709:t=bt709:m=bt709:tonemap=bt2390:peak=100:desat=0

Versus the SDR file that worked in Infuse, which needs no tonemap:

-vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,scale_cuda=w=960:h=540:format=yuv420p

So GPU, server and file are all fine. The difference is that the DV file’s transcode profile requires tonemapping, and Infuse appears to reject or abandon that PlaybackInfo response before requesting the stream.

Two corrections to my earlier posts, sorry for the noise:

  • No AuthenticateByName / request.App exceptions occurred anywhere in this window. That crash is a separate issue from a periodic background auth loop, not the cause of this.
  • The token rotation I flagged happened at 17:45:32, before the Friends test that succeeded, so that’s not it either.

Since the server side is silent, the answer is almost certainly in Infuse’s own log. I’ll reproduce and submit an in-app report, and can also enable Jellyfin debug logging if the full stream-selection reasoning would help.

hi ,can you check AuthenticateByName multiple request log let James to fix?

Same issue here, adding another data point.

Infuse 8.5.5 (iOS/iPadOS), Jellyfin 12.1 on Windows 11, Intel Quick Sync (not NVENC).

Same log pattern: two PlaybackInfo (MediaInfoHelper) lines, then nothing. No TranscodeManager/ffmpeg line, no playback start, no errors. Jellyfin web transcodes the same files fine.

Differences from the original report:

  • It fails on SDR content too, not just HDR/DV (e.g. a 1080p SDR TV episode forced to 480p 1.5 Mbps).
  • It fails on a direct local connection (http://192.168.x.x:8096, no proxy or tunnel), so it isn’t network related.
  • It still fails with the InfuseSync plugin disabled.

Diagnostic code: QA4D9

This should be resolved in today’s 8.5.6 update. :slight_smile: