diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-12-07 15:03:00 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-12-07 15:03:00 -0500 |
| commit | 63a69cdc60361b2031e4090b55e45bdb9ca73c94 (patch) | |
| tree | d852e5534a8e609eb72c889a4ee25071db821023 /Emby.Server.Implementations | |
| parent | 0130209cdce07dc042b075c6cf972a7eb1339861 (diff) | |
improve m3u channel list parsing
Diffstat (limited to 'Emby.Server.Implementations')
| -rw-r--r-- | Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs | 82 |
1 files changed, 65 insertions, 17 deletions
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs index e4e0519de..e0f040281 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -100,16 +101,23 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts extInf = extInf.Trim(); - channel.ImageUrl = FindProperty("tvg-logo", extInf); + string remaining; + var attributes = ParseExtInf(extInf, out remaining); + extInf = remaining; - channel.Name = GetChannelName(extInf); + string value; + if (attributes.TryGetValue("tvg-logo", out value)) + { + channel.ImageUrl = value; + } - channel.Number = GetChannelNumber(extInf, mediaUrl); + channel.Name = GetChannelName(extInf, attributes); + channel.Number = GetChannelNumber(extInf, attributes, mediaUrl); return channel; } - private string GetChannelNumber(string extInf, string mediaUrl) + private string GetChannelNumber(string extInf, Dictionary<string, string> attributes, string mediaUrl) { var nameParts = extInf.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var nameInExtInf = nameParts.Length > 1 ? nameParts.Last().Trim() : null; @@ -130,18 +138,41 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts } } - if (string.IsNullOrWhiteSpace(numberString) || + if (!string.IsNullOrWhiteSpace(numberString)) + { + numberString = numberString.Trim(); + } + + if (string.IsNullOrWhiteSpace(numberString) || string.Equals(numberString, "-1", StringComparison.OrdinalIgnoreCase) || string.Equals(numberString, "0", StringComparison.OrdinalIgnoreCase)) { - numberString = FindProperty("tvg-id", extInf); + string value; + if (attributes.TryGetValue("tvg-id", out value)) + { + numberString = value; + } + } + + if (!string.IsNullOrWhiteSpace(numberString)) + { + numberString = numberString.Trim(); } if (string.IsNullOrWhiteSpace(numberString) || string.Equals(numberString, "-1", StringComparison.OrdinalIgnoreCase) || string.Equals(numberString, "0", StringComparison.OrdinalIgnoreCase)) { - numberString = FindProperty("channel-id", extInf); + string value; + if (attributes.TryGetValue("channel-id", out value)) + { + numberString = value; + } + } + + if (!string.IsNullOrWhiteSpace(numberString)) + { + numberString = numberString.Trim(); } if (string.IsNullOrWhiteSpace(numberString) || @@ -160,13 +191,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts else { numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last()); + + double value; + if (!double.TryParse(numberString, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) + { + numberString = null; + } } } return numberString; } - private string GetChannelName(string extInf) + private string GetChannelName(string extInf, Dictionary<string, string> attributes) { var nameParts = extInf.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var nameInExtInf = nameParts.Length > 1 ? nameParts.Last().Trim() : null; @@ -186,7 +223,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts } } - var name = FindProperty("tvg-name", extInf); + string name; + attributes.TryGetValue("tvg-name", out name); + if (string.IsNullOrWhiteSpace(name)) { name = nameInExtInf; @@ -194,7 +233,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts if (string.IsNullOrWhiteSpace(name)) { - name = FindProperty("tvg-id", extInf); + attributes.TryGetValue("tvg-id", out name); } if (string.IsNullOrWhiteSpace(name)) @@ -205,18 +244,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts return name; } - private string FindProperty(string property, string properties) + private Dictionary<string, string> ParseExtInf(string line, out string remaining) { + var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + var reg = new Regex(@"([a-z0-9\-_]+)=\""([^""]+)\""", RegexOptions.IgnoreCase); - var matches = reg.Matches(properties); + var matches = reg.Matches(line); + var minIndex = int.MaxValue; foreach (Match match in matches) { - if (match.Groups[1].Value == property) - { - return match.Groups[2].Value; - } + dict[match.Groups[1].Value] = match.Groups[2].Value; + minIndex = Math.Min(minIndex, match.Index); } - return null; + + if (minIndex > 0 && minIndex < line.Length) + { + line = line.Substring(0, minIndex); + } + + remaining = line; + + return dict; } } |
