Пример #1
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            var source =
                value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(e => KV.Parse(e, '=').Value);

            if (fileInfo.Key == null && source.Any())
            {
                fileInfo.Key = new M3UKeyInfo();
            }
            foreach (var keyValuePair in source)
            {
                var key = keyValuePair.Key;
                if (key != "URI")
                {
                    if (key != "IV")
                    {
                        if (key == "METHOD")
                        {
                            fileInfo.Key.Method = keyValuePair.Value;
                        }
                    }
                    else
                    {
                        fileInfo.Key.IV = keyValuePair.Value;
                    }
                }
                else
                {
                    fileInfo.Key.Uri = Uri.TryCreate(keyValuePair.Value, UriKind.Absolute, out var result)
                        ? result
                        : null;
                }
            }
        }
Пример #2
0
        public bool Read(LineReader reader, M3UFileInfo fileInfo)
        {
            var line = reader.Current?.Trim();

            if (string.IsNullOrEmpty(line))
            {
                return(false);
            }
            if (M3UAttributes.TagIdentifier != line[0])
            {
                return(false);
            }

            var kv = KV.Parse(line, M3UAttributes.TagSeparator).Value;

            if (!CanRead(kv.Key))
            {
                return(false);
            }
            if (ShouldTerminate())
            {
                return(true);
            }

            Write(fileInfo, kv.Value, reader);

            return(false);
        }
Пример #3
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            var attrs = value
                        .Split(new[] { M3UAttributes.AttributeSeparator }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(e => KV.Parse(e, M3UAttributes.PairSeparator).Value);

            if (fileInfo.Key == null && attrs.Any())
            {
                fileInfo.Key = new M3UKeyInfo();
            }

            foreach (var attr in attrs)
            {
                switch (attr.Key)
                {
                case M3UAttributes.KeyAttributes.Uri:
                    fileInfo.Key.Uri = Uri.TryCreate(attr.Value, UriKind.Absolute, out var uri) ? uri : default;
                    break;

                case M3UAttributes.KeyAttributes.IV:
                    fileInfo.Key.IV = attr.Value;
                    break;

                case M3UAttributes.KeyAttributes.Method:
                    fileInfo.Key.Method = attr.Value;
                    break;
                }
            }
        }
Пример #4
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            if (fileInfo.MediaFiles == null)
            {
                fileInfo.MediaFiles = new List <M3UMediaInfo>();
            }
            var m3UmediaInfo = new M3UMediaInfo();
            var strArray     = value.Split(new char[1] {
                ','
            }, StringSplitOptions.RemoveEmptyEntries);

            if (strArray.Length != 0)
            {
                m3UmediaInfo.Duration = To.Value <float>(strArray[0]);
                m3UmediaInfo.Title    = strArray.Length > 1 ? strArray[1].Trim() : string.Empty;
            }

            if (!reader.MoveNext())
            {
                throw new InvalidDataException("Invalid M3U file. Missing a media URI.");
            }

            var relativeUri = new Uri(reader.Current.Trim(), UriKind.RelativeOrAbsolute);

            if (!relativeUri.IsAbsoluteUri && !relativeUri.IsWellFormedOriginalString())
            {
                throw new InvalidDataException("Invalid M3U file. Include a invalid media URI.",
                                               new UriFormatException(reader.Current));
            }

            if (!relativeUri.IsAbsoluteUri)
            {
                var baseUri = Configuration.Default.BaseUri;
                if (baseUri == null && reader.Adapter is NetworkAdapter adapter)
                {
                    baseUri = new Uri(
                        adapter.Uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo,
                                                  UriFormat.SafeUnescaped), UriKind.Absolute);
                }
                if (baseUri != null)
                {
                    m3UmediaInfo.Uri = new Uri(baseUri, relativeUri);
                }
            }

            if (m3UmediaInfo.Uri == null)
            {
                m3UmediaInfo.Uri = relativeUri;
            }
            fileInfo.MediaFiles.Add(m3UmediaInfo);
        }
Пример #5
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            if (fileInfo.MediaFiles == null)
            {
                fileInfo.MediaFiles = new List <M3UMediaInfo>();
            }

            var media = new M3UMediaInfo();
            var attrs = value.Split(new[] { M3UAttributes.AttributeSeparator }, StringSplitOptions.RemoveEmptyEntries);

            if (attrs.Length > 0)
            {
                media.Duration = To.Value <float>(attrs[0]);
                media.Title    = attrs.Length > 1 ? attrs[1].Trim() : string.Empty;
            }

            if (!reader.MoveNext())
            {
                throw new InvalidDataException("Invalid M3U file. Missing a media URI.");
            }

            var mediaUri = new Uri(reader.Current.Trim(), UriKind.RelativeOrAbsolute);

            if (!mediaUri.IsAbsoluteUri && !mediaUri.IsWellFormedOriginalString())
            {
                throw new InvalidDataException("Invalid M3U file. Include a invalid media URI.",
                                               innerException: new UriFormatException(reader.Current));
            }

            if (!mediaUri.IsAbsoluteUri)
            {
                var baseUri = Configuration.Default.BaseUri;
                if (baseUri == null && reader.Adapter is NetworkAdapter adapter)
                {
                    var uri        = adapter.Uri;
                    var components = UriComponents.SchemeAndServer | UriComponents.UserInfo;
                    baseUri = new Uri(uri.GetComponents(components, UriFormat.SafeUnescaped), UriKind.Absolute);
                }
                if (baseUri != null)
                {
                    media.Uri = new Uri(baseUri, mediaUri);
                }
            }
            if (media.Uri == null)
            {
                media.Uri = mediaUri;
            }

            fileInfo.MediaFiles.Add(media);
        }
Пример #6
0
        public bool Read(LineReader reader, M3UFileInfo fileInfo)
        {
            var text = reader.Current?.Trim();

            if (string.IsNullOrEmpty(text) || '#' != text[0])
            {
                return(false);
            }

            var keyValuePair = KV.Parse(text);

            if (!CanRead(keyValuePair.Key))
            {
                return(false);
            }
            if (ShouldTerminate())
            {
                return(true);
            }

            Write(fileInfo, keyValuePair.Value, reader);
            return(false);
        }
Пример #7
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
 {
     fileInfo.TargetDuration = To.Value <int>(value);
 }
Пример #8
0
 protected abstract void Write(M3UFileInfo fileInfo, string value, LineReader reader);
Пример #9
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader) =>
 fileInfo.PlaylistType = value;
Пример #10
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader) =>
 fileInfo.MediaSequence = To.Value <int>(value);
Пример #11
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
 {
 }
Пример #12
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader) =>
 fileInfo.ProgramDateTime = To.Value <DateTime>(value);
Пример #13
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            var source = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                         .Select(e => KV.Parse(e, '=').Value);

            if (fileInfo.Streams == null && source.Any())
            {
                fileInfo.Streams = new List <M3UStreamInfo>();
            }
            var m3UstreamInfo = new M3UStreamInfo();

            foreach (var keyValuePair in source)
            {
                var key = keyValuePair.Key;
                if (key != "BANDWIDTH")
                {
                    if (key != "PROGRAM-ID")
                    {
                        if (key != "CODECS")
                        {
                            if (key == "RESOLUTION")
                            {
                                m3UstreamInfo.Resolution = keyValuePair.Value;
                            }
                        }
                        else
                        {
                            m3UstreamInfo.Codecs = keyValuePair.Value;
                        }
                    }
                    else
                    {
                        m3UstreamInfo.ProgramId = To.Value <int>(keyValuePair.Value);
                    }
                }
                else
                {
                    m3UstreamInfo.Bandwidth = To.Value <int>(keyValuePair.Value);
                }
            }

            if (!reader.MoveNext())
            {
                throw new InvalidDataException("Invalid M3U file. Missing a stream URI.");
            }

            var relativeUri = new Uri(reader.Current.Trim(), UriKind.RelativeOrAbsolute);

            if (!relativeUri.IsAbsoluteUri && !relativeUri.IsWellFormedOriginalString())
            {
                throw new InvalidDataException("Invalid M3U file. Include a invalid stream URI.",
                                               new UriFormatException(reader.Current));
            }

            if (!relativeUri.IsAbsoluteUri)
            {
                var baseUri = Configuration.Default.BaseUri;
                if (baseUri == null && reader.Adapter is NetworkAdapter adapter)
                {
                    baseUri = new Uri(
                        adapter.Uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.UserInfo,
                                                  UriFormat.SafeUnescaped), UriKind.Absolute);
                }
                if (baseUri != null)
                {
                    m3UstreamInfo.Uri = new Uri(baseUri, relativeUri);
                }
            }

            if (m3UstreamInfo.Uri == null)
            {
                m3UstreamInfo.Uri = relativeUri;
            }
            fileInfo.Streams?.Add(m3UstreamInfo);
        }
Пример #14
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader) =>
 fileInfo.Version = To.Value <int>(value);
Пример #15
0
        protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
        {
            var attrs = value
                        .Split(new[] { M3UAttributes.AttributeSeparator }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(e => KV.Parse(e, M3UAttributes.PairSeparator).Value);

            if (fileInfo.Streams == null && attrs.Any())
            {
                fileInfo.Streams = new List <M3UStreamInfo>();
            }

            var stream = new M3UStreamInfo();

            foreach (var attr in attrs)
            {
                switch (attr.Key)
                {
                case M3UAttributes.StreamInfAttributes.Bandwidth:
                    stream.Bandwidth = To.Value <int>(attr.Value);
                    break;

                case M3UAttributes.StreamInfAttributes.ProgramId:
                    stream.ProgramId = To.Value <int>(attr.Value);
                    break;

                case M3UAttributes.StreamInfAttributes.Codecs:
                    stream.Codecs = attr.Value;
                    break;

                case M3UAttributes.StreamInfAttributes.Resolution:
                    stream.Resolution = attr.Value;
                    break;
                }
            }

            if (!reader.MoveNext())
            {
                throw new InvalidDataException("Invalid M3U file. Missing a stream URI.");
            }

            var streamUri = new Uri(reader.Current.Trim(), UriKind.RelativeOrAbsolute);

            if (!streamUri.IsAbsoluteUri && !streamUri.IsWellFormedOriginalString())
            {
                throw new InvalidDataException("Invalid M3U file. Include a invalid stream URI.",
                                               innerException: new UriFormatException(reader.Current));
            }

            if (!streamUri.IsAbsoluteUri)
            {
                var baseUri = Configuration.Default.BaseUri;
                if (baseUri == null && reader.Adapter is NetworkAdapter adapter)
                {
                    var uri        = adapter.Uri;
                    var components = UriComponents.SchemeAndServer | UriComponents.UserInfo;
                    baseUri = new Uri(uri.GetComponents(components, UriFormat.SafeUnescaped), UriKind.Absolute);
                }
                if (baseUri != null)
                {
                    stream.Uri = new Uri(baseUri, streamUri);
                }
            }
            if (stream.Uri == null)
            {
                stream.Uri = streamUri;
            }

            fileInfo.Streams.Add(stream);
        }
Пример #16
0
 protected override void Write(M3UFileInfo fileInfo, string value, LineReader reader)
 {
     fileInfo.AllowCache = To.Value <bool>(value);
 }