public async Task EnsureJobItems(SyncJob job, User user) { var items = (await GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false)) .ToList(); var jobItems = _syncManager.GetJobItems(new SyncJobItemQuery { JobId = job.Id, AddMetadata = false }).Items.ToList(); foreach (var item in items) { // Respect ItemLimit, if set if (job.ItemLimit.HasValue) { if (jobItems.Count(j => j.Status != SyncJobItemStatus.RemovedFromDevice && j.Status != SyncJobItemStatus.Failed) >= job.ItemLimit.Value) { break; } } var itemId = item.Id.ToString("N"); var jobItem = jobItems.FirstOrDefault(i => string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)); if (jobItem != null) { continue; } var index = jobItems.Count == 0 ? 0 : jobItems.Select(i => i.JobItemIndex).Max() + 1; jobItem = new SyncJobItem { Id = Guid.NewGuid().ToString("N"), ItemId = itemId, ItemName = GetSyncJobItemName(item), JobId = job.Id, TargetId = job.TargetId, DateCreated = DateTime.UtcNow, JobItemIndex = index }; await _syncRepo.Create(jobItem).ConfigureAwait(false); _syncManager.OnSyncJobItemCreated(jobItem); jobItems.Add(jobItem); } jobItems = jobItems .OrderBy(i => i.DateCreated) .ToList(); await UpdateJobStatus(job, jobItems).ConfigureAwait(false); }
public async Task <IEnumerable <MediaSourceInfo> > GetMediaSources(IHasMediaSources item, CancellationToken cancellationToken) { var jobItemResult = _syncManager.GetJobItems(new SyncJobItemQuery { AddMetadata = false, Statuses = new[] { SyncJobItemStatus.Synced }, ItemId = item.Id.ToString("N") }); var list = new List <MediaSourceInfo>(); if (jobItemResult.Items.Length > 0) { var targets = _syncManager.ServerSyncProviders .SelectMany(i => i.GetAllSyncTargets().Select(t => new Tuple <IServerSyncProvider, SyncTarget>(i, t))) .ToList(); var serverId = _appHost.SystemId; foreach (var jobItem in jobItemResult.Items) { var targetTuple = targets.FirstOrDefault(i => string.Equals(i.Item2.Id, jobItem.TargetId, StringComparison.OrdinalIgnoreCase)); if (targetTuple != null) { var syncTarget = targetTuple.Item2; var syncProvider = targetTuple.Item1; var dataProvider = _syncManager.GetDataProvider(targetTuple.Item1, syncTarget); var localItems = await dataProvider.GetItems(syncTarget, serverId, item.Id.ToString("N")).ConfigureAwait(false); foreach (var localItem in localItems) { foreach (var mediaSource in localItem.Item.MediaSources) { AddMediaSource(list, localItem, mediaSource, syncProvider, syncTarget); } } } } } return(list); }