feat: replace mpv config UI with raw text editor

This commit is contained in:
edde746
2026-03-02 23:06:05 +01:00
parent b5904bc477
commit a00e2b78d6
22 changed files with 289 additions and 682 deletions
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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": "확인"
+4 -14
View File
@@ -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"
+2 -2
View File
@@ -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
+10 -30
View File
@@ -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',
+14 -54
View File
@@ -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',
+10 -30
View File
@@ -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',
+10 -30
View File
@@ -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',
+10 -30
View File
@@ -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',
+10 -30
View File
@@ -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' => '심야',
+10 -30
View File
@@ -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',
+10 -30
View File
@@ -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',
+10 -30
View File
@@ -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' => '凌晨',
+4 -14
View File
@@ -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"
+4 -14
View File
@@ -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": "确认操作"
+4 -27
View File
@@ -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<String, dynamic> json) {
return MpvConfigEntry(
key: json['key'] as String,
value: json['value'] as String,
isEnabled: json['isEnabled'] as bool? ?? true,
);
}
Map<String, dynamic> 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<MpvConfigEntry> 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<String, dynamic> json) {
return MpvPreset(
name: json['name'] as String,
entries: (json['entries'] as List).map((e) => MpvConfigEntry.fromJson(e as Map<String, dynamic>)).toList(),
text: json['text'] as String,
createdAt: DateTime.parse(json['createdAt'] as String),
);
}
Map<String, dynamic> toJson() => {
'name': name,
'entries': entries.map((e) => e.toJson()).toList(),
'text': text,
'createdAt': createdAt.toIso8601String(),
};
}
+79 -207
View File
@@ -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<MpvConfigScreen> {
late SettingsService _settingsService;
bool _isLoading = true;
List<MpvConfigEntry> _entries = [];
late TextEditingController _textController;
final _savePresetFocusNode = FocusNode();
List<MpvPreset> _presets = [];
@override
void initState() {
super.initState();
_textController = TextEditingController();
_loadSettings();
}
@override
void dispose() {
_textController.dispose();
_savePresetFocusNode.dispose();
super.dispose();
}
Future<void> _loadSettings() async {
_settingsService = await SettingsService.getInstance();
if (!mounted) return;
setState(() {
_entries = _settingsService.getMpvConfigEntries();
_textController.text = _settingsService.getMpvConfigText();
_presets = _settingsService.getMpvPresets();
_isLoading = false;
});
}
Future<void> _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<void> _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<bool>(
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<bool> _showConfirmDeleteDialog({required String title, required String content}) {
return showDeleteConfirmation(context, title: title, message: content);
}
Future<void> _showDeleteEntryDialog(int index) async {
final confirmed = await _showConfirmDeleteDialog(
title: t.mpvConfig.deleteProperty,
content: t.mpvConfig.confirmDeleteProperty,
);
if (confirmed) {
_deleteEntry(index);
}
Future<void> _saveText() async {
await _settingsService.setMpvConfigText(_textController.text);
}
Future<void> _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<MpvConfigScreen> {
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<MpvConfigScreen> {
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<MpvConfigScreen> {
}
Future<void> _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<MpvConfigScreen> {
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<MpvConfigScreen> {
);
}
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<MpvConfigScreen> {
),
),
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<MpvConfigScreen> {
(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<String>(
onSelected: (value) {
if (value == 'load') {
@@ -337,71 +276,4 @@ class _MpvConfigScreenState extends State<MpvConfigScreen> {
),
);
}
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<String>(
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),
),
),
],
),
);
}
}
+74 -26
View File
@@ -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<MpvConfigEntry> 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<dynamic> decoded = json.decode(jsonString);
return decoded.map((e) => MpvConfigEntry.fromJson(e as Map<String, dynamic>)).toList();
} catch (e) {
return [];
// Migrate from legacy JSON entries
final legacyJson = prefs.getString(_keyMpvConfigEntries);
if (legacyJson != null) {
try {
final List<dynamic> decoded = json.decode(legacyJson);
final lines = <String>[];
for (final item in decoded) {
if (item is Map<String, dynamic>) {
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<void> setMpvConfigEntries(List<MpvConfigEntry> entries) async {
final jsonString = json.encode(entries.map((e) => e.toJson()).toList());
await prefs.setString(_keyMpvConfigEntries, jsonString);
/// Save the raw MPV config text
Future<void> 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<String, String> (skip blanks and # comments)
static Map<String, String> parseMpvConfigText(String text) {
final result = <String, String>{};
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<String, String> 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<dynamic> decoded = json.decode(jsonString);
return decoded.map((e) => MpvPreset.fromJson(e as Map<String, dynamic>)).toList();
return decoded.map((e) {
final map = e as Map<String, dynamic>;
// Migrate legacy presets with entries list to text
if (map.containsKey('entries') && !map.containsKey('text')) {
final entries = map['entries'] as List;
final lines = <String>[];
for (final item in entries) {
if (item is Map<String, dynamic>) {
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<void> saveMpvPreset(String name, List<MpvConfigEntry> entries) async {
Future<void> 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<void> 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),