private static byte[] DownloadAudio(IEnumerable<VideoInfo> videoInfos) { /* * We want the first extractable video with the highest audio quality. */ VideoInfo video = videoInfos .Where(info => info.CanExtractAudio) .OrderByDescending(info => info.AudioBitrate) .First(); /* * If the video has a decrypted signature, decipher it */ if (video.RequiresDecryption) { DownloadUrlResolver.DecryptDownloadUrl(video); } /* * Create the audio downloader. * The first argument is the video where the audio should be extracted from. * The second argument is the path to save the audio file. */ var audioDownloader = new AudioDownloader(video, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), RemoveIllegalPathCharacters(video.Title) + video.AudioExtension)); // Register the progress events. We treat the download progress as 85% of the progress // and the extraction progress only as 15% of the progress, because the download will // take much longer than the audio extraction. audioDownloader.DownloadProgressChanged += (sender, args) => Console.WriteLine(args.ProgressPercentage * 0.85); audioDownloader.AudioExtractionProgressChanged += (sender, args) => Console.WriteLine(85 + args.ProgressPercentage * 0.15); /* * Execute the audio downloader. * For GUI applications note, that this method runs synchronously. */ var result = audioDownloader.GetMusicStream(); return result; //audioDownloader.Execute(); //return null; }