diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sync')
4 files changed, 108 insertions, 44 deletions
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs index 5e129d9a1..6f3e926c0 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -2,10 +2,13 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Sync; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Model.Querying; using MediaBrowser.Model.Session; using MediaBrowser.Model.Sync; using MoreLinq; @@ -24,19 +27,16 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly ISyncManager _syncManager; private readonly ILogger _logger; private readonly IUserManager _userManager; + private readonly ITVSeriesManager _tvSeriesManager; - public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager) + public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager) { _libraryManager = libraryManager; _syncRepo = syncRepo; _syncManager = syncManager; _logger = logger; _userManager = userManager; - } - - public void ProcessJobItem(SyncJob job, SyncJobItem jobItem, SyncTarget target) - { - + _tvSeriesManager = tvSeriesManager; } public async Task EnsureJobItems(SyncJob job) @@ -48,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.Sync throw new InvalidOperationException("Cannot proceed with sync because user no longer exists."); } - var items = GetItemsForSync(job.RequestedItemIds, user, job.UnwatchedOnly) + var items = (await GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false)) .ToList(); var jobItems = _syncRepo.GetJobItems(new SyncJobItemQuery @@ -128,7 +128,7 @@ namespace MediaBrowser.Server.Implementations.Sync foreach (var item in jobItems) { - if (item.Status == SyncJobItemStatus.Failed || item.Status == SyncJobItemStatus.Completed) + if (item.Status == SyncJobItemStatus.Failed || item.Status == SyncJobItemStatus.Synced || item.Status == SyncJobItemStatus.RemovedFromDevice) { pct += 100; } @@ -171,10 +171,11 @@ namespace MediaBrowser.Server.Implementations.Sync return _syncRepo.Update(job); } - public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds, User user, bool unwatchedOnly) + public async Task<IEnumerable<BaseItem>> GetItemsForSync(SyncCategory? category, string parentId, IEnumerable<string> itemIds, User user, bool unwatchedOnly) { - var items = itemIds - .SelectMany(i => GetItemsForSync(i, user)) + var items = category.HasValue ? + await GetItemsForSync(category.Value, parentId, user).ConfigureAwait(false) : + itemIds.SelectMany(i => GetItemsForSync(i, user)) .Where(_syncManager.SupportsSync); if (unwatchedOnly) @@ -198,6 +199,54 @@ namespace MediaBrowser.Server.Implementations.Sync return items.DistinctBy(i => i.Id); } + private async Task<IEnumerable<BaseItem>> GetItemsForSync(SyncCategory category, string parentId, User user) + { + var parent = string.IsNullOrWhiteSpace(parentId) + ? user.RootFolder + : (Folder)_libraryManager.GetItemById(parentId); + + InternalItemsQuery query; + + switch (category) + { + case SyncCategory.Latest: + query = new InternalItemsQuery + { + IsFolder = false, + SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName }, + SortOrder = SortOrder.Descending, + Recursive = true + }; + break; + case SyncCategory.Resume: + query = new InternalItemsQuery + { + IsFolder = false, + SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName }, + SortOrder = SortOrder.Descending, + Recursive = true, + IsResumable = true, + MediaTypes = new[] { MediaType.Video } + }; + break; + + case SyncCategory.NextUp: + return _tvSeriesManager.GetNextUp(new NextUpQuery + { + ParentId = parentId, + UserId = user.Id.ToString("N") + }).Items; + + default: + throw new ArgumentException("Unrecognized category: " + category); + } + + query.User = user; + + var result = await parent.GetItems(query).ConfigureAwait(false); + return result.Items; + } + private IEnumerable<BaseItem> GetItemsForSync(string id, User user) { var item = _libraryManager.GetItemById(id); @@ -263,7 +312,7 @@ namespace MediaBrowser.Server.Implementations.Sync var result = _syncRepo.GetJobItems(new SyncJobItemQuery { - IsCompleted = false + Status = SyncJobItemStatus.Queued }); var jobItems = result.Items; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 3f30dcb1c..9cb697c81 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -9,6 +9,7 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Sync; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -34,10 +35,11 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly IUserManager _userManager; private readonly Func<IDtoService> _dtoService; private readonly IApplicationHost _appHost; + private readonly ITVSeriesManager _tvSeriesManager; private ISyncProvider[] _providers = { }; - public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost) + public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager) { _libraryManager = libraryManager; _repo = repo; @@ -46,6 +48,7 @@ namespace MediaBrowser.Server.Implementations.Sync _userManager = userManager; _dtoService = dtoService; _appHost = appHost; + _tvSeriesManager = tvSeriesManager; } public void AddParts(IEnumerable<ISyncProvider> providers) @@ -55,12 +58,12 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task<SyncJobCreationResult> CreateJob(SyncJobRequest request) { - var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager); + var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager); var user = _userManager.GetUserById(request.UserId); - var items = processor - .GetItemsForSync(request.ItemIds, user, request.UnwatchedOnly) + var items = (await processor + .GetItemsForSync(request.Category, request.ParentId, request.ItemIds, user, request.UnwatchedOnly).ConfigureAwait(false)) .ToList(); if (items.Any(i => !SupportsSync(i))) @@ -68,9 +71,16 @@ namespace MediaBrowser.Server.Implementations.Sync throw new ArgumentException("Item does not support sync."); } - if (string.IsNullOrWhiteSpace(request.Name) && request.ItemIds.Count == 1) + if (string.IsNullOrWhiteSpace(request.Name)) { - request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0])); + if (request.Category.HasValue) + { + request.Name = request.Category.Value.ToString(); + } + else if (request.ItemIds.Count == 1) + { + request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0])); + } } if (string.IsNullOrWhiteSpace(request.Name)) @@ -96,7 +106,7 @@ namespace MediaBrowser.Server.Implementations.Sync UserId = request.UserId, UnwatchedOnly = request.UnwatchedOnly, ItemLimit = request.ItemLimit, - RequestedItemIds = request.ItemIds, + RequestedItemIds = request.ItemIds ?? new List<string> { }, DateCreated = DateTime.UtcNow, DateLastModified = DateTime.UtcNow, SyncNewContent = request.SyncNewContent, @@ -303,12 +313,12 @@ namespace MediaBrowser.Server.Implementations.Sync { var jobItem = _repo.GetJobItem(id); - jobItem.Status = SyncJobItemStatus.Completed; + jobItem.Status = SyncJobItemStatus.Synced; jobItem.Progress = 100; await _repo.Update(jobItem).ConfigureAwait(false); - var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager); + var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager); await processor.UpdateJobStatus(jobItem.JobId).ConfigureAwait(false); } @@ -391,6 +401,21 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task<SyncDataResponse> SyncData(SyncDataRequest request) { + var jobItemResult = GetJobItems(new SyncJobItemQuery + { + TargetId = request.TargetId, + Status = SyncJobItemStatus.Synced + }); + + foreach (var jobItem in jobItemResult.Items) + { + if (!request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase)) + { + jobItem.Status = SyncJobItemStatus.RemovedFromDevice; + await _repo.Update(jobItem).ConfigureAwait(false); + } + } + var response = new SyncDataResponse(); return response; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index e5b323725..a10e9a7e6 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Sync public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "sync8.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "sync9.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); @@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.Sync _deleteJobItemsCommand = _connection.CreateCommand(); _deleteJobItemsCommand.CommandText = "delete from SyncJobItems where JobId=@JobId"; _deleteJobItemsCommand.Parameters.Add(_deleteJobItemsCommand, "@JobId"); - + _saveJobCommand = _connection.CreateCommand(); _saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)"; @@ -119,7 +119,7 @@ namespace MediaBrowser.Server.Implementations.Sync { throw new ArgumentNullException("id"); } - + using (var cmd = _connection.CreateCommand()) { cmd.CommandText = BaseJobSelectText + " where Id=@Id"; @@ -169,7 +169,7 @@ namespace MediaBrowser.Server.Implementations.Sync if (!reader.IsDBNull(7)) { - info.RequestedItemIds = reader.GetString(7).Split(',').ToList(); + info.RequestedItemIds = reader.GetString(7).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } if (!reader.IsDBNull(8)) @@ -302,7 +302,7 @@ namespace MediaBrowser.Server.Implementations.Sync _deleteJobItemsCommand.GetParameter(index++).Value = id; _deleteJobItemsCommand.Transaction = transaction; _deleteJobItemsCommand.ExecuteNonQuery(); - + transaction.Commit(); } catch (OperationCanceledException) @@ -473,19 +473,6 @@ namespace MediaBrowser.Server.Implementations.Sync cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = query.Status.Value.ToString(); } - else if (query.IsCompleted.HasValue) - { - if (query.IsCompleted.Value) - { - whereClauses.Add("Status=@Status"); - } - else - { - whereClauses.Add("Status<>@Status"); - } - cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString(); - } - var whereTextWithoutPaging = whereClauses.Count == 0 ? string.Empty : " where " + string.Join(" AND ", whereClauses.ToArray()); @@ -616,9 +603,9 @@ namespace MediaBrowser.Server.Implementations.Sync { info.MediaSourceId = reader.GetString(2); } - + info.JobId = reader.GetString(3); - + if (!reader.IsDBNull(4)) { info.OutputPath = reader.GetString(4); @@ -637,7 +624,7 @@ namespace MediaBrowser.Server.Implementations.Sync { info.Progress = reader.GetDouble(8); } - + return info; } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs index 2127e9c46..e7e30b857 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Sync; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -16,14 +17,16 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly ISyncManager _syncManager; private readonly ILogger _logger; private readonly IUserManager _userManager; + private readonly ITVSeriesManager _tvSeriesManager; - public SyncScheduledTask(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager) + public SyncScheduledTask(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager) { _libraryManager = libraryManager; _syncRepo = syncRepo; _syncManager = syncManager; _logger = logger; _userManager = userManager; + _tvSeriesManager = tvSeriesManager; } public string Name @@ -46,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Sync public Task Execute(CancellationToken cancellationToken, IProgress<double> progress) { - return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager).Sync(progress, + return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager, _tvSeriesManager).Sync(progress, cancellationToken); } |
