using DotNetTools.SharpGrabber; using DotNetTools.SharpGrabber.Grabbed; using System; using System.IO; using System.Net.Http; using System.Threading.Tasks; namespace WebAPI.Logics { public class VideoDownloadLogic { public async void Download(string youtubeUrl, string filePath) { var grabber = GrabberBuilder.New() .UseDefaultServices() .AddYouTube() .Build(); var result = await grabber.GrabAsync(new Uri(youtubeUrl)); var info = result.Resource(); Console.WriteLine("Time Length: {0}", info.Length); var videos = result.Resources(); foreach (var video in videos) { if ("mp4" == video.Format.Extension) { if (video.Resolution == "1080p") { await DownloadMedia(video, result, $"{filePath}/{video.Title}.mp4"); break; } } } } public async void DownloadWorship(string youtubeUrl) { await Task.Run(() => { Download(youtubeUrl, ServerUtils.MapPath("WorshipVideos"));//ServerUtils.MapPath("Church/Test.mp4") }); } private static async Task DownloadMedia(GrabbedMedia media, IGrabResult grabResult, string path) { HttpClient Client = new HttpClient(); Client.Timeout = TimeSpan.FromMinutes(30); Console.WriteLine("Downloading {0}...", media.Title ?? media.FormatTitle ?? media.Resolution); using var response = await Client.GetAsync(media.ResourceUri); response.EnsureSuccessStatusCode(); using var downloadStream = await response.Content.ReadAsStreamAsync(); using var resourceStream = await grabResult.WrapStreamAsync(downloadStream); using var fileStream = new FileStream(path, FileMode.Create); await resourceStream.CopyToAsync(fileStream); return path; } } }