From 7234da5b64f5bfcb4edf29350ca393c484ee1fa6 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:11:03 +0100 Subject: [PATCH] feat: skip intro/credits keyboard shortcut close #419 --- lib/i18n/en.i18n.json | 3 ++- lib/i18n/strings.g.dart | 4 ++-- lib/i18n/strings_en.g.dart | 6 +++++- lib/services/keyboard_shortcuts_service.dart | 8 ++++++++ lib/services/settings_service.dart | 1 + lib/widgets/video_controls/video_controls.dart | 1 + 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 33e3037f..15909d09 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -203,7 +203,8 @@ "speedReset": "Reset Speed", "subSeekNext": "Seek to Next Subtitle", "subSeekPrev": "Seek to Previous Subtitle", - "shaderToggle": "Toggle Shaders" + "shaderToggle": "Toggle Shaders", + "skipMarker": "Skip Intro/Credits" } }, "pinEntry": { diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 40632af4..a2e09834 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 9 -/// Strings: 5121 (569 per locale) +/// Strings: 5131 (570 per locale) /// -/// Built on 2026-02-09 at 18:36 UTC +/// Built on 2026-02-10 at 15:52 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 9eeb5a1f..d080b704 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -2051,6 +2051,9 @@ class TranslationsHotkeysActionsEn { /// en: 'Toggle Shaders' String get shaderToggle => 'Toggle Shaders'; + + /// en: 'Skip Intro/Credits' + String get skipMarker => 'Skip Intro/Credits'; } // Path: videoControls.pipErrors @@ -2322,6 +2325,7 @@ extension on Translations { 'hotkeys.actions.subSeekNext' => 'Seek to Next Subtitle', 'hotkeys.actions.subSeekPrev' => 'Seek to Previous Subtitle', 'hotkeys.actions.shaderToggle' => 'Toggle Shaders', + 'hotkeys.actions.skipMarker' => 'Skip Intro/Credits', 'pinEntry.enterPin' => 'Enter PIN', 'pinEntry.showPin' => 'Show PIN', 'pinEntry.hidePin' => 'Hide PIN', @@ -2644,9 +2648,9 @@ extension on Translations { 'watchTogether.title' => 'Watch Together', 'watchTogether.description' => 'Watch content in sync with friends and family', 'watchTogether.createSession' => 'Create Session', - 'watchTogether.creating' => 'Creating...', _ => null, } ?? switch (path) { + 'watchTogether.creating' => 'Creating...', 'watchTogether.joinSession' => 'Join Session', 'watchTogether.joining' => 'Joining...', 'watchTogether.controlMode' => 'Control Mode', diff --git a/lib/services/keyboard_shortcuts_service.dart b/lib/services/keyboard_shortcuts_service.dart index 7b0cdc00..88fcc63b 100644 --- a/lib/services/keyboard_shortcuts_service.dart +++ b/lib/services/keyboard_shortcuts_service.dart @@ -136,6 +136,7 @@ class KeyboardShortcutsService { VoidCallback? onPreviousChapter, { VoidCallback? onBack, VoidCallback? onToggleShader, + VoidCallback? onSkipMarker, }) { if (event is! KeyDownEvent) return KeyEventResult.ignored; @@ -212,6 +213,7 @@ class KeyboardShortcutsService { onNextChapter, onPreviousChapter, onToggleShader: onToggleShader, + onSkipMarker: onSkipMarker, ); return KeyEventResult.handled; } @@ -230,6 +232,7 @@ class KeyboardShortcutsService { VoidCallback? onNextChapter, VoidCallback? onPreviousChapter, { VoidCallback? onToggleShader, + VoidCallback? onSkipMarker, }) { switch (action) { case 'play_pause': @@ -303,6 +306,9 @@ class KeyboardShortcutsService { case 'shader_toggle': onToggleShader?.call(); break; + case 'skip_marker': + onSkipMarker?.call(); + break; } } @@ -349,6 +355,8 @@ class KeyboardShortcutsService { return t.hotkeys.actions.subSeekPrev; case 'shader_toggle': return t.hotkeys.actions.shaderToggle; + case 'skip_marker': + return t.hotkeys.actions.skipMarker; default: return action; } diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 3ee69dd9..d33c0680 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -403,6 +403,7 @@ class SettingsService extends BaseSharedPreferencesService { 'sub_seek_next': HotKey(key: PhysicalKeyboardKey.arrowRight, modifiers: [HotKeyModifier.control]), 'sub_seek_prev': HotKey(key: PhysicalKeyboardKey.arrowLeft, modifiers: [HotKeyModifier.control]), 'shader_toggle': HotKey(key: PhysicalKeyboardKey.keyG), + 'skip_marker': HotKey(key: PhysicalKeyboardKey.enter), }; } diff --git a/lib/widgets/video_controls/video_controls.dart b/lib/widgets/video_controls/video_controls.dart index ab6b483f..1258dfc8 100644 --- a/lib/widgets/video_controls/video_controls.dart +++ b/lib/widgets/video_controls/video_controls.dart @@ -1557,6 +1557,7 @@ class _PlexVideoControlsState extends State with WindowListen _previousChapter, onBack: widget.onBack ?? () => Navigator.of(context).pop(true), onToggleShader: _toggleShader, + onSkipMarker: _performAutoSkip, ); // Never return .ignored from fullscreen video — prevent leaking to previous routes return result == KeyEventResult.ignored ? KeyEventResult.handled : result;