Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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>());
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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));
        }