feat: expose audio codec in download result and skip lossy-to-lossless conversion

Go backend:
- Add AudioCodec field to DownloadResult and DownloadResponse
- Extension download results can now include audio_codec/audioCodec
- ffmpegGetInfo and probeAudioQuality now return codec field
- Add trackItemBytes option to file.download() for custom progress handling

Flutter:
- Check audio_codec before container conversion
- Skip FLAC conversion if source codec is lossy (AAC, MP3, Opus, etc.)
- Prevents fake upscale from lossy to lossless containers
This commit is contained in:
zarzet
2026-05-15 04:37:25 +07:00
parent 8b7cecc1c5
commit fb4cd75cb2
6 changed files with 45 additions and 6 deletions
+17 -1
View File
@@ -6246,6 +6246,16 @@ class DownloadQueueNotifier extends Notifier<DownloadQueueState> {
if (context.quality == 'HIGH' || context.outputExt != '.flac') {
return filePath;
}
final resultAudioFormat = _normalizeAudioFormatValue(
result['audio_codec']?.toString() ??
result['actual_audio_codec']?.toString(),
);
if (_isLossyAudioFormat(resultAudioFormat)) {
_log.d(
'Native-worker output is $resultAudioFormat; preserving native container.',
);
return filePath;
}
final requiresContainerConversion =
result['requires_container_conversion'] == true ||
result['requiresContainerConversion'] == true;
@@ -7411,10 +7421,16 @@ class DownloadQueueNotifier extends Notifier<DownloadQueueState> {
result,
filePath: filePath,
);
final resultAudioFormat = _normalizeAudioFormatValue(
result['audio_codec']?.toString() ??
result['actual_audio_codec']?.toString(),
);
final resultIsLossyAudio = _isLossyAudioFormat(resultAudioFormat);
final requiresContainerConversion =
result['requires_container_conversion'] == true ||
result['requiresContainerConversion'] == true ||
_shouldRequestContainerConversion(actualService, safOutputExt);
(!resultIsLossyAudio &&
_shouldRequestContainerConversion(actualService, safOutputExt));
final preferredOutputExt = _extensionPreferredOutputExt(actualService);
final shouldPreserveNativeM4a =
!requiresContainerConversion &&