feat: add preserveNativeOutputExtensions capability for extensions

This commit is contained in:
zarzet
2026-04-14 17:58:41 +07:00
parent 27c0880e87
commit 62519d2d1c
2 changed files with 32 additions and 1 deletions
+18 -1
View File
@@ -2369,6 +2369,21 @@ class DownloadQueueNotifier extends Notifier<DownloadQueueState> {
return null;
}
bool _extensionPreservesNativeOutputExt(String service, String ext) {
final normalizedService = service.trim().toLowerCase();
final normalizedExt = ext.trim().toLowerCase();
if (normalizedService.isEmpty || normalizedExt.isEmpty) return false;
final extensionState = ref.read(extensionProvider);
return extensionState.extensions.any(
(ext) =>
ext.enabled &&
ext.hasDownloadProvider &&
ext.id.toLowerCase() == normalizedService &&
ext.preservedNativeOutputExtensions.contains(normalizedExt),
);
}
String _determineOutputExt(String quality, String service) {
final extensionPreferred = _extensionPreferredOutputExt(service);
if (extensionPreferred != null) {
@@ -4874,7 +4889,9 @@ class DownloadQueueNotifier extends Notifier<DownloadQueueState> {
((result['service'] as String?)?.toLowerCase()) ??
item.service.toLowerCase();
final preferredOutputExt = _extensionPreferredOutputExt(actualService);
final shouldPreserveNativeM4a = preferredOutputExt == '.m4a';
final shouldPreserveNativeM4a =
preferredOutputExt == '.m4a' ||
_extensionPreservesNativeOutputExt(actualService, '.m4a');
final decryptionDescriptor =
DownloadDecryptionDescriptor.fromDownloadResult(result);
trackToDownload = _buildTrackForMetadataEmbedding(
+14
View File
@@ -179,6 +179,20 @@ class Extension {
final trimmed = value.trim();
return trimmed.isEmpty ? null : trimmed;
}
List<String> get preservedNativeOutputExtensions {
final value = capabilities['preserveNativeOutputExtensions'];
if (value is! List) return const [];
final normalized = <String>[];
for (final item in value) {
if (item is! String) continue;
final trimmed = item.trim().toLowerCase();
if (trimmed.isEmpty) continue;
normalized.add(trimmed.startsWith('.') ? trimmed : '.$trimmed');
}
return normalized;
}
}
class SearchFilter {