async Task ProcessYouTubeUrlAsync() { VideoMetaData = null; AudioOnlyStreamInfos = Array.Empty <AudioOnlyStreamInfo>(); CheckedAudioOnlyStreamInfoHashCode = NoSelection; ProcessYouTubeUrlButtonEnabled = false; DownloadButtonEnabled = false; Progress = 0; OpusAudioStreamPresent = false; ExtractOpus = false; try { var taskVideoMetaData = YouTubeDownloadApi.GetVideoMetaDataAsync(YouTubeUrl); var taskAudioOnlyStreamInfos = YouTubeDownloadApi.GetAudioOnlyStreamsAsync(YouTubeUrl); await Task.WhenAll(taskVideoMetaData, taskAudioOnlyStreamInfos); VideoMetaData = await taskVideoMetaData; AudioOnlyStreamInfos = await taskAudioOnlyStreamInfos; var highest = AudioOnlyStreamInfos.TryGetWithHighestBitrate(); CheckedAudioOnlyStreamInfoHashCode = highest?.GetHashCode() ?? NoSelection; OpusAudioStreamPresent = AudioOnlyStreamInfos.Any(a => a.IsOpus()); ExtractOpus = OpusAudioStreamPresent; } finally { DownloadButtonEnabled = true; ProcessYouTubeUrlButtonEnabled = true; } }
async Task DownloadFileAsync() { if (CheckedAudioOnlyStreamInfoHashCode == NoSelection) { return; } Progress = 0; DownloadButtonEnabled = false; try { var streamInfo = AudioOnlyStreamInfos.Single(x => x.GetHashCode() == CheckedAudioOnlyStreamInfoHashCode); var x = new Stopwatch(); x.Reset(); x.Start(); // bool oggOpusIsExtractedByServer = false; Stream stream; if (streamInfo.IsOpus() && ExtractOpus) { stream = await YouTubeDownloadApi.GetOggOpusAudioStreamAsync(streamInfo); // oggOpusIsExtractedByServer = true; x.Stop(); Console.WriteLine("GetOggOpusAudioStreamAsync = " + x.Elapsed); } else { stream = await YouTubeDownloadApi.GetAudioStreamAsync(streamInfo); x.Stop(); Console.WriteLine("GetAudioStreamAsync = " + x.Elapsed); } var filename = GetFileNameWithExtension(streamInfo); x.Reset(); x.Start(); using var memoryStream = new MemoryStream(); long lastValue = 0; await stream.CopyToAsync(memoryStream, async (e) => { Progress = 100 * e.TotalBytesRead / e.SourceLength; if (Progress != lastValue) { lastValue = Progress; StateHasChanged(); await Task.Delay(5); // give the UI some time to catch up } }); x.Stop(); Console.WriteLine("CopyToAsync = " + x.Elapsed); //byte[] array; //if (OpusAudioStreamPresent && ExtractOpus && !oggOpusIsExtractedByServer) //{ // using var opusStream = new MemoryStream(); // x.Start(); // memoryStream.Position = 0; // MatroskaDemuxer.ExtractOggOpusAudio(memoryStream, opusStream); // Console.WriteLine("ExtractOggOpusAudio and ToArray = " + x.Elapsed); // array = opusStream.ToArray(); // x.Stop(); //} //else //{ // x.Start(); // array = memoryStream.ToArray(); // x.Stop(); // Console.WriteLine("ToArray = " + x.Elapsed); //} x.Reset(); x.Start(); byte[] array = memoryStream.ToArray(); x.Stop(); Console.WriteLine("ToArray = " + x.Elapsed); x.Reset(); x.Start(); await BlazorDownloadFileService.DownloadFileAsync(filename, array); x.Stop(); Console.WriteLine("Download = " + x.Elapsed); } finally { DownloadButtonEnabled = true; } }