fix(player): intercept spurious mid-file EOF and recover in place

close #1520

Classify player EOF signals against the best-known duration: a mid-file
EOF means the stream died (transcode reaped or idle connection closed
during a long pause), not that the media ended — it must never mark the
item watched, prompt Play Next, or exit a movie. Recover with a bounded
in-place reload at the parked position; if the server is still refusing,
park on the old frame and rebuild the stream on user play/seek or when
the server-status monitor sees it come back online.
This commit is contained in:
edde746
2026-07-10 19:11:18 +02:00
parent 3bf72d7237
commit c885c0c6bc
9 changed files with 258 additions and 5 deletions
+6 -2
View File
@@ -1672,6 +1672,9 @@ class TranslationsMessagesEn {
/// en: 'Error: ${error}'
String errorLoading({required Object error}) => 'Error: ${error}';
/// en: 'The stream was interrupted. Press play or seek to retry.'
String get streamInterrupted => 'The stream was interrupted. Press play or seek to retry.';
/// en: 'File information not available'
String get fileInfoNotAvailable => 'File information not available';
@@ -5470,10 +5473,11 @@ extension on Translations {
'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Auto-removed: ${title}',
'messages.removedFromContinueWatching' => 'Removed from Continue Watching',
'messages.errorLoading' => ({required Object error}) => 'Error: ${error}',
'messages.streamInterrupted' => 'The stream was interrupted. Press play or seek to retry.',
'messages.fileInfoNotAvailable' => 'File information not available',
'messages.errorLoadingFileInfo' => ({required Object error}) => 'Error loading file info: ${error}',
_ => null,
} ?? switch (path) {
'messages.errorLoadingFileInfo' => ({required Object error}) => 'Error loading file info: ${error}',
'messages.errorLoadingSeries' => 'Error loading series',
'messages.musicNotSupported' => 'Music playback is not yet supported',
'messages.noDescriptionAvailable' => 'No description available',
@@ -5985,9 +5989,9 @@ extension on Translations {
'downloads.tvShows' => 'TV Shows',
'downloads.movies' => 'Movies',
'downloads.music' => 'Music',
'downloads.tracksQueued' => ({required Object count}) => '${count} tracks queued for download',
_ => null,
} ?? switch (path) {
'downloads.tracksQueued' => ({required Object count}) => '${count} tracks queued for download',
'downloads.noDownloads' => 'No downloads yet',
'downloads.noDownloadsDescription' => 'Downloaded content will appear here for offline viewing',
'downloads.downloadNow' => 'Download',