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)); }
public DateTimeTagInstance Find(IEnumerable <M3U8TagInstance> tags) { if (null == tags) { return((DateTimeTagInstance)null); } return(M3U8TagInstanceExtensions.Tag <M3U8DateTimeTag, DateTimeTagInstance>(tags, this)); }
public ExtStreamInfTagInstance Find(IEnumerable <M3U8TagInstance> tags) { if (null == tags) { return((ExtStreamInfTagInstance)null); } return(M3U8TagInstanceExtensions.Tag <M3U8ExtStreamInfTag, ExtStreamInfTagInstance>(tags, this)); }
public ValueTagInstance Find(IEnumerable <M3U8TagInstance> tags) { if (null == tags) { return((ValueTagInstance)null); } return(M3U8TagInstanceExtensions.Tag <M3U8ValueTag, ValueTagInstance>(tags, this)); }
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); }))); }
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); })); }
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)); }); }
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); }