aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Sync
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sync')
-rw-r--r--MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs7
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs36
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs15
3 files changed, 57 insertions, 1 deletions
diff --git a/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs
index 7b1fa4dec..03485012f 100644
--- a/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs
+++ b/MediaBrowser.Server.Implementations/Sync/AppSyncProvider.cs
@@ -9,7 +9,7 @@ using System.Linq;
namespace MediaBrowser.Server.Implementations.Sync
{
- public class AppSyncProvider : ISyncProvider, IHasUniqueTargetIds, IHasSyncQuality
+ public class AppSyncProvider : ISyncProvider, IHasUniqueTargetIds, IHasSyncQuality, IHasDuplicateCheck
{
private readonly IDeviceManager _deviceManager;
@@ -104,5 +104,10 @@ namespace MediaBrowser.Server.Implementations.Sync
IsConverting = isConverting
};
}
+
+ public bool AllowDuplicateJobItem(SyncJobItem original, SyncJobItem duplicate)
+ {
+ return false;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index 04ebcd903..1061a373e 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -466,6 +466,32 @@ namespace MediaBrowser.Server.Implementations.Sync
return;
}
+ // See if there's already another active job item for the same target
+ var existingJobItems = _syncManager.GetJobItems(new SyncJobItemQuery
+ {
+ AddMetadata = false,
+ ItemId = jobItem.ItemId,
+ TargetId = job.TargetId,
+ Statuses = new[] { SyncJobItemStatus.Converting, SyncJobItemStatus.Queued, SyncJobItemStatus.ReadyToTransfer, SyncJobItemStatus.Synced, SyncJobItemStatus.Transferring }
+ });
+
+ var duplicateJobItems = existingJobItems.Items
+ .Where(i => !string.Equals(i.Id, jobItem.Id, StringComparison.OrdinalIgnoreCase))
+ .ToList();
+
+ if (duplicateJobItems.Count > 0)
+ {
+ var syncProvider = _syncManager.GetSyncProvider(jobItem, job) as IHasDuplicateCheck;
+
+ if (!duplicateJobItems.Any(i => AllowDuplicateJobItem(syncProvider, i, jobItem)))
+ {
+ _logger.Debug("Cancelling sync job item because there is already another active job for the same target.");
+ jobItem.Status = SyncJobItemStatus.Cancelled;
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
+ return;
+ }
+ }
+
var video = item as Video;
if (video != null)
{
@@ -488,6 +514,16 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
+ private bool AllowDuplicateJobItem(IHasDuplicateCheck provider, SyncJobItem original, SyncJobItem duplicate)
+ {
+ if (provider != null)
+ {
+ return provider.AllowDuplicateJobItem(original, duplicate);
+ }
+
+ return true;
+ }
+
private async Task Sync(SyncJobItem jobItem, SyncJob job, Video item, User user, bool enableConversion, SyncOptions syncOptions, IProgress<double> progress, CancellationToken cancellationToken)
{
var jobOptions = _syncManager.GetVideoOptions(jobItem, job);
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 5bd35a325..18fcb4e79 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -1159,6 +1159,21 @@ namespace MediaBrowser.Server.Implementations.Sync
return options;
}
+ public ISyncProvider GetSyncProvider(SyncJobItem jobItem, SyncJob job)
+ {
+ foreach (var provider in _providers)
+ {
+ foreach (var target in GetSyncTargets(provider))
+ {
+ if (string.Equals(target.Id, jobItem.TargetId, StringComparison.OrdinalIgnoreCase))
+ {
+ return provider;
+ }
+ }
+ }
+ return null;
+ }
+
public SyncJobOptions GetVideoOptions(SyncJobItem jobItem, SyncJob job)
{
var options = GetSyncJobOptions(jobItem.TargetId, job.Profile, job.Quality);