private Task <GrabResult> GrabAsync(Uri uri, PlaylistDocument doc, CancellationToken cancellationToken, GrabOptions options) { // get resources IList <IGrabbed> grabs; if (doc.Streams.Count > 0) { grabs = GrabStreams(uri, doc); } else if (doc.Segments.Count > 0) { grabs = GrabSegments(uri, doc); } else { grabs = null; } // make result var result = new GrabResult(uri, grabs); if (options.Flags.HasFlag(GrabOptionFlag.Decrypt) && doc.Key != null) { UpdateDecryptionMethod(result, doc.Key); } return(Task.FromResult(result)); }
private IList <IGrabbed> GrabStreams(Uri originalUri, PlaylistDocument doc) { var list = new List <GrabbedStreamMetadata>(); foreach (var stream in doc.Streams) { var uri = new Uri(originalUri, stream.Uri); var g = new GrabbedStreamMetadata(originalUri, uri, stream.Name, stream.Resolution, stream.Bandwidth, PlaylistFormat, OutputFormat, new ResolvableStream(uri, stream)); list.Add(g); } return(list.OrderByDescending(s => s.Resolution.Height).ToList <IGrabbed>()); }
private IList <IGrabbed> GrabSegments(Uri originalUri, PlaylistDocument doc) { var list = new List <IGrabbed>(); var segments = new List <MediaSegment>(); var totalDuration = TimeSpan.Zero; foreach (var segment in doc.Segments) { totalDuration += segment.Duration; var uri = new Uri(originalUri, segment.Uri); segments.Add(new MediaSegment(segment.Title, uri, segment.Duration)); } var g = new GrabbedStream(originalUri, originalUri, totalDuration, segments); list.Add(new GrabbedStreamMetadata(originalUri, originalUri, "Media", null, 0, PlaylistFormat, OutputFormat, new ResolvableStream(g))); return(list); }
public override async Task <GrabResult> GrabAsync(Uri uri, CancellationToken cancellationToken, GrabOptions options) { using var client = HttpHelper.GetClient(uri); using var response = await client.GetAsync(uri, cancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); using var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); var doc = new PlaylistDocument(); try { await doc.LoadAsync(responseStream).ConfigureAwait(false); } catch (PlaylistDocumentLoadException loadException) { throw new GrabException("Failed to load the M3U8 playlist.", loadException); } return(await GrabAsync(uri, doc, cancellationToken, options).ConfigureAwait(false)); }