Use async requests for media cover proxy
This commit is contained in:
parent
ddabe66262
commit
ad1f185330
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
|
@ -12,7 +13,7 @@ namespace NzbDrone.Core.MediaCover
|
|||
string RegisterUrl(string url);
|
||||
|
||||
string GetUrl(string hash);
|
||||
byte[] GetImage(string hash);
|
||||
Task<byte[]> GetImage(string hash);
|
||||
}
|
||||
|
||||
public class MediaCoverProxy : IMediaCoverProxy
|
||||
|
@ -52,13 +53,14 @@ namespace NzbDrone.Core.MediaCover
|
|||
return result;
|
||||
}
|
||||
|
||||
public byte[] GetImage(string hash)
|
||||
public async Task<byte[]> GetImage(string hash)
|
||||
{
|
||||
var url = GetUrl(hash);
|
||||
|
||||
var request = new HttpRequest(url);
|
||||
var response = await _httpClient.GetAsync(request);
|
||||
|
||||
return _httpClient.Get(request).ResponseData;
|
||||
return response.ResponseData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Sonarr.Http.Frontend.Mappers
|
||||
{
|
||||
|
@ -6,6 +7,6 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
{
|
||||
string Map(string resourceUrl);
|
||||
bool CanHandle(string resourceUrl);
|
||||
IActionResult GetResponse(string resourceUrl);
|
||||
Task<IActionResult> GetResponse(string resourceUrl);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
|
@ -9,7 +10,7 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
{
|
||||
public class MediaCoverProxyMapper : IMapHttpRequestsToDisk
|
||||
{
|
||||
private readonly Regex _regex = new Regex(@"/MediaCoverProxy/(?<hash>\w+)/(?<filename>(.+)\.(jpg|png|gif))");
|
||||
private readonly Regex _regex = new (@"/MediaCoverProxy/(?<hash>\w+)/(?<filename>(.+)\.(jpg|png|gif))");
|
||||
|
||||
private readonly IMediaCoverProxy _mediaCoverProxy;
|
||||
private readonly IContentTypeProvider _mimeTypeProvider;
|
||||
|
@ -30,7 +31,7 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
return resourceUrl.StartsWith("/MediaCoverProxy/", StringComparison.InvariantCultureIgnoreCase);
|
||||
}
|
||||
|
||||
public IActionResult GetResponse(string resourceUrl)
|
||||
public async Task<IActionResult> GetResponse(string resourceUrl)
|
||||
{
|
||||
var match = _regex.Match(resourceUrl);
|
||||
|
||||
|
@ -42,7 +43,7 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
var hash = match.Groups["hash"].Value;
|
||||
var filename = match.Groups["filename"].Value;
|
||||
|
||||
var imageData = _mediaCoverProxy.GetImage(hash);
|
||||
var imageData = await _mediaCoverProxy.GetImage(hash);
|
||||
|
||||
if (!_mimeTypeProvider.TryGetContentType(filename, out var contentType))
|
||||
{
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
@ -30,7 +31,7 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
|
||||
public abstract bool CanHandle(string resourceUrl);
|
||||
|
||||
public IActionResult GetResponse(string resourceUrl)
|
||||
public Task<IActionResult> GetResponse(string resourceUrl)
|
||||
{
|
||||
var filePath = Map(resourceUrl);
|
||||
|
||||
|
@ -41,10 +42,10 @@ namespace Sonarr.Http.Frontend.Mappers
|
|||
contentType = "application/octet-stream";
|
||||
}
|
||||
|
||||
return new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType)
|
||||
return Task.FromResult<IActionResult>(new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType)
|
||||
{
|
||||
Encoding = contentType == "text/plain" ? Encoding.UTF8 : null
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
_logger.Warn("File {0} not found", filePath);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
@ -25,27 +26,27 @@ namespace Sonarr.Http.Frontend
|
|||
|
||||
[AllowAnonymous]
|
||||
[HttpGet("login")]
|
||||
public IActionResult LoginPage()
|
||||
public async Task<IActionResult> LoginPage()
|
||||
{
|
||||
return MapResource("login");
|
||||
return await MapResource("login");
|
||||
}
|
||||
|
||||
[EnableCors("AllowGet")]
|
||||
[AllowAnonymous]
|
||||
[HttpGet("/content/{**path:regex(^(?!api/).*)}")]
|
||||
public IActionResult IndexContent([FromRoute] string path)
|
||||
public async Task<IActionResult> IndexContent([FromRoute] string path)
|
||||
{
|
||||
return MapResource("Content/" + path);
|
||||
return await MapResource("Content/" + path);
|
||||
}
|
||||
|
||||
[HttpGet("")]
|
||||
[HttpGet("/{**path:regex(^(?!(api|feed)/).*)}")]
|
||||
public IActionResult Index([FromRoute] string path)
|
||||
public async Task<IActionResult> Index([FromRoute] string path)
|
||||
{
|
||||
return MapResource(path);
|
||||
return await MapResource(path);
|
||||
}
|
||||
|
||||
private IActionResult MapResource(string path)
|
||||
private async Task<IActionResult> MapResource(string path)
|
||||
{
|
||||
path = "/" + (path ?? "");
|
||||
|
||||
|
@ -53,7 +54,7 @@ namespace Sonarr.Http.Frontend
|
|||
|
||||
if (mapper != null)
|
||||
{
|
||||
var result = mapper.GetResponse(path);
|
||||
var result = await mapper.GetResponse(path);
|
||||
|
||||
if (result != null)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue