浏览代码

rework epg storage

Luke Pulverenti 7 年之前
父节点
当前提交
adc22b5e81

+ 34 - 3
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -114,7 +114,7 @@ namespace Emby.Server.Implementations.Data
         {
             get
             {
-                return false;
+                return true;
             }
         }
 
@@ -252,6 +252,7 @@ namespace Emby.Server.Implementations.Data
                     AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
                     AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
                     AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
+                    AddColumn(db, "TypedBaseItems", "ShowId", "Text", existingColumnNames);
 
                     existingColumnNames = GetColumnNames(db, "ItemValues");
                     AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
@@ -457,7 +458,8 @@ namespace Emby.Server.Implementations.Data
             "Artists",
             "AlbumArtists",
             "ExternalId",
-            "SeriesPresentationUniqueKey"
+            "SeriesPresentationUniqueKey",
+            "ShowId"
         };
 
         private readonly string[] _mediaStreamSaveColumns =
@@ -577,7 +579,8 @@ namespace Emby.Server.Implementations.Data
                 "Artists",
                 "AlbumArtists",
                 "ExternalId",
-            "SeriesPresentationUniqueKey"
+                "SeriesPresentationUniqueKey",
+                "ShowId"
             };
 
             var saveItemCommandCommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -1044,6 +1047,16 @@ namespace Emby.Server.Implementations.Data
             saveItemStatement.TryBind("@AlbumArtists", albumArtists);
             saveItemStatement.TryBind("@ExternalId", item.ExternalId);
 
+            var program = item as LiveTvProgram;
+            if (program != null)
+            {
+                saveItemStatement.TryBind("@ShowId", program.ShowId);
+            }
+            else
+            {
+                saveItemStatement.TryBindNull("@ShowId");
+            }
+
             saveItemStatement.MoveNext();
         }
 
@@ -1935,6 +1948,23 @@ namespace Emby.Server.Implementations.Data
                 index++;
             }
 
+            if (enableProgramAttributes)
+            {
+                var program = item as LiveTvProgram;
+                if (program != null)
+                {
+                    if (!reader.IsDBNull(index))
+                    {
+                        program.ShowId = reader.GetString(index);
+                    }
+                    index++;
+                }
+                else
+                {
+                    index ++;
+                }
+            }
+
             return item;
         }
 
@@ -2441,6 +2471,7 @@ namespace Emby.Server.Implementations.Data
                 list.Remove("IsPremiere");
                 list.Remove("EpisodeTitle");
                 list.Remove("IsRepeat");
+                list.Remove("ShowId");
             }
 
             if (!HasEpisodeAttributes(query))

+ 1 - 1
Emby.Server.Implementations/Data/SqliteUserDataRepository.cs

@@ -94,7 +94,7 @@ namespace Emby.Server.Implementations.Data
         {
             get
             {
-                return false;
+                return true;
             }
         }
 

+ 203 - 135
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -305,26 +305,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             var seriesTimers = await GetSeriesTimersAsync(cancellationToken).ConfigureAwait(false);
 
-            List<ChannelInfo> channels = null;
-
             foreach (var timer in seriesTimers)
             {
-                List<ProgramInfo> epgData;
-
-                if (timer.RecordAnyChannel)
-                {
-                    if (channels == null)
-                    {
-                        channels = (await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false)).ToList();
-                    }
-                    var channelIds = channels.Select(i => i.Id).ToList();
-                    epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
-                }
-                else
-                {
-                    epgData = GetEpgDataForChannel(timer.ChannelId);
-                }
-                await UpdateTimersForSeriesTimer(epgData, timer, false, true).ConfigureAwait(false);
+                await UpdateTimersForSeriesTimer(timer, false, true).ConfigureAwait(false);
             }
         }
 
@@ -332,6 +315,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             var timers = await GetTimersAsync(cancellationToken).ConfigureAwait(false);
 
+            var tempChannelCache = new Dictionary<string, LiveTvChannel>();
+
             foreach (var timer in timers)
             {
                 if (DateTime.UtcNow > timer.EndDate && !_activeRecordings.ContainsKey(timer.Id))
@@ -345,15 +330,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     continue;
                 }
 
-                var epg = GetEpgDataForChannel(timer.ChannelId);
-                var program = epg.FirstOrDefault(i => string.Equals(i.Id, timer.ProgramId, StringComparison.OrdinalIgnoreCase));
+                var program = GetProgramInfoFromCache(timer);
                 if (program == null)
                 {
                     OnTimerOutOfDate(timer);
                     continue;
                 }
 
-                RecordingHelper.CopyProgramInfoToTimerInfo(program, timer);
+                CopyProgramInfoToTimerInfo(program, timer, tempChannelCache);
                 _timerProvider.Update(timer);
             }
         }
@@ -621,7 +605,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             ActiveRecordingInfo activeRecordingInfo;
 
             if (_activeRecordings.TryGetValue(timerId, out activeRecordingInfo))
-            { 
+            {
                 activeRecordingInfo.Timer = timer;
                 activeRecordingInfo.CancellationTokenSource.Cancel();
             }
@@ -672,11 +656,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
             timer.Id = Guid.NewGuid().ToString("N");
 
-            ProgramInfo programInfo = null;
+            LiveTvProgram programInfo = null;
 
             if (!string.IsNullOrWhiteSpace(timer.ProgramId))
             {
-                programInfo = GetProgramInfoFromCache(timer.ChannelId, timer.ProgramId);
+                programInfo = GetProgramInfoFromCache(timer);
             }
             if (programInfo == null)
             {
@@ -686,7 +670,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
             if (programInfo != null)
             {
-                RecordingHelper.CopyProgramInfoToTimerInfo(programInfo, timer);
+                CopyProgramInfoToTimerInfo(programInfo, timer);
             }
 
             timer.IsManual = true;
@@ -698,24 +682,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             info.Id = Guid.NewGuid().ToString("N");
 
-            List<ProgramInfo> epgData;
-            if (info.RecordAnyChannel)
-            {
-                var channels = await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false);
-                var channelIds = channels.Select(i => i.Id).ToList();
-                epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
-            }
-            else
-            {
-                epgData = GetEpgDataForChannel(info.ChannelId);
-            }
-
             // populate info.seriesID
-            var program = epgData.FirstOrDefault(i => string.Equals(i.Id, info.ProgramId, StringComparison.OrdinalIgnoreCase));
+            var program = GetProgramInfoFromCache(info.ProgramId);
 
             if (program != null)
             {
-                info.SeriesId = program.SeriesId;
+                info.SeriesId = program.ExternalSeriesId;
             }
             else
             {
@@ -750,7 +722,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 _timerProvider.AddOrUpdate(timer, false);
             }
 
-            await UpdateTimersForSeriesTimer(epgData, info, true, false).ConfigureAwait(false);
+            await UpdateTimersForSeriesTimer(info, true, false).ConfigureAwait(false);
 
             return info.Id;
         }
@@ -779,19 +751,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
                 _seriesTimerProvider.Update(instance);
 
-                List<ProgramInfo> epgData;
-                if (instance.RecordAnyChannel)
-                {
-                    var channels = await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false);
-                    var channelIds = channels.Select(i => i.Id).ToList();
-                    epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
-                }
-                else
-                {
-                    epgData = GetEpgDataForChannel(instance.ChannelId);
-                }
-
-                await UpdateTimersForSeriesTimer(epgData, instance, true, true).ConfigureAwait(false);
+                await UpdateTimersForSeriesTimer(instance, true, true).ConfigureAwait(false);
             }
         }
 
@@ -962,23 +922,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             return Task.FromResult((IEnumerable<SeriesTimerInfo>)_seriesTimerProvider.GetAll());
         }
 
-        public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
-        {
-            try
-            {
-                return await GetProgramsAsyncInternal(channelId, startDateUtc, endDateUtc, cancellationToken).ConfigureAwait(false);
-            }
-            catch (OperationCanceledException)
-            {
-                throw;
-            }
-            catch (Exception ex)
-            {
-                _logger.ErrorException("Error getting programs", ex);
-                return GetEpgDataForChannel(channelId).Where(i => i.StartDate <= endDateUtc && i.EndDate >= startDateUtc);
-            }
-        }
-
         private bool IsListingProviderEnabledForTuner(ListingsProviderInfo info, string tunerHostId)
         {
             if (info.EnableAllTuners)
@@ -994,7 +937,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             return info.EnabledTuners.Contains(tunerHostId, StringComparer.OrdinalIgnoreCase);
         }
 
-        private async Task<IEnumerable<ProgramInfo>> GetProgramsAsyncInternal(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
+        public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
         {
             var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false);
             var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase));
@@ -1037,8 +980,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
                 if (programs.Count > 0)
                 {
-                    SaveEpgDataForChannel(channelId, programs);
-
                     return programs;
                 }
             }
@@ -1464,11 +1405,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 throw new ArgumentNullException("timer");
             }
 
-            ProgramInfo programInfo = null;
+            LiveTvProgram programInfo = null;
 
             if (!string.IsNullOrWhiteSpace(timer.ProgramId))
             {
-                programInfo = GetProgramInfoFromCache(timer.ChannelId, timer.ProgramId);
+                programInfo = GetProgramInfoFromCache(timer);
             }
             if (programInfo == null)
             {
@@ -1478,8 +1419,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
             if (programInfo != null)
             {
-                RecordingHelper.CopyProgramInfoToTimerInfo(programInfo, timer);
-                activeRecordingInfo.Program = programInfo;
+                CopyProgramInfoToTimerInfo(programInfo, timer);
+                //activeRecordingInfo.Program = programInfo;
             }
 
             string seriesPath = null;
@@ -2336,18 +2277,49 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
         }
 
-        private ProgramInfo GetProgramInfoFromCache(string channelId, string programId)
+        private LiveTvProgram GetProgramInfoFromCache(string programId)
         {
-            var epgData = GetEpgDataForChannel(channelId);
-            return epgData.FirstOrDefault(p => string.Equals(p.Id, programId, StringComparison.OrdinalIgnoreCase));
+            var query = new InternalItemsQuery
+            {
+                ItemIds = new[] { _liveTvManager.GetInternalProgramId(Name, programId).ToString("N") },
+                Limit = 1,
+                DtoOptions = new DtoOptions()
+            };
+
+            return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
         }
 
-        private ProgramInfo GetProgramInfoFromCache(string channelId, DateTime startDateUtc)
+        private LiveTvProgram GetProgramInfoFromCache(TimerInfo timer)
         {
-            var epgData = GetEpgDataForChannel(channelId);
-            var startDateTicks = startDateUtc.Ticks;
-            // Find the first program that starts within 3 minutes
-            return epgData.FirstOrDefault(p => Math.Abs(startDateTicks - p.StartDate.Ticks) <= TimeSpan.FromMinutes(3).Ticks);
+            return GetProgramInfoFromCache(timer.ProgramId, timer.ChannelId);
+        }
+
+        private LiveTvProgram GetProgramInfoFromCache(string programId, string channelId)
+        {
+            return GetProgramInfoFromCache(programId);
+        }
+
+        private LiveTvProgram GetProgramInfoFromCache(string channelId, DateTime startDateUtc)
+        {
+            var query = new InternalItemsQuery
+            {
+                IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
+                Limit = 1,
+                DtoOptions = new DtoOptions(true)
+                {
+                    EnableImages = false
+                },
+                MinStartDate = startDateUtc.AddMinutes(-3),
+                MaxStartDate = startDateUtc.AddMinutes(3),
+                OrderBy = new[] { new Tuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending) }
+            };
+
+            if (!string.IsNullOrWhiteSpace(channelId))
+            {
+                query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, channelId).ToString("N") };
+            }
+
+            return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
         }
 
         private LiveTvOptions GetConfiguration()
@@ -2421,9 +2393,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
         }
 
-        private async Task UpdateTimersForSeriesTimer(List<ProgramInfo> epgData, SeriesTimerInfo seriesTimer, bool updateTimerSettings, bool deleteInvalidTimers)
+        private async Task UpdateTimersForSeriesTimer(SeriesTimerInfo seriesTimer, bool updateTimerSettings, bool deleteInvalidTimers)
         {
-            var allTimers = GetTimersForSeries(seriesTimer, epgData)
+            var allTimers = GetTimersForSeries(seriesTimer)
                 .ToList();
 
             var registration = await _liveTvManager.GetRegistrationInfo("seriesrecordings").ConfigureAwait(false);
@@ -2520,23 +2492,160 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
         }
 
-        private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer, IEnumerable<ProgramInfo> allPrograms)
+        private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer)
         {
             if (seriesTimer == null)
             {
                 throw new ArgumentNullException("seriesTimer");
             }
-            if (allPrograms == null)
+
+            if (string.IsNullOrWhiteSpace(seriesTimer.SeriesId))
+            {
+                return new List<TimerInfo>();
+            }
+
+            var query = new InternalItemsQuery
+            {
+                IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
+                ExternalSeriesId = seriesTimer.SeriesId,
+                DtoOptions = new DtoOptions(true)
+                {
+                    EnableImages = false
+                },
+                MinEndDate = DateTime.UtcNow
+            };
+
+            if (!seriesTimer.RecordAnyChannel)
+            {
+                query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, seriesTimer.ChannelId).ToString("N") };
+            }
+
+            var tempChannelCache = new Dictionary<string, LiveTvChannel>();
+
+            return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().Select(i => CreateTimer(i, seriesTimer, tempChannelCache));
+        }
+
+        private TimerInfo CreateTimer(LiveTvProgram parent, SeriesTimerInfo seriesTimer, Dictionary<string, LiveTvChannel> tempChannelCache)
+        {
+            string channelId = seriesTimer.RecordAnyChannel ? null : seriesTimer.ChannelId;
+
+            if (string.IsNullOrWhiteSpace(channelId) && !string.IsNullOrWhiteSpace(parent.ChannelId))
+            {
+                LiveTvChannel channel;
+
+                if (!tempChannelCache.TryGetValue(parent.ChannelId, out channel))
+                {
+                    channel = _libraryManager.GetItemList(new InternalItemsQuery
+                    {
+                        IncludeItemTypes = new string[] { typeof(LiveTvChannel).Name },
+                        ItemIds = new[] { parent.ChannelId },
+                        DtoOptions = new DtoOptions()
+
+                    }).Cast<LiveTvChannel>().FirstOrDefault();
+
+                    if (channel != null && !string.IsNullOrWhiteSpace(channel.ExternalId))
+                    {
+                        tempChannelCache[parent.ChannelId] = channel;
+                    }
+                }
+
+                if (channel != null || tempChannelCache.TryGetValue(parent.ChannelId, out channel))
+                {
+                    channelId = channel.ExternalId;
+                }
+            }
+
+            var timer = new TimerInfo
+            {
+                ChannelId = channelId,
+                Id = (seriesTimer.Id + parent.ExternalId).GetMD5().ToString("N"),
+                StartDate = parent.StartDate,
+                EndDate = parent.EndDate.Value,
+                ProgramId = parent.ExternalId,
+                PrePaddingSeconds = seriesTimer.PrePaddingSeconds,
+                PostPaddingSeconds = seriesTimer.PostPaddingSeconds,
+                IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired,
+                IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired,
+                KeepUntil = seriesTimer.KeepUntil,
+                Priority = seriesTimer.Priority,
+                Name = parent.Name,
+                Overview = parent.Overview,
+                SeriesId = parent.ExternalSeriesId,
+                SeriesTimerId = seriesTimer.Id,
+                ShowId = parent.ShowId
+            };
+
+            CopyProgramInfoToTimerInfo(parent, timer, tempChannelCache);
+
+            return timer;
+        }
+
+        private void CopyProgramInfoToTimerInfo(LiveTvProgram programInfo, TimerInfo timerInfo)
+        {
+            var tempChannelCache = new Dictionary<string, LiveTvChannel>();
+            CopyProgramInfoToTimerInfo(programInfo, timerInfo, tempChannelCache);
+        }
+
+        private void CopyProgramInfoToTimerInfo(LiveTvProgram programInfo, TimerInfo timerInfo, Dictionary<string, LiveTvChannel> tempChannelCache)
+        {
+            string channelId = null;
+
+            if (!string.IsNullOrWhiteSpace(programInfo.ChannelId))
+            {
+                LiveTvChannel channel;
+
+                if (!tempChannelCache.TryGetValue(programInfo.ChannelId, out channel))
+                {
+                    channel = _libraryManager.GetItemList(new InternalItemsQuery
+                    {
+                        IncludeItemTypes = new string[] { typeof(LiveTvChannel).Name },
+                        ItemIds = new[] { programInfo.ChannelId },
+                        DtoOptions = new DtoOptions()
+
+                    }).Cast<LiveTvChannel>().FirstOrDefault();
+
+                    if (channel != null && !string.IsNullOrWhiteSpace(channel.ExternalId))
+                    {
+                        tempChannelCache[programInfo.ChannelId] = channel;
+                    }
+                }
+
+                if (channel != null || tempChannelCache.TryGetValue(programInfo.ChannelId, out channel))
+                {
+                    channelId = channel.ExternalId;
+                }
+            }
+
+            timerInfo.Name = programInfo.Name;
+            timerInfo.StartDate = programInfo.StartDate;
+            timerInfo.EndDate = programInfo.EndDate.Value;
+
+            if (!string.IsNullOrWhiteSpace(channelId))
             {
-                throw new ArgumentNullException("allPrograms");
+                timerInfo.ChannelId = channelId;
             }
 
-            // Exclude programs that have already ended
-            allPrograms = allPrograms.Where(i => i.EndDate > DateTime.UtcNow);
+            timerInfo.SeasonNumber = programInfo.ParentIndexNumber;
+            timerInfo.EpisodeNumber = programInfo.IndexNumber;
+            timerInfo.IsMovie = programInfo.IsMovie;
+            timerInfo.IsKids = programInfo.IsKids;
+            timerInfo.IsNews = programInfo.IsNews;
+            timerInfo.IsSports = programInfo.IsSports;
+            timerInfo.ProductionYear = programInfo.ProductionYear;
+            timerInfo.EpisodeTitle = programInfo.EpisodeTitle;
+            timerInfo.OriginalAirDate = programInfo.PremiereDate;
+            timerInfo.IsProgramSeries = programInfo.IsSeries;
 
-            allPrograms = GetProgramsForSeries(seriesTimer, allPrograms);
+            timerInfo.IsSeries = programInfo.IsSeries;
+            timerInfo.IsLive = programInfo.IsLive;
+            timerInfo.IsPremiere = programInfo.IsPremiere;
 
-            return allPrograms.Select(i => RecordingHelper.CreateTimer(i, seriesTimer));
+            timerInfo.HomePageUrl = programInfo.HomePageUrl;
+            timerInfo.CommunityRating = programInfo.CommunityRating;
+            timerInfo.Overview = programInfo.Overview;
+            timerInfo.OfficialRating = programInfo.OfficialRating;
+            timerInfo.IsRepeat = programInfo.IsRepeat;
+            timerInfo.SeriesId = programInfo.ExternalSeriesId;
         }
 
         private bool IsProgramAlreadyInLibrary(TimerInfo program)
@@ -2577,47 +2686,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             return false;
         }
 
-        private IEnumerable<ProgramInfo> GetProgramsForSeries(SeriesTimerInfo seriesTimer, IEnumerable<ProgramInfo> allPrograms)
-        {
-            if (string.IsNullOrWhiteSpace(seriesTimer.SeriesId))
-            {
-                _logger.Error("seriesTimer.SeriesId is null. Cannot find programs for series");
-                return new List<ProgramInfo>();
-            }
-
-            return allPrograms.Where(i => string.Equals(i.SeriesId, seriesTimer.SeriesId, StringComparison.OrdinalIgnoreCase));
-        }
-
-        private string GetChannelEpgCachePath(string channelId)
-        {
-            return Path.Combine(_config.CommonApplicationPaths.CachePath, "embytvepg", channelId + ".json");
-        }
-
-        private readonly object _epgLock = new object();
-        private void SaveEpgDataForChannel(string channelId, List<ProgramInfo> epgData)
-        {
-            var path = GetChannelEpgCachePath(channelId);
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
-            lock (_epgLock)
-            {
-                _jsonSerializer.SerializeToFile(epgData, path);
-            }
-        }
-        private List<ProgramInfo> GetEpgDataForChannel(string channelId)
-        {
-            try
-            {
-                lock (_epgLock)
-                {
-                    return _jsonSerializer.DeserializeFromFile<List<ProgramInfo>>(GetChannelEpgCachePath(channelId));
-                }
-            }
-            catch
-            {
-                return new List<ProgramInfo>();
-            }
-        }
-
         private bool _disposed;
         public void Dispose()
         {

+ 1 - 60
Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs

@@ -1,8 +1,6 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.LiveTv;
 using System;
 using System.Globalization;
-using MediaBrowser.Model.LiveTv;
 
 namespace Emby.Server.Implementations.LiveTv.EmbyTV
 {
@@ -13,63 +11,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             return timer.StartDate.AddSeconds(-timer.PrePaddingSeconds);
         }
 
-        public static TimerInfo CreateTimer(ProgramInfo parent, SeriesTimerInfo seriesTimer)
-        {
-            var timer = new TimerInfo
-            {
-                ChannelId = parent.ChannelId,
-                Id = (seriesTimer.Id + parent.Id).GetMD5().ToString("N"),
-                StartDate = parent.StartDate,
-                EndDate = parent.EndDate,
-                ProgramId = parent.Id,
-                PrePaddingSeconds = seriesTimer.PrePaddingSeconds,
-                PostPaddingSeconds = seriesTimer.PostPaddingSeconds,
-                IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired,
-                IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired,
-                KeepUntil = seriesTimer.KeepUntil,
-                Priority = seriesTimer.Priority,
-                Name = parent.Name,
-                Overview = parent.Overview,
-                SeriesId = parent.SeriesId,
-                SeriesTimerId = seriesTimer.Id,
-                ShowId = parent.ShowId
-            };
-
-            CopyProgramInfoToTimerInfo(parent, timer);
-
-            return timer;
-        }
-
-        public static void CopyProgramInfoToTimerInfo(ProgramInfo programInfo, TimerInfo timerInfo)
-        {
-            timerInfo.Name = programInfo.Name;
-            timerInfo.StartDate = programInfo.StartDate;
-            timerInfo.EndDate = programInfo.EndDate;
-            timerInfo.ChannelId = programInfo.ChannelId;
-
-            timerInfo.SeasonNumber = programInfo.SeasonNumber;
-            timerInfo.EpisodeNumber = programInfo.EpisodeNumber;
-            timerInfo.IsMovie = programInfo.IsMovie;
-            timerInfo.IsKids = programInfo.IsKids;
-            timerInfo.IsNews = programInfo.IsNews;
-            timerInfo.IsSports = programInfo.IsSports;
-            timerInfo.ProductionYear = programInfo.ProductionYear;
-            timerInfo.EpisodeTitle = programInfo.EpisodeTitle;
-            timerInfo.OriginalAirDate = programInfo.OriginalAirDate;
-            timerInfo.IsProgramSeries = programInfo.IsSeries;
-
-            timerInfo.IsSeries = programInfo.IsSeries;
-            timerInfo.IsLive = programInfo.IsLive;
-            timerInfo.IsPremiere = programInfo.IsPremiere;
-
-            timerInfo.HomePageUrl = programInfo.HomePageUrl;
-            timerInfo.CommunityRating = programInfo.CommunityRating;
-            timerInfo.Overview = programInfo.Overview;
-            timerInfo.OfficialRating = programInfo.OfficialRating;
-            timerInfo.IsRepeat = programInfo.IsRepeat;
-            timerInfo.SeriesId = programInfo.SeriesId;
-        }
-
         public static string GetRecordingName(TimerInfo info)
         {
             var name = info.Name;

+ 1 - 5
Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs

@@ -9,14 +9,12 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.Logging;
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Extensions;
-using MediaBrowser.Model.Querying;
 
 namespace Emby.Server.Implementations.LiveTv
 {
@@ -25,15 +23,13 @@ namespace Emby.Server.Implementations.LiveTv
         private readonly ILogger _logger;
         private readonly IImageProcessor _imageProcessor;
 
-        private readonly IUserDataManager _userDataManager;
         private readonly IDtoService _dtoService;
         private readonly IApplicationHost _appHost;
         private readonly ILibraryManager _libraryManager;
 
-        public LiveTvDtoService(IDtoService dtoService, IUserDataManager userDataManager, IImageProcessor imageProcessor, ILogger logger, IApplicationHost appHost, ILibraryManager libraryManager)
+        public LiveTvDtoService(IDtoService dtoService, IImageProcessor imageProcessor, ILogger logger, IApplicationHost appHost, ILibraryManager libraryManager)
         {
             _dtoService = dtoService;
-            _userDataManager = userDataManager;
             _imageProcessor = imageProcessor;
             _logger = logger;
             _appHost = appHost;

+ 17 - 1
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -99,7 +99,7 @@ namespace Emby.Server.Implementations.LiveTv
             _dtoService = dtoService;
             _userDataManager = userDataManager;
 
-            _tvDtoService = new LiveTvDtoService(dtoService, userDataManager, imageProcessor, logger, appHost, _libraryManager);
+            _tvDtoService = new LiveTvDtoService(dtoService, imageProcessor, logger, appHost, _libraryManager);
         }
 
         /// <summary>
@@ -600,6 +600,12 @@ namespace Emby.Server.Implementations.LiveTv
                 };
             }
 
+            if (!string.Equals(info.ShowId, item.ShowId, StringComparison.OrdinalIgnoreCase))
+            {
+                item.ShowId = info.ShowId;
+                forceUpdate = true;
+            }
+
             var seriesId = info.SeriesId;
 
             if (!item.ParentId.Equals(channel.Id))
@@ -3143,5 +3149,15 @@ namespace Emby.Server.Implementations.LiveTv
             var provider = _listingProviders.First(i => string.Equals(i.Type, info.Type, StringComparison.OrdinalIgnoreCase));
             return provider.GetChannels(info, cancellationToken);
         }
+
+        public Guid GetInternalChannelId(string serviceName, string externalId)
+        {
+            return _tvDtoService.GetInternalChannelId(serviceName, externalId);
+        }
+
+        public Guid GetInternalProgramId(string serviceName, string externalId)
+        {
+            return _tvDtoService.GetInternalProgramId(serviceName, externalId);
+        }
     }
 }

+ 0 - 1
MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs

@@ -42,7 +42,6 @@ namespace MediaBrowser.Controller.LiveTv
         public string Id { get; set; }
         public string Path { get; set; }
         public TimerInfo Timer { get; set; }
-        public ProgramInfo Program { get; set; }
         public CancellationTokenSource CancellationTokenSource { get; set; }
     }
 }

+ 3 - 0
MediaBrowser.Controller/LiveTv/LiveTvProgram.cs

@@ -88,6 +88,9 @@ namespace MediaBrowser.Controller.LiveTv
         [IgnoreDataMember]
         public string EpisodeTitle { get; set; }
 
+        [IgnoreDataMember]
+        public string ShowId { get; set; }
+
         /// <summary>
         /// Gets or sets a value indicating whether this instance is movie.
         /// </summary>

+ 0 - 3
MediaBrowser.Model/Net/ISocket.cs

@@ -24,8 +24,5 @@ namespace MediaBrowser.Model.Net
         /// Sends a UDP message to a particular end point (uni or multicast).
         /// </summary>
         Task SendToAsync(byte[] buffer, int offset, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
-
-        IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, AsyncCallback callback, object state);
-        int EndSendTo(IAsyncResult result);
     }
 }

+ 13 - 4
RSSDP/RSSDP.csproj

@@ -12,9 +12,8 @@
     <AssemblyName>RSSDP</AssemblyName>
     <DefaultLanguage>en-US</DefaultLanguage>
     <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -77,8 +76,18 @@
       <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">

+ 0 - 6
RSSDP/RSSDP.nuget.targets

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Target Name="EmitMSBuildWarning" BeforeTargets="Build">
-    <Warning Text="Packages containing MSBuild targets and props files cannot be fully installed in projects targeting multiple frameworks. The MSBuild targets and props files have been ignored." />
-  </Target>
-</Project>

+ 1 - 1
SharedVersion.cs

@@ -1,3 +1,3 @@
 using System.Reflection;
 
-[assembly: AssemblyVersion("3.2.30.9")]
+[assembly: AssemblyVersion("3.2.30.10")]