diff --git a/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.spec.ts b/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.spec.ts index d368b63c4..bea76398e 100644 --- a/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.spec.ts +++ b/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.spec.ts @@ -196,6 +196,22 @@ describe('playback diagnostics', () => { expect(issue.externalFallbackRecommended).toBe(true); }); + it('keeps opaque native network failures generic when the browser hides access details', () => { + const issue = classifyNativePlaybackIssue( + { + code: 2, + message: '', + }, + createPlaybackSourceMetadata({ + url: 'https://provider.example/live.m3u8', + player: 'html5', + }) + ); + + expect(issue.code).toBe(PlaybackDiagnosticCode.NetworkError); + expect(issue.externalFallbackRecommended).toBe(false); + }); + it('classifies mpegts browser fetch restrictions separately from generic network errors', () => { const issue = classifyMpegTsPlaybackIssue( { diff --git a/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.ts b/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.ts index 84ca939d0..925bb53aa 100644 --- a/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.ts +++ b/libs/ui/playback/src/lib/playback-diagnostics/playback-diagnostics.util.ts @@ -236,6 +236,9 @@ export function classifyNativePlaybackIssue( const lowerNativeErrorMessage = nativeErrorMessage?.toLowerCase() ?? ''; if (nativeErrorCode === NETWORK_ERROR_CODE) { + // Native MediaError details are often opaque for browser security + // failures. Only classify browser access when the runtime exposes a + // concrete CORS/mixed-content/CSP-style message. return createDiagnostic({ code: isBrowserAccessFailure(lowerNativeErrorMessage) ? PlaybackDiagnosticCode.BrowserAccessError diff --git a/libs/ui/playback/src/lib/web-player-view/web-player-view.component.ts b/libs/ui/playback/src/lib/web-player-view/web-player-view.component.ts index cdc7de61f..98b5e82ec 100644 --- a/libs/ui/playback/src/lib/web-player-view/web-player-view.component.ts +++ b/libs/ui/playback/src/lib/web-player-view/web-player-view.component.ts @@ -1,13 +1,12 @@ import { Component, - EventEmitter, - Output, Signal, ViewEncapsulation, computed, effect, inject, input, + output, signal, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; @@ -71,12 +70,11 @@ export class WebPlayerViewComponent { volume = input(1); showCaptions = input(false); playerOverride = input(null); - @Output() timeUpdate = new EventEmitter<{ + readonly timeUpdate = output<{ currentTime: number; duration: number; }>(); - @Output() externalFallbackRequested = - new EventEmitter(); + readonly externalFallbackRequested = output(); settings = toSignal( this.storage.get(STORE_KEY.Settings)