private async Task StartDownloadAsync(DownloadItem downloadInfo) {
downloadInfo.Status = DownloadStatus.Initializing;
// Query the download URL for the right file.
var VTask = GetDownloadUrlsAsync(downloadInfo.Request.DownloadUrl);
var VideoList = await VTask.ConfigureAwait(false);
if (VideoList == null) {
downloadInfo.Status = DownloadStatus.Failed;
RaiseCallback(downloadInfo);
return;
}
if (!downloadInfo.UpgradeAudio || downloadInfo.Request.FileName == null || !File.Exists(Settings.NaturalGroundingFolder + downloadInfo.Request.FileName)) {
downloadInfo.UpgradeAudio = false;
// Get the highest resolution format.
BestFormatInfo BestFile = SelectBestFormat(VideoList);
if (BestFile.BestVideo.AdaptiveType == AdaptiveType.None) {
// Download single file.
downloadInfo.Files.Add(new DownloadItem.FileProgress() {
Source = BestFile.BestVideo,
Destination = downloadInfo.Destination + BestFile.BestVideo.VideoExtension
});
} else {
// Download audio and video separately.
downloadInfo.Files.Add(new DownloadItem.FileProgress() {
Source = BestFile.BestVideo,
Destination = downloadInfo.Destination + GetCodecExtension(BestFile.BestVideo.VideoType)
});
if (BestFile.BestAudio != null) {
downloadInfo.Files.Add(new DownloadItem.FileProgress() {
Source = BestFile.BestAudio,
Destination = downloadInfo.Destination + GetAudioExtension(BestFile.BestAudio.AudioType)
});
}
}
} else if (File.Exists(Settings.NaturalGroundingFolder + downloadInfo.Request.FileName)) {
// Keep local video and upgrade audio.
VideoInfo AudioFile = SelectBestAudio(from v in VideoList
where (v.CanExtractAudio || v.AdaptiveType == AdaptiveType.Audio)
orderby v.AudioBitrate descending
select v);
downloadInfo.Files.Add(new DownloadItem.FileProgress() {
Source = AudioFile,
Destination = downloadInfo.Destination + GetAudioExtension(AudioFile.AudioType)
});
}
await DownloadFilesAsync(downloadInfo, downloadInfo.Callback).ConfigureAwait(false);
}