ChannelPostScanTask.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Jellyfin.Data.Enums;
  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. /// <summary>
  13. /// A task to remove all non-installed channels from the database.
  14. /// </summary>
  15. public class ChannelPostScanTask
  16. {
  17. private readonly IChannelManager _channelManager;
  18. private readonly ILogger _logger;
  19. private readonly ILibraryManager _libraryManager;
  20. /// <summary>
  21. /// Initializes a new instance of the <see cref="ChannelPostScanTask"/> class.
  22. /// </summary>
  23. /// <param name="channelManager">The channel manager.</param>
  24. /// <param name="logger">The logger.</param>
  25. /// <param name="libraryManager">The library manager.</param>
  26. public ChannelPostScanTask(IChannelManager channelManager, ILogger logger, ILibraryManager libraryManager)
  27. {
  28. _channelManager = channelManager;
  29. _logger = logger;
  30. _libraryManager = libraryManager;
  31. }
  32. /// <summary>
  33. /// Runs this task.
  34. /// </summary>
  35. /// <param name="progress">The progress.</param>
  36. /// <param name="cancellationToken">The cancellation token.</param>
  37. /// <returns>The completed task.</returns>
  38. public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
  39. {
  40. CleanDatabase(cancellationToken);
  41. progress.Report(100);
  42. return Task.CompletedTask;
  43. }
  44. private void CleanDatabase(CancellationToken cancellationToken)
  45. {
  46. var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds();
  47. var uninstalledChannels = _libraryManager.GetItemList(new InternalItemsQuery
  48. {
  49. IncludeItemTypes = new[] { BaseItemKind.Channel },
  50. ExcludeItemIds = installedChannelIds.ToArray()
  51. });
  52. foreach (var channel in uninstalledChannels)
  53. {
  54. cancellationToken.ThrowIfCancellationRequested();
  55. CleanChannel((Channel)channel, cancellationToken);
  56. }
  57. }
  58. private void CleanChannel(Channel channel, CancellationToken cancellationToken)
  59. {
  60. _logger.LogInformation("Cleaning channel {0} from database", channel.Id);
  61. // Delete all channel items
  62. var items = _libraryManager.GetItemList(new InternalItemsQuery
  63. {
  64. ChannelIds = new[] { channel.Id }
  65. });
  66. foreach (var item in items)
  67. {
  68. cancellationToken.ThrowIfCancellationRequested();
  69. _libraryManager.DeleteItem(
  70. item,
  71. new DeleteOptions
  72. {
  73. DeleteFileLocation = false
  74. },
  75. false);
  76. }
  77. // Finally, delete the channel itself
  78. _libraryManager.DeleteItem(
  79. channel,
  80. new DeleteOptions
  81. {
  82. DeleteFileLocation = false
  83. },
  84. false);
  85. }
  86. }
  87. }