From a00e2b78d6c823af3de944885265afe76900823a Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 2 Mar 2026 23:05:52 +0100 Subject: [PATCH] feat: replace mpv config UI with raw text editor --- lib/i18n/de.i18n.json | 18 +- lib/i18n/en.i18n.json | 18 +- lib/i18n/es.i18n.json | 18 +- lib/i18n/fr.i18n.json | 18 +- lib/i18n/it.i18n.json | 18 +- lib/i18n/ko.i18n.json | 18 +- lib/i18n/nl.i18n.json | 18 +- lib/i18n/strings.g.dart | 4 +- lib/i18n/strings_de.g.dart | 40 +-- lib/i18n/strings_en.g.dart | 68 +---- lib/i18n/strings_es.g.dart | 40 +-- lib/i18n/strings_fr.g.dart | 40 +-- lib/i18n/strings_it.g.dart | 40 +-- lib/i18n/strings_ko.g.dart | 40 +-- lib/i18n/strings_nl.g.dart | 40 +-- lib/i18n/strings_sv.g.dart | 40 +-- lib/i18n/strings_zh.g.dart | 40 +-- lib/i18n/sv.i18n.json | 18 +- lib/i18n/zh.i18n.json | 18 +- lib/models/mpv_config_models.dart | 31 +-- lib/screens/settings/mpv_config_screen.dart | 286 ++++++-------------- lib/services/settings_service.dart | 100 +++++-- 22 files changed, 289 insertions(+), 682 deletions(-) diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 1ed84c3a..c61b31c6 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -64,7 +64,7 @@ "licenses": "Lizenzen", "switchProfile": "Profil wechseln", "subtitleStyling": "Untertitel-Stil", - "mpvConfig": "MPV-Konfiguration", + "mpvConfig": "mpv.conf", "logs": "Protokolle" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Player-Backend", "exoPlayer": "ExoPlayer (Empfohlen)", "exoPlayerDescription": "Android-nativer Player mit besserer Hardware-Unterstützung", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Erweiterter Player mit mehr Funktionen und ASS-Untertitel-Unterstützung", "hardwareDecoding": "Hardware-Decodierung", "hardwareDecodingDescription": "Hardwarebeschleunigung verwenden, sofern verfügbar", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV-Konfiguration", + "title": "mpv-Konfiguration", "description": "Erweiterte Videoplayer-Einstellungen", - "properties": "Eigenschaften", "presets": "Voreinstellungen", - "noProperties": "Keine Eigenschaften konfiguriert", "noPresets": "Keine gespeicherten Voreinstellungen", - "addProperty": "Eigenschaft hinzufügen", - "editProperty": "Eigenschaft bearbeiten", - "deleteProperty": "Eigenschaft löschen", - "propertyKey": "Eigenschaftsschlüssel", - "propertyKeyHint": "z.B. hwdec, demuxer-max-bytes", - "propertyValue": "Eigenschaftswert", - "propertyValueHint": "z.B. auto, 256000000", "saveAsPreset": "Als Voreinstellung speichern...", "presetName": "Name der Voreinstellung", "presetNameHint": "Namen für diese Voreinstellung eingeben", @@ -442,8 +433,7 @@ "presetLoaded": "Voreinstellung geladen", "presetDeleted": "Voreinstellung gelöscht", "confirmDeletePreset": "Möchten Sie diese Voreinstellung wirklich löschen?", - "confirmDeleteProperty": "Möchten Sie diese Eigenschaft wirklich löschen?", - "entriesCount": "${count} Einträge" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Aktion bestätigen" diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 4c0567b5..e4e33400 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licenses", "switchProfile": "Switch Profile", "subtitleStyling": "Subtitle Styling", - "mpvConfig": "MPV Configuration", + "mpvConfig": "mpv.conf", "logs": "Logs" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Player Backend", "exoPlayer": "ExoPlayer (Recommended)", "exoPlayerDescription": "Android native player with better hardware support", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Advanced player with more features and ASS subtitle support", "hardwareDecoding": "Hardware Decoding", "hardwareDecodingDescription": "Use hardware acceleration when available", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV Configuration", + "title": "mpv.conf", "description": "Advanced video player settings", - "properties": "Properties", "presets": "Presets", - "noProperties": "No properties configured", "noPresets": "No saved presets", - "addProperty": "Add Property", - "editProperty": "Edit Property", - "deleteProperty": "Delete Property", - "propertyKey": "Property Key", - "propertyKeyHint": "e.g., hwdec, demuxer-max-bytes", - "propertyValue": "Property Value", - "propertyValueHint": "e.g., auto, 256000000", "saveAsPreset": "Save as Preset...", "presetName": "Preset Name", "presetNameHint": "Enter a name for this preset", @@ -442,8 +433,7 @@ "presetLoaded": "Preset loaded", "presetDeleted": "Preset deleted", "confirmDeletePreset": "Are you sure you want to delete this preset?", - "confirmDeleteProperty": "Are you sure you want to delete this property?", - "entriesCount": "${count} entries" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Confirm Action" diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 186949e9..f41dd8b4 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licencias", "switchProfile": "Cambiar Perfil", "subtitleStyling": "Estilo de Subtítulos", - "mpvConfig": "Configuración de MPV", + "mpvConfig": "mpv.conf", "logs": "Logs" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Reproductor", "exoPlayer": "ExoPlayer (Recomendado)", "exoPlayerDescription": "Reproductor nativo de Android con mejor soporte de hardware", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Reproductor avanzado con más funciones y soporte de subtítulos ASS", "hardwareDecoding": "Decodificación por Hardware", "hardwareDecodingDescription": "Usar aceleración por hardware cuando esté disponible", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "Configuración de MPV", + "title": "Configuración de mpv", "description": "Ajustes avanzados del reproductor de video", - "properties": "Propiedades", "presets": "Ajustes preestablecidos", - "noProperties": "No hay propiedades configuradas", "noPresets": "No hay ajustes guardados", - "addProperty": "Añadir Propiedad", - "editProperty": "Editar Propiedad", - "deleteProperty": "Eliminar Propiedad", - "propertyKey": "Clave de la Propiedad", - "propertyKeyHint": "ej., hwdec, demuxer-max-bytes", - "propertyValue": "Valor de la Propiedad", - "propertyValueHint": "ej., auto, 256000000", "saveAsPreset": "Guardar como Ajuste...", "presetName": "Nombre del Ajuste", "presetNameHint": "Introduce un nombre para este ajuste", @@ -442,8 +433,7 @@ "presetLoaded": "Ajuste cargado", "presetDeleted": "Ajuste eliminado", "confirmDeletePreset": "¿Estás seguro de que quieres eliminar este ajuste?", - "confirmDeleteProperty": "¿Estás seguro de que quieres eliminar esta propiedad?", - "entriesCount": "${count} entradas" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Confirmar Acción" diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 9c355c2a..f3116d0d 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licenses", "switchProfile": "Changer de profil", "subtitleStyling": "Configuration des sous-titres", - "mpvConfig": "Configuration MPV", + "mpvConfig": "mpv.conf", "logs": "Logs" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Moteur de lecture", "exoPlayer": "ExoPlayer (Recommandé)", "exoPlayerDescription": "Lecteur natif Android avec meilleur support matériel", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Lecteur avancé avec plus de fonctionnalités et support des sous-titres ASS", "hardwareDecoding": "Décodage matériel", "hardwareDecodingDescription": "Utilisez l'accélération matérielle lorsqu'elle est disponible.", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "Configuration MPV", + "title": "Configuration mpv", "description": "Paramètres avancés du lecteur vidéo", - "properties": "Propriétés", "presets": "Préréglages", - "noProperties": "Aucune propriété configurée", "noPresets": "Aucun préréglage enregistré", - "addProperty": "Ajouter une propriété", - "editProperty": "Modifier la propriété", - "deleteProperty": "Supprimer la propriété", - "propertyKey": "Clé", - "propertyKeyHint": "e.g., hwdec, demuxer-max-bytes", - "propertyValue": "Valeur", - "propertyValueHint": "e.g., auto, 256000000", "saveAsPreset": "Enregistrer comme préréglage...", "presetName": "Nom du préréglage", "presetNameHint": "Entrez un nom pour ce préréglage", @@ -442,8 +433,7 @@ "presetLoaded": "Préréglage chargé", "presetDeleted": "Préréglage supprimé", "confirmDeletePreset": "Êtes-vous sûr de vouloir supprimer ce préréglage ?", - "confirmDeleteProperty": "Êtes-vous sûr de vouloir supprimer cette propriété ?", - "entriesCount": "${count} entrées" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Confirmer l'action" diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index da867b4e..41e7736c 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licenze", "switchProfile": "Cambia profilo", "subtitleStyling": "Stile sottotitoli", - "mpvConfig": "Configurazione MPV", + "mpvConfig": "mpv.conf", "logs": "Registro" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Motore di riproduzione", "exoPlayer": "ExoPlayer (Consigliato)", "exoPlayerDescription": "Lettore nativo Android con migliore supporto hardware", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Lettore avanzato con più funzionalità e supporto sottotitoli ASS", "hardwareDecoding": "Decodifica Hardware", "hardwareDecodingDescription": "Utilizza l'accelerazione hardware quando disponibile", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "Configurazione MPV", + "title": "Configurazione mpv", "description": "Impostazioni avanzate del lettore video", - "properties": "Proprietà", "presets": "Preset", - "noProperties": "Nessuna proprietà configurata", "noPresets": "Nessun preset salvato", - "addProperty": "Aggiungi proprietà", - "editProperty": "Modifica proprietà", - "deleteProperty": "Elimina proprietà", - "propertyKey": "Chiave proprietà", - "propertyKeyHint": "es. hwdec, demuxer-max-bytes", - "propertyValue": "Valore proprietà", - "propertyValueHint": "es. auto, 256000000", "saveAsPreset": "Salva come preset...", "presetName": "Nome preset", "presetNameHint": "Inserisci un nome per questo preset", @@ -442,8 +433,7 @@ "presetLoaded": "Preset caricato", "presetDeleted": "Preset eliminato", "confirmDeletePreset": "Sei sicuro di voler eliminare questo preset?", - "confirmDeleteProperty": "Sei sicuro di voler eliminare questa proprietà?", - "entriesCount": "${count} voci" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Conferma azione" diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 8a5ee097..9faa084c 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -64,7 +64,7 @@ "licenses": "라이선스", "switchProfile": "프로필 전환", "subtitleStyling": "자막 스타일 설정", - "mpvConfig": "MPV 설정", + "mpvConfig": "mpv.conf", "logs": "로그" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "플레이어 백엔드", "exoPlayer": "ExoPlayer (권장)", "exoPlayerDescription": "더 나은 하드웨어 지원을 제공하는 Android 네이티브 플레이어", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "더 많은 기능과 ASS 자막을 지원하는 고급 플레이어", "hardwareDecoding": "하드웨어 디코딩", "hardwareDecodingDescription": "가능한 경우 하드웨어 가속을 사용합니다", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV 설정", + "title": "mpv 설정", "description": "고급 비디오 플레이어 설정", - "properties": "속성", "presets": "사전 설정", - "noProperties": "설정된 속성이 없습니다", "noPresets": "저장된 사전 설정이 없습니다", - "addProperty": "속성 추가", - "editProperty": "속성 편집", - "deleteProperty": "속성 삭제", - "propertyKey": "속성 키", - "propertyKeyHint": "예: hwdec, demuxer-max-bytes", - "propertyValue": "속성값", - "propertyValueHint": "예: auto, 256000000", "saveAsPreset": "프리셋으로 저장...", "presetName": "프리셋 이름", "presetNameHint": "이 프리셋의 이름을 입력하세요", @@ -442,8 +433,7 @@ "presetLoaded": "프리셋이 로드 되었습니다", "presetDeleted": "프리셋이 삭제 되었습니다", "confirmDeletePreset": "이 프리셋을 삭제 하시겠습니까?", - "confirmDeleteProperty": "이 속성을 삭제 하시겠습니까?", - "entriesCount": "${count} 항목" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "확인" diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 31a80a73..0a484e63 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licenties", "switchProfile": "Wissel van profiel", "subtitleStyling": "Ondertitel opmaak", - "mpvConfig": "MPV-configuratie", + "mpvConfig": "mpv.conf", "logs": "Logbestanden" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Speler backend", "exoPlayer": "ExoPlayer (Aanbevolen)", "exoPlayerDescription": "Android-native speler met betere hardware-ondersteuning", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Geavanceerde speler met meer functies en ASS-ondertitelondersteuning", "hardwareDecoding": "Hardware decodering", "hardwareDecodingDescription": "Gebruik hardware versnelling indien beschikbaar", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV-configuratie", + "title": "mpv-configuratie", "description": "Geavanceerde videospeler-instellingen", - "properties": "Eigenschappen", "presets": "Voorinstellingen", - "noProperties": "Geen eigenschappen geconfigureerd", "noPresets": "Geen opgeslagen voorinstellingen", - "addProperty": "Eigenschap toevoegen", - "editProperty": "Eigenschap bewerken", - "deleteProperty": "Eigenschap verwijderen", - "propertyKey": "Eigenschapssleutel", - "propertyKeyHint": "bijv. hwdec, demuxer-max-bytes", - "propertyValue": "Eigenschapswaarde", - "propertyValueHint": "bijv. auto, 256000000", "saveAsPreset": "Opslaan als voorinstelling...", "presetName": "Naam voorinstelling", "presetNameHint": "Voer een naam in voor deze voorinstelling", @@ -442,8 +433,7 @@ "presetLoaded": "Voorinstelling geladen", "presetDeleted": "Voorinstelling verwijderd", "confirmDeletePreset": "Weet je zeker dat je deze voorinstelling wilt verwijderen?", - "confirmDeleteProperty": "Weet je zeker dat je deze eigenschap wilt verwijderen?", - "entriesCount": "${count} items" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Bevestig actie" diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index e0d44f80..89498bb6 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: 7263 (807 per locale) +/// Strings: 7173 (797 per locale) /// -/// Built on 2026-03-02 at 20:21 UTC +/// Built on 2026-03-02 at 21:41 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index f539817a..6dd02f0c 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensDe implements TranslationsScreensEn { @override String get licenses => 'Lizenzen'; @override String get switchProfile => 'Profil wechseln'; @override String get subtitleStyling => 'Untertitel-Stil'; - @override String get mpvConfig => 'MPV-Konfiguration'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Protokolle'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsDe implements TranslationsSettingsEn { @override String get playerBackend => 'Player-Backend'; @override String get exoPlayer => 'ExoPlayer (Empfohlen)'; @override String get exoPlayerDescription => 'Android-nativer Player mit besserer Hardware-Unterstützung'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Erweiterter Player mit mehr Funktionen und ASS-Untertitel-Unterstützung'; @override String get hardwareDecoding => 'Hardware-Decodierung'; @override String get hardwareDecodingDescription => 'Hardwarebeschleunigung verwenden, sofern verfügbar'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigDe implements TranslationsMpvConfigEn { final TranslationsDe _root; // ignore: unused_field // Translations - @override String get title => 'MPV-Konfiguration'; + @override String get title => 'mpv-Konfiguration'; @override String get description => 'Erweiterte Videoplayer-Einstellungen'; - @override String get properties => 'Eigenschaften'; @override String get presets => 'Voreinstellungen'; - @override String get noProperties => 'Keine Eigenschaften konfiguriert'; @override String get noPresets => 'Keine gespeicherten Voreinstellungen'; - @override String get addProperty => 'Eigenschaft hinzufügen'; - @override String get editProperty => 'Eigenschaft bearbeiten'; - @override String get deleteProperty => 'Eigenschaft löschen'; - @override String get propertyKey => 'Eigenschaftsschlüssel'; - @override String get propertyKeyHint => 'z.B. hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Eigenschaftswert'; - @override String get propertyValueHint => 'z.B. auto, 256000000'; @override String get saveAsPreset => 'Als Voreinstellung speichern...'; @override String get presetName => 'Name der Voreinstellung'; @override String get presetNameHint => 'Namen für diese Voreinstellung eingeben'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigDe implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Voreinstellung geladen'; @override String get presetDeleted => 'Voreinstellung gelöscht'; @override String get confirmDeletePreset => 'Möchten Sie diese Voreinstellung wirklich löschen?'; - @override String get confirmDeleteProperty => 'Möchten Sie diese Eigenschaft wirklich löschen?'; - @override String entriesCount({required Object count}) => '${count} Einträge'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsDe { 'screens.licenses' => 'Lizenzen', 'screens.switchProfile' => 'Profil wechseln', 'screens.subtitleStyling' => 'Untertitel-Stil', - 'screens.mpvConfig' => 'MPV-Konfiguration', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Protokolle', 'update.available' => 'Update verfügbar', 'update.versionAvailable' => ({required Object version}) => 'Version ${version} ist verfügbar', @@ -1422,7 +1412,7 @@ extension on TranslationsDe { 'settings.playerBackend' => 'Player-Backend', 'settings.exoPlayer' => 'ExoPlayer (Empfohlen)', 'settings.exoPlayerDescription' => 'Android-nativer Player mit besserer Hardware-Unterstützung', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Erweiterter Player mit mehr Funktionen und ASS-Untertitel-Unterstützung', 'settings.hardwareDecoding' => 'Hardware-Decodierung', 'settings.hardwareDecodingDescription' => 'Hardwarebeschleunigung verwenden, sofern verfügbar', @@ -1686,19 +1676,10 @@ extension on TranslationsDe { 'subtitlingStyling.backgroundOpacity' => 'Hintergrunddeckkraft', 'subtitlingStyling.backgroundColor' => 'Hintergrundfarbe', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV-Konfiguration', + 'mpvConfig.title' => 'mpv-Konfiguration', 'mpvConfig.description' => 'Erweiterte Videoplayer-Einstellungen', - 'mpvConfig.properties' => 'Eigenschaften', 'mpvConfig.presets' => 'Voreinstellungen', - 'mpvConfig.noProperties' => 'Keine Eigenschaften konfiguriert', 'mpvConfig.noPresets' => 'Keine gespeicherten Voreinstellungen', - 'mpvConfig.addProperty' => 'Eigenschaft hinzufügen', - 'mpvConfig.editProperty' => 'Eigenschaft bearbeiten', - 'mpvConfig.deleteProperty' => 'Eigenschaft löschen', - 'mpvConfig.propertyKey' => 'Eigenschaftsschlüssel', - 'mpvConfig.propertyKeyHint' => 'z.B. hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Eigenschaftswert', - 'mpvConfig.propertyValueHint' => 'z.B. auto, 256000000', 'mpvConfig.saveAsPreset' => 'Als Voreinstellung speichern...', 'mpvConfig.presetName' => 'Name der Voreinstellung', 'mpvConfig.presetNameHint' => 'Namen für diese Voreinstellung eingeben', @@ -1708,8 +1689,7 @@ extension on TranslationsDe { 'mpvConfig.presetLoaded' => 'Voreinstellung geladen', 'mpvConfig.presetDeleted' => 'Voreinstellung gelöscht', 'mpvConfig.confirmDeletePreset' => 'Möchten Sie diese Voreinstellung wirklich löschen?', - 'mpvConfig.confirmDeleteProperty' => 'Möchten Sie diese Eigenschaft wirklich löschen?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} Einträge', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Aktion bestätigen', 'discover.title' => 'Entdecken', 'discover.switchProfile' => 'Profil wechseln', @@ -1816,8 +1796,6 @@ extension on TranslationsDe { 'liveTv.noChannels' => 'Keine Kanäle verfügbar', 'liveTv.noDvr' => 'Kein DVR auf einem Server konfiguriert', 'liveTv.tuneFailed' => 'Kanal konnte nicht eingestellt werden', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Kanäle werden geladen...', 'liveTv.nowPlaying' => 'Läuft gerade', 'liveTv.noPrograms' => 'Keine Programmdaten verfügbar', @@ -1828,6 +1806,8 @@ extension on TranslationsDe { 'liveTv.reloadGuide' => 'Programmführer neu laden', 'liveTv.allChannels' => 'Alle Kanäle', 'liveTv.now' => 'Jetzt', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Heute', 'liveTv.midnight' => 'Mitternacht', 'liveTv.overnight' => 'Nacht', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 220febec..1097f70c 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -289,8 +289,8 @@ class TranslationsScreensEn { /// en: 'Subtitle Styling' String get subtitleStyling => 'Subtitle Styling'; - /// en: 'MPV Configuration' - String get mpvConfig => 'MPV Configuration'; + /// en: 'mpv.conf' + String get mpvConfig => 'mpv.conf'; /// en: 'Logs' String get logs => 'Logs'; @@ -487,8 +487,8 @@ class TranslationsSettingsEn { /// en: 'Android native player with better hardware support' String get exoPlayerDescription => 'Android native player with better hardware support'; - /// en: 'MPV' - String get mpv => 'MPV'; + /// en: 'mpv' + String get mpv => 'mpv'; /// en: 'Advanced player with more features and ASS subtitle support' String get mpvDescription => 'Advanced player with more features and ASS subtitle support'; @@ -1313,45 +1313,18 @@ class TranslationsMpvConfigEn { // Translations - /// en: 'MPV Configuration' - String get title => 'MPV Configuration'; + /// en: 'mpv.conf' + String get title => 'mpv.conf'; /// en: 'Advanced video player settings' String get description => 'Advanced video player settings'; - /// en: 'Properties' - String get properties => 'Properties'; - /// en: 'Presets' String get presets => 'Presets'; - /// en: 'No properties configured' - String get noProperties => 'No properties configured'; - /// en: 'No saved presets' String get noPresets => 'No saved presets'; - /// en: 'Add Property' - String get addProperty => 'Add Property'; - - /// en: 'Edit Property' - String get editProperty => 'Edit Property'; - - /// en: 'Delete Property' - String get deleteProperty => 'Delete Property'; - - /// en: 'Property Key' - String get propertyKey => 'Property Key'; - - /// en: 'e.g., hwdec, demuxer-max-bytes' - String get propertyKeyHint => 'e.g., hwdec, demuxer-max-bytes'; - - /// en: 'Property Value' - String get propertyValue => 'Property Value'; - - /// en: 'e.g., auto, 256000000' - String get propertyValueHint => 'e.g., auto, 256000000'; - /// en: 'Save as Preset...' String get saveAsPreset => 'Save as Preset...'; @@ -1379,11 +1352,8 @@ class TranslationsMpvConfigEn { /// en: 'Are you sure you want to delete this preset?' String get confirmDeletePreset => 'Are you sure you want to delete this preset?'; - /// en: 'Are you sure you want to delete this property?' - String get confirmDeleteProperty => 'Are you sure you want to delete this property?'; - - /// en: '${count} entries' - String entriesCount({required Object count}) => '${count} entries'; + /// en: 'gpu-api=vulkan hwdec=auto # comment' + String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -2983,7 +2953,7 @@ extension on Translations { 'screens.licenses' => 'Licenses', 'screens.switchProfile' => 'Switch Profile', 'screens.subtitleStyling' => 'Subtitle Styling', - 'screens.mpvConfig' => 'MPV Configuration', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Logs', 'update.available' => 'Update Available', 'update.versionAvailable' => ({required Object version}) => 'Version ${version} is available', @@ -3043,7 +3013,7 @@ extension on Translations { 'settings.playerBackend' => 'Player Backend', 'settings.exoPlayer' => 'ExoPlayer (Recommended)', 'settings.exoPlayerDescription' => 'Android native player with better hardware support', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Advanced player with more features and ASS subtitle support', 'settings.hardwareDecoding' => 'Hardware Decoding', 'settings.hardwareDecodingDescription' => 'Use hardware acceleration when available', @@ -3307,19 +3277,10 @@ extension on Translations { 'subtitlingStyling.backgroundOpacity' => 'Background Opacity', 'subtitlingStyling.backgroundColor' => 'Background Color', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV Configuration', + 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Advanced video player settings', - 'mpvConfig.properties' => 'Properties', 'mpvConfig.presets' => 'Presets', - 'mpvConfig.noProperties' => 'No properties configured', 'mpvConfig.noPresets' => 'No saved presets', - 'mpvConfig.addProperty' => 'Add Property', - 'mpvConfig.editProperty' => 'Edit Property', - 'mpvConfig.deleteProperty' => 'Delete Property', - 'mpvConfig.propertyKey' => 'Property Key', - 'mpvConfig.propertyKeyHint' => 'e.g., hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Property Value', - 'mpvConfig.propertyValueHint' => 'e.g., auto, 256000000', 'mpvConfig.saveAsPreset' => 'Save as Preset...', 'mpvConfig.presetName' => 'Preset Name', 'mpvConfig.presetNameHint' => 'Enter a name for this preset', @@ -3329,8 +3290,7 @@ extension on Translations { 'mpvConfig.presetLoaded' => 'Preset loaded', 'mpvConfig.presetDeleted' => 'Preset deleted', 'mpvConfig.confirmDeletePreset' => 'Are you sure you want to delete this preset?', - 'mpvConfig.confirmDeleteProperty' => 'Are you sure you want to delete this property?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} entries', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Confirm Action', 'discover.title' => 'Discover', 'discover.switchProfile' => 'Switch Profile', @@ -3437,8 +3397,6 @@ extension on Translations { 'liveTv.noChannels' => 'No channels available', 'liveTv.noDvr' => 'No DVR configured on any server', 'liveTv.tuneFailed' => 'Failed to tune channel', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Loading channels...', 'liveTv.nowPlaying' => 'Now Playing', 'liveTv.noPrograms' => 'No program data available', @@ -3449,6 +3407,8 @@ extension on Translations { 'liveTv.reloadGuide' => 'Reload Guide', 'liveTv.allChannels' => 'All Channels', 'liveTv.now' => 'Now', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Today', 'liveTv.midnight' => 'Midnight', 'liveTv.overnight' => 'Overnight', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index feebdd6c..1fc41f09 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensEs implements TranslationsScreensEn { @override String get licenses => 'Licencias'; @override String get switchProfile => 'Cambiar Perfil'; @override String get subtitleStyling => 'Estilo de Subtítulos'; - @override String get mpvConfig => 'Configuración de MPV'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Logs'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsEs implements TranslationsSettingsEn { @override String get playerBackend => 'Reproductor'; @override String get exoPlayer => 'ExoPlayer (Recomendado)'; @override String get exoPlayerDescription => 'Reproductor nativo de Android con mejor soporte de hardware'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Reproductor avanzado con más funciones y soporte de subtítulos ASS'; @override String get hardwareDecoding => 'Decodificación por Hardware'; @override String get hardwareDecodingDescription => 'Usar aceleración por hardware cuando esté disponible'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigEs implements TranslationsMpvConfigEn { final TranslationsEs _root; // ignore: unused_field // Translations - @override String get title => 'Configuración de MPV'; + @override String get title => 'Configuración de mpv'; @override String get description => 'Ajustes avanzados del reproductor de video'; - @override String get properties => 'Propiedades'; @override String get presets => 'Ajustes preestablecidos'; - @override String get noProperties => 'No hay propiedades configuradas'; @override String get noPresets => 'No hay ajustes guardados'; - @override String get addProperty => 'Añadir Propiedad'; - @override String get editProperty => 'Editar Propiedad'; - @override String get deleteProperty => 'Eliminar Propiedad'; - @override String get propertyKey => 'Clave de la Propiedad'; - @override String get propertyKeyHint => 'ej., hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Valor de la Propiedad'; - @override String get propertyValueHint => 'ej., auto, 256000000'; @override String get saveAsPreset => 'Guardar como Ajuste...'; @override String get presetName => 'Nombre del Ajuste'; @override String get presetNameHint => 'Introduce un nombre para este ajuste'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigEs implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Ajuste cargado'; @override String get presetDeleted => 'Ajuste eliminado'; @override String get confirmDeletePreset => '¿Estás seguro de que quieres eliminar este ajuste?'; - @override String get confirmDeleteProperty => '¿Estás seguro de que quieres eliminar esta propiedad?'; - @override String entriesCount({required Object count}) => '${count} entradas'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsEs { 'screens.licenses' => 'Licencias', 'screens.switchProfile' => 'Cambiar Perfil', 'screens.subtitleStyling' => 'Estilo de Subtítulos', - 'screens.mpvConfig' => 'Configuración de MPV', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Logs', 'update.available' => 'Actualización disponible', 'update.versionAvailable' => ({required Object version}) => 'Versión ${version} disponible', @@ -1422,7 +1412,7 @@ extension on TranslationsEs { 'settings.playerBackend' => 'Reproductor', 'settings.exoPlayer' => 'ExoPlayer (Recomendado)', 'settings.exoPlayerDescription' => 'Reproductor nativo de Android con mejor soporte de hardware', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Reproductor avanzado con más funciones y soporte de subtítulos ASS', 'settings.hardwareDecoding' => 'Decodificación por Hardware', 'settings.hardwareDecodingDescription' => 'Usar aceleración por hardware cuando esté disponible', @@ -1686,19 +1676,10 @@ extension on TranslationsEs { 'subtitlingStyling.backgroundOpacity' => 'Opacidad de Fondo', 'subtitlingStyling.backgroundColor' => 'Color de Fondo', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'Configuración de MPV', + 'mpvConfig.title' => 'Configuración de mpv', 'mpvConfig.description' => 'Ajustes avanzados del reproductor de video', - 'mpvConfig.properties' => 'Propiedades', 'mpvConfig.presets' => 'Ajustes preestablecidos', - 'mpvConfig.noProperties' => 'No hay propiedades configuradas', 'mpvConfig.noPresets' => 'No hay ajustes guardados', - 'mpvConfig.addProperty' => 'Añadir Propiedad', - 'mpvConfig.editProperty' => 'Editar Propiedad', - 'mpvConfig.deleteProperty' => 'Eliminar Propiedad', - 'mpvConfig.propertyKey' => 'Clave de la Propiedad', - 'mpvConfig.propertyKeyHint' => 'ej., hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Valor de la Propiedad', - 'mpvConfig.propertyValueHint' => 'ej., auto, 256000000', 'mpvConfig.saveAsPreset' => 'Guardar como Ajuste...', 'mpvConfig.presetName' => 'Nombre del Ajuste', 'mpvConfig.presetNameHint' => 'Introduce un nombre para este ajuste', @@ -1708,8 +1689,7 @@ extension on TranslationsEs { 'mpvConfig.presetLoaded' => 'Ajuste cargado', 'mpvConfig.presetDeleted' => 'Ajuste eliminado', 'mpvConfig.confirmDeletePreset' => '¿Estás seguro de que quieres eliminar este ajuste?', - 'mpvConfig.confirmDeleteProperty' => '¿Estás seguro de que quieres eliminar esta propiedad?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} entradas', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Confirmar Acción', 'discover.title' => 'Descubrir', 'discover.switchProfile' => 'Cambiar Perfil', @@ -1816,8 +1796,6 @@ extension on TranslationsEs { 'liveTv.noChannels' => 'No hay canales disponibles', 'liveTv.noDvr' => 'No hay DVR configurado en ningún servidor', 'liveTv.tuneFailed' => 'Error al sintonizar el canal', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Cargando canales...', 'liveTv.nowPlaying' => 'Reproduciendo ahora', 'liveTv.noPrograms' => 'No hay datos de programación disponibles', @@ -1828,6 +1806,8 @@ extension on TranslationsEs { 'liveTv.reloadGuide' => 'Recargar guía', 'liveTv.allChannels' => 'Todos los canales', 'liveTv.now' => 'Ahora', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Hoy', 'liveTv.midnight' => 'Medianoche', 'liveTv.overnight' => 'Madrugada', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 183c052d..2a7a3518 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensFr implements TranslationsScreensEn { @override String get licenses => 'Licenses'; @override String get switchProfile => 'Changer de profil'; @override String get subtitleStyling => 'Configuration des sous-titres'; - @override String get mpvConfig => 'Configuration MPV'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Logs'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsFr implements TranslationsSettingsEn { @override String get playerBackend => 'Moteur de lecture'; @override String get exoPlayer => 'ExoPlayer (Recommandé)'; @override String get exoPlayerDescription => 'Lecteur natif Android avec meilleur support matériel'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Lecteur avancé avec plus de fonctionnalités et support des sous-titres ASS'; @override String get hardwareDecoding => 'Décodage matériel'; @override String get hardwareDecodingDescription => 'Utilisez l\'accélération matérielle lorsqu\'elle est disponible.'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigFr implements TranslationsMpvConfigEn { final TranslationsFr _root; // ignore: unused_field // Translations - @override String get title => 'Configuration MPV'; + @override String get title => 'Configuration mpv'; @override String get description => 'Paramètres avancés du lecteur vidéo'; - @override String get properties => 'Propriétés'; @override String get presets => 'Préréglages'; - @override String get noProperties => 'Aucune propriété configurée'; @override String get noPresets => 'Aucun préréglage enregistré'; - @override String get addProperty => 'Ajouter une propriété'; - @override String get editProperty => 'Modifier la propriété'; - @override String get deleteProperty => 'Supprimer la propriété'; - @override String get propertyKey => 'Clé'; - @override String get propertyKeyHint => 'e.g., hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Valeur'; - @override String get propertyValueHint => 'e.g., auto, 256000000'; @override String get saveAsPreset => 'Enregistrer comme préréglage...'; @override String get presetName => 'Nom du préréglage'; @override String get presetNameHint => 'Entrez un nom pour ce préréglage'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigFr implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Préréglage chargé'; @override String get presetDeleted => 'Préréglage supprimé'; @override String get confirmDeletePreset => 'Êtes-vous sûr de vouloir supprimer ce préréglage ?'; - @override String get confirmDeleteProperty => 'Êtes-vous sûr de vouloir supprimer cette propriété ?'; - @override String entriesCount({required Object count}) => '${count} entrées'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsFr { 'screens.licenses' => 'Licenses', 'screens.switchProfile' => 'Changer de profil', 'screens.subtitleStyling' => 'Configuration des sous-titres', - 'screens.mpvConfig' => 'Configuration MPV', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Logs', 'update.available' => 'Mise à jour disponible', 'update.versionAvailable' => ({required Object version}) => 'Version ${version} disponible', @@ -1422,7 +1412,7 @@ extension on TranslationsFr { 'settings.playerBackend' => 'Moteur de lecture', 'settings.exoPlayer' => 'ExoPlayer (Recommandé)', 'settings.exoPlayerDescription' => 'Lecteur natif Android avec meilleur support matériel', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Lecteur avancé avec plus de fonctionnalités et support des sous-titres ASS', 'settings.hardwareDecoding' => 'Décodage matériel', 'settings.hardwareDecodingDescription' => 'Utilisez l\'accélération matérielle lorsqu\'elle est disponible.', @@ -1686,19 +1676,10 @@ extension on TranslationsFr { 'subtitlingStyling.backgroundOpacity' => 'Opacité d\'arrière-plan', 'subtitlingStyling.backgroundColor' => 'Couleur d\'arrière-plan', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'Configuration MPV', + 'mpvConfig.title' => 'Configuration mpv', 'mpvConfig.description' => 'Paramètres avancés du lecteur vidéo', - 'mpvConfig.properties' => 'Propriétés', 'mpvConfig.presets' => 'Préréglages', - 'mpvConfig.noProperties' => 'Aucune propriété configurée', 'mpvConfig.noPresets' => 'Aucun préréglage enregistré', - 'mpvConfig.addProperty' => 'Ajouter une propriété', - 'mpvConfig.editProperty' => 'Modifier la propriété', - 'mpvConfig.deleteProperty' => 'Supprimer la propriété', - 'mpvConfig.propertyKey' => 'Clé', - 'mpvConfig.propertyKeyHint' => 'e.g., hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Valeur', - 'mpvConfig.propertyValueHint' => 'e.g., auto, 256000000', 'mpvConfig.saveAsPreset' => 'Enregistrer comme préréglage...', 'mpvConfig.presetName' => 'Nom du préréglage', 'mpvConfig.presetNameHint' => 'Entrez un nom pour ce préréglage', @@ -1708,8 +1689,7 @@ extension on TranslationsFr { 'mpvConfig.presetLoaded' => 'Préréglage chargé', 'mpvConfig.presetDeleted' => 'Préréglage supprimé', 'mpvConfig.confirmDeletePreset' => 'Êtes-vous sûr de vouloir supprimer ce préréglage ?', - 'mpvConfig.confirmDeleteProperty' => 'Êtes-vous sûr de vouloir supprimer cette propriété ?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} entrées', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Confirmer l\'action', 'discover.title' => 'Découvrez', 'discover.switchProfile' => 'Changer de profil', @@ -1816,8 +1796,6 @@ extension on TranslationsFr { 'liveTv.noChannels' => 'Aucune chaîne disponible', 'liveTv.noDvr' => 'Aucun DVR configuré sur les serveurs', 'liveTv.tuneFailed' => 'Impossible de syntoniser la chaîne', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Chargement des chaînes...', 'liveTv.nowPlaying' => 'En cours de lecture', 'liveTv.noPrograms' => 'Aucune donnée de programme disponible', @@ -1828,6 +1806,8 @@ extension on TranslationsFr { 'liveTv.reloadGuide' => 'Recharger le guide', 'liveTv.allChannels' => 'Toutes les chaînes', 'liveTv.now' => 'Maintenant', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Aujourd\'hui', 'liveTv.midnight' => 'Minuit', 'liveTv.overnight' => 'Nuit', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 2b4d4e39..6d0528ff 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensIt implements TranslationsScreensEn { @override String get licenses => 'Licenze'; @override String get switchProfile => 'Cambia profilo'; @override String get subtitleStyling => 'Stile sottotitoli'; - @override String get mpvConfig => 'Configurazione MPV'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Registro'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsIt implements TranslationsSettingsEn { @override String get playerBackend => 'Motore di riproduzione'; @override String get exoPlayer => 'ExoPlayer (Consigliato)'; @override String get exoPlayerDescription => 'Lettore nativo Android con migliore supporto hardware'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Lettore avanzato con più funzionalità e supporto sottotitoli ASS'; @override String get hardwareDecoding => 'Decodifica Hardware'; @override String get hardwareDecodingDescription => 'Utilizza l\'accelerazione hardware quando disponibile'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigIt implements TranslationsMpvConfigEn { final TranslationsIt _root; // ignore: unused_field // Translations - @override String get title => 'Configurazione MPV'; + @override String get title => 'Configurazione mpv'; @override String get description => 'Impostazioni avanzate del lettore video'; - @override String get properties => 'Proprietà'; @override String get presets => 'Preset'; - @override String get noProperties => 'Nessuna proprietà configurata'; @override String get noPresets => 'Nessun preset salvato'; - @override String get addProperty => 'Aggiungi proprietà'; - @override String get editProperty => 'Modifica proprietà'; - @override String get deleteProperty => 'Elimina proprietà'; - @override String get propertyKey => 'Chiave proprietà'; - @override String get propertyKeyHint => 'es. hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Valore proprietà'; - @override String get propertyValueHint => 'es. auto, 256000000'; @override String get saveAsPreset => 'Salva come preset...'; @override String get presetName => 'Nome preset'; @override String get presetNameHint => 'Inserisci un nome per questo preset'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigIt implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Preset caricato'; @override String get presetDeleted => 'Preset eliminato'; @override String get confirmDeletePreset => 'Sei sicuro di voler eliminare questo preset?'; - @override String get confirmDeleteProperty => 'Sei sicuro di voler eliminare questa proprietà?'; - @override String entriesCount({required Object count}) => '${count} voci'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsIt { 'screens.licenses' => 'Licenze', 'screens.switchProfile' => 'Cambia profilo', 'screens.subtitleStyling' => 'Stile sottotitoli', - 'screens.mpvConfig' => 'Configurazione MPV', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Registro', 'update.available' => 'Aggiornamento disponibile', 'update.versionAvailable' => ({required Object version}) => 'Versione ${version} disponibile', @@ -1422,7 +1412,7 @@ extension on TranslationsIt { 'settings.playerBackend' => 'Motore di riproduzione', 'settings.exoPlayer' => 'ExoPlayer (Consigliato)', 'settings.exoPlayerDescription' => 'Lettore nativo Android con migliore supporto hardware', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Lettore avanzato con più funzionalità e supporto sottotitoli ASS', 'settings.hardwareDecoding' => 'Decodifica Hardware', 'settings.hardwareDecodingDescription' => 'Utilizza l\'accelerazione hardware quando disponibile', @@ -1686,19 +1676,10 @@ extension on TranslationsIt { 'subtitlingStyling.backgroundOpacity' => 'Opacità sfondo', 'subtitlingStyling.backgroundColor' => 'Colore sfondo', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'Configurazione MPV', + 'mpvConfig.title' => 'Configurazione mpv', 'mpvConfig.description' => 'Impostazioni avanzate del lettore video', - 'mpvConfig.properties' => 'Proprietà', 'mpvConfig.presets' => 'Preset', - 'mpvConfig.noProperties' => 'Nessuna proprietà configurata', 'mpvConfig.noPresets' => 'Nessun preset salvato', - 'mpvConfig.addProperty' => 'Aggiungi proprietà', - 'mpvConfig.editProperty' => 'Modifica proprietà', - 'mpvConfig.deleteProperty' => 'Elimina proprietà', - 'mpvConfig.propertyKey' => 'Chiave proprietà', - 'mpvConfig.propertyKeyHint' => 'es. hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Valore proprietà', - 'mpvConfig.propertyValueHint' => 'es. auto, 256000000', 'mpvConfig.saveAsPreset' => 'Salva come preset...', 'mpvConfig.presetName' => 'Nome preset', 'mpvConfig.presetNameHint' => 'Inserisci un nome per questo preset', @@ -1708,8 +1689,7 @@ extension on TranslationsIt { 'mpvConfig.presetLoaded' => 'Preset caricato', 'mpvConfig.presetDeleted' => 'Preset eliminato', 'mpvConfig.confirmDeletePreset' => 'Sei sicuro di voler eliminare questo preset?', - 'mpvConfig.confirmDeleteProperty' => 'Sei sicuro di voler eliminare questa proprietà?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} voci', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Conferma azione', 'discover.title' => 'Esplora', 'discover.switchProfile' => 'Cambia profilo', @@ -1816,8 +1796,6 @@ extension on TranslationsIt { 'liveTv.noChannels' => 'Nessun canale disponibile', 'liveTv.noDvr' => 'Nessun DVR configurato su nessun server', 'liveTv.tuneFailed' => 'Impossibile sintonizzare il canale', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Caricamento canali...', 'liveTv.nowPlaying' => 'In riproduzione', 'liveTv.noPrograms' => 'Nessun dato di programma disponibile', @@ -1828,6 +1806,8 @@ extension on TranslationsIt { 'liveTv.reloadGuide' => 'Ricarica guida', 'liveTv.allChannels' => 'Tutti i canali', 'liveTv.now' => 'Ora', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Oggi', 'liveTv.midnight' => 'Mezzanotte', 'liveTv.overnight' => 'Notte', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index d66826ce..6564cc56 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensKo implements TranslationsScreensEn { @override String get licenses => '라이선스'; @override String get switchProfile => '프로필 전환'; @override String get subtitleStyling => '자막 스타일 설정'; - @override String get mpvConfig => 'MPV 설정'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => '로그'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsKo implements TranslationsSettingsEn { @override String get playerBackend => '플레이어 백엔드'; @override String get exoPlayer => 'ExoPlayer (권장)'; @override String get exoPlayerDescription => '더 나은 하드웨어 지원을 제공하는 Android 네이티브 플레이어'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => '더 많은 기능과 ASS 자막을 지원하는 고급 플레이어'; @override String get hardwareDecoding => '하드웨어 디코딩'; @override String get hardwareDecodingDescription => '가능한 경우 하드웨어 가속을 사용합니다'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigKo implements TranslationsMpvConfigEn { final TranslationsKo _root; // ignore: unused_field // Translations - @override String get title => 'MPV 설정'; + @override String get title => 'mpv 설정'; @override String get description => '고급 비디오 플레이어 설정'; - @override String get properties => '속성'; @override String get presets => '사전 설정'; - @override String get noProperties => '설정된 속성이 없습니다'; @override String get noPresets => '저장된 사전 설정이 없습니다'; - @override String get addProperty => '속성 추가'; - @override String get editProperty => '속성 편집'; - @override String get deleteProperty => '속성 삭제'; - @override String get propertyKey => '속성 키'; - @override String get propertyKeyHint => '예: hwdec, demuxer-max-bytes'; - @override String get propertyValue => '속성값'; - @override String get propertyValueHint => '예: auto, 256000000'; @override String get saveAsPreset => '프리셋으로 저장...'; @override String get presetName => '프리셋 이름'; @override String get presetNameHint => '이 프리셋의 이름을 입력하세요'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigKo implements TranslationsMpvConfigEn { @override String get presetLoaded => '프리셋이 로드 되었습니다'; @override String get presetDeleted => '프리셋이 삭제 되었습니다'; @override String get confirmDeletePreset => '이 프리셋을 삭제 하시겠습니까?'; - @override String get confirmDeleteProperty => '이 속성을 삭제 하시겠습니까?'; - @override String entriesCount({required Object count}) => '${count} 항목'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsKo { 'screens.licenses' => '라이선스', 'screens.switchProfile' => '프로필 전환', 'screens.subtitleStyling' => '자막 스타일 설정', - 'screens.mpvConfig' => 'MPV 설정', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => '로그', 'update.available' => '사용 가능한 업데이트', 'update.versionAvailable' => ({required Object version}) => '버전 ${version} 출시됨', @@ -1422,7 +1412,7 @@ extension on TranslationsKo { 'settings.playerBackend' => '플레이어 백엔드', 'settings.exoPlayer' => 'ExoPlayer (권장)', 'settings.exoPlayerDescription' => '더 나은 하드웨어 지원을 제공하는 Android 네이티브 플레이어', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => '더 많은 기능과 ASS 자막을 지원하는 고급 플레이어', 'settings.hardwareDecoding' => '하드웨어 디코딩', 'settings.hardwareDecodingDescription' => '가능한 경우 하드웨어 가속을 사용합니다', @@ -1686,19 +1676,10 @@ extension on TranslationsKo { 'subtitlingStyling.backgroundOpacity' => '배경 불투명도', 'subtitlingStyling.backgroundColor' => '배경색', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV 설정', + 'mpvConfig.title' => 'mpv 설정', 'mpvConfig.description' => '고급 비디오 플레이어 설정', - 'mpvConfig.properties' => '속성', 'mpvConfig.presets' => '사전 설정', - 'mpvConfig.noProperties' => '설정된 속성이 없습니다', 'mpvConfig.noPresets' => '저장된 사전 설정이 없습니다', - 'mpvConfig.addProperty' => '속성 추가', - 'mpvConfig.editProperty' => '속성 편집', - 'mpvConfig.deleteProperty' => '속성 삭제', - 'mpvConfig.propertyKey' => '속성 키', - 'mpvConfig.propertyKeyHint' => '예: hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => '속성값', - 'mpvConfig.propertyValueHint' => '예: auto, 256000000', 'mpvConfig.saveAsPreset' => '프리셋으로 저장...', 'mpvConfig.presetName' => '프리셋 이름', 'mpvConfig.presetNameHint' => '이 프리셋의 이름을 입력하세요', @@ -1708,8 +1689,7 @@ extension on TranslationsKo { 'mpvConfig.presetLoaded' => '프리셋이 로드 되었습니다', 'mpvConfig.presetDeleted' => '프리셋이 삭제 되었습니다', 'mpvConfig.confirmDeletePreset' => '이 프리셋을 삭제 하시겠습니까?', - 'mpvConfig.confirmDeleteProperty' => '이 속성을 삭제 하시겠습니까?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} 항목', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => '확인', 'discover.title' => '발견', 'discover.switchProfile' => '사용자 전환', @@ -1816,8 +1796,6 @@ extension on TranslationsKo { 'liveTv.noChannels' => '사용 가능한 채널이 없습니다', 'liveTv.noDvr' => '서버에 DVR이 구성되어 있지 않습니다', 'liveTv.tuneFailed' => '채널 튜닝에 실패했습니다', - _ => null, - } ?? switch (path) { 'liveTv.loading' => '채널 로딩 중...', 'liveTv.nowPlaying' => '현재 재생 중', 'liveTv.noPrograms' => '프로그램 데이터가 없습니다', @@ -1828,6 +1806,8 @@ extension on TranslationsKo { 'liveTv.reloadGuide' => '편성표 새로고침', 'liveTv.allChannels' => '전체 채널', 'liveTv.now' => '지금', + _ => null, + } ?? switch (path) { 'liveTv.today' => '오늘', 'liveTv.midnight' => '자정', 'liveTv.overnight' => '심야', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 767c8d5b..05de0bea 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensNl implements TranslationsScreensEn { @override String get licenses => 'Licenties'; @override String get switchProfile => 'Wissel van profiel'; @override String get subtitleStyling => 'Ondertitel opmaak'; - @override String get mpvConfig => 'MPV-configuratie'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Logbestanden'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsNl implements TranslationsSettingsEn { @override String get playerBackend => 'Speler backend'; @override String get exoPlayer => 'ExoPlayer (Aanbevolen)'; @override String get exoPlayerDescription => 'Android-native speler met betere hardware-ondersteuning'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Geavanceerde speler met meer functies en ASS-ondertitelondersteuning'; @override String get hardwareDecoding => 'Hardware decodering'; @override String get hardwareDecodingDescription => 'Gebruik hardware versnelling indien beschikbaar'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigNl implements TranslationsMpvConfigEn { final TranslationsNl _root; // ignore: unused_field // Translations - @override String get title => 'MPV-configuratie'; + @override String get title => 'mpv-configuratie'; @override String get description => 'Geavanceerde videospeler-instellingen'; - @override String get properties => 'Eigenschappen'; @override String get presets => 'Voorinstellingen'; - @override String get noProperties => 'Geen eigenschappen geconfigureerd'; @override String get noPresets => 'Geen opgeslagen voorinstellingen'; - @override String get addProperty => 'Eigenschap toevoegen'; - @override String get editProperty => 'Eigenschap bewerken'; - @override String get deleteProperty => 'Eigenschap verwijderen'; - @override String get propertyKey => 'Eigenschapssleutel'; - @override String get propertyKeyHint => 'bijv. hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Eigenschapswaarde'; - @override String get propertyValueHint => 'bijv. auto, 256000000'; @override String get saveAsPreset => 'Opslaan als voorinstelling...'; @override String get presetName => 'Naam voorinstelling'; @override String get presetNameHint => 'Voer een naam in voor deze voorinstelling'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigNl implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Voorinstelling geladen'; @override String get presetDeleted => 'Voorinstelling verwijderd'; @override String get confirmDeletePreset => 'Weet je zeker dat je deze voorinstelling wilt verwijderen?'; - @override String get confirmDeleteProperty => 'Weet je zeker dat je deze eigenschap wilt verwijderen?'; - @override String entriesCount({required Object count}) => '${count} items'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsNl { 'screens.licenses' => 'Licenties', 'screens.switchProfile' => 'Wissel van profiel', 'screens.subtitleStyling' => 'Ondertitel opmaak', - 'screens.mpvConfig' => 'MPV-configuratie', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Logbestanden', 'update.available' => 'Update beschikbaar', 'update.versionAvailable' => ({required Object version}) => 'Versie ${version} is beschikbaar', @@ -1422,7 +1412,7 @@ extension on TranslationsNl { 'settings.playerBackend' => 'Speler backend', 'settings.exoPlayer' => 'ExoPlayer (Aanbevolen)', 'settings.exoPlayerDescription' => 'Android-native speler met betere hardware-ondersteuning', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Geavanceerde speler met meer functies en ASS-ondertitelondersteuning', 'settings.hardwareDecoding' => 'Hardware decodering', 'settings.hardwareDecodingDescription' => 'Gebruik hardware versnelling indien beschikbaar', @@ -1686,19 +1676,10 @@ extension on TranslationsNl { 'subtitlingStyling.backgroundOpacity' => 'Achtergrond transparantie', 'subtitlingStyling.backgroundColor' => 'Achtergrondkleur', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV-configuratie', + 'mpvConfig.title' => 'mpv-configuratie', 'mpvConfig.description' => 'Geavanceerde videospeler-instellingen', - 'mpvConfig.properties' => 'Eigenschappen', 'mpvConfig.presets' => 'Voorinstellingen', - 'mpvConfig.noProperties' => 'Geen eigenschappen geconfigureerd', 'mpvConfig.noPresets' => 'Geen opgeslagen voorinstellingen', - 'mpvConfig.addProperty' => 'Eigenschap toevoegen', - 'mpvConfig.editProperty' => 'Eigenschap bewerken', - 'mpvConfig.deleteProperty' => 'Eigenschap verwijderen', - 'mpvConfig.propertyKey' => 'Eigenschapssleutel', - 'mpvConfig.propertyKeyHint' => 'bijv. hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Eigenschapswaarde', - 'mpvConfig.propertyValueHint' => 'bijv. auto, 256000000', 'mpvConfig.saveAsPreset' => 'Opslaan als voorinstelling...', 'mpvConfig.presetName' => 'Naam voorinstelling', 'mpvConfig.presetNameHint' => 'Voer een naam in voor deze voorinstelling', @@ -1708,8 +1689,7 @@ extension on TranslationsNl { 'mpvConfig.presetLoaded' => 'Voorinstelling geladen', 'mpvConfig.presetDeleted' => 'Voorinstelling verwijderd', 'mpvConfig.confirmDeletePreset' => 'Weet je zeker dat je deze voorinstelling wilt verwijderen?', - 'mpvConfig.confirmDeleteProperty' => 'Weet je zeker dat je deze eigenschap wilt verwijderen?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} items', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Bevestig actie', 'discover.title' => 'Ontdekken', 'discover.switchProfile' => 'Wissel van profiel', @@ -1816,8 +1796,6 @@ extension on TranslationsNl { 'liveTv.noChannels' => 'Geen zenders beschikbaar', 'liveTv.noDvr' => 'Geen DVR geconfigureerd op een server', 'liveTv.tuneFailed' => 'Kan zender niet afstemmen', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Zenders laden...', 'liveTv.nowPlaying' => 'Nu aan het afspelen', 'liveTv.noPrograms' => 'Geen programmagegevens beschikbaar', @@ -1828,6 +1806,8 @@ extension on TranslationsNl { 'liveTv.reloadGuide' => 'Gids herladen', 'liveTv.allChannels' => 'Alle zenders', 'liveTv.now' => 'Nu', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Vandaag', 'liveTv.midnight' => 'Middernacht', 'liveTv.overnight' => 'Nacht', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 8f7b967c..119c665a 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensSv implements TranslationsScreensEn { @override String get licenses => 'Licenser'; @override String get switchProfile => 'Byt profil'; @override String get subtitleStyling => 'Undertext-styling'; - @override String get mpvConfig => 'MPV-konfiguration'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => 'Loggar'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsSv implements TranslationsSettingsEn { @override String get playerBackend => 'Spelarmotor'; @override String get exoPlayer => 'ExoPlayer (Rekommenderad)'; @override String get exoPlayerDescription => 'Android-nativ spelare med bättre hårdvarustöd'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => 'Avancerad spelare med fler funktioner och ASS-undertextstöd'; @override String get hardwareDecoding => 'Hårdvaruavkodning'; @override String get hardwareDecodingDescription => 'Använd hårdvaruacceleration när tillgängligt'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigSv implements TranslationsMpvConfigEn { final TranslationsSv _root; // ignore: unused_field // Translations - @override String get title => 'MPV-konfiguration'; + @override String get title => 'mpv-konfiguration'; @override String get description => 'Avancerade videospelares inställningar'; - @override String get properties => 'Egenskaper'; @override String get presets => 'Förval'; - @override String get noProperties => 'Inga egenskaper konfigurerade'; @override String get noPresets => 'Inga sparade förval'; - @override String get addProperty => 'Lägg till egenskap'; - @override String get editProperty => 'Redigera egenskap'; - @override String get deleteProperty => 'Ta bort egenskap'; - @override String get propertyKey => 'Egenskapsnyckel'; - @override String get propertyKeyHint => 't.ex. hwdec, demuxer-max-bytes'; - @override String get propertyValue => 'Egenskapsvärde'; - @override String get propertyValueHint => 't.ex. auto, 256000000'; @override String get saveAsPreset => 'Spara som förval...'; @override String get presetName => 'Förvalnamn'; @override String get presetNameHint => 'Ange ett namn för detta förval'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigSv implements TranslationsMpvConfigEn { @override String get presetLoaded => 'Förval laddat'; @override String get presetDeleted => 'Förval borttaget'; @override String get confirmDeletePreset => 'Är du säker på att du vill ta bort detta förval?'; - @override String get confirmDeleteProperty => 'Är du säker på att du vill ta bort denna egenskap?'; - @override String entriesCount({required Object count}) => '${count} poster'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsSv { 'screens.licenses' => 'Licenser', 'screens.switchProfile' => 'Byt profil', 'screens.subtitleStyling' => 'Undertext-styling', - 'screens.mpvConfig' => 'MPV-konfiguration', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => 'Loggar', 'update.available' => 'Uppdatering tillgänglig', 'update.versionAvailable' => ({required Object version}) => 'Version ${version} är tillgänglig', @@ -1422,7 +1412,7 @@ extension on TranslationsSv { 'settings.playerBackend' => 'Spelarmotor', 'settings.exoPlayer' => 'ExoPlayer (Rekommenderad)', 'settings.exoPlayerDescription' => 'Android-nativ spelare med bättre hårdvarustöd', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => 'Avancerad spelare med fler funktioner och ASS-undertextstöd', 'settings.hardwareDecoding' => 'Hårdvaruavkodning', 'settings.hardwareDecodingDescription' => 'Använd hårdvaruacceleration när tillgängligt', @@ -1686,19 +1676,10 @@ extension on TranslationsSv { 'subtitlingStyling.backgroundOpacity' => 'Bakgrundsopacitet', 'subtitlingStyling.backgroundColor' => 'Bakgrundsfärg', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV-konfiguration', + 'mpvConfig.title' => 'mpv-konfiguration', 'mpvConfig.description' => 'Avancerade videospelares inställningar', - 'mpvConfig.properties' => 'Egenskaper', 'mpvConfig.presets' => 'Förval', - 'mpvConfig.noProperties' => 'Inga egenskaper konfigurerade', 'mpvConfig.noPresets' => 'Inga sparade förval', - 'mpvConfig.addProperty' => 'Lägg till egenskap', - 'mpvConfig.editProperty' => 'Redigera egenskap', - 'mpvConfig.deleteProperty' => 'Ta bort egenskap', - 'mpvConfig.propertyKey' => 'Egenskapsnyckel', - 'mpvConfig.propertyKeyHint' => 't.ex. hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => 'Egenskapsvärde', - 'mpvConfig.propertyValueHint' => 't.ex. auto, 256000000', 'mpvConfig.saveAsPreset' => 'Spara som förval...', 'mpvConfig.presetName' => 'Förvalnamn', 'mpvConfig.presetNameHint' => 'Ange ett namn för detta förval', @@ -1708,8 +1689,7 @@ extension on TranslationsSv { 'mpvConfig.presetLoaded' => 'Förval laddat', 'mpvConfig.presetDeleted' => 'Förval borttaget', 'mpvConfig.confirmDeletePreset' => 'Är du säker på att du vill ta bort detta förval?', - 'mpvConfig.confirmDeleteProperty' => 'Är du säker på att du vill ta bort denna egenskap?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} poster', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => 'Bekräfta åtgärd', 'discover.title' => 'Upptäck', 'discover.switchProfile' => 'Byt profil', @@ -1816,8 +1796,6 @@ extension on TranslationsSv { 'liveTv.noChannels' => 'Inga kanaler tillgängliga', 'liveTv.noDvr' => 'Ingen DVR konfigurerad på någon server', 'liveTv.tuneFailed' => 'Kunde inte ställa in kanalen', - _ => null, - } ?? switch (path) { 'liveTv.loading' => 'Laddar kanaler...', 'liveTv.nowPlaying' => 'Spelas nu', 'liveTv.noPrograms' => 'Ingen programdata tillgänglig', @@ -1828,6 +1806,8 @@ extension on TranslationsSv { 'liveTv.reloadGuide' => 'Ladda om programguide', 'liveTv.allChannels' => 'Alla kanaler', 'liveTv.now' => 'Nu', + _ => null, + } ?? switch (path) { 'liveTv.today' => 'Idag', 'liveTv.midnight' => 'Midnatt', 'liveTv.overnight' => 'Natt', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 139934c7..b821dec2 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -169,7 +169,7 @@ class _TranslationsScreensZh implements TranslationsScreensEn { @override String get licenses => '许可证'; @override String get switchProfile => '切换用户'; @override String get subtitleStyling => '字幕样式'; - @override String get mpvConfig => 'MPV 配置'; + @override String get mpvConfig => 'mpv.conf'; @override String get logs => '日志'; } @@ -247,7 +247,7 @@ class _TranslationsSettingsZh implements TranslationsSettingsEn { @override String get playerBackend => '播放器引擎'; @override String get exoPlayer => 'ExoPlayer(推荐)'; @override String get exoPlayerDescription => 'Android 原生播放器,硬件支持更好'; - @override String get mpv => 'MPV'; + @override String get mpv => 'mpv'; @override String get mpvDescription => '功能更多的高级播放器,支持 ASS 字幕'; @override String get hardwareDecoding => '硬件解码'; @override String get hardwareDecodingDescription => '如果可用,使用硬件加速'; @@ -595,19 +595,10 @@ class _TranslationsMpvConfigZh implements TranslationsMpvConfigEn { final TranslationsZh _root; // ignore: unused_field // Translations - @override String get title => 'MPV 配置'; + @override String get title => 'mpv 配置'; @override String get description => '高级视频播放器设置'; - @override String get properties => '属性'; @override String get presets => '预设'; - @override String get noProperties => '未配置任何属性'; @override String get noPresets => '没有保存的预设'; - @override String get addProperty => '添加属性'; - @override String get editProperty => '编辑属性'; - @override String get deleteProperty => '删除属性'; - @override String get propertyKey => '属性键'; - @override String get propertyKeyHint => '例如 hwdec, demuxer-max-bytes'; - @override String get propertyValue => '属性值'; - @override String get propertyValueHint => '例如 auto, 256000000'; @override String get saveAsPreset => '保存为预设...'; @override String get presetName => '预设名称'; @override String get presetNameHint => '输入此预设的名称'; @@ -617,8 +608,7 @@ class _TranslationsMpvConfigZh implements TranslationsMpvConfigEn { @override String get presetLoaded => '预设已加载'; @override String get presetDeleted => '预设已删除'; @override String get confirmDeletePreset => '确定要删除此预设吗?'; - @override String get confirmDeleteProperty => '确定要删除此属性吗?'; - @override String entriesCount({required Object count}) => '${count} 条目'; + @override String get configPlaceholder => 'gpu-api=vulkan\nhwdec=auto\n# comment'; } // Path: dialog @@ -1362,7 +1352,7 @@ extension on TranslationsZh { 'screens.licenses' => '许可证', 'screens.switchProfile' => '切换用户', 'screens.subtitleStyling' => '字幕样式', - 'screens.mpvConfig' => 'MPV 配置', + 'screens.mpvConfig' => 'mpv.conf', 'screens.logs' => '日志', 'update.available' => '有可用更新', 'update.versionAvailable' => ({required Object version}) => '版本 ${version} 已发布', @@ -1422,7 +1412,7 @@ extension on TranslationsZh { 'settings.playerBackend' => '播放器引擎', 'settings.exoPlayer' => 'ExoPlayer(推荐)', 'settings.exoPlayerDescription' => 'Android 原生播放器,硬件支持更好', - 'settings.mpv' => 'MPV', + 'settings.mpv' => 'mpv', 'settings.mpvDescription' => '功能更多的高级播放器,支持 ASS 字幕', 'settings.hardwareDecoding' => '硬件解码', 'settings.hardwareDecodingDescription' => '如果可用,使用硬件加速', @@ -1686,19 +1676,10 @@ extension on TranslationsZh { 'subtitlingStyling.backgroundOpacity' => '背景不透明度', 'subtitlingStyling.backgroundColor' => '背景颜色', 'subtitlingStyling.position' => 'Position', - 'mpvConfig.title' => 'MPV 配置', + 'mpvConfig.title' => 'mpv 配置', 'mpvConfig.description' => '高级视频播放器设置', - 'mpvConfig.properties' => '属性', 'mpvConfig.presets' => '预设', - 'mpvConfig.noProperties' => '未配置任何属性', 'mpvConfig.noPresets' => '没有保存的预设', - 'mpvConfig.addProperty' => '添加属性', - 'mpvConfig.editProperty' => '编辑属性', - 'mpvConfig.deleteProperty' => '删除属性', - 'mpvConfig.propertyKey' => '属性键', - 'mpvConfig.propertyKeyHint' => '例如 hwdec, demuxer-max-bytes', - 'mpvConfig.propertyValue' => '属性值', - 'mpvConfig.propertyValueHint' => '例如 auto, 256000000', 'mpvConfig.saveAsPreset' => '保存为预设...', 'mpvConfig.presetName' => '预设名称', 'mpvConfig.presetNameHint' => '输入此预设的名称', @@ -1708,8 +1689,7 @@ extension on TranslationsZh { 'mpvConfig.presetLoaded' => '预设已加载', 'mpvConfig.presetDeleted' => '预设已删除', 'mpvConfig.confirmDeletePreset' => '确定要删除此预设吗?', - 'mpvConfig.confirmDeleteProperty' => '确定要删除此属性吗?', - 'mpvConfig.entriesCount' => ({required Object count}) => '${count} 条目', + 'mpvConfig.configPlaceholder' => 'gpu-api=vulkan\nhwdec=auto\n# comment', 'dialog.confirmAction' => '确认操作', 'discover.title' => '发现', 'discover.switchProfile' => '切换用户', @@ -1816,8 +1796,6 @@ extension on TranslationsZh { 'liveTv.noChannels' => '没有可用的频道', 'liveTv.noDvr' => '没有服务器配置了DVR', 'liveTv.tuneFailed' => '无法调谐频道', - _ => null, - } ?? switch (path) { 'liveTv.loading' => '正在加载频道...', 'liveTv.nowPlaying' => '正在播放', 'liveTv.noPrograms' => '没有可用的节目数据', @@ -1828,6 +1806,8 @@ extension on TranslationsZh { 'liveTv.reloadGuide' => '重新加载节目指南', 'liveTv.allChannels' => '所有频道', 'liveTv.now' => '现在', + _ => null, + } ?? switch (path) { 'liveTv.today' => '今天', 'liveTv.midnight' => '午夜', 'liveTv.overnight' => '凌晨', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 5c17c128..18074940 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -64,7 +64,7 @@ "licenses": "Licenser", "switchProfile": "Byt profil", "subtitleStyling": "Undertext-styling", - "mpvConfig": "MPV-konfiguration", + "mpvConfig": "mpv.conf", "logs": "Loggar" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "Spelarmotor", "exoPlayer": "ExoPlayer (Rekommenderad)", "exoPlayerDescription": "Android-nativ spelare med bättre hårdvarustöd", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "Avancerad spelare med fler funktioner och ASS-undertextstöd", "hardwareDecoding": "Hårdvaruavkodning", "hardwareDecodingDescription": "Använd hårdvaruacceleration när tillgängligt", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV-konfiguration", + "title": "mpv-konfiguration", "description": "Avancerade videospelares inställningar", - "properties": "Egenskaper", "presets": "Förval", - "noProperties": "Inga egenskaper konfigurerade", "noPresets": "Inga sparade förval", - "addProperty": "Lägg till egenskap", - "editProperty": "Redigera egenskap", - "deleteProperty": "Ta bort egenskap", - "propertyKey": "Egenskapsnyckel", - "propertyKeyHint": "t.ex. hwdec, demuxer-max-bytes", - "propertyValue": "Egenskapsvärde", - "propertyValueHint": "t.ex. auto, 256000000", "saveAsPreset": "Spara som förval...", "presetName": "Förvalnamn", "presetNameHint": "Ange ett namn för detta förval", @@ -442,8 +433,7 @@ "presetLoaded": "Förval laddat", "presetDeleted": "Förval borttaget", "confirmDeletePreset": "Är du säker på att du vill ta bort detta förval?", - "confirmDeleteProperty": "Är du säker på att du vill ta bort denna egenskap?", - "entriesCount": "${count} poster" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "Bekräfta åtgärd" diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 8289c01a..ca407d60 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -64,7 +64,7 @@ "licenses": "许可证", "switchProfile": "切换用户", "subtitleStyling": "字幕样式", - "mpvConfig": "MPV 配置", + "mpvConfig": "mpv.conf", "logs": "日志" }, "update": { @@ -128,7 +128,7 @@ "playerBackend": "播放器引擎", "exoPlayer": "ExoPlayer(推荐)", "exoPlayerDescription": "Android 原生播放器,硬件支持更好", - "mpv": "MPV", + "mpv": "mpv", "mpvDescription": "功能更多的高级播放器,支持 ASS 字幕", "hardwareDecoding": "硬件解码", "hardwareDecodingDescription": "如果可用,使用硬件加速", @@ -420,19 +420,10 @@ "position": "Position" }, "mpvConfig": { - "title": "MPV 配置", + "title": "mpv 配置", "description": "高级视频播放器设置", - "properties": "属性", "presets": "预设", - "noProperties": "未配置任何属性", "noPresets": "没有保存的预设", - "addProperty": "添加属性", - "editProperty": "编辑属性", - "deleteProperty": "删除属性", - "propertyKey": "属性键", - "propertyKeyHint": "例如 hwdec, demuxer-max-bytes", - "propertyValue": "属性值", - "propertyValueHint": "例如 auto, 256000000", "saveAsPreset": "保存为预设...", "presetName": "预设名称", "presetNameHint": "输入此预设的名称", @@ -442,8 +433,7 @@ "presetLoaded": "预设已加载", "presetDeleted": "预设已删除", "confirmDeletePreset": "确定要删除此预设吗?", - "confirmDeleteProperty": "确定要删除此属性吗?", - "entriesCount": "${count} 条目" + "configPlaceholder": "gpu-api=vulkan\nhwdec=auto\n# comment" }, "dialog": { "confirmAction": "确认操作" diff --git a/lib/models/mpv_config_models.dart b/lib/models/mpv_config_models.dart index 7a72cd80..d0ecfbe8 100644 --- a/lib/models/mpv_config_models.dart +++ b/lib/models/mpv_config_models.dart @@ -1,45 +1,22 @@ -/// Represents a single MPV configuration entry -class MpvConfigEntry { - final String key; - final String value; - final bool isEnabled; - - const MpvConfigEntry({required this.key, required this.value, this.isEnabled = true}); - - factory MpvConfigEntry.fromJson(Map json) { - return MpvConfigEntry( - key: json['key'] as String, - value: json['value'] as String, - isEnabled: json['isEnabled'] as bool? ?? true, - ); - } - - Map toJson() => {'key': key, 'value': value, 'isEnabled': isEnabled}; - - MpvConfigEntry copyWith({String? key, String? value, bool? isEnabled}) { - return MpvConfigEntry(key: key ?? this.key, value: value ?? this.value, isEnabled: isEnabled ?? this.isEnabled); - } -} - /// Represents a saved preset of MPV configurations class MpvPreset { final String name; - final List entries; + final String text; final DateTime createdAt; - const MpvPreset({required this.name, required this.entries, required this.createdAt}); + const MpvPreset({required this.name, required this.text, required this.createdAt}); factory MpvPreset.fromJson(Map json) { return MpvPreset( name: json['name'] as String, - entries: (json['entries'] as List).map((e) => MpvConfigEntry.fromJson(e as Map)).toList(), + text: json['text'] as String, createdAt: DateTime.parse(json['createdAt'] as String), ); } Map toJson() => { 'name': name, - 'entries': entries.map((e) => e.toJson()).toList(), + 'text': text, 'createdAt': createdAt.toIso8601String(), }; } diff --git a/lib/screens/settings/mpv_config_screen.dart b/lib/screens/settings/mpv_config_screen.dart index 1c4bd2e9..916afa92 100644 --- a/lib/screens/settings/mpv_config_screen.dart +++ b/lib/screens/settings/mpv_config_screen.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:plezy/widgets/app_icon.dart'; import 'package:material_symbols_icons/symbols.dart'; +import '../../focus/dpad_navigator.dart'; +import '../../focus/key_event_utils.dart'; import '../../i18n/strings.g.dart'; import '../../models/mpv_config_models.dart'; import '../../focus/focusable_button.dart'; @@ -20,158 +23,41 @@ class _MpvConfigScreenState extends State { late SettingsService _settingsService; bool _isLoading = true; - List _entries = []; + late TextEditingController _textController; + final _savePresetFocusNode = FocusNode(); List _presets = []; @override void initState() { super.initState(); + _textController = TextEditingController(); _loadSettings(); } + @override + void dispose() { + _textController.dispose(); + _savePresetFocusNode.dispose(); + super.dispose(); + } + Future _loadSettings() async { _settingsService = await SettingsService.getInstance(); if (!mounted) return; setState(() { - _entries = _settingsService.getMpvConfigEntries(); + _textController.text = _settingsService.getMpvConfigText(); _presets = _settingsService.getMpvPresets(); _isLoading = false; }); } - Future _saveEntries() async { - await _settingsService.setMpvConfigEntries(_entries); - } - - void _toggleEntry(int index) { - setState(() { - _entries[index] = _entries[index].copyWith(isEnabled: !_entries[index].isEnabled); - }); - _saveEntries(); - } - - void _deleteEntry(int index) { - setState(() { - _entries.removeAt(index); - }); - _saveEntries(); - } - - void _addEntry(MpvConfigEntry entry) { - setState(() { - _entries.add(entry); - }); - _saveEntries(); - } - - void _updateEntry(int index, MpvConfigEntry entry) { - setState(() { - _entries[index] = entry; - }); - _saveEntries(); - } - - Future _showEntryDialog({int? editIndex}) async { - final isEdit = editIndex != null; - final existingEntry = isEdit ? _entries[editIndex] : null; - - final keyController = TextEditingController(text: existingEntry?.key ?? ''); - final valueController = TextEditingController(text: existingEntry?.value ?? ''); - final keyFocusNode = FocusNode(); - final valueFocusNode = FocusNode(); - final saveFocusNode = FocusNode(); - - final result = await showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(isEdit ? t.mpvConfig.editProperty : t.mpvConfig.addProperty), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - controller: keyController, - focusNode: keyFocusNode, - decoration: InputDecoration(labelText: t.mpvConfig.propertyKey, hintText: t.mpvConfig.propertyKeyHint), - autofocus: true, - textInputAction: TextInputAction.next, - onSubmitted: (_) => valueFocusNode.requestFocus(), - ), - const SizedBox(height: 16), - TextField( - controller: valueController, - focusNode: valueFocusNode, - decoration: InputDecoration( - labelText: t.mpvConfig.propertyValue, - hintText: t.mpvConfig.propertyValueHint, - ), - textInputAction: TextInputAction.done, - onSubmitted: (_) => saveFocusNode.requestFocus(), - ), - ], - ), - actions: [ - FocusableButton( - onPressed: () => Navigator.pop(context, false), - child: TextButton(onPressed: () => Navigator.pop(context, false), child: Text(t.common.cancel)), - ), - FocusableButton( - focusNode: saveFocusNode, - onPressed: () { - if (keyController.text.isNotEmpty && valueController.text.isNotEmpty) { - Navigator.pop(context, true); - } - }, - child: TextButton( - onPressed: () { - if (keyController.text.isNotEmpty && valueController.text.isNotEmpty) { - Navigator.pop(context, true); - } - }, - child: Text(t.common.save), - ), - ), - ], - ), - ); - - if (result == true) { - final entry = MpvConfigEntry( - key: keyController.text.trim(), - value: valueController.text.trim(), - isEnabled: existingEntry?.isEnabled ?? true, - ); - - if (isEdit) { - _updateEntry(editIndex, entry); - } else { - _addEntry(entry); - } - } - - keyController.dispose(); - valueController.dispose(); - keyFocusNode.dispose(); - valueFocusNode.dispose(); - saveFocusNode.dispose(); - } - - Future _showConfirmDeleteDialog({required String title, required String content}) { - return showDeleteConfirmation(context, title: title, message: content); - } - - Future _showDeleteEntryDialog(int index) async { - final confirmed = await _showConfirmDeleteDialog( - title: t.mpvConfig.deleteProperty, - content: t.mpvConfig.confirmDeleteProperty, - ); - if (confirmed) { - _deleteEntry(index); - } + Future _saveText() async { + await _settingsService.setMpvConfigText(_textController.text); } Future _showSavePresetDialog() async { - if (_entries.isEmpty) return; + if (_textController.text.trim().isEmpty) return; final nameController = TextEditingController(); final saveFocusNode = FocusNode(); @@ -215,7 +101,7 @@ class _MpvConfigScreenState extends State { saveFocusNode.dispose(); if (result == true) { - await _settingsService.saveMpvPreset(nameController.text.trim(), _entries); + await _settingsService.saveMpvPreset(nameController.text.trim(), _textController.text); if (!mounted) return; setState(() { _presets = _settingsService.getMpvPresets(); @@ -233,7 +119,7 @@ class _MpvConfigScreenState extends State { await _settingsService.loadMpvPreset(preset.name); if (!mounted) return; setState(() { - _entries = _settingsService.getMpvConfigEntries(); + _textController.text = _settingsService.getMpvConfigText(); }); if (mounted) { @@ -242,9 +128,10 @@ class _MpvConfigScreenState extends State { } Future _deletePreset(MpvPreset preset) async { - final confirmed = await _showConfirmDeleteDialog( + final confirmed = await showDeleteConfirmation( + context, title: t.mpvConfig.deletePreset, - content: t.mpvConfig.confirmDeletePreset, + message: t.mpvConfig.confirmDeletePreset, ); if (confirmed) { @@ -271,9 +158,9 @@ class _MpvConfigScreenState extends State { padding: const EdgeInsets.all(16), sliver: SliverList( delegate: SliverChildListDelegate([ - _buildPresetsCard(), + _buildConfigEditor(), const SizedBox(height: 16), - _buildEntriesCard(), + _buildPresetsCard(), const SizedBox(height: 24), ]), ), @@ -282,6 +169,58 @@ class _MpvConfigScreenState extends State { ); } + Widget _buildConfigEditor() { + return Focus( + canRequestFocus: false, + onKeyEvent: (_, event) { + // Back/Escape: move focus to the save preset button instead of exiting. + // Suppress the KeyUp so it doesn't reach handleBackKeyNavigation + // on the new focus chain after focus moves away from the text field. + if (event.logicalKey.isBackKey) { + if (event is KeyDownEvent) { + BackKeyUpSuppressor.suppressBackUntilKeyUp(); + _savePresetFocusNode.requestFocus(); + } + return KeyEventResult.handled; + } + // We must consume Enter to prevent parent handlers from unfocusing, + // but that also blocks Flutter's text editing shortcuts (which are + // higher in the focus tree). So we manually insert newlines here. + if (event.logicalKey == LogicalKeyboardKey.enter || + event.logicalKey == LogicalKeyboardKey.numpadEnter) { + if (event is KeyDownEvent || event is KeyRepeatEvent) { + final sel = _textController.selection; + if (sel.isValid) { + final text = _textController.text; + _textController.value = TextEditingValue( + text: text.replaceRange(sel.start, sel.end, '\n'), + selection: TextSelection.collapsed(offset: sel.start + 1), + ); + _saveText(); + } + } + return KeyEventResult.handled; + } + if (event.logicalKey.isSelectKey) { + return KeyEventResult.handled; + } + return KeyEventResult.ignored; + }, + child: TextField( + controller: _textController, + maxLines: null, + minLines: 12, + decoration: InputDecoration( + hintText: t.mpvConfig.configPlaceholder, + border: const OutlineInputBorder(), + contentPadding: const EdgeInsets.all(12), + ), + style: const TextStyle(fontFamily: 'monospace', fontSize: 13), + onChanged: (_) => _saveText(), + ), + ); + } + Widget _buildPresetsCard() { return Card( child: Column( @@ -295,10 +234,11 @@ class _MpvConfigScreenState extends State { ), ), ListTile( + focusNode: _savePresetFocusNode, leading: const AppIcon(Symbols.save_rounded, fill: 1), title: Text(t.mpvConfig.saveAsPreset), - enabled: _entries.isNotEmpty, - onTap: _entries.isNotEmpty ? _showSavePresetDialog : null, + enabled: _textController.text.trim().isNotEmpty, + onTap: _textController.text.trim().isNotEmpty ? _showSavePresetDialog : null, ), if (_presets.isNotEmpty) ...[ const Divider(), @@ -306,7 +246,6 @@ class _MpvConfigScreenState extends State { (preset) => ListTile( leading: const AppIcon(Symbols.folder_rounded, fill: 1), title: Text(preset.name), - subtitle: Text(t.mpvConfig.entriesCount(count: preset.entries.length)), trailing: PopupMenuButton( onSelected: (value) { if (value == 'load') { @@ -337,71 +276,4 @@ class _MpvConfigScreenState extends State { ), ); } - - Widget _buildEntriesCard() { - return Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: Row( - children: [ - Expanded( - child: Text( - t.mpvConfig.properties, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), - ), - ), - IconButton( - icon: const AppIcon(Symbols.add_rounded, fill: 1), - onPressed: () => _showEntryDialog(), - tooltip: t.mpvConfig.addProperty, - ), - ], - ), - ), - if (_entries.isNotEmpty) ...[ - const Divider(height: 1), - ...List.generate(_entries.length, (index) { - final entry = _entries[index]; - return ListTile( - leading: Switch(value: entry.isEnabled, onChanged: (_) => _toggleEntry(index)), - title: Text( - entry.key, - style: TextStyle(color: entry.isEnabled ? null : Theme.of(context).colorScheme.onSurfaceVariant), - ), - subtitle: Text( - entry.value, - style: TextStyle(color: entry.isEnabled ? null : Theme.of(context).colorScheme.onSurfaceVariant), - ), - trailing: PopupMenuButton( - onSelected: (value) { - if (value == 'edit') { - _showEntryDialog(editIndex: index); - } else if (value == 'delete') { - _showDeleteEntryDialog(index); - } - }, - itemBuilder: (context) => [ - PopupMenuItem(value: 'edit', child: Text(t.mpvConfig.editProperty)), - PopupMenuItem(value: 'delete', child: Text(t.mpvConfig.deleteProperty)), - ], - ), - ); - }), - ] else - Padding( - padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), - child: Text( - t.mpvConfig.noProperties, - style: Theme.of( - context, - ).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ), - ], - ), - ); - } } diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 90981872..5f36b013 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -62,7 +62,8 @@ class SettingsService extends BaseSharedPreferencesService { static const String _keyDownloadOnWifiOnly = 'download_on_wifi_only'; static const String _keyVideoPlayerNavigationEnabled = 'video_player_navigation_enabled'; static const String _keyShowPerformanceOverlay = 'show_performance_overlay'; - static const String _keyMpvConfigEntries = 'mpv_config_entries'; + static const String _keyMpvConfigEntries = 'mpv_config_entries'; // Legacy + static const String _keyMpvConfigText = 'mpv_config_text'; static const String _keyMpvConfigPresets = 'mpv_config_presets'; static const String _keyMaxVolume = 'max_volume'; static const String _keyEnableDiscordRPC = 'enable_discord_rpc'; @@ -923,31 +924,61 @@ class SettingsService extends BaseSharedPreferencesService { return prefs.getBool(_keyDownloadOnWifiOnly) ?? false; } - // MPV Config Entries + // MPV Config (raw text) - /// Get all MPV config entries - List getMpvConfigEntries() { - final jsonString = prefs.getString(_keyMpvConfigEntries); - if (jsonString == null) return []; + /// Get the raw MPV config text. Migrates from legacy JSON entries on first read. + String getMpvConfigText() { + final text = prefs.getString(_keyMpvConfigText); + if (text != null) return text; - try { - final List decoded = json.decode(jsonString); - return decoded.map((e) => MpvConfigEntry.fromJson(e as Map)).toList(); - } catch (e) { - return []; + // Migrate from legacy JSON entries + final legacyJson = prefs.getString(_keyMpvConfigEntries); + if (legacyJson != null) { + try { + final List decoded = json.decode(legacyJson); + final lines = []; + for (final item in decoded) { + if (item is Map) { + final key = item['key'] as String? ?? ''; + final value = item['value'] as String? ?? ''; + final enabled = item['isEnabled'] as bool? ?? true; + if (key.isNotEmpty) { + lines.add(enabled ? '$key=$value' : '#$key=$value'); + } + } + } + final migrated = lines.join('\n'); + prefs.setString(_keyMpvConfigText, migrated); + return migrated; + } catch (_) {} } + + return ''; } - /// Save all MPV config entries - Future setMpvConfigEntries(List entries) async { - final jsonString = json.encode(entries.map((e) => e.toJson()).toList()); - await prefs.setString(_keyMpvConfigEntries, jsonString); + /// Save the raw MPV config text + Future setMpvConfigText(String text) async { + await prefs.setString(_keyMpvConfigText, text); } - /// Get only enabled MPV config entries (for player initialization) + /// Parse raw config text into a Map (skip blanks and # comments) + static Map parseMpvConfigText(String text) { + final result = {}; + for (final line in text.split('\n')) { + final trimmed = line.trim(); + if (trimmed.isEmpty || trimmed.startsWith('#')) continue; + final eqIndex = trimmed.indexOf('='); + if (eqIndex <= 0) continue; + final key = trimmed.substring(0, eqIndex).trim(); + final value = trimmed.substring(eqIndex + 1).trim(); + if (key.isNotEmpty) result[key] = value; + } + return result; + } + + /// Get enabled MPV config entries (for player initialization) Map getEnabledMpvConfigEntries() { - final entries = getMpvConfigEntries(); - return Map.fromEntries(entries.where((e) => e.isEnabled).map((e) => MapEntry(e.key, e.value))); + return parseMpvConfigText(getMpvConfigText()); } // MPV Presets @@ -959,20 +990,36 @@ class SettingsService extends BaseSharedPreferencesService { try { final List decoded = json.decode(jsonString); - return decoded.map((e) => MpvPreset.fromJson(e as Map)).toList(); + return decoded.map((e) { + final map = e as Map; + // Migrate legacy presets with entries list to text + if (map.containsKey('entries') && !map.containsKey('text')) { + final entries = map['entries'] as List; + final lines = []; + for (final item in entries) { + if (item is Map) { + final key = item['key'] as String? ?? ''; + final value = item['value'] as String? ?? ''; + final enabled = item['isEnabled'] as bool? ?? true; + if (key.isNotEmpty) { + lines.add(enabled ? '$key=$value' : '#$key=$value'); + } + } + } + map['text'] = lines.join('\n'); + } + return MpvPreset.fromJson(map); + }).toList(); } catch (e) { return []; } } /// Save a new preset (overwrites existing with same name) - Future saveMpvPreset(String name, List entries) async { + Future saveMpvPreset(String name, String text) async { final presets = getMpvPresets(); - - // Remove existing preset with same name presets.removeWhere((p) => p.name == name); - - presets.add(MpvPreset(name: name, entries: entries, createdAt: DateTime.now())); + presets.add(MpvPreset(name: name, text: text, createdAt: DateTime.now())); final jsonString = json.encode(presets.map((p) => p.toJson()).toList()); await prefs.setString(_keyMpvConfigPresets, jsonString); @@ -987,12 +1034,12 @@ class SettingsService extends BaseSharedPreferencesService { await prefs.setString(_keyMpvConfigPresets, jsonString); } - /// Load a preset (replaces current entries) + /// Load a preset (replaces current config text) Future loadMpvPreset(String name) async { final presets = getMpvPresets(); final preset = presets.firstWhere((p) => p.name == name, orElse: () => throw Exception('Preset not found: $name')); - await setMpvConfigEntries(preset.entries); + await setMpvConfigText(preset.text); } // Discord Rich Presence @@ -1248,6 +1295,7 @@ class SettingsService extends BaseSharedPreferencesService { prefs.remove(_keyVideoPlayerNavigationEnabled), prefs.remove(_keyShowPerformanceOverlay), prefs.remove(_keyMpvConfigEntries), + prefs.remove(_keyMpvConfigText), prefs.remove(_keyMpvConfigPresets), prefs.remove(_keyEnableDiscordRPC), prefs.remove(_keyAutoPip),