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/SyncJobProcessor.cs73
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs43
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs29
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs7
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);
}