|
@@ -89,29 +89,63 @@ namespace MediaBrowser.MediaEncoding.Attachments
|
|
string outputPath,
|
|
string outputPath,
|
|
CancellationToken cancellationToken)
|
|
CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
- var semaphore = _semaphoreLocks.GetOrAdd(outputPath, key => new SemaphoreSlim(1, 1));
|
|
|
|
|
|
+ if (!Directory.Exists(outputPath))
|
|
|
|
+ {
|
|
|
|
+ var semaphore = _semaphoreLocks.GetOrAdd(outputPath, key => new SemaphoreSlim(1, 1));
|
|
|
|
|
|
- await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
+ await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
- try
|
|
|
|
- {
|
|
|
|
- if (!Directory.Exists(outputPath))
|
|
|
|
|
|
+ try
|
|
{
|
|
{
|
|
await ExtractAllAttachmentsInternal(
|
|
await ExtractAllAttachmentsInternal(
|
|
_mediaEncoder.GetInputArgument(inputFile, mediaSource),
|
|
_mediaEncoder.GetInputArgument(inputFile, mediaSource),
|
|
outputPath,
|
|
outputPath,
|
|
|
|
+ false,
|
|
cancellationToken).ConfigureAwait(false);
|
|
cancellationToken).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
+ finally
|
|
|
|
+ {
|
|
|
|
+ semaphore.Release();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- finally
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public async Task ExtractAllAttachmentsExternal(
|
|
|
|
+ string inputArgument,
|
|
|
|
+ string id,
|
|
|
|
+ string outputPath,
|
|
|
|
+ CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ if (!File.Exists(Path.Join(outputPath, id)))
|
|
{
|
|
{
|
|
- semaphore.Release();
|
|
|
|
|
|
+ var semaphore = _semaphoreLocks.GetOrAdd(outputPath, key => new SemaphoreSlim(1, 1));
|
|
|
|
+
|
|
|
|
+ await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
+
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ await ExtractAllAttachmentsInternal(
|
|
|
|
+ inputArgument,
|
|
|
|
+ outputPath,
|
|
|
|
+ true,
|
|
|
|
+ cancellationToken).ConfigureAwait(false);
|
|
|
|
+ }
|
|
|
|
+ finally
|
|
|
|
+ {
|
|
|
|
+ if (Directory.Exists(outputPath))
|
|
|
|
+ {
|
|
|
|
+ File.Create(Path.Join(outputPath, id));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ semaphore.Release();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private async Task ExtractAllAttachmentsInternal(
|
|
private async Task ExtractAllAttachmentsInternal(
|
|
string inputPath,
|
|
string inputPath,
|
|
string outputPath,
|
|
string outputPath,
|
|
|
|
+ bool isExternal,
|
|
CancellationToken cancellationToken)
|
|
CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
if (string.IsNullOrEmpty(inputPath))
|
|
if (string.IsNullOrEmpty(inputPath))
|
|
@@ -124,11 +158,14 @@ namespace MediaBrowser.MediaEncoding.Attachments
|
|
throw new ArgumentNullException(nameof(outputPath));
|
|
throw new ArgumentNullException(nameof(outputPath));
|
|
}
|
|
}
|
|
|
|
|
|
- Directory.CreateDirectory(outputPath);
|
|
|
|
|
|
+ if (!Directory.Exists(outputPath))
|
|
|
|
+ {
|
|
|
|
+ Directory.CreateDirectory(outputPath);
|
|
|
|
+ }
|
|
|
|
|
|
var processArgs = string.Format(
|
|
var processArgs = string.Format(
|
|
CultureInfo.InvariantCulture,
|
|
CultureInfo.InvariantCulture,
|
|
- "-dump_attachment:t \"\" -i {0} -t 0 -f null null",
|
|
|
|
|
|
+ "-dump_attachment:t \"\" -y -i {0} -t 0 -f null null",
|
|
inputPath);
|
|
inputPath);
|
|
|
|
|
|
int exitCode;
|
|
int exitCode;
|
|
@@ -174,19 +211,24 @@ namespace MediaBrowser.MediaEncoding.Attachments
|
|
|
|
|
|
if (exitCode != 0)
|
|
if (exitCode != 0)
|
|
{
|
|
{
|
|
- failed = true;
|
|
|
|
-
|
|
|
|
- _logger.LogWarning("Deleting extracted attachments {Path} due to failure: {ExitCode}", outputPath, exitCode);
|
|
|
|
- try
|
|
|
|
|
|
+ if (isExternal && exitCode == 1)
|
|
{
|
|
{
|
|
- if (Directory.Exists(outputPath))
|
|
|
|
|
|
+ // ffmpeg returns exitCode 1 because there is no video or audio stream
|
|
|
|
+ // this can be ignored
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ failed = true;
|
|
|
|
+
|
|
|
|
+ _logger.LogWarning("Deleting extracted attachments {Path} due to failure: {ExitCode}", outputPath, exitCode);
|
|
|
|
+ try
|
|
{
|
|
{
|
|
Directory.Delete(outputPath);
|
|
Directory.Delete(outputPath);
|
|
}
|
|
}
|
|
- }
|
|
|
|
- catch (IOException ex)
|
|
|
|
- {
|
|
|
|
- _logger.LogError(ex, "Error deleting extracted attachments {Path}", outputPath);
|
|
|
|
|
|
+ catch (IOException ex)
|
|
|
|
+ {
|
|
|
|
+ _logger.LogError(ex, "Error deleting extracted attachments {Path}", outputPath);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (!Directory.Exists(outputPath))
|
|
else if (!Directory.Exists(outputPath))
|