From 62519d2d1cffd79aef8ad8d02aa34e2d648224b1 Mon Sep 17 00:00:00 2001 From: zarzet Date: Tue, 14 Apr 2026 17:58:41 +0700 Subject: [PATCH] feat: add preserveNativeOutputExtensions capability for extensions --- lib/providers/download_queue_provider.dart | 19 ++++++++++++++++++- lib/providers/extension_provider.dart | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/providers/download_queue_provider.dart b/lib/providers/download_queue_provider.dart index 275fefa..336642e 100644 --- a/lib/providers/download_queue_provider.dart +++ b/lib/providers/download_queue_provider.dart @@ -2369,6 +2369,21 @@ class DownloadQueueNotifier extends Notifier { 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 { ((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( diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index 93a662b..a969d78 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -179,6 +179,20 @@ class Extension { final trimmed = value.trim(); return trimmed.isEmpty ? null : trimmed; } + + List get preservedNativeOutputExtensions { + final value = capabilities['preserveNativeOutputExtensions']; + if (value is! List) return const []; + + final normalized = []; + 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 {