using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Channels { /// /// A task to remove all non-installed channels from the database. /// public class ChannelPostScanTask { private readonly IChannelManager _channelManager; private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; /// /// Initializes a new instance of the class. /// /// The channel manager. /// The logger. /// The library manager. public ChannelPostScanTask(IChannelManager channelManager, ILogger logger, ILibraryManager libraryManager) { _channelManager = channelManager; _logger = logger; _libraryManager = libraryManager; } /// /// Runs this task. /// /// The progress. /// The cancellation token. /// The completed task. public Task Run(IProgress progress, CancellationToken cancellationToken) { CleanDatabase(cancellationToken); progress.Report(100); return Task.CompletedTask; } private void CleanDatabase(CancellationToken cancellationToken) { var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds(); var uninstalledChannels = _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { BaseItemKind.Channel }, ExcludeItemIds = installedChannelIds.ToArray() }); foreach (var channel in uninstalledChannels) { cancellationToken.ThrowIfCancellationRequested(); CleanChannel((Channel)channel, cancellationToken); } } private void CleanChannel(Channel channel, CancellationToken cancellationToken) { _logger.LogInformation("Cleaning channel {0} from database", channel.Id); // Delete all channel items var items = _libraryManager.GetItemList(new InternalItemsQuery { ChannelIds = new[] { channel.Id } }); foreach (var item in items) { cancellationToken.ThrowIfCancellationRequested(); _libraryManager.DeleteItem( item, new DeleteOptions { DeleteFileLocation = false }, false); } // Finally, delete the channel itself _libraryManager.DeleteItem( channel, new DeleteOptions { DeleteFileLocation = false }, false); } } }