|
|
|
@ -68,11 +68,6 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
|
|
|
|
|
private readonly IItemRepository _itemRepo;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The _locks
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly ConcurrentDictionary<string, SemaphoreSlim> _locks = new ConcurrentDictionary<string, SemaphoreSlim>();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Initializes a new instance of the <see cref="ImageManager" /> class.
|
|
|
|
|
/// </summary>
|
|
|
|
@ -146,7 +141,7 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var originalImageSize = await GetImageSize(originalImagePath, dateModified).ConfigureAwait(false);
|
|
|
|
|
var originalImageSize = GetImageSize(originalImagePath, dateModified);
|
|
|
|
|
|
|
|
|
|
// Determine the output size based on incoming parameters
|
|
|
|
|
var newSize = DrawingUtils.Resize(originalImageSize, width, height, maxWidth, maxHeight);
|
|
|
|
@ -304,7 +299,7 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
/// <param name="dateModified">The date modified.</param>
|
|
|
|
|
/// <returns>Task{ImageSize}.</returns>
|
|
|
|
|
/// <exception cref="System.ArgumentNullException">imagePath</exception>
|
|
|
|
|
public async Task<ImageSize> GetImageSize(string imagePath, DateTime dateModified)
|
|
|
|
|
public ImageSize GetImageSize(string imagePath, DateTime dateModified)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(imagePath))
|
|
|
|
|
{
|
|
|
|
@ -317,7 +312,7 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
|
|
|
|
|
if (!_cachedImagedSizes.TryGetValue(name, out size))
|
|
|
|
|
{
|
|
|
|
|
size = await GetImageSize(name, imagePath).ConfigureAwait(false);
|
|
|
|
|
size = GetImageSize(name, imagePath);
|
|
|
|
|
|
|
|
|
|
_cachedImagedSizes.AddOrUpdate(name, size, (keyName, oldValue) => size);
|
|
|
|
|
}
|
|
|
|
@ -333,7 +328,7 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
/// <param name="keyName">Name of the key.</param>
|
|
|
|
|
/// <param name="imagePath">The image path.</param>
|
|
|
|
|
/// <returns>ImageSize.</returns>
|
|
|
|
|
private async Task<ImageSize> GetImageSize(string keyName, string imagePath)
|
|
|
|
|
private ImageSize GetImageSize(string keyName, string imagePath)
|
|
|
|
|
{
|
|
|
|
|
// Now check the file system cache
|
|
|
|
|
var fullCachePath = ImageSizeCache.GetResourcePath(keyName, ".txt");
|
|
|
|
@ -349,34 +344,29 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
// Cache file doesn't exist or is currently being written to
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var semaphore = GetLock(fullCachePath);
|
|
|
|
|
|
|
|
|
|
await semaphore.WaitAsync().ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray();
|
|
|
|
|
var syncLock = GetObjectLock(fullCachePath);
|
|
|
|
|
|
|
|
|
|
return new ImageSize { Width = result[0], Height = result[1] };
|
|
|
|
|
}
|
|
|
|
|
catch (FileNotFoundException)
|
|
|
|
|
lock (syncLock)
|
|
|
|
|
{
|
|
|
|
|
// Cache file doesn't exist no biggie
|
|
|
|
|
}
|
|
|
|
|
catch (DirectoryNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
// Cache file doesn't exist no biggie
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
semaphore.Release();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var result = File.ReadAllText(fullCachePath)
|
|
|
|
|
.Split('|')
|
|
|
|
|
.Select(i => double.Parse(i, UsCulture))
|
|
|
|
|
.ToArray();
|
|
|
|
|
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
return new ImageSize { Width = result[0], Height = result[1] };
|
|
|
|
|
}
|
|
|
|
|
catch (FileNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
// Cache file doesn't exist no biggie
|
|
|
|
|
}
|
|
|
|
|
catch (DirectoryNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
// Cache file doesn't exist no biggie
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var size = await ImageHeader.GetDimensions(imagePath, _logger).ConfigureAwait(false);
|
|
|
|
|
var size = ImageHeader.GetDimensions(imagePath, _logger);
|
|
|
|
|
|
|
|
|
|
var parentPath = Path.GetDirectoryName(fullCachePath);
|
|
|
|
|
|
|
|
|
@ -390,10 +380,6 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
|
|
|
|
|
return new ImageSize { Width = size.Width, Height = size.Height };
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
semaphore.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -600,7 +586,7 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
|
|
|
|
|
return GetEnhancedImage(originalImagePath, dateModified, item, imageType, imageIndex, supportedImageEnhancers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Runs an image through the image enhancers, caches the result, and returns the cached path
|
|
|
|
|
/// </summary>
|
|
|
|
@ -786,6 +772,11 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The _semaphoreLocks
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphoreLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the lock.
|
|
|
|
|
/// </summary>
|
|
|
|
@ -793,7 +784,22 @@ namespace MediaBrowser.Controller.Drawing
|
|
|
|
|
/// <returns>System.Object.</returns>
|
|
|
|
|
private SemaphoreSlim GetLock(string filename)
|
|
|
|
|
{
|
|
|
|
|
return _locks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
|
|
|
|
|
return _semaphoreLocks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The _semaphoreLocks
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the lock.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="filename">The filename.</param>
|
|
|
|
|
/// <returns>System.Object.</returns>
|
|
|
|
|
private object GetObjectLock(string filename)
|
|
|
|
|
{
|
|
|
|
|
return _locks.GetOrAdd(filename, key => new object());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|