fix(player): tell the user when the server cannot read the media file
A 404 on the media stream means the server resolved the item but could not open the file behind it — moved, deleted, or on storage that went away. Jellyfin maps the resulting FileNotFoundException to 404, and PlaybackInfo never stats the file, so negotiation succeeds and only the stream request fails. Playback then died with a snackbar reading "Failed to open [REDACTED_URL]" before popping the route, which tells the user nothing and leaves nothing useful in a bug report. Generalize the HTTP-500 log probe into PlayerError.httpStatusFromLog and latch every status in fatalPlaybackHttpStatuses. Each latches on its own so the 503 that stream-lavf-o deliberately retries cannot mask the fatal status behind it. A 404 now raises a dedicated modal naming the cause and the fix. On Android a 404 previously failed the "Response code: 500" string test and fell through to the ExoPlayer→MPV fallback, showing "switching to compatible player" before failing again on the same request. Read the real status off HttpDataSource.InvalidResponseCodeException instead and skip the fallback: an HTTP status is not a codec problem.
This commit is contained in:
@@ -1772,9 +1772,12 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> with WidgetsBindin
|
||||
}
|
||||
|
||||
String? _lastLogError;
|
||||
bool _sawServer500 = false;
|
||||
|
||||
static final RegExp _server500Pattern = RegExp(r'\b(?:HTTP error |Response code: )500\b');
|
||||
/// Statuses in [fatalPlaybackHttpStatuses] the player's own log stream
|
||||
/// reported for this open. Each latches independently: the reconnect path
|
||||
/// deliberately retries a 503 (see `_applyNetworkStreamTuning`), and a
|
||||
/// transient status must never mask the fatal one that follows.
|
||||
final Set<int> _fatalHttpStatuses = <int>{};
|
||||
|
||||
// OS Media Controls Integration
|
||||
|
||||
|
||||
Reference in New Issue
Block a user