using Google.Apis.Services; using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.Threading.Tasks; using YouTube.Models; using YoutubeExplode; using YoutubeExplode.Videos.ClosedCaptions; using YoutubeExplode.Videos.Streams; namespace YouTube.Resources { public class VideoPlaybackResource { IClientService ClientService { get; } public VideoPlaybackResource(IClientService clientService) => ClientService = clientService; public ListRequest List(string videoId) => new ListRequest(ClientService, videoId); public class ListRequest { IClientService Service { get; } public string Id { get; set; } public async Task ExecuteAsync() { VideoPlayback item = new VideoPlayback(); YoutubeClient client = new YoutubeClient(Service.HttpClient); item.Id = Id; item.PlaybackUrls.ValidUntil = DateTime.Now + TimeSpan.FromHours(1); item.PlaybackUrls.LiveStreamUrl = await client.Videos.Streams.GetHttpLiveStreamUrlAsync(Id); if (!string.IsNullOrWhiteSpace(item.PlaybackUrls.LiveStreamUrl)) return item; item.PlaybackUrls.VideoFilesManifest = await client.Videos.Streams.GetManifestAsync(Id); ClosedCaptionManifest ccSet = await client.Videos.ClosedCaptions.GetManifestAsync(Id); List captions = new List(); foreach (ClosedCaptionTrackInfo i in ccSet.Tracks) captions.Add(new ClosedCaptionInfo { AutoGenerated = i.IsAutoGenerated, Url = i.Url, Language = new CultureInfo(i.Language.Code), TrackInfo = i }); item.ClosedCaptions = captions.AsReadOnly(); return item; } public VideoPlayback Execute() { Task task = ExecuteAsync(); task.Wait(); return task.Result; } public ListRequest(IClientService service, string id) { Id = id; Service = service; } } } }