|
|
|
@ -74,57 +74,50 @@ namespace Jellyfin.Api.Controllers.Images
|
|
|
|
|
[FromQuery] string providerName,
|
|
|
|
|
[FromQuery] bool includeAllLanguages)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var images = await _providerManager.GetAvailableRemoteImages(
|
|
|
|
|
item,
|
|
|
|
|
new RemoteImageQuery
|
|
|
|
|
{
|
|
|
|
|
ProviderName = providerName,
|
|
|
|
|
IncludeAllLanguages = includeAllLanguages,
|
|
|
|
|
IncludeDisabledProviders = true,
|
|
|
|
|
ImageType = type
|
|
|
|
|
}, CancellationToken.None)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var imageArray = images.ToArray();
|
|
|
|
|
var allProviders = _providerManager.GetRemoteImageProviderInfo(item);
|
|
|
|
|
if (type.HasValue)
|
|
|
|
|
{
|
|
|
|
|
allProviders = allProviders.Where(o => o.SupportedImages.Contains(type.Value));
|
|
|
|
|
}
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var result = new RemoteImageResult
|
|
|
|
|
{
|
|
|
|
|
TotalRecordCount = imageArray.Length,
|
|
|
|
|
Providers = allProviders.Select(o => o.Name)
|
|
|
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
|
|
|
.ToArray()
|
|
|
|
|
};
|
|
|
|
|
var images = await _providerManager.GetAvailableRemoteImages(
|
|
|
|
|
item,
|
|
|
|
|
new RemoteImageQuery
|
|
|
|
|
{
|
|
|
|
|
ProviderName = providerName,
|
|
|
|
|
IncludeAllLanguages = includeAllLanguages,
|
|
|
|
|
IncludeDisabledProviders = true,
|
|
|
|
|
ImageType = type
|
|
|
|
|
}, CancellationToken.None)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (startIndex.HasValue)
|
|
|
|
|
{
|
|
|
|
|
imageArray = imageArray.Skip(startIndex.Value).ToArray();
|
|
|
|
|
}
|
|
|
|
|
var imageArray = images.ToArray();
|
|
|
|
|
var allProviders = _providerManager.GetRemoteImageProviderInfo(item);
|
|
|
|
|
if (type.HasValue)
|
|
|
|
|
{
|
|
|
|
|
allProviders = allProviders.Where(o => o.SupportedImages.Contains(type.Value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (limit.HasValue)
|
|
|
|
|
{
|
|
|
|
|
imageArray = imageArray.Take(limit.Value).ToArray();
|
|
|
|
|
}
|
|
|
|
|
var result = new RemoteImageResult
|
|
|
|
|
{
|
|
|
|
|
TotalRecordCount = imageArray.Length,
|
|
|
|
|
Providers = allProviders.Select(o => o.Name)
|
|
|
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
|
|
|
.ToArray()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
result.Images = imageArray;
|
|
|
|
|
return Ok(result);
|
|
|
|
|
if (startIndex.HasValue)
|
|
|
|
|
{
|
|
|
|
|
imageArray = imageArray.Skip(startIndex.Value).ToArray();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
|
|
|
|
if (limit.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
|
|
|
|
|
imageArray = imageArray.Take(limit.Value).ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result.Images = imageArray;
|
|
|
|
|
return Ok(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -138,21 +131,14 @@ namespace Jellyfin.Api.Controllers.Images
|
|
|
|
|
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
|
|
|
|
|
public IActionResult GetRemoteImageProviders([FromRoute] string id)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var providers = _providerManager.GetRemoteImageProviderInfo(item);
|
|
|
|
|
return Ok(providers);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var providers = _providerManager.GetRemoteImageProviderInfo(item);
|
|
|
|
|
return Ok(providers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -166,49 +152,42 @@ namespace Jellyfin.Api.Controllers.Images
|
|
|
|
|
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
|
|
|
|
|
public async Task<IActionResult> GetRemoteImage([FromQuery, BindRequired] string imageUrl)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var urlHash = imageUrl.GetMD5();
|
|
|
|
|
var pointerCachePath = GetFullCachePath(urlHash.ToString());
|
|
|
|
|
var urlHash = imageUrl.GetMD5();
|
|
|
|
|
var pointerCachePath = GetFullCachePath(urlHash.ToString());
|
|
|
|
|
|
|
|
|
|
string? contentPath = null;
|
|
|
|
|
bool hasFile = false;
|
|
|
|
|
string? contentPath = null;
|
|
|
|
|
bool hasFile = false;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
contentPath = await System.IO.File.ReadAllTextAsync(pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
if (System.IO.File.Exists(contentPath))
|
|
|
|
|
{
|
|
|
|
|
hasFile = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (FileNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
// Means the file isn't cached yet
|
|
|
|
|
}
|
|
|
|
|
catch (IOException)
|
|
|
|
|
{
|
|
|
|
|
// Means the file isn't cached yet
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hasFile)
|
|
|
|
|
{
|
|
|
|
|
await DownloadImage(imageUrl, urlHash, pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
contentPath = await System.IO.File.ReadAllTextAsync(pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(contentPath))
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
contentPath = await System.IO.File.ReadAllTextAsync(pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
if (System.IO.File.Exists(contentPath))
|
|
|
|
|
{
|
|
|
|
|
return NotFound();
|
|
|
|
|
hasFile = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (FileNotFoundException)
|
|
|
|
|
{
|
|
|
|
|
// Means the file isn't cached yet
|
|
|
|
|
}
|
|
|
|
|
catch (IOException)
|
|
|
|
|
{
|
|
|
|
|
// Means the file isn't cached yet
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var contentType = MimeTypes.GetMimeType(contentPath);
|
|
|
|
|
return new FileStreamResult(System.IO.File.OpenRead(contentPath), contentType);
|
|
|
|
|
if (!hasFile)
|
|
|
|
|
{
|
|
|
|
|
await DownloadImage(imageUrl, urlHash, pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
contentPath = await System.IO.File.ReadAllTextAsync(pointerCachePath).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(contentPath))
|
|
|
|
|
{
|
|
|
|
|
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var contentType = MimeTypes.GetMimeType(contentPath);
|
|
|
|
|
return new FileStreamResult(System.IO.File.OpenRead(contentPath), contentType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -227,24 +206,17 @@ namespace Jellyfin.Api.Controllers.Images
|
|
|
|
|
[FromQuery, BindRequired] ImageType type,
|
|
|
|
|
[FromQuery] string imageUrl)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
var item = _libraryManager.GetItemById(id);
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
return NotFound();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await _providerManager.SaveImage(item, imageUrl, type, null, CancellationToken.None)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
await _providerManager.SaveImage(item, imageUrl, type, null, CancellationToken.None)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
|
|
|
|
|
return Ok();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
|
|
|
|
|
}
|
|
|
|
|
item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
|
|
|
|
|
return Ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|