mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-08 00:39:25 +01:00
create sync job items pages
This commit is contained in:
@@ -30,6 +30,20 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
});
|
||||
}
|
||||
|
||||
public IEnumerable<SyncTarget> GetSyncTargets(string userId)
|
||||
{
|
||||
return _deviceManager.GetDevices(new DeviceQuery
|
||||
{
|
||||
SupportsSync = true,
|
||||
UserId = userId
|
||||
|
||||
}).Items.Select(i => new SyncTarget
|
||||
{
|
||||
Id = i.Id,
|
||||
Name = i.Name
|
||||
});
|
||||
}
|
||||
|
||||
public DeviceProfile GetDeviceProfile(SyncTarget target)
|
||||
{
|
||||
return new DeviceProfile();
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
using MediaBrowser.Controller.Sync;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
using MediaBrowser.Model.Sync;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
@@ -10,7 +9,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
{
|
||||
public class CloudSyncProvider : ISyncProvider
|
||||
{
|
||||
private ICloudSyncProvider[] _providers = new ICloudSyncProvider[] {};
|
||||
private ICloudSyncProvider[] _providers = {};
|
||||
|
||||
public CloudSyncProvider(IApplicationHost appHost)
|
||||
{
|
||||
@@ -22,6 +21,11 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
return new List<SyncTarget>();
|
||||
}
|
||||
|
||||
public IEnumerable<SyncTarget> GetSyncTargets(string userId)
|
||||
{
|
||||
return new List<SyncTarget>();
|
||||
}
|
||||
|
||||
public DeviceProfile GetDeviceProfile(SyncTarget target)
|
||||
{
|
||||
return new DeviceProfile();
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller.Sync;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
using MediaBrowser.Model.Sync;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.Sync
|
||||
{
|
||||
public class MockSyncProvider : ISyncProvider
|
||||
{
|
||||
public string Name
|
||||
{
|
||||
get { return "Test Sync"; }
|
||||
}
|
||||
|
||||
public IEnumerable<SyncTarget> GetSyncTargets()
|
||||
{
|
||||
return new List<SyncTarget>
|
||||
{
|
||||
new SyncTarget
|
||||
{
|
||||
Id = GetType().Name.GetMD5().ToString("N"),
|
||||
Name = Name
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public DeviceProfile GetDeviceProfile(SyncTarget target)
|
||||
{
|
||||
return new DeviceProfile();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,6 +81,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
{
|
||||
Id = Guid.NewGuid().ToString("N"),
|
||||
ItemId = itemId,
|
||||
ItemName = GetSyncJobItemName(item),
|
||||
JobId = job.Id,
|
||||
TargetId = job.TargetId,
|
||||
DateCreated = DateTime.UtcNow
|
||||
@@ -98,6 +99,11 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
await UpdateJobStatus(job, jobItems).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private string GetSyncJobItemName(BaseItem item)
|
||||
{
|
||||
return item.Name;
|
||||
}
|
||||
|
||||
public Task UpdateJobStatus(string id)
|
||||
{
|
||||
var job = _syncRepo.GetJob(id);
|
||||
|
||||
@@ -73,11 +73,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
if (string.IsNullOrWhiteSpace(request.Name))
|
||||
{
|
||||
if (request.Category.HasValue)
|
||||
{
|
||||
request.Name = request.Category.Value.ToString();
|
||||
}
|
||||
else if (request.ItemIds.Count == 1)
|
||||
if (request.ItemIds.Count == 1)
|
||||
{
|
||||
request.Name = GetDefaultName(_libraryManager.GetItemById(request.ItemIds[0]));
|
||||
}
|
||||
@@ -132,21 +128,49 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
};
|
||||
}
|
||||
|
||||
public QueryResult<SyncJob> GetJobs(SyncJobQuery query)
|
||||
public Task UpdateJob(SyncJob job)
|
||||
{
|
||||
// Get fresh from the db and only update the fields that are supported to be changed.
|
||||
var instance = _repo.GetJob(job.Id);
|
||||
|
||||
instance.Name = job.Name;
|
||||
instance.Quality = job.Quality;
|
||||
instance.UnwatchedOnly = job.UnwatchedOnly;
|
||||
instance.SyncNewContent = job.SyncNewContent;
|
||||
instance.ItemLimit = job.ItemLimit;
|
||||
|
||||
return _repo.Update(instance);
|
||||
}
|
||||
|
||||
public async Task<QueryResult<SyncJob>> GetJobs(SyncJobQuery query)
|
||||
{
|
||||
var result = _repo.GetJobs(query);
|
||||
|
||||
result.Items.ForEach(FillMetadata);
|
||||
foreach (var item in result.Items)
|
||||
{
|
||||
await FillMetadata(item).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void FillMetadata(SyncJob job)
|
||||
private async Task FillMetadata(SyncJob job)
|
||||
{
|
||||
var item = job.RequestedItemIds
|
||||
.Select(_libraryManager.GetItemById)
|
||||
.FirstOrDefault(i => i != null);
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager);
|
||||
|
||||
var user = _userManager.GetUserById(job.UserId);
|
||||
|
||||
item = (await processor
|
||||
.GetItemsForSync(job.Category, job.ParentId, job.RequestedItemIds, user, job.UnwatchedOnly).ConfigureAwait(false))
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
var hasSeries = item as IHasSeries;
|
||||
@@ -162,13 +186,25 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
|
||||
var primaryImage = item.GetImageInfo(ImageType.Primary, 0);
|
||||
var itemWithImage = item;
|
||||
|
||||
if (primaryImage == null)
|
||||
{
|
||||
var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
|
||||
|
||||
if (parentWithImage != null)
|
||||
{
|
||||
itemWithImage = parentWithImage;
|
||||
primaryImage = parentWithImage.GetImageInfo(ImageType.Primary, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (primaryImage != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
job.PrimaryImageTag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary);
|
||||
job.PrimaryImageItemId = item.Id.ToString("N");
|
||||
job.PrimaryImageTag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Primary);
|
||||
job.PrimaryImageItemId = itemWithImage.Id.ToString("N");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -179,6 +215,44 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
}
|
||||
|
||||
private void FillMetadata(SyncJobItem jobItem)
|
||||
{
|
||||
var item = _libraryManager.GetItemById(jobItem.ItemId);
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var primaryImage = item.GetImageInfo(ImageType.Primary, 0);
|
||||
var itemWithImage = item;
|
||||
|
||||
if (primaryImage == null)
|
||||
{
|
||||
var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
|
||||
|
||||
if (parentWithImage != null)
|
||||
{
|
||||
itemWithImage = parentWithImage;
|
||||
primaryImage = parentWithImage.GetImageInfo(ImageType.Primary, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (primaryImage != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
jobItem.PrimaryImageTag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Primary);
|
||||
jobItem.PrimaryImageItemId = itemWithImage.Id.ToString("N");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error getting image info", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Task CancelJob(string id)
|
||||
{
|
||||
return _repo.DeleteJob(id);
|
||||
@@ -198,7 +272,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
private IEnumerable<SyncTarget> GetSyncTargets(ISyncProvider provider, string userId)
|
||||
{
|
||||
return provider.GetSyncTargets().Select(i => new SyncTarget
|
||||
return provider.GetSyncTargets(userId).Select(i => new SyncTarget
|
||||
{
|
||||
Name = i.Name,
|
||||
Id = GetSyncTargetId(provider, i)
|
||||
@@ -330,7 +404,14 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
public QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query)
|
||||
{
|
||||
return _repo.GetJobItems(query);
|
||||
var result = _repo.GetJobItems(query);
|
||||
|
||||
if (query.AddMetadata)
|
||||
{
|
||||
result.Items.ForEach(FillMetadata);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private SyncedItem GetJobItemInfo(SyncJobItem jobItem)
|
||||
@@ -449,7 +530,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
|
||||
response.ItemIdsToRemove = response.ItemIdsToRemove.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
|
||||
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
public async Task Initialize()
|
||||
{
|
||||
var dbFile = Path.Combine(_appPaths.DataPath, "sync9.db");
|
||||
var dbFile = Path.Combine(_appPaths.DataPath, "sync10.db");
|
||||
|
||||
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
"create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)",
|
||||
"create index if not exists idx_SyncJobs on SyncJobs(Id)",
|
||||
|
||||
"create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, MediaSourceId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)",
|
||||
"create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)",
|
||||
"create index if not exists idx_SyncJobItems on SyncJobs(Id)",
|
||||
|
||||
//pragmas
|
||||
@@ -90,21 +90,22 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
_saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount");
|
||||
|
||||
_saveJobItemCommand = _connection.CreateCommand();
|
||||
_saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @MediaSourceId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)";
|
||||
_saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)";
|
||||
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Id");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@ItemId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@MediaSourceId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@JobId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@OutputPath");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Status");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@TargetId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@DateCreated");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobCommand, "@Progress");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Id");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemName");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@MediaSourceId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@JobId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@OutputPath");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Status");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@TargetId");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@DateCreated");
|
||||
_saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Progress");
|
||||
}
|
||||
|
||||
private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs";
|
||||
private const string BaseJobItemSelectText = "select Id, ItemId, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems";
|
||||
private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems";
|
||||
|
||||
public SyncJob GetJob(string id)
|
||||
{
|
||||
@@ -366,6 +367,11 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
whereClauses.Add("TargetId=@TargetId");
|
||||
cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(query.UserId))
|
||||
{
|
||||
whereClauses.Add("UserId=@UserId");
|
||||
cmd.Parameters.Add(cmd, "@UserId", DbType.String).Value = query.UserId;
|
||||
}
|
||||
|
||||
var whereTextWithoutPaging = whereClauses.Count == 0 ?
|
||||
string.Empty :
|
||||
@@ -547,6 +553,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
_saveJobItemCommand.GetParameter(index++).Value = new Guid(jobItem.Id);
|
||||
_saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemId;
|
||||
_saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemName;
|
||||
_saveJobItemCommand.GetParameter(index++).Value = jobItem.MediaSourceId;
|
||||
_saveJobItemCommand.GetParameter(index++).Value = jobItem.JobId;
|
||||
_saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath;
|
||||
@@ -602,28 +609,33 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
if (!reader.IsDBNull(2))
|
||||
{
|
||||
info.MediaSourceId = reader.GetString(2);
|
||||
info.ItemName = reader.GetString(2);
|
||||
}
|
||||
|
||||
info.JobId = reader.GetString(3);
|
||||
|
||||
if (!reader.IsDBNull(4))
|
||||
if (!reader.IsDBNull(3))
|
||||
{
|
||||
info.OutputPath = reader.GetString(4);
|
||||
info.MediaSourceId = reader.GetString(3);
|
||||
}
|
||||
|
||||
info.JobId = reader.GetString(4);
|
||||
|
||||
if (!reader.IsDBNull(5))
|
||||
{
|
||||
info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(5), true);
|
||||
info.OutputPath = reader.GetString(5);
|
||||
}
|
||||
|
||||
info.TargetId = reader.GetString(6);
|
||||
|
||||
info.DateCreated = reader.GetDateTime(7);
|
||||
|
||||
if (!reader.IsDBNull(8))
|
||||
if (!reader.IsDBNull(6))
|
||||
{
|
||||
info.Progress = reader.GetDouble(8);
|
||||
info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(6), true);
|
||||
}
|
||||
|
||||
info.TargetId = reader.GetString(7);
|
||||
|
||||
info.DateCreated = reader.GetDateTime(8);
|
||||
|
||||
if (!reader.IsDBNull(9))
|
||||
{
|
||||
info.Progress = reader.GetDouble(9);
|
||||
}
|
||||
|
||||
return info;
|
||||
|
||||
Reference in New Issue
Block a user