aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/LiveTv/EmbyTV
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-02-04 18:32:16 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-02-04 18:32:16 -0500
commit851364f84fb690c7701bb097d5791ca7e5435219 (patch)
tree67f122e1b195594bd0be64bce185b7e520856a3b /Emby.Server.Implementations/LiveTv/EmbyTV
parentac3ec6d1856b59c7b2ee1a2547c88a350405d749 (diff)
rework guide mappings
Diffstat (limited to 'Emby.Server.Implementations/LiveTv/EmbyTV')
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs161
1 files changed, 129 insertions, 32 deletions
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index f942597540..89ef87c8ef 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -393,7 +393,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
try
{
- await provider.Item1.AddMetadata(provider.Item2, enabledChannels, cancellationToken).ConfigureAwait(false);
+ await AddMetadata(provider.Item1, provider.Item2, enabledChannels, enableCache, cancellationToken).ConfigureAwait(false);
}
catch (NotSupportedException)
{
@@ -409,6 +409,120 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
return list;
}
+ private async Task AddMetadata(IListingsProvider provider, ListingsProviderInfo info, List<ChannelInfo> tunerChannels, bool enableCache, CancellationToken cancellationToken)
+ {
+ var epgChannels = await GetEpgChannels(provider, info, enableCache, cancellationToken).ConfigureAwait(false);
+
+ foreach (var tunerChannel in tunerChannels)
+ {
+ var epgChannel = GetEpgChannelFromTunerChannel(info, tunerChannel, epgChannels);
+
+ if (epgChannel != null)
+ {
+ if (!string.IsNullOrWhiteSpace(epgChannel.Name))
+ {
+ tunerChannel.Name = epgChannel.Name;
+ }
+ }
+ }
+ }
+
+ private readonly ConcurrentDictionary<string, List<ChannelInfo>> _epgChannels =
+ new ConcurrentDictionary<string, List<ChannelInfo>>(StringComparer.OrdinalIgnoreCase);
+
+ private async Task<List<ChannelInfo>> GetEpgChannels(IListingsProvider provider, ListingsProviderInfo info, bool enableCache, CancellationToken cancellationToken)
+ {
+ List<ChannelInfo> result;
+ if (!enableCache || !_epgChannels.TryGetValue(info.Id, out result))
+ {
+ result = await provider.GetChannels(info, cancellationToken).ConfigureAwait(false);
+
+ _epgChannels.AddOrUpdate(info.Id, result, (k, v) => result);
+ }
+
+ return result;
+ }
+
+ private async Task<ChannelInfo> GetEpgChannelFromTunerChannel(IListingsProvider provider, ListingsProviderInfo info, ChannelInfo tunerChannel, CancellationToken cancellationToken)
+ {
+ var epgChannels = await GetEpgChannels(provider, info, true, cancellationToken).ConfigureAwait(false);
+
+ return GetEpgChannelFromTunerChannel(info, tunerChannel, epgChannels);
+ }
+
+ private string GetMappedChannel(string channelId, List<NameValuePair> mappings)
+ {
+ foreach (NameValuePair mapping in mappings)
+ {
+ if (StringHelper.EqualsIgnoreCase(mapping.Name, channelId))
+ {
+ return mapping.Value;
+ }
+ }
+ return channelId;
+ }
+
+ private ChannelInfo GetEpgChannelFromTunerChannel(ListingsProviderInfo info, ChannelInfo tunerChannel, List<ChannelInfo> epgChannels)
+ {
+ return GetEpgChannelFromTunerChannel(info.ChannelMappings.ToList(), tunerChannel, epgChannels);
+ }
+
+ public ChannelInfo GetEpgChannelFromTunerChannel(List<NameValuePair> mappings, ChannelInfo tunerChannel, List<ChannelInfo> epgChannels)
+ {
+ if (!string.IsNullOrWhiteSpace(tunerChannel.TunerChannelId))
+ {
+ var tunerChannelId = GetMappedChannel(tunerChannel.TunerChannelId, mappings);
+
+ if (string.IsNullOrWhiteSpace(tunerChannelId))
+ {
+ tunerChannelId = tunerChannel.TunerChannelId;
+ }
+
+ var channel = epgChannels.FirstOrDefault(i => string.Equals(tunerChannelId, i.Id, StringComparison.OrdinalIgnoreCase));
+
+ if (channel != null)
+ {
+ return channel;
+ }
+ }
+
+ if (!string.IsNullOrWhiteSpace(tunerChannel.Number))
+ {
+ var tunerChannelNumber = GetMappedChannel(tunerChannel.Number, mappings);
+
+ if (string.IsNullOrWhiteSpace(tunerChannelNumber))
+ {
+ tunerChannelNumber = tunerChannel.Number;
+ }
+
+ var channel = epgChannels.FirstOrDefault(i => string.Equals(tunerChannelNumber, i.Number, StringComparison.OrdinalIgnoreCase));
+
+ if (channel != null)
+ {
+ return channel;
+ }
+ }
+
+ if (!string.IsNullOrWhiteSpace(tunerChannel.Name))
+ {
+ var normalizedName = NormalizeName(tunerChannel.Name);
+
+ var channel = epgChannels.FirstOrDefault(i => string.Equals(normalizedName, NormalizeName(i.Name ?? string.Empty), StringComparison.OrdinalIgnoreCase));
+
+ if (channel != null)
+ {
+ return channel;
+ }
+ }
+
+ return null;
+ }
+
+ private string NormalizeName(string value)
+ {
+ return value.Replace(" ", string.Empty).Replace("-", string.Empty);
+ }
+
public async Task<List<ChannelInfo>> GetChannelsForListingsProvider(ListingsProviderInfo listingsProvider, CancellationToken cancellationToken)
{
var list = new List<ChannelInfo>();
@@ -845,54 +959,37 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
_logger.Debug("Getting programs for channel {0}-{1} from {2}-{3}", channel.Number, channel.Name, provider.Item1.Name, provider.Item2.ListingsId ?? string.Empty);
- var channelMappings = GetChannelMappings(provider.Item2);
- var channelNumber = channel.Number;
- var tunerChannelId = channel.TunerChannelId;
+ var epgChannel = await GetEpgChannelFromTunerChannel(provider.Item1, provider.Item2, channel, cancellationToken).ConfigureAwait(false);
+
+ List<ProgramInfo> programs;
- if (!string.IsNullOrWhiteSpace(channelNumber))
+ if (epgChannel == null)
{
- string mappedChannelNumber;
- if (channelMappings.TryGetValue(channelNumber, out mappedChannelNumber))
- {
- _logger.Debug("Found mapped channel on provider {0}. Tuner channel number: {1}, Mapped channel number: {2}", provider.Item1.Name, channelNumber, mappedChannelNumber);
- channelNumber = mappedChannelNumber;
- }
+ programs = new List<ProgramInfo>();
+ }
+ else
+ {
+ programs = (await provider.Item1.GetProgramsAsync(provider.Item2, epgChannel.Id, startDateUtc, endDateUtc, cancellationToken)
+ .ConfigureAwait(false)).ToList();
}
-
- var programs = await provider.Item1.GetProgramsAsync(provider.Item2, tunerChannelId, channelNumber, channel.Name, startDateUtc, endDateUtc, cancellationToken)
- .ConfigureAwait(false);
-
- var list = programs.ToList();
// Replace the value that came from the provider with a normalized value
- foreach (var program in list)
+ foreach (var program in programs)
{
program.ChannelId = channelId;
}
- if (list.Count > 0)
+ if (programs.Count > 0)
{
- SaveEpgDataForChannel(channelId, list);
+ SaveEpgDataForChannel(channelId, programs);
- return list;
+ return programs;
}
}
return new List<ProgramInfo>();
}
- private Dictionary<string, string> GetChannelMappings(ListingsProviderInfo info)
- {
- var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
-
- foreach (var mapping in info.ChannelMappings)
- {
- dict[mapping.Name] = mapping.Value;
- }
-
- return dict;
- }
-
private List<Tuple<IListingsProvider, ListingsProviderInfo>> GetListingProviders()
{
return GetConfiguration().ListingProviders