ChannelPostScanTask.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #pragma warning disable CS1591
  2. #pragma warning disable SA1600
  3. using System;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using MediaBrowser.Controller.Channels;
  8. using MediaBrowser.Controller.Entities;
  9. using MediaBrowser.Controller.Library;
  10. using Microsoft.Extensions.Logging;
  11. namespace Emby.Server.Implementations.Channels
  12. {
  13. public class ChannelPostScanTask
  14. {
  15. private readonly IChannelManager _channelManager;
  16. private readonly IUserManager _userManager;
  17. private readonly ILogger _logger;
  18. private readonly ILibraryManager _libraryManager;
  19. public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger, ILibraryManager libraryManager)
  20. {
  21. _channelManager = channelManager;
  22. _userManager = userManager;
  23. _logger = logger;
  24. _libraryManager = libraryManager;
  25. }
  26. public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  27. {
  28. CleanDatabase(cancellationToken);
  29. progress.Report(100);
  30. return Task.CompletedTask;
  31. }
  32. private void CleanDatabase(CancellationToken cancellationToken)
  33. {
  34. var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds();
  35. var uninstalledChannels = _libraryManager.GetItemList(new InternalItemsQuery
  36. {
  37. IncludeItemTypes = new[] { typeof(Channel).Name },
  38. ExcludeItemIds = installedChannelIds.ToArray()
  39. });
  40. foreach (var channel in uninstalledChannels)
  41. {
  42. cancellationToken.ThrowIfCancellationRequested();
  43. CleanChannel((Channel)channel, cancellationToken);
  44. }
  45. }
  46. private void CleanChannel(Channel channel, CancellationToken cancellationToken)
  47. {
  48. _logger.LogInformation("Cleaning channel {0} from database", channel.Id);
  49. // Delete all channel items
  50. var items = _libraryManager.GetItemList(new InternalItemsQuery
  51. {
  52. ChannelIds = new[] { channel.Id }
  53. });
  54. foreach (var item in items)
  55. {
  56. cancellationToken.ThrowIfCancellationRequested();
  57. _libraryManager.DeleteItem(
  58. item,
  59. new DeleteOptions
  60. {
  61. DeleteFileLocation = false
  62. },
  63. false);
  64. }
  65. // Finally, delete the channel itself
  66. _libraryManager.DeleteItem(
  67. channel,
  68. new DeleteOptions
  69. {
  70. DeleteFileLocation = false
  71. },
  72. false);
  73. }
  74. }
  75. }