fix subtitle syncing

pull/702/head
Luke Pulverenti 10 years ago
parent dfaf935f5e
commit 7773862fac

@ -6,6 +6,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -29,7 +30,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// <summary> /// <summary>
/// The _task queue /// The _task queue
/// </summary> /// </summary>
private readonly SortedDictionary<Type, TaskExecutionOptions> _taskQueue = new SortedDictionary<Type, TaskExecutionOptions>(); private readonly ConcurrentQueue<Tuple<Type, TaskExecutionOptions>> _taskQueue =
new ConcurrentQueue<Tuple<Type, TaskExecutionOptions>>();
/// <summary> /// <summary>
/// Gets or sets the json serializer. /// Gets or sets the json serializer.
@ -136,25 +138,17 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
{ {
var type = task.ScheduledTask.GetType(); var type = task.ScheduledTask.GetType();
Logger.Info("Queueing task {0}", type.Name);
lock (_taskQueue) lock (_taskQueue)
{ {
// If it's idle just execute immediately
if (task.State == TaskState.Idle) if (task.State == TaskState.Idle)
{ {
Execute(task, options); Execute(task, options);
return; return;
} }
if (!_taskQueue.ContainsKey(type)) _taskQueue.Enqueue(new Tuple<Type, TaskExecutionOptions>(type, options));
{
Logger.Info("Queueing task {0}", type.Name);
_taskQueue.Add(type, options);
}
else
{
_taskQueue[type] = options;
Logger.Info("Task already queued: {0}", type.Name);
}
} }
} }
@ -241,15 +235,24 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
// Execute queued tasks // Execute queued tasks
lock (_taskQueue) lock (_taskQueue)
{ {
foreach (var enqueuedType in _taskQueue.ToList()) var list = new List<Tuple<Type, TaskExecutionOptions>>();
Tuple<Type, TaskExecutionOptions> item;
while (_taskQueue.TryDequeue(out item))
{ {
var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == enqueuedType.Key); if (list.All(i => i.Item1 != item.Item1))
{
list.Add(item);
}
}
foreach (var enqueuedType in list)
{
var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == enqueuedType.Item1);
if (scheduledTask.State == TaskState.Idle) if (scheduledTask.State == TaskState.Idle)
{ {
Execute(scheduledTask, enqueuedType.Value); Execute(scheduledTask, enqueuedType.Item2);
_taskQueue.Remove(enqueuedType.Key);
} }
} }
} }

@ -186,18 +186,17 @@ namespace MediaBrowser.LocalMetadata.Images
names.Add("movie"); names.Add("movie");
} }
foreach (var name in names)
{
AddImage(files, images, imagePrefix + name, ImageType.Primary);
}
var fileNameWithoutExtension = item.FileNameWithoutExtension; var fileNameWithoutExtension = item.FileNameWithoutExtension;
if (!string.IsNullOrEmpty(fileNameWithoutExtension)) if (!string.IsNullOrEmpty(fileNameWithoutExtension))
{ {
AddImage(files, images, fileNameWithoutExtension, ImageType.Primary); AddImage(files, images, fileNameWithoutExtension, ImageType.Primary);
} }
foreach (var name in names)
{
AddImage(files, images, imagePrefix + name, ImageType.Primary);
}
if (!isInMixedFolder) if (!isInMixedFolder)
{ {
foreach (var name in names) foreach (var name in names)

@ -233,57 +233,45 @@ namespace MediaBrowser.Server.Implementations.Drawing
await semaphore.WaitAsync().ConfigureAwait(false); await semaphore.WaitAsync().ConfigureAwait(false);
// Check again in case of lock contention
try
{
if (File.Exists(cacheFilePath))
{
semaphore.Release();
return cacheFilePath;
}
}
catch
{
semaphore.Release();
throw;
}
try try
{ {
CheckDisposed(); CheckDisposed();
var newWidth = Convert.ToInt32(newSize.Width); if (!File.Exists(cacheFilePath))
var newHeight = Convert.ToInt32(newSize.Height); {
var newWidth = Convert.ToInt32(newSize.Width);
var newHeight = Convert.ToInt32(newSize.Height);
Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath)); Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
if (string.IsNullOrWhiteSpace(options.BackgroundColor)) if (string.IsNullOrWhiteSpace(options.BackgroundColor))
{
using (var originalImage = new MagickWand(originalImagePath))
{ {
originalImage.CurrentImage.ResizeImage(newWidth, newHeight); using (var originalImage = new MagickWand(originalImagePath))
{
originalImage.CurrentImage.ResizeImage(newWidth, newHeight);
DrawIndicator(originalImage, newWidth, newHeight, options); DrawIndicator(originalImage, newWidth, newHeight, options);
originalImage.CurrentImage.CompressionQuality = quality; originalImage.CurrentImage.CompressionQuality = quality;
originalImage.SaveImage(cacheFilePath); originalImage.SaveImage(cacheFilePath);
}
} }
} else
else
{
using (var wand = new MagickWand(newWidth, newHeight, options.BackgroundColor))
{ {
using (var originalImage = new MagickWand(originalImagePath)) using (var wand = new MagickWand(newWidth, newHeight, options.BackgroundColor))
{ {
originalImage.CurrentImage.ResizeImage(newWidth, newHeight); using (var originalImage = new MagickWand(originalImagePath))
{
originalImage.CurrentImage.ResizeImage(newWidth, newHeight);
wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0); wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0);
DrawIndicator(wand, newWidth, newHeight, options); DrawIndicator(wand, newWidth, newHeight, options);
wand.CurrentImage.CompressionQuality = quality; wand.CurrentImage.CompressionQuality = quality;
wand.SaveImage(cacheFilePath); wand.SaveImage(cacheFilePath);
}
} }
} }
} }

@ -1,4 +1,5 @@
using MediaBrowser.Common.IO; using System.IO;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Progress; using MediaBrowser.Common.Progress;
using MediaBrowser.Controller; using MediaBrowser.Controller;
using MediaBrowser.Controller.Sync; using MediaBrowser.Controller.Sync;
@ -9,7 +10,6 @@ using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Sync; using MediaBrowser.Model.Sync;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
@ -152,7 +152,7 @@ namespace MediaBrowser.Server.Implementations.Sync
try try
{ {
var sendFileResult = await SendFile(provider, internalSyncJobItem.OutputPath, localItem, target, cancellationToken).ConfigureAwait(false); var sendFileResult = await SendFile(provider, internalSyncJobItem.OutputPath, localItem.LocalPath, target, cancellationToken).ConfigureAwait(false);
if (localItem.Item.MediaSources != null) if (localItem.Item.MediaSources != null)
{ {
@ -173,10 +173,6 @@ namespace MediaBrowser.Server.Implementations.Sync
var mediaSource = localItem.Item.MediaSources.FirstOrDefault(); var mediaSource = localItem.Item.MediaSources.FirstOrDefault();
if (mediaSource != null) if (mediaSource != null)
{ {
mediaSource.Path = sendFileResult.Path;
mediaSource.Protocol = sendFileResult.Protocol;
mediaSource.SupportsTranscoding = false;
await SendSubtitles(localItem, mediaSource, provider, dataProvider, target, cancellationToken).ConfigureAwait(false); await SendSubtitles(localItem, mediaSource, provider, dataProvider, target, cancellationToken).ConfigureAwait(false);
} }
} }
@ -216,7 +212,8 @@ namespace MediaBrowser.Server.Implementations.Sync
{ {
try try
{ {
var sendFileResult = await SendFile(provider, mediaStream.Path, localItem, target, cancellationToken).ConfigureAwait(false); var remotePath = GetRemoteSubtitlePath(localItem, mediaStream, provider, target);
var sendFileResult = await SendFile(provider, mediaStream.Path, remotePath, target, cancellationToken).ConfigureAwait(false);
mediaStream.Path = sendFileResult.Path; mediaStream.Path = sendFileResult.Path;
requiresSave = true; requiresSave = true;
@ -240,6 +237,38 @@ namespace MediaBrowser.Server.Implementations.Sync
} }
} }
private string GetRemoteSubtitlePath(LocalItem item, MediaStream stream, IServerSyncProvider provider, SyncTarget target)
{
var path = item.LocalPath;
var filename = GetSubtitleSaveFileName(item, stream.Language, stream.IsForced) + "." + stream.Codec.ToLower();
var parentPath = provider.GetParentDirectoryPath(path, target);
path = Path.Combine(parentPath, filename);
return path;
}
private string GetSubtitleSaveFileName(LocalItem item, string language, bool isForced)
{
var path = item.LocalPath;
var name = Path.GetFileNameWithoutExtension(path);
if (!string.IsNullOrWhiteSpace(language))
{
name += "." + language.ToLower();
}
if (isForced)
{
name += ".foreign";
}
return name;
}
private async Task RemoveItem(IServerSyncProvider provider, private async Task RemoveItem(IServerSyncProvider provider,
ISyncDataProvider dataProvider, ISyncDataProvider dataProvider,
string serverId, string serverId,
@ -264,12 +293,12 @@ namespace MediaBrowser.Server.Implementations.Sync
} }
} }
private async Task<SendFileResult> SendFile(IServerSyncProvider provider, string inputPath, LocalItem item, SyncTarget target, CancellationToken cancellationToken) private async Task<SendFileResult> SendFile(IServerSyncProvider provider, string inputPath, string remotePath, SyncTarget target, CancellationToken cancellationToken)
{ {
_logger.Debug("Sending {0} to {1}. Remote path: {2}", inputPath, provider.Name, item.LocalPath); _logger.Debug("Sending {0} to {1}. Remote path: {2}", inputPath, provider.Name, remotePath);
using (var stream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true)) using (var stream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
{ {
return await provider.SendFile(stream, item.LocalPath, target, new Progress<double>(), cancellationToken).ConfigureAwait(false); return await provider.SendFile(stream, remotePath, target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
} }
} }

@ -632,7 +632,8 @@ namespace MediaBrowser.Server.Implementations.Sync
IsExternal = true, IsExternal = true,
Language = subtitle.Language, Language = subtitle.Language,
Path = fileInfo.Path, Path = fileInfo.Path,
SupportsExternalStream = true SupportsExternalStream = true,
Type = MediaStreamType.Subtitle
}); });
startingIndex++; startingIndex++;

Loading…
Cancel
Save