MultiProviderSync.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Common.Progress;
  3. using MediaBrowser.Controller;
  4. using MediaBrowser.Controller.Sync;
  5. using MediaBrowser.Model.Logging;
  6. using MediaBrowser.Model.Sync;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace MediaBrowser.Server.Implementations.Sync
  13. {
  14. public class MultiProviderSync
  15. {
  16. private readonly SyncManager _syncManager;
  17. private readonly IServerApplicationHost _appHost;
  18. private readonly ILogger _logger;
  19. private readonly IFileSystem _fileSystem;
  20. public MultiProviderSync(SyncManager syncManager, IServerApplicationHost appHost, ILogger logger, IFileSystem fileSystem)
  21. {
  22. _syncManager = syncManager;
  23. _appHost = appHost;
  24. _logger = logger;
  25. _fileSystem = fileSystem;
  26. }
  27. public async Task Sync(IEnumerable<IServerSyncProvider> providers, IProgress<double> progress, CancellationToken cancellationToken)
  28. {
  29. var targets = providers
  30. .SelectMany(i => i.GetAllSyncTargets().Select(t => new Tuple<IServerSyncProvider, SyncTarget>(i, t)))
  31. .ToList();
  32. var numComplete = 0;
  33. double startingPercent = 0;
  34. double percentPerItem = 1;
  35. if (targets.Count > 0)
  36. {
  37. percentPerItem /= targets.Count;
  38. }
  39. foreach (var target in targets)
  40. {
  41. cancellationToken.ThrowIfCancellationRequested();
  42. var currentPercent = startingPercent;
  43. var innerProgress = new ActionableProgress<double>();
  44. innerProgress.RegisterAction(pct =>
  45. {
  46. var totalProgress = pct * percentPerItem;
  47. totalProgress += currentPercent;
  48. progress.Report(totalProgress);
  49. });
  50. var dataProvider = _syncManager.GetDataProvider(target.Item1, target.Item2);
  51. await new MediaSync(_logger, _syncManager, _appHost, _fileSystem)
  52. .Sync(target.Item1, dataProvider, target.Item2, innerProgress, cancellationToken)
  53. .ConfigureAwait(false);
  54. numComplete++;
  55. startingPercent = numComplete;
  56. startingPercent /= targets.Count;
  57. startingPercent *= 100;
  58. progress.Report(startingPercent);
  59. }
  60. }
  61. }
  62. }