コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
            }
        }