UI now loads the 250px image if available, and reverts to full size otherwise.

pull/2/head
Taloth Saldono 10 years ago
parent 35ab3a28fd
commit b145ea1a70

@ -1,4 +1,6 @@
using System.IO; using System.IO;
using System.Text.RegularExpressions;
using Nancy;
using NLog; using NLog;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
@ -8,6 +10,8 @@ namespace NzbDrone.Api.Frontend.Mappers
{ {
public class MediaCoverMapper : StaticResourceMapperBase public class MediaCoverMapper : StaticResourceMapperBase
{ {
private static readonly Regex RegexResizedImage = new Regex(@"-\d+\.jpg($|\?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly IAppFolderInfo _appFolderInfo; private readonly IAppFolderInfo _appFolderInfo;
public MediaCoverMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, Logger logger) public MediaCoverMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, Logger logger)
@ -24,6 +28,24 @@ namespace NzbDrone.Api.Frontend.Mappers
return Path.Combine(_appFolderInfo.GetAppDataPath(), path); return Path.Combine(_appFolderInfo.GetAppDataPath(), path);
} }
public override Response GetResponse(string resourceUrl)
{
var result = base.GetResponse(resourceUrl);
// Return the full sized image if someone requests a non-existing resized one.
// TODO: This code can be removed later once everyone had the update for a while.
if (result is NotFoundResponse)
{
var baseResourceUrl = RegexResizedImage.Replace(resourceUrl, ".jpg$1");
if (baseResourceUrl != resourceUrl)
{
result = base.GetResponse(baseResourceUrl);
}
}
return result;
}
public override bool CanHandle(string resourceUrl) public override bool CanHandle(string resourceUrl)
{ {
return resourceUrl.StartsWith("/MediaCover"); return resourceUrl.StartsWith("/MediaCover");

@ -1,4 +1,5 @@
using System.IO; using System.IO;
using System.Text.RegularExpressions;
using Nancy; using Nancy;
using Nancy.Responses; using Nancy.Responses;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
@ -9,6 +10,8 @@ namespace NzbDrone.Api.MediaCovers
{ {
public class MediaCoverModule : NzbDroneApiModule public class MediaCoverModule : NzbDroneApiModule
{ {
private static readonly Regex RegexResizedImage = new Regex(@"-\d+\.jpg$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private const string MEDIA_COVER_ROUTE = @"/(?<seriesId>\d+)/(?<filename>(.+)\.(jpg|png|gif))"; private const string MEDIA_COVER_ROUTE = @"/(?<seriesId>\d+)/(?<filename>(.+)\.(jpg|png|gif))";
private readonly IAppFolderInfo _appFolderInfo; private readonly IAppFolderInfo _appFolderInfo;
@ -27,7 +30,16 @@ namespace NzbDrone.Api.MediaCovers
var filePath = Path.Combine(_appFolderInfo.GetAppDataPath(), "MediaCover", seriesId.ToString(), filename); var filePath = Path.Combine(_appFolderInfo.GetAppDataPath(), "MediaCover", seriesId.ToString(), filename);
if (!_diskProvider.FileExists(filePath)) if (!_diskProvider.FileExists(filePath))
return new NotFoundResponse(); {
// Return the full sized image if someone requests a non-existing resized one.
// TODO: This code can be removed later once everyone had the update for a while.
var basefilePath = RegexResizedImage.Replace(filePath, ".jpg");
if (basefilePath == filePath || !_diskProvider.FileExists(basefilePath))
{
return new NotFoundResponse();
}
filePath = basefilePath;
}
return new StreamResponse(() => File.OpenRead(filePath), MimeTypes.GetMimeType(filePath)); return new StreamResponse(() => File.OpenRead(filePath), MimeTypes.GetMimeType(filePath));
} }

@ -17,8 +17,16 @@ define(
img.onerror = null; img.onerror = null;
}; };
Handlebars.registerHelper('defaultImg', function () { Handlebars.registerHelper('defaultImg', function (src, size) {
return new Handlebars.SafeString('onerror=window.NzbDrone.imageError(this)'); if (!src) {
return new Handlebars.SafeString('onerror="window.NzbDrone.imageError(this);"');
}
if (size) {
src = src.replace(/\.jpg($|\?)/g, '-' + size + '.jpg$1');
}
return new Handlebars.SafeString('src="{0}" onerror="window.NzbDrone.imageError(this);"'.format(src));
}); });
Handlebars.registerHelper('UrlBase', function () { Handlebars.registerHelper('UrlBase', function () {

@ -11,7 +11,7 @@ define(
var poster = _.where(this.images, {coverType: 'poster'}); var poster = _.where(this.images, {coverType: 'poster'});
if (poster[0]) { if (poster[0]) {
return new Handlebars.SafeString('<img class="series-poster" src="{0}" {1}>'.format(poster[0].url, Handlebars.helpers.defaultImg.call())); return new Handlebars.SafeString('<img class="series-poster" {0}>'.format(Handlebars.helpers.defaultImg.call(null, poster[0].url, 250)));
} }
return new Handlebars.SafeString('<img class="series-poster placeholder-image" src="{0}">'.format(placeholder)); return new Handlebars.SafeString('<img class="series-poster placeholder-image" src="{0}">'.format(placeholder));

Loading…
Cancel
Save