ChannelPostScanTask.cs 2.8 KB

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