fix(embedded-mpv): isolate recording ticks by engine

This commit is contained in:
4gray committed 2026-07-16 16:24:23 +02:00
1 parent 7913b75017
commit bbc854ff31
3 files changed
+42 -17

No files matched your search

@@ -32,7 +32,10 @@ describe('EmbeddedMpvPlayerComponent recording status message', () => {
} as unknown as typeof window.electron;
await TestBed.configureTestingModule({
imports: [EmbeddedMpvPlayerHostComponent, TranslateModule.forRoot()],
imports: [
EmbeddedMpvPlayerHostComponent,
TranslateModule.forRoot(),
],
providers: [
{
provide: EmbeddedMpvOverlayVisibilityService,
@@ -69,6 +72,7 @@ describe('EmbeddedMpvPlayerComponent recording status message', () => {
controller.support.set({
supported: true,
platform: 'darwin',
engine: 'native',
capabilities: {
subtitles: true,
playbackSpeed: true,
@@ -75,7 +75,9 @@ export class EmbeddedMpvControlsAdapter implements PlayerController {
() => this.playbackIdentity()
);
private readonly recordingActive = computed(
() => this.controller.session()?.recording?.active === true
() =>
this.controller.support()?.engine === 'frame-copy' &&
this.controller.session()?.recording?.active === true
);
private readonly activeSessionId = computed(
() => this.controller.session()?.id ?? null
@@ -313,6 +315,7 @@ export class EmbeddedMpvControlsAdapter implements PlayerController {
!session ||
!playbackIdentity ||
!support?.supported ||
support.engine !== 'frame-copy' ||
support.capabilities?.recording !== true ||
!this.isLivePlayback(context.playback()) ||
session?.status === 'error'
@@ -283,23 +283,41 @@ describe('EmbeddedMpvPlayerComponent shared controls host', () => {
expect(component.menus.audioOpen()).toBe(true);
});
it('uses only the adapter recording interval for frame-copy', () => {
const { fixture, controller } = render();
const setInterval = jest.spyOn(window, 'setInterval');
it.each(['frame-copy', 'native'] as const)(
'uses exactly one recording interval for the %s engine',
(engine) => {
const { fixture, controller } = render(engine);
const setInterval = jest.spyOn(window, 'setInterval');
controller.session.update((session) =>
session
? {
...session,
recording: {
active: true,
startedAt: new Date().toISOString(),
},
}
: session
);
controller.session.update((session) =>
session
? {
...session,
recording: {
active: true,
startedAt: new Date().toISOString(),
},
}
: session
);
fixture.detectChanges();
expect(setInterval).toHaveBeenCalledTimes(1);
}
);
it('keeps the component-scoped recording adapter inert for native', () => {
const { fixture, component, controller } = render('native');
fixture.componentRef.setInput('playback', {
streamUrl: 'https://example.test/live.ts',
title: 'Live news',
isLive: true,
});
fixture.detectChanges();
const startRecording = jest.spyOn(controller, 'startRecording');
expect(setInterval).toHaveBeenCalledTimes(1);
component.sharedControls.commands.toggleRecording();
expect(startRecording).not.toHaveBeenCalled();
});
});