CleanDatabaseScheduledTask.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using MediaBrowser.Common.Progress;
  2. using MediaBrowser.Common.ScheduledTasks;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Controller.LiveTv;
  6. using MediaBrowser.Controller.Persistence;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using MediaBrowser.Model.Logging;
  12. namespace MediaBrowser.Server.Implementations.Persistence
  13. {
  14. class CleanDatabaseScheduledTask : IScheduledTask
  15. {
  16. private readonly ILibraryManager _libraryManager;
  17. private readonly IItemRepository _itemRepo;
  18. private readonly ILogger _logger;
  19. public CleanDatabaseScheduledTask(ILibraryManager libraryManager, IItemRepository itemRepo, ILogger logger)
  20. {
  21. _libraryManager = libraryManager;
  22. _itemRepo = itemRepo;
  23. _logger = logger;
  24. }
  25. public string Name
  26. {
  27. get { return "Clean Database"; }
  28. }
  29. public string Description
  30. {
  31. get { return "Deletes obsolete content from the database."; }
  32. }
  33. public string Category
  34. {
  35. get { return "Library"; }
  36. }
  37. public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
  38. {
  39. var innerProgress = new ActionableProgress<double>();
  40. innerProgress.RegisterAction(progress.Report);
  41. await UpdateToLatestSchema(cancellationToken, innerProgress).ConfigureAwait(false);
  42. }
  43. private async Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
  44. {
  45. var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
  46. {
  47. IsCurrentSchema = false,
  48. Limit = 100000,
  49. // These are constantly getting regenerated so don't bother with them here
  50. ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name }
  51. });
  52. var numComplete = 0;
  53. var numItems = itemIds.Count;
  54. _logger.Debug("Upgrading schema for {0} items", numItems);
  55. foreach (var itemId in itemIds)
  56. {
  57. cancellationToken.ThrowIfCancellationRequested();
  58. var item = _libraryManager.GetItemById(itemId);
  59. if (item != null)
  60. {
  61. await _itemRepo.SaveItem(item, cancellationToken).ConfigureAwait(false);
  62. }
  63. numComplete++;
  64. double percent = numComplete;
  65. percent /= numItems;
  66. progress.Report(percent * 100);
  67. }
  68. progress.Report(100);
  69. }
  70. public IEnumerable<ITaskTrigger> GetDefaultTriggers()
  71. {
  72. return new ITaskTrigger[]
  73. {
  74. new IntervalTrigger{ Interval = TimeSpan.FromDays(1)}
  75. };
  76. }
  77. }
  78. }