Church.Net.API/Church.Net.WebAPI/Logics/VideoDownloadLogic.cs
2024-05-02 15:24:13 -07:00

63 lines
2.1 KiB
C#

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<GrabbedInfo>();
Console.WriteLine("Time Length: {0}", info.Length);
var videos = result.Resources<GrabbedMedia>();
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<string> 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;
}
}
}