From 1a0e03cb93512708c8cd61837b1dddd28f7f1361 Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Sun, 12 Jul 2026 11:20:51 +0200 Subject: [PATCH] fix(settings): desktop-gate the frame-copy toggle and drop the platform list from its description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The toggle only renders when the engine is available on the current machine (or a stale opt-in needs clearing), so enumerating supported platforms in the description was redundant and doomed to go stale — all 18 locales now describe the behavior only. The visibility condition also gains an explicit isDesktop gate: the stale-opt-in fallback could have surfaced the checkbox in the PWA if a stored settings value ever carried embeddedMpvFrameCopy=true. Spec covers desktop-available, stale-opt-in and PWA-hidden cases. Co-Authored-By: Claude Fable 5 --- .../settings-playback-section.component.html | 5 ++- ...ettings-playback-section.component.spec.ts | 43 +++++++++++++++++++ apps/web/src/assets/i18n/ar.json | 2 +- apps/web/src/assets/i18n/ary.json | 2 +- apps/web/src/assets/i18n/by.json | 2 +- apps/web/src/assets/i18n/de.json | 2 +- apps/web/src/assets/i18n/el.json | 2 +- apps/web/src/assets/i18n/en.json | 2 +- apps/web/src/assets/i18n/es.json | 2 +- apps/web/src/assets/i18n/fr.json | 2 +- apps/web/src/assets/i18n/it.json | 2 +- apps/web/src/assets/i18n/ja.json | 2 +- apps/web/src/assets/i18n/ko.json | 2 +- apps/web/src/assets/i18n/nl.json | 2 +- apps/web/src/assets/i18n/pl.json | 2 +- apps/web/src/assets/i18n/pt.json | 2 +- apps/web/src/assets/i18n/ru.json | 2 +- apps/web/src/assets/i18n/tr.json | 2 +- apps/web/src/assets/i18n/zh.json | 2 +- apps/web/src/assets/i18n/zhtw.json | 2 +- 20 files changed, 65 insertions(+), 19 deletions(-) diff --git a/apps/web/src/app/settings/settings-playback-section.component.html b/apps/web/src/app/settings/settings-playback-section.component.html index b698fe1cd..c038443ce 100644 --- a/apps/web/src/app/settings/settings-playback-section.component.html +++ b/apps/web/src/app/settings/settings-playback-section.component.html @@ -114,7 +114,10 @@ - @if (frameCopyAvailable() || form().value.embeddedMpvFrameCopy) { + @if ( + isDesktop() && + (frameCopyAvailable() || form().value.embeddedMpvFrameCopy) + ) {
{ ).toBeNull(); }); + it('shows the frame-copy toggle when the engine is available on desktop', () => { + fixture.componentRef.setInput('isDesktop', true); + fixture.componentRef.setInput('frameCopyAvailable', true); + fixture.detectChanges(); + + expect( + fixture.nativeElement.querySelector( + '[data-test-id="embedded-mpv-frame-copy-setting"]' + ) + ).not.toBeNull(); + }); + + it('keeps a stale frame-copy opt-in clearable on desktop without the helper', () => { + const form = createForm(); + form.controls['embeddedMpvFrameCopy'].setValue(true); + fixture.componentRef.setInput('form', form); + fixture.componentRef.setInput('isDesktop', true); + fixture.componentRef.setInput('frameCopyAvailable', false); + fixture.detectChanges(); + + expect( + fixture.nativeElement.querySelector( + '[data-test-id="embedded-mpv-frame-copy-setting"]' + ) + ).not.toBeNull(); + }); + + it('never shows the frame-copy toggle in the PWA, even with a stored opt-in', () => { + const form = createForm(); + form.controls['embeddedMpvFrameCopy'].setValue(true); + fixture.componentRef.setInput('form', form); + fixture.componentRef.setInput('isDesktop', false); + fixture.componentRef.setInput('frameCopyAvailable', false); + fixture.detectChanges(); + + expect( + fixture.nativeElement.querySelector( + '[data-test-id="embedded-mpv-frame-copy-setting"]' + ) + ).toBeNull(); + }); + it('shows the recording folder setting only in desktop builds', () => { fixture.componentRef.setInput('isDesktop', true); fixture.detectChanges(); @@ -364,6 +406,7 @@ function createForm(player = VideoPlayer.VideoJs): FormGroup { streamFormat: new FormControl(StreamFormat.AutoStreamFormat), openStreamOnDoubleClick: new FormControl(false), showExternalPlaybackBar: new FormControl(true), + embeddedMpvFrameCopy: new FormControl(false), mpvPlayerPath: new FormControl(''), mpvPlayerArguments: new FormControl(''), mpvReuseInstance: new FormControl(false), diff --git a/apps/web/src/assets/i18n/ar.json b/apps/web/src/assets/i18n/ar.json index 38969d427..5477ac874 100644 --- a/apps/web/src/assets/i18n/ar.json +++ b/apps/web/src/assets/i18n/ar.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "MPV المدمج: محرك نسخ الإطارات (تجريبي)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "يُرسم الفيديو على لوحة التطبيق بحيث تظهر القوائم ومربعات الحوار فوقه. متاح فقط على macOS بمعالج Apple Silicon وعلى Windows وLinux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "يُرسم الفيديو على لوحة التطبيق بحيث تظهر القوائم ومربعات الحوار فوقه.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "يسري المفعول بعد إعادة تشغيل التطبيق." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/ary.json b/apps/web/src/assets/i18n/ary.json index c6d80c9ba..39e39a6a7 100644 --- a/apps/web/src/assets/i18n/ary.json +++ b/apps/web/src/assets/i18n/ary.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "MPV المدمج: محرك نسخ الإطارات (تجريبي)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "الفيديو كيترسم على لوحة التطبيق باش القوائم والحوارات يبانو فوقو. غير على macOS ب Apple Silicon و Windows و Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "الفيديو كيترسم على لوحة التطبيق باش القوائم والحوارات يبانو فوقو.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "غادي يخدم من بعد ما تعاود تشغل التطبيق." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/by.json b/apps/web/src/assets/i18n/by.json index 56e19f95e..51187e9d6 100644 --- a/apps/web/src/assets/i18n/by.json +++ b/apps/web/src/assets/i18n/by.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: рухавік frame-copy (эксперыментальна)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Відэа малюецца на канвасе праграмы, таму меню і дыялогі паказваюцца па-над ім. Толькі macOS на Apple Silicon, Windows і Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Відэа малюецца на канвасе праграмы, таму меню і дыялогі паказваюцца па-над ім.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Пачне дзейнічаць пасля перазапуску праграмы." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/de.json b/apps/web/src/assets/i18n/de.json index 93ee9f213..8e6a996a3 100644 --- a/apps/web/src/assets/i18n/de.json +++ b/apps/web/src/assets/i18n/de.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: Frame-Copy-Engine (experimentell)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Das Video wird auf die App-Leinwand gerendert, sodass Menüs und Dialoge darüber liegen. Nur macOS auf Apple Silicon, Windows und Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Das Video wird auf die App-Leinwand gerendert, sodass Menüs und Dialoge darüber liegen.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Wird nach einem Neustart der App wirksam." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/el.json b/apps/web/src/assets/i18n/el.json index 32bacc022..a1771a6cb 100644 --- a/apps/web/src/assets/i18n/el.json +++ b/apps/web/src/assets/i18n/el.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: μηχανή frame-copy (πειραματικό)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Το βίντεο σχεδιάζεται στον καμβά της εφαρμογής, ώστε τα μενού και τα παράθυρα διαλόγου να εμφανίζονται από πάνω του. Μόνο macOS με Apple Silicon, Windows και Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Το βίντεο σχεδιάζεται στον καμβά της εφαρμογής, ώστε τα μενού και τα παράθυρα διαλόγου να εμφανίζονται από πάνω του.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Ισχύει μετά την επανεκκίνηση της εφαρμογής." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/en.json b/apps/web/src/assets/i18n/en.json index 654067ab3..b6b2b61b8 100644 --- a/apps/web/src/assets/i18n/en.json +++ b/apps/web/src/assets/i18n/en.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: frame-copy engine (experimental)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Render video onto the app canvas so menus and dialogs stack above it. macOS (Apple Silicon), Windows, and Linux only.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Render video onto the app canvas so menus and dialogs stack above it.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Takes effect after restarting the app." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/es.json b/apps/web/src/assets/i18n/es.json index 7843bdbbf..427b38154 100644 --- a/apps/web/src/assets/i18n/es.json +++ b/apps/web/src/assets/i18n/es.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: motor frame-copy (experimental)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "El vídeo se dibuja en el lienzo de la aplicación, de modo que los menús y diálogos quedan encima. Solo macOS con Apple Silicon, Windows y Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "El vídeo se dibuja en el lienzo de la aplicación, de modo que los menús y diálogos quedan encima.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Se aplica tras reiniciar la aplicación." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/fr.json b/apps/web/src/assets/i18n/fr.json index 5b2602843..d3fafc62c 100644 --- a/apps/web/src/assets/i18n/fr.json +++ b/apps/web/src/assets/i18n/fr.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV : moteur frame-copy (expérimental)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "La vidéo est rendue sur le canevas de l'application, les menus et boîtes de dialogue s'affichent donc au-dessus. macOS Apple Silicon, Windows et Linux uniquement.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "La vidéo est rendue sur le canevas de l'application, les menus et boîtes de dialogue s'affichent donc au-dessus.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Prend effet après le redémarrage de l'application." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/it.json b/apps/web/src/assets/i18n/it.json index 452631976..a330a03a5 100644 --- a/apps/web/src/assets/i18n/it.json +++ b/apps/web/src/assets/i18n/it.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: motore frame-copy (sperimentale)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Il video viene disegnato sul canvas dell'app, così menu e finestre di dialogo appaiono sopra di esso. Solo macOS con Apple Silicon, Windows e Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Il video viene disegnato sul canvas dell'app, così menu e finestre di dialogo appaiono sopra di esso.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Ha effetto dopo il riavvio dell'app." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/ja.json b/apps/web/src/assets/i18n/ja.json index 4ae2cd3c8..c31ed8ec1 100644 --- a/apps/web/src/assets/i18n/ja.json +++ b/apps/web/src/assets/i18n/ja.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "埋め込みMPV:フレームコピーエンジン(実験的)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "映像をアプリのキャンバスに描画するため、メニューやダイアログをその上に表示できます。Apple Silicon搭載macOS、Windows、Linuxのみ。", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "映像をアプリのキャンバスに描画するため、メニューやダイアログをその上に表示できます。", "EMBEDDED_MPV_FRAME_COPY_RESTART": "アプリの再起動後に有効になります。" }, "THEMES": { diff --git a/apps/web/src/assets/i18n/ko.json b/apps/web/src/assets/i18n/ko.json index b923571d7..956c565f1 100644 --- a/apps/web/src/assets/i18n/ko.json +++ b/apps/web/src/assets/i18n/ko.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "내장 MPV: 프레임 복사 엔진(실험적)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "비디오를 앱 캔버스에 렌더링하여 메뉴와 대화 상자가 그 위에 표시됩니다. Apple Silicon macOS, Windows 및 Linux 전용.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "비디오를 앱 캔버스에 렌더링하여 메뉴와 대화 상자가 그 위에 표시됩니다.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "앱을 다시 시작한 후 적용됩니다." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/nl.json b/apps/web/src/assets/i18n/nl.json index f85bb2a89..80ab1ee86 100644 --- a/apps/web/src/assets/i18n/nl.json +++ b/apps/web/src/assets/i18n/nl.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: frame-copy-engine (experimenteel)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "De video wordt op het app-canvas getekend zodat menu's en dialoogvensters erboven verschijnen. Alleen macOS op Apple Silicon, Windows en Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "De video wordt op het app-canvas getekend zodat menu's en dialoogvensters erboven verschijnen.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Wordt van kracht na het herstarten van de app." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/pl.json b/apps/web/src/assets/i18n/pl.json index a346ce5f3..efea31ddf 100644 --- a/apps/web/src/assets/i18n/pl.json +++ b/apps/web/src/assets/i18n/pl.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: silnik frame-copy (eksperymentalny)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Wideo jest rysowane na kanwie aplikacji, dzięki czemu menu i okna dialogowe wyświetlają się nad nim. Tylko macOS na Apple Silicon, Windows i Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Wideo jest rysowane na kanwie aplikacji, dzięki czemu menu i okna dialogowe wyświetlają się nad nim.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Zacznie działać po ponownym uruchomieniu aplikacji." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/pt.json b/apps/web/src/assets/i18n/pt.json index e521af3e7..dae773b9b 100644 --- a/apps/web/src/assets/i18n/pt.json +++ b/apps/web/src/assets/i18n/pt.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: motor frame-copy (experimental)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "O vídeo é desenhado na tela da aplicação, para que menus e diálogos fiquem por cima. Apenas macOS com Apple Silicon, Windows e Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "O vídeo é desenhado na tela da aplicação, para que menus e diálogos fiquem por cima.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Entra em vigor após reiniciar a aplicação." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/ru.json b/apps/web/src/assets/i18n/ru.json index c84c9c6dc..6d18a0d63 100644 --- a/apps/web/src/assets/i18n/ru.json +++ b/apps/web/src/assets/i18n/ru.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Открыть GitHub release", "APP_UPDATE_RELEASE_NOTES": "Что нового", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: движок frame-copy (экспериментально)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Видео рисуется на канвасе приложения, поэтому меню и диалоги отображаются поверх него. Только macOS на Apple Silicon, Windows и Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Видео рисуется на канвасе приложения, поэтому меню и диалоги отображаются поверх него.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Вступит в силу после перезапуска приложения." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/tr.json b/apps/web/src/assets/i18n/tr.json index 5b0a87a2d..f2c4a12c8 100644 --- a/apps/web/src/assets/i18n/tr.json +++ b/apps/web/src/assets/i18n/tr.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "Embedded MPV: frame-copy motoru (deneysel)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Video uygulama tuvaline çizilir, böylece menüler ve iletişim kutuları üzerinde görüntülenir. Yalnızca Apple Silicon macOS, Windows ve Linux.", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "Video uygulama tuvaline çizilir, böylece menüler ve iletişim kutuları üzerinde görüntülenir.", "EMBEDDED_MPV_FRAME_COPY_RESTART": "Uygulama yeniden başlatıldıktan sonra geçerli olur." }, "THEMES": { diff --git a/apps/web/src/assets/i18n/zh.json b/apps/web/src/assets/i18n/zh.json index cbd3bf909..7ff6591eb 100644 --- a/apps/web/src/assets/i18n/zh.json +++ b/apps/web/src/assets/i18n/zh.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "嵌入式 MPV:帧拷贝引擎(实验性)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "视频渲染到应用画布上,菜单和对话框可以显示在其上方。仅限 Apple Silicon 的 macOS、Windows 和 Linux。", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "视频渲染到应用画布上,菜单和对话框可以显示在其上方。", "EMBEDDED_MPV_FRAME_COPY_RESTART": "重启应用后生效。" }, "THEMES": { diff --git a/apps/web/src/assets/i18n/zhtw.json b/apps/web/src/assets/i18n/zhtw.json index 46816a6ae..e8b42f117 100644 --- a/apps/web/src/assets/i18n/zhtw.json +++ b/apps/web/src/assets/i18n/zhtw.json @@ -430,7 +430,7 @@ "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", "APP_UPDATE_RELEASE_NOTES": "What's new", "EMBEDDED_MPV_FRAME_COPY": "內嵌 MPV:幀複製引擎(實驗性)", - "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "影片會繪製到應用程式畫布上,選單和對話框可顯示在其上方。僅限 Apple Silicon 的 macOS、Windows 和 Linux。", + "EMBEDDED_MPV_FRAME_COPY_DESCRIPTION": "影片會繪製到應用程式畫布上,選單和對話框可顯示在其上方。", "EMBEDDED_MPV_FRAME_COPY_RESTART": "重新啟動應用程式後生效。" }, "THEMES": {