feat(download): add automatic lossy conversion

This commit is contained in:
zarzet
2026-08-11 15:19:45 +07:00
parent a59c749089
commit 5237aed25e
30 changed files with 1272 additions and 12 deletions
+54
View File
@@ -2764,6 +2764,60 @@ abstract class AppLocalizations {
/// **'Lossy Format'**
String get downloadLossyFormat;
/// Toggle for automatic post-download audio conversion
///
/// In en, this message translates to:
/// **'Auto-convert after download'**
String get downloadAutoConvert;
/// Explanation of safe automatic post-download conversion
///
/// In en, this message translates to:
/// **'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.'**
String get downloadAutoConvertSubtitle;
/// Automatic conversion output format setting
///
/// In en, this message translates to:
/// **'Output format'**
String get downloadAutoConvertFormat;
/// Automatic conversion format picker explanation
///
/// In en, this message translates to:
/// **'Choose the lossy format used for newly completed downloads.'**
String get downloadAutoConvertFormatSubtitle;
/// Automatic conversion bitrate setting
///
/// In en, this message translates to:
/// **'Output quality'**
String get downloadAutoConvertBitrate;
/// Automatic conversion bitrate picker explanation
///
/// In en, this message translates to:
/// **'Higher bitrates preserve more detail but create larger files.'**
String get downloadAutoConvertBitrateSubtitle;
/// MP3 automatic conversion option description
///
/// In en, this message translates to:
/// **'Best compatibility across players and devices'**
String get downloadAutoConvertMp3Subtitle;
/// M4A AAC automatic conversion option description
///
/// In en, this message translates to:
/// **'Efficient AAC audio in an M4A container'**
String get downloadAutoConvertM4aSubtitle;
/// Opus automatic conversion option description
///
/// In en, this message translates to:
/// **'Best efficiency for modern players'**
String get downloadAutoConvertOpusSubtitle;
/// Title of the lossy format picker bottom sheet
///
/// In en, this message translates to:
+33
View File
@@ -1515,6 +1515,39 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get downloadLossyFormat => 'Verlustbehaftetes Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Verlustbehaftetes 320kbps-Format';
+33
View File
@@ -1494,6 +1494,39 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get downloadLossyFormat => 'Lossy Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Lossy 320kbps Format';
+33
View File
@@ -1494,6 +1494,39 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get downloadLossyFormat => 'Lossy Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Lossy 320kbps Format';
+33
View File
@@ -1533,6 +1533,39 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get downloadLossyFormat => 'Format avec perte';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Format avec perte à 320 kbps';
+33
View File
@@ -1501,6 +1501,39 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get downloadLossyFormat => 'Format Lossy';
@override
String get downloadAutoConvert => 'Konversi otomatis setelah unduh';
@override
String get downloadAutoConvertSubtitle =>
'Ubah unduhan yang selesai ke format lossy yang lebih kecil. File asli hanya diganti setelah konversi berhasil.';
@override
String get downloadAutoConvertFormat => 'Format keluaran';
@override
String get downloadAutoConvertFormatSubtitle =>
'Pilih format lossy untuk unduhan yang baru selesai.';
@override
String get downloadAutoConvertBitrate => 'Kualitas keluaran';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Bitrate lebih tinggi menjaga lebih banyak detail, tetapi ukuran file juga lebih besar.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Kompatibilitas terbaik di berbagai pemutar dan perangkat';
@override
String get downloadAutoConvertM4aSubtitle =>
'Audio AAC yang efisien dalam container M4A';
@override
String get downloadAutoConvertOpusSubtitle =>
'Efisiensi terbaik untuk pemutar modern';
@override
String get downloadLossy320Format => 'Format Lossy 320kbps';
+33
View File
@@ -1485,6 +1485,39 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get downloadLossyFormat => 'Lossy Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Lossy 320kbps Format';
+33
View File
@@ -1464,6 +1464,39 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get downloadLossyFormat => '손실 압축 형식';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => '손실 압축 320kbps 형식';
+33
View File
@@ -1494,6 +1494,39 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get downloadLossyFormat => 'Lossy Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Lossy 320kbps Format';
+33
View File
@@ -1505,6 +1505,39 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get downloadLossyFormat => 'Формат с потерями';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Формат с потерями 320 кбит/с';
+33
View File
@@ -1507,6 +1507,39 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get downloadLossyFormat => 'Kayıplı Format';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Kayıplı 320kbps Formatı';
+33
View File
@@ -1513,6 +1513,39 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get downloadLossyFormat => 'Формат із втратами';
@override
String get downloadAutoConvert => 'Auto-convert after download';
@override
String get downloadAutoConvertSubtitle =>
'Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.';
@override
String get downloadAutoConvertFormat => 'Output format';
@override
String get downloadAutoConvertFormatSubtitle =>
'Choose the lossy format used for newly completed downloads.';
@override
String get downloadAutoConvertBitrate => 'Output quality';
@override
String get downloadAutoConvertBitrateSubtitle =>
'Higher bitrates preserve more detail but create larger files.';
@override
String get downloadAutoConvertMp3Subtitle =>
'Best compatibility across players and devices';
@override
String get downloadAutoConvertM4aSubtitle =>
'Efficient AAC audio in an M4A container';
@override
String get downloadAutoConvertOpusSubtitle =>
'Best efficiency for modern players';
@override
String get downloadLossy320Format => 'Формат із втратами 320 кбіт/с';
+36
View File
@@ -1991,6 +1991,42 @@
"@downloadLossyFormat": {
"description": "Setting title to pick output format for lossy downloads"
},
"downloadAutoConvert": "Auto-convert after download",
"@downloadAutoConvert": {
"description": "Toggle for automatic post-download audio conversion"
},
"downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.",
"@downloadAutoConvertSubtitle": {
"description": "Explanation of safe automatic post-download conversion"
},
"downloadAutoConvertFormat": "Output format",
"@downloadAutoConvertFormat": {
"description": "Automatic conversion output format setting"
},
"downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.",
"@downloadAutoConvertFormatSubtitle": {
"description": "Automatic conversion format picker explanation"
},
"downloadAutoConvertBitrate": "Output quality",
"@downloadAutoConvertBitrate": {
"description": "Automatic conversion bitrate setting"
},
"downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.",
"@downloadAutoConvertBitrateSubtitle": {
"description": "Automatic conversion bitrate picker explanation"
},
"downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices",
"@downloadAutoConvertMp3Subtitle": {
"description": "MP3 automatic conversion option description"
},
"downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container",
"@downloadAutoConvertM4aSubtitle": {
"description": "M4A AAC automatic conversion option description"
},
"downloadAutoConvertOpusSubtitle": "Best efficiency for modern players",
"@downloadAutoConvertOpusSubtitle": {
"description": "Opus automatic conversion option description"
},
"downloadLossy320Format": "Lossy 320kbps Format",
"@downloadLossy320Format": {
"description": "Title of the lossy format picker bottom sheet"
+36
View File
@@ -4253,6 +4253,42 @@
"@downloadLossyFormat": {
"description": "Setting title to pick output format for lossy downloads"
},
"downloadAutoConvert": "Konversi otomatis setelah unduh",
"@downloadAutoConvert": {
"description": "Toggle for automatic post-download audio conversion"
},
"downloadAutoConvertSubtitle": "Ubah unduhan yang selesai ke format lossy yang lebih kecil. File asli hanya diganti setelah konversi berhasil.",
"@downloadAutoConvertSubtitle": {
"description": "Explanation of safe automatic post-download conversion"
},
"downloadAutoConvertFormat": "Format keluaran",
"@downloadAutoConvertFormat": {
"description": "Automatic conversion output format setting"
},
"downloadAutoConvertFormatSubtitle": "Pilih format lossy untuk unduhan yang baru selesai.",
"@downloadAutoConvertFormatSubtitle": {
"description": "Automatic conversion format picker explanation"
},
"downloadAutoConvertBitrate": "Kualitas keluaran",
"@downloadAutoConvertBitrate": {
"description": "Automatic conversion bitrate setting"
},
"downloadAutoConvertBitrateSubtitle": "Bitrate lebih tinggi menjaga lebih banyak detail, tetapi ukuran file juga lebih besar.",
"@downloadAutoConvertBitrateSubtitle": {
"description": "Automatic conversion bitrate picker explanation"
},
"downloadAutoConvertMp3Subtitle": "Kompatibilitas terbaik di berbagai pemutar dan perangkat",
"@downloadAutoConvertMp3Subtitle": {
"description": "MP3 automatic conversion option description"
},
"downloadAutoConvertM4aSubtitle": "Audio AAC yang efisien dalam container M4A",
"@downloadAutoConvertM4aSubtitle": {
"description": "M4A AAC automatic conversion option description"
},
"downloadAutoConvertOpusSubtitle": "Efisiensi terbaik untuk pemutar modern",
"@downloadAutoConvertOpusSubtitle": {
"description": "Opus automatic conversion option description"
},
"snackbarAlreadyInLibrary": "\"{trackName}\" sudah ada di perpustakaan Anda",
"@snackbarAlreadyInLibrary": {
"description": "Snackbar - track already exists in local library",