public IEnumerable <ExtKeyTagInstance> FindAll(IEnumerable <M3U8TagInstance> tags)
 {
     if (null == tags)
     {
         return((IEnumerable <ExtKeyTagInstance>)null);
     }
     return(M3U8TagInstanceExtensions.Tags <M3U8ExtKeyTag, ExtKeyTagInstance>(tags, this));
 }
 public ByterangeTagInstance Find(IEnumerable <M3U8TagInstance> tags)
 {
     if (null == tags)
     {
         return((ByterangeTagInstance)null);
     }
     return(M3U8TagInstanceExtensions.Tag <M3U8ByterangeTag, ByterangeTagInstance>(tags, this));
 }
Example #3
0
 public DateTimeTagInstance Find(IEnumerable <M3U8TagInstance> tags)
 {
     if (null == tags)
     {
         return((DateTimeTagInstance)null);
     }
     return(M3U8TagInstanceExtensions.Tag <M3U8DateTimeTag, DateTimeTagInstance>(tags, this));
 }
Example #4
0
 public ExtStreamInfTagInstance Find(IEnumerable <M3U8TagInstance> tags)
 {
     if (null == tags)
     {
         return((ExtStreamInfTagInstance)null);
     }
     return(M3U8TagInstanceExtensions.Tag <M3U8ExtStreamInfTag, ExtStreamInfTagInstance>(tags, this));
 }
Example #5
0
 public ValueTagInstance Find(IEnumerable <M3U8TagInstance> tags)
 {
     if (null == tags)
     {
         return((ValueTagInstance)null);
     }
     return(M3U8TagInstanceExtensions.Tag <M3U8ValueTag, ValueTagInstance>(tags, this));
 }
Example #6
0
        private static bool IsYesNo(M3U8TagInstance tag, M3U8ValueAttribute <string> attribute, bool defaultValue = false)
        {
            M3U8AttributeValueInstance <string> attributeValueInstance = M3U8TagInstanceExtensions.Attribute <string>(tag, attribute);

            if (attributeValueInstance == null || string.IsNullOrWhiteSpace(attributeValueInstance.Value))
            {
                return(defaultValue);
            }
            return(0 == string.CompareOrdinal("YES", attributeValueInstance.Value.ToUpperInvariant()));
        }
 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);
     })));
 }
Example #8
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);
            }));
        }
Example #9
0
        private static void AddMedia(Uri playlist, M3U8TagInstance gt, Dictionary <string, HlsProgramManager.MediaGroup> audioStreams)
        {
            string key       = M3U8TagInstanceExtensions.Attribute <string>(gt, ExtMediaSupport.AttrGroupId).Value;
            string uriString = M3U8TagInstanceExtensions.AttributeObject <string>(gt, ExtMediaSupport.AttrUri);
            Uri    uri       = (Uri)null;

            if (null != uriString)
            {
                uri = new Uri(playlist, new Uri(uriString, UriKind.RelativeOrAbsolute));
            }
            string            str = M3U8TagInstanceExtensions.AttributeObject <string>(gt, ExtMediaSupport.AttrLanguage);
            PlaylistSubStream playlistSubStream1 = new PlaylistSubStream();

            playlistSubStream1.Type         = M3U8TagInstanceExtensions.AttributeObject <string>(gt, ExtMediaSupport.AttrType);
            playlistSubStream1.Name         = key;
            playlistSubStream1.Playlist     = uri;
            playlistSubStream1.IsAutoselect = HlsProgramManager.IsYesNo(gt, ExtMediaSupport.AttrAutoselect, false);
            playlistSubStream1.Language     = str == null ? (string)null : str.Trim().ToLower();
            PlaylistSubStream playlistSubStream2 = playlistSubStream1;

            HlsProgramManager.MediaGroup mediaGroup;
            if (!audioStreams.TryGetValue(key, out mediaGroup))
            {
                mediaGroup = new HlsProgramManager.MediaGroup()
                {
                    Default = (SubStream)playlistSubStream2
                };
                audioStreams[key] = mediaGroup;
            }
            if (HlsProgramManager.IsYesNo(gt, ExtMediaSupport.AttrDefault, false))
            {
                mediaGroup.Default = (SubStream)playlistSubStream2;
            }
            string index = M3U8TagInstanceExtensions.Attribute <string>(gt, ExtMediaSupport.AttrName).Value;

            mediaGroup.Streams[index] = (SubStream)playlistSubStream2;
        }
        private void HandleKey(SubStreamSegment segment, IEnumerable <ExtKeyTagInstance> extKeys, CancellationToken cancellationToken)
        {
            ExtKeyTagInstance[] extKeyTagInstanceArray = Enumerable.ToArray <ExtKeyTagInstance>(extKeys);
            if (extKeyTagInstanceArray.Length < 1)
            {
                return;
            }
            string url = (string)null;

            byte[] iv = (byte[])null;
            foreach (ExtKeyTagInstance extKeyTagInstance in extKeyTagInstanceArray)
            {
                string b = M3U8TagInstanceExtensions.AttributeObject <string>((M3U8TagInstance)extKeyTagInstance, ExtKeySupport.AttrMethod);
                if (string.Equals("NONE", b, StringComparison.OrdinalIgnoreCase))
                {
                    url = (string)null;
                }
                else
                {
                    if (!string.Equals("AES-128", b, StringComparison.OrdinalIgnoreCase))
                    {
                        if (string.Equals("SAMPLE-AES", b, StringComparison.OrdinalIgnoreCase))
                        {
                            throw new NotImplementedException("Method SAMPLE-AES decryption is not implemented");
                        }
                        throw new NotSupportedException("Unknown decryption method type: " + b);
                    }
                    string str = M3U8TagInstanceExtensions.AttributeObject <string>((M3U8TagInstance)extKeyTagInstance, ExtKeySupport.AttrUri);
                    if (null != str)
                    {
                        url = str;
                    }
                    byte[] numArray = M3U8TagInstanceExtensions.AttributeObject <byte[]>((M3U8TagInstance)extKeyTagInstance, ExtKeySupport.AttrIv);
                    if (null != numArray)
                    {
                        iv = numArray;
                    }
                }
            }
            if (null == url)
            {
                return;
            }
            if (null == iv)
            {
                iv = new byte[16];
                long num = segment.MediaSequence ?? (long)(this._segmentIndex - 1);
                iv[15] = (byte)((ulong)num & (ulong)byte.MaxValue);
                iv[14] = (byte)((ulong)(num >> 8) & (ulong)byte.MaxValue);
                iv[13] = (byte)((ulong)(num >> 16) & (ulong)byte.MaxValue);
                iv[12] = (byte)((ulong)(num >> 24) & (ulong)byte.MaxValue);
            }
            Func <Stream, CancellationToken, Task <Stream> > filter = segment.AsyncStreamFilter;
            Uri uri = M3U8ParserExtensions.ResolveUrl(this._parser, url);

            segment.AsyncStreamFilter = (Func <Stream, CancellationToken, Task <Stream> >)(async(stream, ct) =>
            {
                if (null != filter)
                {
                    stream = await filter(stream, ct).ConfigureAwait(false);
                }
                byte[] key;
                if (!this._keyCache.TryGetValue(uri, out key))
                {
                    key = await this.LoadKeyAsync(uri, cancellationToken).ConfigureAwait(false);
                    if (16 != key.Length)
                    {
                        throw new FormatException("AES-128 key length mismatch: " + (object)key.Length);
                    }
                    this._keyCache[uri] = key;
                }
                Debug.WriteLine("Segment AES-128: key {0} iv {1}", (object)BitConverter.ToString(key), (object)BitConverter.ToString(iv));
                return(this._platformServices.Aes128DecryptionFilter(stream, key, iv));
            });
        }
Example #11
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);
        }