From fafa879eef6c1fd7590bab78f842cf997251f5ab Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Aug 2015 13:50:37 -0400 Subject: [PATCH] keep channels db clean --- .../Channels/ChannelPostScanTask.cs | 61 ++++++++++++++++++- .../Channels/RefreshChannelsScheduledTask.cs | 6 +- .../Library/Validators/GameGenresValidator.cs | 2 + .../Library/Validators/GenresValidator.cs | 2 + .../Validators/MusicGenresValidator.cs | 2 + .../Library/Validators/PeopleValidator.cs | 42 +++++++++++-- .../Library/Validators/StudiosValidator.cs | 2 + .../LiveTv/EmbyTV/EmbyTV.cs | 2 +- 8 files changed, 110 insertions(+), 9 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs b/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs index b9f03fbc61..976fa56153 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs @@ -18,12 +18,14 @@ namespace MediaBrowser.Server.Implementations.Channels private readonly IChannelManager _channelManager; private readonly IUserManager _userManager; private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; - public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger) + public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger, ILibraryManager libraryManager) { _channelManager = channelManager; _userManager = userManager; _logger = logger; + _libraryManager = libraryManager; } public async Task Run(IProgress progress, CancellationToken cancellationToken) @@ -52,6 +54,8 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(percent * 100); } + await CleanDatabase(cancellationToken).ConfigureAwait(false); + progress.Report(100); } @@ -63,7 +67,7 @@ namespace MediaBrowser.Server.Implementations.Channels return string.Join("|", channels.ToArray()); } - + private async Task DownloadContent(string user, CancellationToken cancellationToken, IProgress progress) { var channels = await _channelManager.GetChannelsInternal(new ChannelQuery @@ -116,6 +120,59 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(100); } + private async Task CleanDatabase(CancellationToken cancellationToken) + { + var allChannels = await _channelManager.GetChannelsInternal(new ChannelQuery { }, cancellationToken); + + var allIds = _libraryManager.GetItemIds(new InternalItemsQuery + { + IncludeItemTypes = new[] { typeof(Channel).Name } + }); + + var invalidIds = allIds + .Except(allChannels.Items.Select(i => i.Id).ToList()) + .ToList(); + + foreach (var id in invalidIds) + { + cancellationToken.ThrowIfCancellationRequested(); + + await CleanChannel(id, cancellationToken).ConfigureAwait(false); + } + } + + private async Task CleanChannel(Guid id, CancellationToken cancellationToken) + { + _logger.Debug("Cleaning channel {0} from database", id); + + // Delete all channel items + var allIds = _libraryManager.GetItemIds(new InternalItemsQuery + { + ChannelIds = new[] { id.ToString("N") } + }); + + foreach (var deleteId in allIds) + { + cancellationToken.ThrowIfCancellationRequested(); + + await DeleteItem(deleteId).ConfigureAwait(false); + } + + // Finally, delete the channel itself + await DeleteItem(id).ConfigureAwait(false); + } + + private Task DeleteItem(Guid id) + { + var item = _libraryManager.GetItemById(id); + + return _libraryManager.DeleteItem(item, new DeleteOptions + { + DeleteFileLocation = false + + }); + } + private async Task GetAllItems(string user, string channelId, string folderId, int currentRefreshLevel, int maxRefreshLevel, IProgress progress, CancellationToken cancellationToken) { var folderItems = new List(); diff --git a/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs b/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs index df94580a57..005bbb852e 100644 --- a/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs @@ -13,12 +13,14 @@ namespace MediaBrowser.Server.Implementations.Channels private readonly IChannelManager _channelManager; private readonly IUserManager _userManager; private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; - public RefreshChannelsScheduledTask(IChannelManager channelManager, IUserManager userManager, ILogger logger) + public RefreshChannelsScheduledTask(IChannelManager channelManager, IUserManager userManager, ILogger logger, ILibraryManager libraryManager) { _channelManager = channelManager; _userManager = userManager; _logger = logger; + _libraryManager = libraryManager; } public string Name @@ -42,7 +44,7 @@ namespace MediaBrowser.Server.Implementations.Channels await manager.RefreshChannels(new Progress(), cancellationToken).ConfigureAwait(false); - await new ChannelPostScanTask(_channelManager, _userManager, _logger).Run(progress, cancellationToken) + await new ChannelPostScanTask(_channelManager, _userManager, _logger, _libraryManager).Run(progress, cancellationToken) .ConfigureAwait(false); } diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs index ee06fecdfc..b57e128d3e 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs @@ -84,6 +84,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators foreach (var id in invalidIds) { + cancellationToken.ThrowIfCancellationRequested(); + var item = _libraryManager.GetItemById(id); await _libraryManager.DeleteItem(item, new DeleteOptions diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs index 6ab70ea22f..11d4c9f166 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs @@ -85,6 +85,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators foreach (var id in invalidIds) { + cancellationToken.ThrowIfCancellationRequested(); + var item = _libraryManager.GetItemById(id); await _libraryManager.DeleteItem(item, new DeleteOptions diff --git a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs index 8be0f43494..0a66b4b41c 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs @@ -85,6 +85,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators foreach (var id in invalidIds) { + cancellationToken.ThrowIfCancellationRequested(); + var item = _libraryManager.GetItemById(id); await _libraryManager.DeleteItem(item, new DeleteOptions diff --git a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs index ef9dee8b51..a4c43af5d7 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/PeopleValidator.cs @@ -92,15 +92,25 @@ namespace MediaBrowser.Server.Implementations.Library.Validators foreach (var person in people) { - bool current; - if (!dict.TryGetValue(person.Name, out current) || !current) + var isMetadataEnabled = DownloadMetadata(person, peopleOptions); + + bool currentValue; + if (dict.TryGetValue(person.Name, out currentValue)) + { + if (!currentValue && isMetadataEnabled) + { + dict[person.Name] = true; + } + } + else { - dict[person.Name] = DownloadMetadata(person, peopleOptions); + dict[person.Name] = isMetadataEnabled; } } var numComplete = 0; - + var validIds = new List(); + foreach (var person in dict) { cancellationToken.ThrowIfCancellationRequested(); @@ -109,6 +119,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators { var item = _libraryManager.GetPerson(person.Key); + validIds.Add(item.Id); + var options = new MetadataRefreshOptions { MetadataRefreshMode = person.Value ? MetadataRefreshMode.Default : MetadataRefreshMode.ValidationOnly, @@ -130,6 +142,28 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100 * percent); } + var allIds = _libraryManager.GetItemIds(new InternalItemsQuery + { + IncludeItemTypes = new[] { typeof(Person).Name } + }); + + var invalidIds = allIds + .Except(validIds) + .ToList(); + + foreach (var id in invalidIds) + { + cancellationToken.ThrowIfCancellationRequested(); + + var item = _libraryManager.GetItemById(id); + + await _libraryManager.DeleteItem(item, new DeleteOptions + { + DeleteFileLocation = false + + }).ConfigureAwait(false); + } + progress.Report(100); _logger.Info("People validation complete"); diff --git a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs index c90cbb2f05..c122d64d30 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs @@ -84,6 +84,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators foreach (var id in invalidIds) { + cancellationToken.ThrowIfCancellationRequested(); + var item = _libraryManager.GetItemById(id); await _libraryManager.DeleteItem(item, new DeleteOptions diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 9b7e838948..d4b02568a9 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -21,7 +21,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV { - public class EmbyTV : ILiveTvService, IHasRegistrationInfo, IDisposable + public class EmbyTV : ILiveTvService/*, IHasRegistrationInfo*/, IDisposable { private readonly IApplicationHost _appHpst; private readonly ILogger _logger;