aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs5
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json5
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs55
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs47
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs2
6 files changed, 82 insertions, 35 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 61c24cf54..7b36321f1 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -162,7 +162,8 @@ namespace MediaBrowser.Server.Implementations.Dto
{
SyncJobItemStatus.Converting,
SyncJobItemStatus.Queued,
- SyncJobItemStatus.Transferring
+ SyncJobItemStatus.Transferring,
+ SyncJobItemStatus.ReadyToTransfer
}
});
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index d7ea444a3..29871d928 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -517,6 +517,11 @@ namespace MediaBrowser.Server.Implementations.Library
public IEnumerable<BaseItem> ReplaceVideosWithPrimaryVersions(IEnumerable<BaseItem> items)
{
+ if (items == null)
+ {
+ throw new ArgumentNullException("items");
+ }
+
var dict = new Dictionary<Guid, BaseItem>();
foreach (var item in items)
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index 5e881e3b6..3fddf274c 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -53,6 +53,7 @@
"SyncJobStatusFailed": "Failed",
"SyncJobStatusCancelled": "Cancelled",
"SyncJobStatusCompleted": "Synced",
+ "SyncJobStatusReadyToTransfer": "Ready to Transfer",
"SyncJobStatusTransferring": "Transferring",
"SyncJobStatusCompletedWithError": "Synced with errors",
"LabelCollection": "Collection",
@@ -216,8 +217,8 @@
"MessageConfirmRestart": "Are you sure you wish to restart Media Browser Server?",
"MessageConfirmShutdown": "Are you sure you wish to shutdown Media Browser Server?",
"ButtonUpdateNow": "Update Now",
- "ValueItemCount": "{0} item",
- "ValueItemCountPlural": "{0} items",
+ "ValueItemCount": "{0} item",
+ "ValueItemCountPlural": "{0} items",
"NewVersionOfSomethingAvailable": "A new version of {0} is available!",
"VersionXIsAvailableForDownload": "Version {0} is now available for download.",
"LabelVersionNumber": "Version {0}",
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index c373faf1e..e418448db 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -29,7 +29,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
private readonly ILibraryManager _libraryManager;
private readonly ISyncRepository _syncRepo;
- private readonly ISyncManager _syncManager;
+ private readonly SyncManager _syncManager;
private readonly ILogger _logger;
private readonly IUserManager _userManager;
private readonly ITVSeriesManager _tvSeriesManager;
@@ -38,7 +38,7 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly IConfigurationManager _config;
private readonly IFileSystem _fileSystem;
- public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, ISyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager, IMediaEncoder mediaEncoder, ISubtitleEncoder subtitleEncoder, IConfigurationManager config, IFileSystem fileSystem)
+ public SyncJobProcessor(ILibraryManager libraryManager, ISyncRepository syncRepo, SyncManager syncManager, ILogger logger, IUserManager userManager, ITVSeriesManager tvSeriesManager, IMediaEncoder mediaEncoder, ISubtitleEncoder subtitleEncoder, IConfigurationManager config, IFileSystem fileSystem)
{
_libraryManager = libraryManager;
_syncRepo = syncRepo;
@@ -106,6 +106,7 @@ namespace MediaBrowser.Server.Implementations.Sync
};
await _syncRepo.Create(jobItem).ConfigureAwait(false);
+ _syncManager.OnSyncJobItemCreated(jobItem);
jobItems.Add(jobItem);
}
@@ -184,11 +185,19 @@ namespace MediaBrowser.Server.Implementations.Sync
{
job.Status = SyncJobStatus.Cancelled;
}
+ else if (jobItems.All(i => i.Status == SyncJobItemStatus.ReadyToTransfer))
+ {
+ job.Status = SyncJobStatus.ReadyToTransfer;
+ }
+ else if (jobItems.All(i => i.Status == SyncJobItemStatus.Transferring))
+ {
+ job.Status = SyncJobStatus.Transferring;
+ }
else if (jobItems.Any(i => i.Status == SyncJobItemStatus.Converting))
{
job.Status = SyncJobStatus.Converting;
}
- else if (pct >= 100)
+ else if (jobItems.All(i => i.Status == SyncJobItemStatus.Cancelled || i.Status == SyncJobItemStatus.Failed || i.Status == SyncJobItemStatus.Synced || i.Status == SyncJobItemStatus.RemovedFromDevice))
{
if (jobItems.Any(i => i.Status == SyncJobItemStatus.Failed))
{
@@ -201,12 +210,12 @@ namespace MediaBrowser.Server.Implementations.Sync
}
else
{
- job.Status = SyncJobStatus.Transferring;
+ job.Status = SyncJobStatus.Queued;
}
await _syncRepo.Update(job).ConfigureAwait(false);
- ((SyncManager)_syncManager).OnSyncJobUpdated(job);
+ _syncManager.OnSyncJobUpdated(job);
}
public async Task<IEnumerable<BaseItem>> GetItemsForSync(SyncCategory? category, string parentId, IEnumerable<string> itemIds, User user, bool unwatchedOnly)
@@ -414,7 +423,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
jobItem.Status = SyncJobItemStatus.Failed;
_logger.Error("Unable to locate library item for JobItem {0}, ItemId {1}", jobItem.Id, jobItem.ItemId);
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
return;
}
@@ -423,7 +432,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
jobItem.Status = SyncJobItemStatus.Failed;
_logger.Error("Unable to locate SyncTarget for JobItem {0}, SyncTargetId {1}", jobItem.Id, jobItem.TargetId);
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
return;
}
@@ -490,7 +499,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (streamInfo.PlayMethod == PlayMethod.Transcode)
{
// Save the job item now since conversion could take a while
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
await UpdateJobStatus(job).ConfigureAwait(false);
try
@@ -504,7 +513,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if ((DateTime.UtcNow - lastJobUpdate).TotalSeconds >= DatabaseProgressUpdateIntervalSeconds)
{
jobItem.Progress = pct / 2;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
await UpdateJobStatus(job).ConfigureAwait(false);
}
});
@@ -528,7 +537,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (jobItem.Status == SyncJobItemStatus.Failed || jobItem.Status == SyncJobItemStatus.Queued)
{
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
return;
}
@@ -555,14 +564,14 @@ namespace MediaBrowser.Server.Implementations.Sync
if (externalSubs.Count > 0)
{
// Save the job item now since conversion could take a while
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
await ConvertSubtitles(jobItem, externalSubs, streamInfo, cancellationToken).ConfigureAwait(false);
}
jobItem.Progress = 50;
- jobItem.Status = SyncJobItemStatus.Transferring;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ jobItem.Status = SyncJobItemStatus.ReadyToTransfer;
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
}
private bool RequiresExtraction(SubtitleStreamInfo stream, MediaSourceInfo mediaSource)
@@ -666,7 +675,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
jobItem.Status = SyncJobItemStatus.Converting;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
await UpdateJobStatus(job).ConfigureAwait(false);
try
@@ -680,7 +689,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if ((DateTime.UtcNow - lastJobUpdate).TotalSeconds >= DatabaseProgressUpdateIntervalSeconds)
{
jobItem.Progress = pct / 2;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
await UpdateJobStatus(job).ConfigureAwait(false);
}
});
@@ -704,7 +713,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (jobItem.Status == SyncJobItemStatus.Failed || jobItem.Status == SyncJobItemStatus.Queued)
{
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
return;
}
@@ -729,8 +738,8 @@ namespace MediaBrowser.Server.Implementations.Sync
}
jobItem.Progress = 50;
- jobItem.Status = SyncJobItemStatus.Transferring;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ jobItem.Status = SyncJobItemStatus.ReadyToTransfer;
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
}
private async Task Sync(SyncJobItem jobItem, Photo item, DeviceProfile profile, CancellationToken cancellationToken)
@@ -738,17 +747,17 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.OutputPath = item.Path;
jobItem.Progress = 50;
- jobItem.Status = SyncJobItemStatus.Transferring;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ jobItem.Status = SyncJobItemStatus.ReadyToTransfer;
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
}
private async Task SyncGeneric(SyncJobItem jobItem, BaseItem item, CancellationToken cancellationToken)
{
jobItem.OutputPath = item.Path;
-
+
jobItem.Progress = 50;
- jobItem.Status = SyncJobItemStatus.Transferring;
- await _syncRepo.Update(jobItem).ConfigureAwait(false);
+ jobItem.Status = SyncJobItemStatus.ReadyToTransfer;
+ await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
}
private async Task<string> DownloadFile(SyncJobItem jobItem, MediaSourceInfo mediaSource, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 6eef268b9..eecbd78d1 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -52,6 +52,8 @@ namespace MediaBrowser.Server.Implementations.Sync
public event EventHandler<GenericEventArgs<SyncJobCreationResult>> SyncJobCreated;
public event EventHandler<GenericEventArgs<SyncJob>> SyncJobCancelled;
public event EventHandler<GenericEventArgs<SyncJob>> SyncJobUpdated;
+ public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemUpdated;
+ public event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCreated;
public SyncManager(ILibraryManager libraryManager, ISyncRepository repo, IImageProcessor imageProcessor, ILogger logger, IUserManager userManager, Func<IDtoService> dtoService, IApplicationHost appHost, ITVSeriesManager tvSeriesManager, Func<IMediaEncoder> mediaEncoder, IFileSystem fileSystem, Func<ISubtitleEncoder> subtitleEncoder, IConfigurationManager config)
{
@@ -202,6 +204,32 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
+ internal async Task UpdateSyncJobItemInternal(SyncJobItem jobItem)
+ {
+ await _repo.Update(jobItem).ConfigureAwait(false);
+
+ if (SyncJobUpdated != null)
+ {
+ EventHelper.FireEventIfNotNull(SyncJobItemUpdated, this, new GenericEventArgs<SyncJobItem>
+ {
+ Argument = jobItem
+
+ }, _logger);
+ }
+ }
+
+ internal void OnSyncJobItemCreated(SyncJobItem job)
+ {
+ if (SyncJobUpdated != null)
+ {
+ EventHelper.FireEventIfNotNull(SyncJobItemCreated, this, new GenericEventArgs<SyncJobItem>
+ {
+ Argument = job
+
+ }, _logger);
+ }
+ }
+
public async Task<QueryResult<SyncJob>> GetJobs(SyncJobQuery query)
{
var result = _repo.GetJobs(query);
@@ -504,7 +532,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
var processor = GetSyncJobProcessor();
@@ -610,7 +638,10 @@ namespace MediaBrowser.Server.Implementations.Sync
var jobItemResult = GetJobItems(new SyncJobItemQuery
{
TargetId = targetId,
- Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Transferring }
+ Statuses = new List<SyncJobItemStatus>
+ {
+ SyncJobItemStatus.ReadyToTransfer
+ }
});
return jobItemResult.Items
@@ -669,7 +700,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
// Content is no longer on the device
jobItem.Status = SyncJobItemStatus.RemovedFromDevice;
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
}
}
@@ -761,7 +792,7 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.Progress = 0;
jobItem.IsMarkedForRemoval = false;
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
var processor = GetSyncJobProcessor();
@@ -772,7 +803,7 @@ namespace MediaBrowser.Server.Implementations.Sync
{
var jobItem = _repo.GetJobItem(id);
- if (jobItem.Status != SyncJobItemStatus.Queued && jobItem.Status != SyncJobItemStatus.Transferring && jobItem.Status != SyncJobItemStatus.Converting)
+ if (jobItem.Status != SyncJobItemStatus.Queued && jobItem.Status != SyncJobItemStatus.ReadyToTransfer && jobItem.Status != SyncJobItemStatus.Converting)
{
throw new ArgumentException("Operation is not valid for this job item");
}
@@ -781,7 +812,7 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.Progress = 0;
jobItem.IsMarkedForRemoval = true;
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
var processor = GetSyncJobProcessor();
@@ -814,7 +845,7 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.IsMarkedForRemoval = true;
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
var processor = GetSyncJobProcessor();
@@ -832,7 +863,7 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.IsMarkedForRemoval = false;
- await _repo.Update(jobItem).ConfigureAwait(false);
+ await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
var processor = GetSyncJobProcessor();
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs
index b68a97817..ccc9508e8 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs
@@ -60,7 +60,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
- return new SyncJobProcessor(_libraryManager, _syncRepo, _syncManager, _logger, _userManager, _tvSeriesManager, _mediaEncoder, _subtitleEncoder, _config, _fileSystem)
+ return new SyncJobProcessor(_libraryManager, _syncRepo, (SyncManager)_syncManager, _logger, _userManager, _tvSeriesManager, _mediaEncoder, _subtitleEncoder, _config, _fileSystem)
.Sync(progress, cancellationToken);
}