diff --git a/web/src/pages/playerDiagnostics.test.ts b/web/src/pages/playerDiagnostics.test.ts
new file mode 100644
index 0000000..60e0875
--- /dev/null
+++ b/web/src/pages/playerDiagnostics.test.ts
@@ -0,0 +1,13 @@
+import { shouldShowPlayerDiagnostics } from './playerPageModel.ts'
+
+function check(name: string, actual: boolean, expected: boolean) {
+ if (actual !== expected) throw new Error(`playerDiagnostics: ${name}`)
+}
+
+check('hidden by default and during normal playback', shouldShowPlayerDiagnostics('', ''), false)
+check('visible when playback fails', shouldShowPlayerDiagnostics('视频播放失败', ''), true)
+check('visible when media cannot be loaded', shouldShowPlayerDiagnostics('', '无法加载该媒体'), true)
+check('visible when both loading and playback fail', shouldShowPlayerDiagnostics('视频播放失败', '无法加载该媒体'), true)
+check('hidden again after errors are cleared', shouldShowPlayerDiagnostics('', ''), false)
+
+console.log('playerDiagnostics.test.ts ok')
diff --git a/web/src/pages/playerPageModel.ts b/web/src/pages/playerPageModel.ts
index 89857e9..a233f94 100644
--- a/web/src/pages/playerPageModel.ts
+++ b/web/src/pages/playerPageModel.ts
@@ -3,6 +3,10 @@ import { isRemoteEmbyID } from '../utils/remoteEmby'
export type PlayerMode = 'direct' | 'hls'
+export function shouldShowPlayerDiagnostics(playerError: string, loadError: string): boolean {
+ return Boolean(playerError || loadError)
+}
+
const directContainers = ['mp4', 'webm', 'm4v']
const directVideoCodecs = ['h264', 'avc', 'avc1']
const directAudioCodecs = ['aac', 'mp3', 'opus']