ChannelPostScanTask.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. public static string GetUserDistinctValue(User user)
  32. {
  33. var channels = user.Policy.EnabledChannels
  34. .OrderBy(i => i);
  35. return string.Join("|", channels);
  36. }
  37. private void CleanDatabase(CancellationToken cancellationToken)
  38. {
  39. var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds();
  40. var uninstalledChannels = _libraryManager.GetItemList(new InternalItemsQuery
  41. {
  42. IncludeItemTypes = new[] { typeof(Channel).Name },
  43. ExcludeItemIds = installedChannelIds.ToArray()
  44. });
  45. foreach (var channel in uninstalledChannels)
  46. {
  47. cancellationToken.ThrowIfCancellationRequested();
  48. CleanChannel((Channel)channel, cancellationToken);
  49. }
  50. }
  51. private void CleanChannel(Channel channel, CancellationToken cancellationToken)
  52. {
  53. _logger.LogInformation("Cleaning channel {0} from database", channel.Id);
  54. // Delete all channel items
  55. var items = _libraryManager.GetItemList(new InternalItemsQuery
  56. {
  57. ChannelIds = new[] { channel.Id }
  58. });
  59. foreach (var item in items)
  60. {
  61. cancellationToken.ThrowIfCancellationRequested();
  62. _libraryManager.DeleteItem(item, new DeleteOptions
  63. {
  64. DeleteFileLocation = false
  65. }, false);
  66. }
  67. // Finally, delete the channel itself
  68. _libraryManager.DeleteItem(channel, new DeleteOptions
  69. {
  70. DeleteFileLocation = false
  71. }, false);
  72. }
  73. }
  74. }