示例#1
0
        public async Task <IDictionary <long, Program> > LoadAsync(CancellationToken cancellationToken)
        {
            ICollection <Uri>           playlists = this.Playlists;
            IDictionary <long, Program> dictionary;

            foreach (Uri uri in (IEnumerable <Uri>)playlists)
            {
                try
                {
                    M3U8Parser parser = new M3U8Parser();
                    if (null != this._playlistWebReader)
                    {
                        this._playlistWebReader.Dispose();
                    }
                    this._playlistWebReader = this._webReaderManager.CreateReader(uri, ContentKind.Playlist, (IWebReader)null, (ContentType)null);
                    Uri actualPlaylist = await M3U8ParserExtensions.ParseAsync(parser, this._playlistWebReader, this._retryManager, uri, cancellationToken).ConfigureAwait(false);

                    dictionary = await this.LoadAsync(this._playlistWebReader, parser, cancellationToken);

                    goto label_14;
                }
                catch (WebException ex)
                {
                    Debug.WriteLine("HlsProgramManager.LoadAsync: " + ex.Message);
                }
            }
            dictionary = HlsProgramManager.NoPrograms;
label_14:
            return(dictionary);
        }
示例#2
0
        private async Task UpdateAsync(M3U8Parser parser, CancellationToken cancellationToken)
        {
            _segments = await _segmentsFactory.CreateSegmentsAsync(parser, _subPlaylistCache.WebReader, cancellationToken).ConfigureAwait(false);

            _isDynamicPlaylist = HlsPlaylistSettings.Parameters.IsDynamicPlaylist(parser);
            _actualUrl         = parser.BaseUrl;
        }
        public async Task RefreshPlaylistAsync(CancellationToken cancellationToken)
        {
            if (this._isDynamicPlaylist || this._segments == null || this._segments.Count <= 0)
            {
                M3U8Parser parser = await this.FetchPlaylistAsync(cancellationToken).ConfigureAwait(false);

                await this.UpdateAsync(parser, cancellationToken).ConfigureAwait(false);
            }
        }
示例#4
0
        public void CheckCameraDownload()
        {
            var mainNode = GetMainNode();

            var m3U8        = mainNode["live"]["amba.m3u8"];
            var webResponse = m3U8.DownloadContent();
            var parser      = new M3U8Parser(webResponse.GetResponseStream());

            webResponse.Dispose();
            Assert.AreEqual("3", parser.Version);
        }
 public static bool IsDynamicPlayist(M3U8Parser parser)
 {
     if (null != M3U8TagInstanceExtensions.Tag(parser.GlobalTags, M3U8Tags.ExtXEndList))
     {
         return(false);
     }
     return(Enumerable.All <M3U8Parser.M3U8Uri>(parser.Playlist, (Func <M3U8Parser.M3U8Uri, bool>)(p =>
     {
         ExtinfTagInstance extinfTagInstance = M3U8Tags.ExtXInf.Find((IEnumerable <M3U8TagInstance>)p.Tags);
         return extinfTagInstance != null && extinfTagInstance.Duration >= new Decimal(0);
     })));
 }
示例#6
0
        public static bool IsDynamicPlayist(M3U8Parser parser)
        {
            if (null != M3U8TagInstanceExtensions.Tag(parser.GlobalTags, M3U8Tags.ExtXEndList))
            {
                return(false);
            }

            return(parser.Playlist.All(p =>
            {
                var extinfTagInstance = M3U8Tags.ExtXInf.Find(p.Tags);
                return extinfTagInstance != null && extinfTagInstance.Duration >= new decimal(0);
            }));
        }
示例#7
0
        private async Task <M3U8Parser> FetchPlaylistAsync(CancellationToken cancellationToken)
        {
            var urls = Urls;

            if (urls == null || urls.Count < 1)
            {
                return(null);
            }

            foreach (Uri playlist in urls)
            {
                UpdateSubPlaylistCache(playlist);
                cancellationToken.ThrowIfCancellationRequested();
                WebResponse webResponse = null;
                if (null == StreamMetadata)
                {
                    webResponse = new WebResponse();
                }

                var parsedPlaylist = await _subPlaylistCache.ReadAsync((actualUri, bytes) =>
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    if (bytes.Length < 1)
                    {
                        return(null);
                    }
                    var parser = new M3U8Parser();
                    using (var memoryStream = new MemoryStream(bytes))
                    {
                        parser.Parse(actualUri, memoryStream);
                    }

                    return(parser);
                }, cancellationToken, webResponse).ConfigureAwait(false);

                if (null != parsedPlaylist)
                {
                    if (null != webResponse)
                    {
                        StreamMetadata = _webMetadataFactory.CreateStreamMetadata(webResponse);
                    }

                    return(parsedPlaylist);
                }
            }

            return(null);
        }
        private async Task <M3U8Parser> FetchPlaylistAsync(CancellationToken cancellationToken)
        {
            ICollection <Uri> urls = this.Urls;
            M3U8Parser        m3U8Parser;

            if (urls == null || urls.Count < 1)
            {
                m3U8Parser = (M3U8Parser)null;
            }
            else
            {
                foreach (Uri playlist in (IEnumerable <Uri>)urls)
                {
                    this.UpdateSubPlaylistCache(playlist);
                    cancellationToken.ThrowIfCancellationRequested();
                    WebResponse webResponse = (WebResponse)null;
                    if (null == this.StreamMetadata)
                    {
                        webResponse = new WebResponse();
                    }
                    M3U8Parser parsedPlaylist = await this._subPlaylistCache.ReadAsync <M3U8Parser>((Func <Uri, byte[], M3U8Parser>)((actualUri, bytes) =>
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        if (bytes.Length < 1)
                        {
                            return((M3U8Parser)null);
                        }
                        M3U8Parser parser = new M3U8Parser();
                        using (MemoryStream memoryStream = new MemoryStream(bytes))
                            M3U8ParserExtensions.Parse(parser, actualUri, (Stream)memoryStream, (Encoding)null);
                        return(parser);
                    }), cancellationToken, webResponse).ConfigureAwait(false);

                    if (null != parsedPlaylist)
                    {
                        if (null != webResponse)
                        {
                            this.StreamMetadata = this._webMetadataFactory.CreateStreamMetadata(webResponse, (ContentType)null);
                        }
                        m3U8Parser = parsedPlaylist;
                        goto label_16;
                    }
                }
                m3U8Parser = (M3U8Parser)null;
            }
label_16:
            return(m3U8Parser);
        }
 public HlsStreamSegments(M3U8Parser parser, IWebReader webReader, IRetryManager retryManager, IPlatformServices platformServices)
 {
     if (null == parser)
     {
         throw new ArgumentNullException("parser");
     }
     if (null == webReader)
     {
         throw new ArgumentNullException("webReader");
     }
     if (null == retryManager)
     {
         throw new ArgumentNullException("retryManager");
     }
     if (null == platformServices)
     {
         throw new ArgumentNullException("platformServices");
     }
     this._parser           = parser;
     this._webReader        = webReader;
     this._retryManager     = retryManager;
     this._platformServices = platformServices;
     this._mediaSequence    = M3U8Tags.ExtXMediaSequence.GetValue <long>(parser.GlobalTags);
 }
        public async Task <IDictionary <long, Program.Program> > LoadAsync(CancellationToken cancellationToken)
        {
            var playlists = Playlists;

            foreach (var uri in playlists)
            {
                try
                {
                    var parser = new M3U8Parser();
                    _playlistWebReader?.Dispose();
                    _playlistWebReader = _webReaderManager.CreateReader(uri, ContentKind.Playlist);
                    var actualPlaylist = await parser.ParseAsync(_playlistWebReader, _retryManager, uri, cancellationToken).ConfigureAwait(false);

                    var dictionary = await LoadAsync(_playlistWebReader, parser, cancellationToken);

                    return(dictionary);
                }
                catch (WebException ex)
                {
                    Debug.WriteLine("HlsProgramManager.LoadAsync: " + ex.Message);
                }
            }
            return(_noPrograms);
        }
示例#11
0
 public Task SetParserAsync(M3U8Parser parser, CancellationToken cancellationToken)
 {
     UpdateSubPlaylistCache(parser.BaseUrl);
     return(UpdateAsync(parser, cancellationToken));
 }
示例#12
0
 public IHlsStreamSegments Create(M3U8Parser parser, IWebReader webReader)
 {
     return((IHlsStreamSegments) new HlsStreamSegments(parser, webReader, this._retryManager, this._platformServices));
 }
        public void CheckCameraDownload()
        {
            var mainNode = GetMainNode();

            var m3U8 = mainNode["live"]["amba.m3u8"];
            var webResponse=m3U8.DownloadContent();
            var parser = new M3U8Parser(webResponse.GetResponseStream());
            webResponse.Dispose();
            Assert.AreEqual("3",parser.Version);
        }
示例#14
0
 public Task <ICollection <ISegment> > CreateSegmentsAsync(M3U8Parser parser, IWebReader webReader, CancellationToken cancellationToken)
 {
     return(_streamSegmentsFactory.Create(parser, webReader).CreateSegmentsAsync(cancellationToken));
 }
        private async Task <IDictionary <long, Program.Program> > LoadAsync(IWebReader webReader, M3U8Parser parser, CancellationToken cancellationToken)
        {
            var audioStreams = new Dictionary <string, MediaGroup>();

            foreach (var m3U8TagInstance in parser.GlobalTags)
            {
                if (M3U8Tags.ExtXMedia != m3U8TagInstance.Tag)
                {
                    continue;
                }

                try
                {
                    if (null != m3U8TagInstance.Attribute(ExtMediaSupport.AttrType, "AUDIO"))
                    {
                        AddMedia(parser.BaseUrl, m3U8TagInstance, audioStreams);
                    }
                }
                catch (NullReferenceException)
                {
                    ;
                }
            }

            var programs    = new Dictionary <long, Program.Program>();
            var hasSegments = false;

            foreach (var m3U8Uri in parser.Playlist)
            {
                if (m3U8Uri.Tags == null || m3U8Uri.Tags.Length < 1)
                {
                    hasSegments = true;
                }
                else
                {
                    var        streamInfTagInstance = M3U8Tags.ExtXStreamInf.Find(m3U8Uri.Tags);
                    var        programId            = long.MinValue;
                    MediaGroup mediaGroup           = null;
                    if (null != streamInfTagInstance)
                    {
                        var attributeValueInstance1 = streamInfTagInstance.Attribute(ExtStreamInfSupport.AttrProgramId);
                        if (null != attributeValueInstance1)
                        {
                            programId = attributeValueInstance1.Value;
                        }

                        var key = streamInfTagInstance.AttributeObject(ExtStreamInfSupport.AttrAudio);
                        if (null != key)
                        {
                            audioStreams.TryGetValue(key, out mediaGroup);
                        }

                        var uri = parser.ResolveUrl(m3U8Uri.Uri);
                        var attributeValueInstance2 = streamInfTagInstance.Attribute(ExtStreamInfSupport.AttrBandwidth);
                        var attributeInstance       = streamInfTagInstance.AttributeInstance <ResolutionAttributeInstance>(ExtStreamInfSupport.AttrResolution);
                        var baseUrl             = parser.BaseUrl;
                        var program             = GetProgram(programs, programId, baseUrl);
                        var hlsProgramStream    = _programStreamFactory.Create(new [] { uri }, webReader);
                        var playlistSubProgram1 = new PlaylistSubProgram(program, hlsProgramStream);
                        playlistSubProgram1.Bandwidth  = attributeValueInstance2?.Value ?? 0L;
                        playlistSubProgram1.Playlist   = uri;
                        playlistSubProgram1.AudioGroup = mediaGroup;
                        var playlistSubProgram2 = playlistSubProgram1;
                        if (null != attributeInstance)
                        {
                            playlistSubProgram2.Width  = attributeInstance.X;
                            playlistSubProgram2.Height = attributeInstance.Y;
                        }
                        program.SubPrograms.Add(playlistSubProgram2);
                    }
                    else
                    {
                        hasSegments = true;
                    }
                }
            }
            if (hasSegments)
            {
                var program          = GetProgram(programs, long.MinValue, parser.BaseUrl);
                var hlsProgramStream = _programStreamFactory.Create(new [] { webReader.RequestUri }, webReader);
                await hlsProgramStream.SetParserAsync(parser, cancellationToken).ConfigureAwait(false);

                var subProgram = new PlaylistSubProgram(program, hlsProgramStream);
                program.SubPrograms.Add(subProgram);
            }
            return(programs);
        }
示例#16
0
        private async Task <IDictionary <long, Program> > LoadAsync(IWebReader webReader, M3U8Parser parser, CancellationToken cancellationToken)
        {
            Dictionary <string, HlsProgramManager.MediaGroup> audioStreams = new Dictionary <string, HlsProgramManager.MediaGroup>();

            foreach (M3U8TagInstance m3U8TagInstance in parser.GlobalTags)
            {
                if (M3U8Tags.ExtXMedia == m3U8TagInstance.Tag)
                {
                    try
                    {
                        if (null != M3U8TagInstanceExtensions.Attribute <string>(m3U8TagInstance, ExtMediaSupport.AttrType, "AUDIO"))
                        {
                            HlsProgramManager.AddMedia(parser.BaseUrl, m3U8TagInstance, audioStreams);
                        }
                    }
                    catch (NullReferenceException ex)
                    {
                    }
                }
            }
            Dictionary <long, Program> programs = new Dictionary <long, Program>();
            bool hasSegments = false;

            foreach (M3U8Parser.M3U8Uri m3U8Uri in parser.Playlist)
            {
                if (m3U8Uri.Tags == null || m3U8Uri.Tags.Length < 1)
                {
                    hasSegments = true;
                }
                else
                {
                    ExtStreamInfTagInstance streamInfTagInstance = M3U8Tags.ExtXStreamInf.Find((IEnumerable <M3U8TagInstance>)m3U8Uri.Tags);
                    long programId = long.MinValue;
                    HlsProgramManager.MediaGroup mediaGroup = (HlsProgramManager.MediaGroup)null;
                    if (null != streamInfTagInstance)
                    {
                        M3U8AttributeValueInstance <long> attributeValueInstance1 = M3U8TagInstanceExtensions.Attribute <long>((M3U8TagInstance)streamInfTagInstance, ExtStreamInfSupport.AttrProgramId);
                        if (null != attributeValueInstance1)
                        {
                            programId = attributeValueInstance1.Value;
                        }
                        string key = M3U8TagInstanceExtensions.AttributeObject <string>((M3U8TagInstance)streamInfTagInstance, ExtStreamInfSupport.AttrAudio);
                        if (null != key)
                        {
                            audioStreams.TryGetValue(key, out mediaGroup);
                        }
                        Uri uri = M3U8ParserExtensions.ResolveUrl(parser, m3U8Uri.Uri);
                        M3U8AttributeValueInstance <long> attributeValueInstance2 = M3U8TagInstanceExtensions.Attribute <long>((M3U8TagInstance)streamInfTagInstance, ExtStreamInfSupport.AttrBandwidth);
                        ResolutionAttributeInstance       attributeInstance       = M3U8TagInstanceExtensions.AttributeInstance <ResolutionAttributeInstance>((M3U8TagInstance)streamInfTagInstance, ExtStreamInfSupport.AttrResolution);
                        Uri               baseUrl          = parser.BaseUrl;
                        Program           program          = HlsProgramManager.GetProgram((IDictionary <long, Program>)programs, programId, baseUrl);
                        IHlsProgramStream hlsProgramStream = this._programStreamFactory.Create((ICollection <Uri>) new Uri[1]
                        {
                            uri
                        }, webReader);
                        PlaylistSubProgram playlistSubProgram1 = new PlaylistSubProgram((IProgram)program, (IProgramStream)hlsProgramStream);
                        playlistSubProgram1.Bandwidth  = attributeValueInstance2 == null ? 0L : attributeValueInstance2.Value;
                        playlistSubProgram1.Playlist   = uri;
                        playlistSubProgram1.AudioGroup = mediaGroup;
                        PlaylistSubProgram playlistSubProgram2 = playlistSubProgram1;
                        if (null != attributeInstance)
                        {
                            playlistSubProgram2.Width  = new int?(attributeInstance.X);
                            playlistSubProgram2.Height = new int?(attributeInstance.Y);
                        }
                        program.SubPrograms.Add((ISubProgram)playlistSubProgram2);
                    }
                    else
                    {
                        hasSegments = true;
                    }
                }
            }
            if (hasSegments)
            {
                Program           program          = HlsProgramManager.GetProgram((IDictionary <long, Program>)programs, long.MinValue, parser.BaseUrl);
                IHlsProgramStream hlsProgramStream = this._programStreamFactory.Create((ICollection <Uri>) new Uri[1]
                {
                    webReader.RequestUri
                }, webReader);
                await hlsProgramStream.SetParserAsync(parser, cancellationToken).ConfigureAwait(false);

                PlaylistSubProgram subProgram = new PlaylistSubProgram((IProgram)program, (IProgramStream)hlsProgramStream);
                program.SubPrograms.Add((ISubProgram)subProgram);
            }
            return((IDictionary <long, Program>)programs);
        }