diff --git a/MediaBrowser.Dlna/PlayTo/SsdpHttpClient.cs b/MediaBrowser.Dlna/PlayTo/SsdpHttpClient.cs index f440beed15..2c57f998c2 100644 --- a/MediaBrowser.Dlna/PlayTo/SsdpHttpClient.cs +++ b/MediaBrowser.Dlna/PlayTo/SsdpHttpClient.cs @@ -98,7 +98,7 @@ namespace MediaBrowser.Dlna.PlayTo } } - public Task PostSoapDataAsync(Uri url, string soapAction, string postData, string header = null, int timeOut = 20000) + private Task PostSoapDataAsync(Uri url, string soapAction, string postData, string header = null, int timeOut = 20000) { if (!soapAction.StartsWith("\"")) soapAction = "\"" + soapAction + "\""; diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index dbdaa87a13..f626c95343 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; @@ -188,7 +187,7 @@ namespace MediaBrowser.Providers.All { PopulateBackdrops(images, files, imagePrefix, "backdrop", "backdrop", ImageType.Backdrop); - if (string.IsNullOrEmpty(item.Path)) + if (!string.IsNullOrEmpty(item.Path)) { var name = Path.GetFileNameWithoutExtension(item.Path); diff --git a/MediaBrowser.Server.Implementations/LiveTv/CleanDatabaseScheduledTask.cs b/MediaBrowser.Server.Implementations/LiveTv/CleanDatabaseScheduledTask.cs new file mode 100644 index 0000000000..56e92f82c4 --- /dev/null +++ b/MediaBrowser.Server.Implementations/LiveTv/CleanDatabaseScheduledTask.cs @@ -0,0 +1,58 @@ +using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Controller.LiveTv; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.LiveTv +{ + class CleanDatabaseScheduledTask : IScheduledTask, IConfigurableScheduledTask + { + private readonly ILiveTvManager _liveTvManager; + + public CleanDatabaseScheduledTask(ILiveTvManager liveTvManager) + { + _liveTvManager = liveTvManager; + } + + public string Name + { + get { return "Clean TV Database"; } + } + + public string Description + { + get { return "Deletes old programs from the tv database."; } + } + + public string Category + { + get { return "Live TV"; } + } + + public Task Execute(System.Threading.CancellationToken cancellationToken, IProgress progress) + { + var manager = (LiveTvManager)_liveTvManager; + + return manager.CleanDatabase(progress, cancellationToken); + } + + public IEnumerable GetDefaultTriggers() + { + return new ITaskTrigger[] + { + new IntervalTrigger{ Interval = TimeSpan.FromHours(24)} + }; + } + + public bool IsHidden + { + get { return _liveTvManager.ActiveService == null; } + } + + public bool IsEnabled + { + get { return true; } + } + } +} diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index 3b284dbf1a..192f84a6ff 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -37,7 +37,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv private readonly IUserManager _userManager; private readonly IUserDataManager _userDataManager; private readonly ILibraryManager _libraryManager; - private readonly IMediaEncoder _mediaEncoder; private readonly ITaskManager _taskManager; private readonly LiveTvDtoService _tvDtoService; @@ -50,7 +49,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv private List _channelIdList = new List(); private Dictionary _programs = new Dictionary(); - public LiveTvManager(IServerConfigurationManager config, IFileSystem fileSystem, ILogger logger, IItemRepository itemRepo, IImageProcessor imageProcessor, IUserDataManager userDataManager, IDtoService dtoService, IUserManager userManager, ILibraryManager libraryManager, IMediaEncoder mediaEncoder, ITaskManager taskManager) + private SemaphoreSlim _refreshSemaphore = new SemaphoreSlim(1, 1); + + public LiveTvManager(IServerConfigurationManager config, IFileSystem fileSystem, ILogger logger, IItemRepository itemRepo, IImageProcessor imageProcessor, IUserDataManager userDataManager, IDtoService dtoService, IUserManager userManager, ILibraryManager libraryManager, ITaskManager taskManager) { _config = config; _fileSystem = fileSystem; @@ -58,7 +59,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv _itemRepo = itemRepo; _userManager = userManager; _libraryManager = libraryManager; - _mediaEncoder = mediaEncoder; _taskManager = taskManager; _userDataManager = userDataManager; @@ -706,6 +706,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv } internal async Task RefreshChannels(IProgress progress, CancellationToken cancellationToken) + { + await _refreshSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + + try + { + await RefreshChannelsInternal(progress, cancellationToken).ConfigureAwait(false); + } + finally + { + _refreshSemaphore.Release(); + } + } + + private async Task RefreshChannelsInternal(IProgress progress, CancellationToken cancellationToken) { // Avoid implicitly captured closure var service = ActiveService; @@ -795,21 +809,39 @@ namespace MediaBrowser.Server.Implementations.LiveTv double percent = numComplete; percent /= allChannelsList.Count; - progress.Report(70 * percent + 10); + progress.Report(80 * percent + 10); } _programs = programs.ToDictionary(i => i.Id); - progress.Report(80); + progress.Report(90); // Load these now which will prefetch metadata await GetRecordings(new RecordingQuery(), cancellationToken).ConfigureAwait(false); - progress.Report(85); - - await DeleteOldPrograms(_programs.Keys.ToList(), progress, cancellationToken).ConfigureAwait(false); - progress.Report(100); } + public async Task CleanDatabase(IProgress progress, CancellationToken cancellationToken) + { + var service = ActiveService; + + if (service == null) + { + progress.Report(100); + return; + } + + await _refreshSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + + try + { + await DeleteOldPrograms(_programs.Keys.ToList(), progress, cancellationToken).ConfigureAwait(false); + } + finally + { + _refreshSemaphore.Release(); + } + } + private async Task DeleteOldPrograms(List currentIdList, IProgress progress, CancellationToken cancellationToken) { var list = _itemRepo.GetItemsOfType(typeof(LiveTvProgram)).ToList(); @@ -829,7 +861,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv double percent = numComplete; percent /= list.Count; - progress.Report(15 * percent + 85); + progress.Report(100 * percent); } } diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index d83f010529..01fd82b19c 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -178,6 +178,7 @@ + diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 97fd02e0d8..f199dc048d 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -438,7 +438,7 @@ namespace MediaBrowser.ServerApplication MediaEncoder); RegisterSingleInstance(EncodingManager); - LiveTvManager = new LiveTvManager(ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, MediaEncoder, TaskManager); + LiveTvManager = new LiveTvManager(ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, TaskManager); RegisterSingleInstance(LiveTvManager); var displayPreferencesTask = Task.Run(async () => await ConfigureDisplayPreferencesRepositories().ConfigureAwait(false)); diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index df527920a1..db84d93e62 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.332 + 3.0.333 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 21ade2ca43..c87a9c3042 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.332 + 3.0.333 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index c327329e92..573356d229 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.332 + 3.0.333 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +