diff --git a/lib/youtube/class/youtube_item_download_config.dart b/lib/youtube/class/youtube_item_download_config.dart index 699c85d0..b1e313de 100644 --- a/lib/youtube/class/youtube_item_download_config.dart +++ b/lib/youtube/class/youtube_item_download_config.dart @@ -10,6 +10,8 @@ class YoutubeItemDownloadConfig { AudioStream? audioStream; final String? prefferedVideoQualityID; final String? prefferedAudioQualityID; + final bool? fetchMissingAudio; + final bool? fetchMissingVideo; YoutubeItemDownloadConfig({ required this.id, @@ -20,6 +22,8 @@ class YoutubeItemDownloadConfig { required this.audioStream, required this.prefferedVideoQualityID, required this.prefferedAudioQualityID, + required this.fetchMissingAudio, + required this.fetchMissingVideo, }); factory YoutubeItemDownloadConfig.fromJson(Map map) { @@ -40,6 +44,8 @@ class YoutubeItemDownloadConfig { audioStream: auds, prefferedVideoQualityID: map['prefferedVideoQualityID'], prefferedAudioQualityID: map['prefferedAudioQualityID'], + fetchMissingAudio: map['fetchMissingAudio'], + fetchMissingVideo: map['fetchMissingVideo'], ); } @@ -53,6 +59,8 @@ class YoutubeItemDownloadConfig { 'audioStream': audioStream?.toMap(), 'prefferedVideoQualityID': prefferedVideoQualityID, 'prefferedAudioQualityID': prefferedAudioQualityID, + 'fetchMissingAudio': fetchMissingAudio, + 'fetchMissingVideo': fetchMissingVideo, }; } diff --git a/lib/youtube/controller/youtube_controller.dart b/lib/youtube/controller/youtube_controller.dart index cd8a7f8e..eed8d8e4 100644 --- a/lib/youtube/controller/youtube_controller.dart +++ b/lib/youtube/controller/youtube_controller.dart @@ -30,7 +30,6 @@ class YoutubeController { static final YoutubeController _instance = YoutubeController._internal(); YoutubeController._internal(); - /// {id: {}} final downloadsVideoProgressMap = >{}.obs; @@ -540,22 +539,26 @@ class YoutubeController { final streams = await completer.future; // -- video - final videos = streams.videoStreams; - if (config.prefferedVideoQualityID != null) { - config.videoStream = videos.firstWhereEff((e) => e.itag.toString() == config.prefferedVideoQualityID); - } - if (config.videoStream == null || config.videoStream?.buildUrl()?.isNotEmpty != true) { - final webm = config.filename.endsWith('.webm') || config.filename.endsWith('.WEBM'); - config.videoStream = getPreferredStreamQuality(videos, qualities: preferredQualities, preferIncludeWebm: webm); + if (config.fetchMissingVideo == true) { + final videos = streams.videoStreams; + if (config.prefferedVideoQualityID != null) { + config.videoStream = videos.firstWhereEff((e) => e.itag.toString() == config.prefferedVideoQualityID); + } + if (config.videoStream == null || config.videoStream?.buildUrl()?.isNotEmpty != true) { + final webm = config.filename.endsWith('.webm') || config.filename.endsWith('.WEBM'); + config.videoStream = getPreferredStreamQuality(videos, qualities: preferredQualities, preferIncludeWebm: webm); + } } - // -- audio - final audios = streams.audioStreams; - if (config.prefferedAudioQualityID != null) { - config.audioStream = audios.firstWhereEff((e) => e.itag.toString() == config.prefferedAudioQualityID); - } - if (config.audioStream == null || config.audioStream?.buildUrl()?.isNotEmpty != true) { - config.audioStream = audios.firstNonWebm() ?? audios.firstOrNull; + if (config.fetchMissingAudio == true) { + // -- audio + final audios = streams.audioStreams; + if (config.prefferedAudioQualityID != null) { + config.audioStream = audios.firstWhereEff((e) => e.itag.toString() == config.prefferedAudioQualityID); + } + if (config.audioStream == null || config.audioStream?.buildUrl()?.isNotEmpty != true) { + config.audioStream = audios.firstNonWebm() ?? audios.firstOrNull; + } } // -- meta info diff --git a/lib/youtube/functions/download_sheet.dart b/lib/youtube/functions/download_sheet.dart index 91346780..5a2a7439 100644 --- a/lib/youtube/functions/download_sheet.dart +++ b/lib/youtube/functions/download_sheet.dart @@ -651,6 +651,8 @@ Future showDownloadVideoBottomSheet({ audioStream: selectedAudioOnlyStream.value, prefferedVideoQualityID: selectedVideoOnlyStream.value?.itag.toString(), prefferedAudioQualityID: selectedAudioOnlyStream.value?.itag.toString(), + fetchMissingAudio: false, + fetchMissingVideo: false, ); if (onConfirmButtonTap != null) { final accept = onConfirmButtonTap(groupName, itemConfig); diff --git a/lib/youtube/pages/yt_playlist_download_subpage.dart b/lib/youtube/pages/yt_playlist_download_subpage.dart index a3faee21..012b8d62 100644 --- a/lib/youtube/pages/yt_playlist_download_subpage.dart +++ b/lib/youtube/pages/yt_playlist_download_subpage.dart @@ -101,6 +101,8 @@ class _YTPlaylistDownloadPageState extends State { audioStream: null, prefferedVideoQualityID: null, prefferedAudioQualityID: null, + fetchMissingAudio: true, + fetchMissingVideo: !downloadAudioOnly.value, ); } diff --git a/pubspec.yaml b/pubspec.yaml index a0e7ec55..a5af7752 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: namida description: A Beautiful and Feature-rich Music Player, With YouTube & Video Support Built in Flutter publish_to: "none" -version: 3.0.7-beta+240708228 +version: 3.0.8-beta+240708232 environment: sdk: ">=3.4.0 <4.0.0"