Esempio n. 1
0
        public async Task EnsureJobItems(SyncJob job)
        {
            var user = _userManager.GetUserById(job.UserId);

            if (user == null)
            {
                throw new InvalidOperationException("Cannot proceed with sync because user no longer exists.");
            }

            var items = (await GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false))
                        .ToList();

            var jobItems = _syncRepo.GetJobItems(new SyncJobItemQuery
            {
                JobId = job.Id
            }).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;
                }

                jobItem = new SyncJobItem
                {
                    Id          = Guid.NewGuid().ToString("N"),
                    ItemId      = itemId,
                    ItemName    = GetSyncJobItemName(item),
                    JobId       = job.Id,
                    TargetId    = job.TargetId,
                    DateCreated = DateTime.UtcNow
                };

                await _syncRepo.Create(jobItem).ConfigureAwait(false);

                jobItems.Add(jobItem);
            }

            jobItems = jobItems
                       .OrderBy(i => i.DateCreated)
                       .ToList();

            await UpdateJobStatus(job, jobItems).ConfigureAwait(false);
        }
Esempio n. 2
0
        public QueryResult <SyncJobItem> GetJobItems(SyncJobItemQuery query)
        {
            var result = _repo.GetJobItems(query);

            if (query.AddMetadata)
            {
                result.Items.ForEach(FillMetadata);
            }

            return(result);
        }
Esempio n. 3
0
        public QueryResult <SyncJobItem> GetJobItems(SyncJobItemQuery query)
        {
            var result = _repo.GetJobItems(query);

            if (query.AddMetadata)
            {
                foreach (var item in result.Items)
                {
                    FillMetadata(item);
                }
            }

            return(result);
        }
Esempio n. 4
0
        public async Task <SyncJobCreationResult> CreateJob(SyncJobRequest request)
        {
            var processor = GetSyncJobProcessor();

            var user = _userManager.GetUserById(request.UserId);

            var items = (await processor
                         .GetItemsForSync(request.Category, request.ParentId, request.ItemIds, user, request.UnwatchedOnly).ConfigureAwait(false))
                        .ToList();

            if (items.Any(i => !SupportsSync(i)))
            {
                throw new ArgumentException("Item does not support sync.");
            }

            if (string.IsNullOrWhiteSpace(request.Name))
            {
                if (request.ItemIds.Count == 1)
                {
                    request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0]));
                }
            }

            if (string.IsNullOrWhiteSpace(request.Name))
            {
                throw new ArgumentException("Please supply a name for the sync job.");
            }

            var target = GetSyncTargets(request.UserId)
                         .FirstOrDefault(i => string.Equals(request.TargetId, i.Id));

            if (target == null)
            {
                throw new ArgumentException("Sync target not found.");
            }

            var jobId = Guid.NewGuid().ToString("N");

            var job = new SyncJob
            {
                Id               = jobId,
                Name             = request.Name,
                TargetId         = target.Id,
                UserId           = request.UserId,
                UnwatchedOnly    = request.UnwatchedOnly,
                ItemLimit        = request.ItemLimit,
                RequestedItemIds = request.ItemIds ?? new List <string> {
                },
                DateCreated      = DateTime.UtcNow,
                DateLastModified = DateTime.UtcNow,
                SyncNewContent   = request.SyncNewContent,
                ItemCount        = items.Count,
                Quality          = request.Quality,
                Category         = request.Category,
                ParentId         = request.ParentId
            };

            if (!request.Category.HasValue && request.ItemIds != null)
            {
                var requestedItems = request.ItemIds
                                     .Select(_libraryManager.GetItemById)
                                     .Where(i => i != null);

                // It's just a static list
                if (!requestedItems.Any(i => i.IsFolder || i is IItemByName))
                {
                    job.SyncNewContent = false;
                }
            }

            await _repo.Create(job).ConfigureAwait(false);

            await processor.EnsureJobItems(job).ConfigureAwait(false);

            // If it already has a converting status then is must have been aborted during conversion
            var jobItemsResult = _repo.GetJobItems(new SyncJobItemQuery
            {
                Statuses = new List <SyncJobItemStatus> {
                    SyncJobItemStatus.Queued, SyncJobItemStatus.Converting
                },
                JobId = jobId
            });

            await processor.SyncJobItems(jobItemsResult.Items, false, new Progress <double>(), CancellationToken.None)
            .ConfigureAwait(false);

            jobItemsResult = _repo.GetJobItems(new SyncJobItemQuery
            {
                Statuses = new List <SyncJobItemStatus> {
                    SyncJobItemStatus.Queued, SyncJobItemStatus.Converting
                },
                JobId = jobId
            });

            var returnResult = new SyncJobCreationResult
            {
                Job      = GetJob(jobId),
                JobItems = jobItemsResult.Items.ToList()
            };

            if (SyncJobCreated != null)
            {
                EventHelper.FireEventIfNotNull(SyncJobCreated, this, new GenericEventArgs <SyncJobCreationResult>
                {
                    Argument = returnResult
                }, _logger);
            }

            return(returnResult);
        }