Use async requests for media cover proxy

(cherry picked from commit ad1f185330a30a2a9d27c9d3f18d384e66727c2a)

Closes #4126
pull/4136/head
Bogdan 8 months ago
parent febf4b26a1
commit 0037a56c2b

@ -1,3 +1,4 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace Lidarr.Http.Frontend.Mappers
@ -6,6 +7,6 @@ namespace Lidarr.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.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 Lidarr.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 Lidarr.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 Lidarr.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 Lidarr.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 Lidarr.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 Lidarr.Http.Extensions;
using Lidarr.Http.Frontend.Mappers;
using Microsoft.AspNetCore.Authorization;
@ -25,27 +26,27 @@ namespace Lidarr.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 Lidarr.Http.Frontend
if (mapper != null)
{
var result = mapper.GetResponse(path);
var result = await mapper.GetResponse(path);
if (result != null)
{

@ -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;
}
}
}

Loading…
Cancel
Save