Fixed: Cache Album covers local (#780)

* Fixed: Cache Album covers local

* Fixed: Maxsize is handled by the backend mapping

* Fixed: Store Album covers seperate from ArtistId
This commit is contained in:
Qstick 2019-05-07 19:10:09 -04:00 committed by GitHub
commit 35c19dac5f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 232 additions and 307 deletions

View file

@ -12,6 +12,7 @@ using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Download;
using NzbDrone.Core.Music.Events;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.MediaCover;
namespace Lidarr.Api.V1.Albums
{
@ -23,13 +24,14 @@ namespace Lidarr.Api.V1.Albums
{
protected readonly IReleaseService _releaseService;
public AlbumModule(IAlbumService albumService,
IReleaseService releaseService,
IArtistStatisticsService artistStatisticsService,
IMapCoversToLocal coverMapper,
IUpgradableSpecification upgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(albumService, artistStatisticsService, upgradableSpecification, signalRBroadcaster)
: base(albumService, artistStatisticsService, coverMapper, upgradableSpecification, signalRBroadcaster)
{
_releaseService = releaseService;
GetResourceAll = GetAlbums;

View file

@ -7,6 +7,7 @@ using NzbDrone.Core.Music;
using NzbDrone.Core.ArtistStats;
using NzbDrone.SignalR;
using Lidarr.Http;
using NzbDrone.Core.MediaCover;
namespace Lidarr.Api.V1.Albums
{
@ -15,15 +16,18 @@ namespace Lidarr.Api.V1.Albums
protected readonly IAlbumService _albumService;
protected readonly IArtistStatisticsService _artistStatisticsService;
protected readonly IUpgradableSpecification _qualityUpgradableSpecification;
protected readonly IMapCoversToLocal _coverMapper;
protected AlbumModuleWithSignalR(IAlbumService albumService,
IArtistStatisticsService artistStatisticsService,
IMapCoversToLocal coverMapper,
IUpgradableSpecification qualityUpgradableSpecification,
IBroadcastSignalRMessage signalRBroadcaster)
: base(signalRBroadcaster)
{
_albumService = albumService;
_artistStatisticsService = artistStatisticsService;
_coverMapper = coverMapper;
_qualityUpgradableSpecification = qualityUpgradableSpecification;
GetResourceById = GetAlbum;
@ -62,6 +66,7 @@ namespace Lidarr.Api.V1.Albums
}
FetchAndLinkAlbumStatistics(resource);
MapCoversToLocal(resource);
return resource;
}
@ -86,6 +91,7 @@ namespace Lidarr.Api.V1.Albums
var artistStats = _artistStatisticsService.ArtistStatistics();
LinkArtistStatistics(result, artistStats);
MapCoversToLocal(result.ToArray());
return result;
}
@ -114,5 +120,13 @@ namespace Lidarr.Api.V1.Albums
}
}
private void MapCoversToLocal(params AlbumResource[] albums)
{
foreach (var albumResource in albums)
{
_coverMapper.ConvertToLocalUrls(albumResource.Id, MediaCoverEntity.Album, albumResource.Images);
}
}
}
}

View file

@ -181,7 +181,7 @@ namespace Lidarr.Api.V1.Artist
{
foreach (var artistResource in artists)
{
_coverMapper.ConvertToLocalUrls(artistResource.Id, artistResource.Images);
_coverMapper.ConvertToLocalUrls(artistResource.Id, MediaCoverEntity.Artist, artistResource.Images);
}
}

View file

@ -12,7 +12,8 @@ namespace Lidarr.Api.V1.MediaCovers
{
private static readonly Regex RegexResizedImage = new Regex(@"-\d+\.jpg$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private const string MEDIA_COVER_ROUTE = @"/(?<artistId>\d+)/(?<filename>(.+)\.(jpg|png|gif))";
private const string MEDIA_COVER_ARTIST_ROUTE = @"/Artist/(?<artistId>\d+)/(?<filename>(.+)\.(jpg|png|gif))";
private const string MEDIA_COVER_ALBUM_ROUTE = @"/Album/(?<artistId>\d+)/(?<filename>(.+)\.(jpg|png|gif))";
private readonly IAppFolderInfo _appFolderInfo;
private readonly IDiskProvider _diskProvider;
@ -22,10 +23,11 @@ namespace Lidarr.Api.V1.MediaCovers
_appFolderInfo = appFolderInfo;
_diskProvider = diskProvider;
Get[MEDIA_COVER_ROUTE] = options => GetMediaCover(options.artistId, options.filename);
Get[MEDIA_COVER_ARTIST_ROUTE] = options => GetArtistMediaCover(options.artistId, options.filename);
Get[MEDIA_COVER_ALBUM_ROUTE] = options => GetAlbumMediaCover(options.artistId, options.filename);
}
private Response GetMediaCover(int artistId, string filename)
private Response GetArtistMediaCover(int artistId, string filename)
{
var filePath = Path.Combine(_appFolderInfo.GetAppDataPath(), "MediaCover", artistId.ToString(), filename);
@ -43,5 +45,24 @@ namespace Lidarr.Api.V1.MediaCovers
return new StreamResponse(() => File.OpenRead(filePath), MimeTypes.GetMimeType(filePath));
}
private Response GetAlbumMediaCover(int albumId, string filename)
{
var filePath = Path.Combine(_appFolderInfo.GetAppDataPath(), "MediaCover", "Albums", albumId.ToString(), filename);
if (!_diskProvider.FileExists(filePath) || _diskProvider.GetFileSize(filePath) == 0)
{
// 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));
}
}
}

View file

@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(It.IsAny<string>()))
.Returns(true);
Subject.ConvertToLocalUrls(12, covers);
Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers);
covers.Single().Url.Should().Be("/MediaCover/12/banner.jpg?lastWrite=1234");
@ -75,10 +75,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(It.IsAny<string>()))
.Returns(true);
Subject.ConvertToLocalUrls(12, covers, 6);
Subject.ConvertToLocalUrls(6, MediaCoverEntity.Album, covers);
covers.Single().Url.Should().Be("/MediaCover/12/6/disc.jpg?lastWrite=1234");
covers.Single().Url.Should().Be("/MediaCover/Albums/6/disc.jpg?lastWrite=1234");
}
[Test]
@ -90,7 +90,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
};
Subject.ConvertToLocalUrls(12, covers);
Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers);
covers.Single().Url.Should().Be("/MediaCover/12/banner.jpg");
@ -103,6 +103,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
.Setup(v => v.AlreadyExists(It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns(false);
Mocker.GetMock<IAlbumService>()
.Setup(v => v.GetAlbumsByArtist(It.IsAny<int>()))
.Returns(new List<Album> { _album });
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(It.IsAny<string>()))
.Returns(true);
@ -110,7 +114,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.HandleAsync(new ArtistUpdatedEvent(_artist));
Mocker.GetMock<IImageResizer>()
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(2));
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(3));
}
[Test]
@ -120,6 +124,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
.Setup(v => v.AlreadyExists(It.IsAny<DateTime>(), It.IsAny<string>()))
.Returns(true);
Mocker.GetMock<IAlbumService>()
.Setup(v => v.GetAlbumsByArtist(It.IsAny<int>()))
.Returns(new List<Album> { _album });
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(It.IsAny<string>()))
.Returns(false);
@ -127,7 +135,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.HandleAsync(new ArtistUpdatedEvent(_artist));
Mocker.GetMock<IImageResizer>()
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(2));
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(3));
}
[Test]
@ -141,6 +149,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
.Setup(v => v.FileExists(It.IsAny<string>()))
.Returns(true);
Mocker.GetMock<IAlbumService>()
.Setup(v => v.GetAlbumsByArtist(It.IsAny<int>()))
.Returns(new List<Album> { _album });
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.GetFileSize(It.IsAny<string>()))
.Returns(1000);
@ -162,6 +174,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
.Setup(v => v.FileExists(It.IsAny<string>()))
.Returns(true);
Mocker.GetMock<IAlbumService>()
.Setup(v => v.GetAlbumsByArtist(It.IsAny<int>()))
.Returns(new List<Album> { _album });
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.GetFileSize(It.IsAny<string>()))
.Returns(0);
@ -169,7 +185,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.HandleAsync(new ArtistUpdatedEvent(_artist));
Mocker.GetMock<IImageResizer>()
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(2));
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(3));
}
[Test]
@ -183,6 +199,10 @@ namespace NzbDrone.Core.Test.MediaCoverTests
.Setup(v => v.FileExists(It.IsAny<string>()))
.Returns(false);
Mocker.GetMock<IAlbumService>()
.Setup(v => v.GetAlbumsByArtist(It.IsAny<int>()))
.Returns(new List<Album> { _album });
Mocker.GetMock<IImageResizer>()
.Setup(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()))
.Throws<ApplicationException>();
@ -190,7 +210,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.HandleAsync(new ArtistUpdatedEvent(_artist));
Mocker.GetMock<IImageResizer>()
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(2));
.Verify(v => v.Resize(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()), Times.Exactly(3));
}
}
}

View file

@ -165,7 +165,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Roksbox
return new List<ImageFileResult>(); ;
}
var source = _mediaCoverService.GetCoverPath(artist.Id, image.CoverType);
var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType);
var destination = Path.GetFileName(artist.Path) + Path.GetExtension(source);
return new List<ImageFileResult>{ new ImageFileResult(destination, source) };

View file

@ -205,7 +205,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{
foreach (var image in artist.Metadata.Value.Images)
{
var source = _mediaCoverService.GetCoverPath(artist.Id, image.CoverType);
var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType);
var destination = image.CoverType.ToString().ToLowerInvariant() + Path.GetExtension(image.Url);
if (image.CoverType == MediaCoverTypes.Poster)
{

View file

@ -16,6 +16,12 @@ namespace NzbDrone.Core.MediaCover
Logo = 8
}
public enum MediaCoverEntity
{
Artist = 0,
Album = 1
}
public class MediaCover : IEmbeddedDocument
{
public MediaCoverTypes CoverType { get; set; }

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using NLog;
using NzbDrone.Common.Disk;
@ -16,8 +17,8 @@ namespace NzbDrone.Core.MediaCover
{
public interface IMapCoversToLocal
{
void ConvertToLocalUrls(int artistId, IEnumerable<MediaCover> covers, int? albumId = null);
string GetCoverPath(int artistId, MediaCoverTypes mediaCoverTypes, int? height = null, int? albumId = null);
void ConvertToLocalUrls(int entityId, MediaCoverEntity coverEntity, IEnumerable<MediaCover> covers);
string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes mediaCoverTypes, int? height = null);
}
public class MediaCoverService :
@ -58,31 +59,33 @@ namespace NzbDrone.Core.MediaCover
_coverRootFolder = appFolderInfo.GetMediaCoverPath();
}
public string GetCoverPath(int artistId, MediaCoverTypes coverTypes, int? height = null, int? albumId = null)
public string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes coverTypes, int? height = null)
{
var heightSuffix = height.HasValue ? "-" + height.ToString() : "";
if (albumId.HasValue)
if (coverEntity == MediaCoverEntity.Album)
{
return Path.Combine(GetAlbumCoverPath(artistId, albumId.Value), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
return Path.Combine(GetAlbumCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
}
else
{
return Path.Combine(GetArtistCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
}
return Path.Combine(GetArtistCoverPath(artistId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
}
public void ConvertToLocalUrls(int artistId, IEnumerable<MediaCover> covers, int? albumId = null)
public void ConvertToLocalUrls(int entityId, MediaCoverEntity coverEntity, IEnumerable<MediaCover> covers)
{
foreach (var mediaCover in covers)
{
var filePath = GetCoverPath(artistId, mediaCover.CoverType, null, albumId);
var filePath = GetCoverPath(entityId, coverEntity, mediaCover.CoverType, null);
if (albumId.HasValue)
if (coverEntity == MediaCoverEntity.Album)
{
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + artistId + "/" + albumId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/Albums/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
}
else
{
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + artistId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
}
if (_diskProvider.FileExists(filePath))
@ -98,16 +101,16 @@ namespace NzbDrone.Core.MediaCover
return Path.Combine(_coverRootFolder, artistId.ToString());
}
private string GetAlbumCoverPath(int artistId, int albumId)
private string GetAlbumCoverPath(int albumId)
{
return Path.Combine(_coverRootFolder, artistId.ToString(), albumId.ToString());
return Path.Combine(_coverRootFolder, "Albums", albumId.ToString());
}
private void EnsureCovers(Artist artist)
private void EnsureArtistCovers(Artist artist)
{
foreach (var cover in artist.Metadata.Value.Images)
{
var fileName = GetCoverPath(artist.Id, cover.CoverType);
var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType);
var alreadyExists = false;
try
@ -134,37 +137,37 @@ namespace NzbDrone.Core.MediaCover
}
}
//TODO Decide if we want to cache album art local
//private void EnsureAlbumCovers(Album album)
//{
// foreach (var cover in album.Images)
// {
// var fileName = GetCoverPath(album.ArtistId, cover.CoverType, null, album.Id);
// var alreadyExists = false;
// try
// {
// alreadyExists = _coverExistsSpecification.AlreadyExists(cover.Url, fileName);
// if (!alreadyExists)
// {
// DownloadAlbumCover(album, cover);
// }
// }
// catch (WebException e)
// {
// _logger.Warn("Couldn't download media cover for {0}. {1}", album, e.Message);
// }
// catch (Exception e)
// {
// _logger.Error(e, "Couldn't download media cover for {0}", album);
// }
private void EnsureAlbumCovers(Album album)
{
foreach (var cover in album.Images.Where(e => e.CoverType == MediaCoverTypes.Cover))
{
var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null);
var alreadyExists = false;
try
{
var lastModifiedServer = GetCoverModifiedDate(cover.Url);
alreadyExists = _coverExistsSpecification.AlreadyExists(lastModifiedServer, fileName);
if (!alreadyExists)
{
DownloadAlbumCover(album, cover, lastModifiedServer);
}
}
catch (WebException e)
{
_logger.Warn("Couldn't download media cover for {0}. {1}", album, e.Message);
}
catch (Exception e)
{
_logger.Error(e, "Couldn't download media cover for {0}", album);
}
// EnsureResizedCovers(album.Artist, cover, !alreadyExists, album);
// }
//}
EnsureResizedAlbumCovers(album, cover, !alreadyExists);
}
}
private void DownloadCover(Artist artist, MediaCover cover, DateTime lastModified)
{
var fileName = GetCoverPath(artist.Id, cover.CoverType);
var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType);
_logger.Info("Downloading {0} for {1} {2}", cover.CoverType, artist, cover.Url);
_httpClient.DownloadFile(cover.Url, fileName);
@ -179,109 +182,70 @@ namespace NzbDrone.Core.MediaCover
}
}
//private void DownloadAlbumCover(Album album, MediaCover cover)
//{
// var fileName = GetCoverPath(album.ArtistId, cover.CoverType, null, album.Id);
private void DownloadAlbumCover(Album album, MediaCover cover, DateTime lastModified)
{
var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null);
// _logger.Info("Downloading {0} for {1} {2}", cover.CoverType, album, cover.Url);
// _httpClient.DownloadFile(cover.Url, fileName);
//}
_logger.Info("Downloading {0} for {1} {2}", cover.CoverType, album, cover.Url);
_httpClient.DownloadFile(cover.Url, fileName);
try
{
_diskProvider.FileSetLastWriteTime(fileName, lastModified);
}
catch (Exception ex)
{
_logger.Debug(ex, "Unable to set modified date for {0} image for album {1}", cover.CoverType, album);
}
}
private void EnsureResizedCovers(Artist artist, MediaCover cover, bool forceResize, Album album = null)
{
int[] heights;
int[] heights = GetDefaultHeights(cover.CoverType);
switch (cover.CoverType)
foreach (var height in heights)
{
default:
return;
var mainFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType);
var resizeFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, height);
case MediaCoverTypes.Poster:
case MediaCoverTypes.Cover:
case MediaCoverTypes.Disc:
case MediaCoverTypes.Logo:
case MediaCoverTypes.Headshot:
heights = new[] { 500, 250 };
break;
case MediaCoverTypes.Banner:
heights = new[] { 70, 35 };
break;
case MediaCoverTypes.Fanart:
case MediaCoverTypes.Screenshot:
heights = new[] { 360, 180 };
break;
}
if (album == null)
{
foreach (var height in heights)
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
{
var mainFileName = GetCoverPath(artist.Id, cover.CoverType);
var resizeFileName = GetCoverPath(artist.Id, cover.CoverType, height);
_logger.Debug("Resizing {0}-{1} for {2}", cover.CoverType, height, artist);
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
try
{
_logger.Debug("Resizing {0}-{1} for {2}", cover.CoverType, height, artist);
try
{
_resizer.Resize(mainFileName, resizeFileName, height);
}
catch
{
_logger.Debug("Couldn't resize media cover {0}-{1} for {2}, using full size image instead.", cover.CoverType, height, artist);
}
_resizer.Resize(mainFileName, resizeFileName, height);
}
}
}
else
{
foreach (var height in heights)
{
var mainFileName = GetCoverPath(album.ArtistId, cover.CoverType, null, album.Id);
var resizeFileName = GetCoverPath(album.ArtistId, cover.CoverType, height, album.Id);
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
catch
{
_logger.Debug("Resizing {0}-{1} for {2}", cover.CoverType, height, artist);
try
{
_resizer.Resize(mainFileName, resizeFileName, height);
}
catch
{
_logger.Debug("Couldn't resize media cover {0}-{1} for {2}, using full size image instead.", cover.CoverType, height, album);
}
_logger.Debug("Couldn't resize media cover {0}-{1} for artist {2}, using full size image instead.", cover.CoverType, height, artist);
}
}
}
}
public void HandleAsync(ArtistUpdatedEvent message)
private void EnsureResizedAlbumCovers(Album album, MediaCover cover, bool forceResize)
{
EnsureCovers(message.Artist);
int[] heights = GetDefaultHeights(cover.CoverType);
//Turn off for now, not using album images
//var albums = _albumService.GetAlbumsByArtist(message.Artist.Id);
//foreach (Album album in albums)
//{
// EnsureAlbumCovers(album);
//}
_eventAggregator.PublishEvent(new MediaCoversUpdatedEvent(message.Artist));
}
public void HandleAsync(ArtistDeletedEvent message)
{
var path = GetArtistCoverPath(message.Artist.Id);
if (_diskProvider.FolderExists(path))
foreach (var height in heights)
{
_diskProvider.DeleteFolder(path, true);
var mainFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null);
var resizeFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, height);
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
{
_logger.Debug("Resizing {0}-{1} for {2}", cover.CoverType, height, album);
try
{
_resizer.Resize(mainFileName, resizeFileName, height);
}
catch
{
_logger.Debug("Couldn't resize media cover {0}-{1} for album {2}, using full size image instead.", cover.CoverType, height, album);
}
}
}
}
@ -298,5 +262,52 @@ namespace NzbDrone.Core.MediaCover
return lastModifiedServer;
}
private int[] GetDefaultHeights(MediaCoverTypes coverType)
{
switch (coverType)
{
default:
return new int[] { };
case MediaCoverTypes.Poster:
case MediaCoverTypes.Disc:
case MediaCoverTypes.Logo:
case MediaCoverTypes.Headshot:
return new[] { 500, 250 };
case MediaCoverTypes.Banner:
return new[] { 70, 35 };
case MediaCoverTypes.Fanart:
case MediaCoverTypes.Screenshot:
return new[] { 360, 180 };
case MediaCoverTypes.Cover:
return new[] { 250 };
}
}
public void HandleAsync(ArtistUpdatedEvent message)
{
EnsureArtistCovers(message.Artist);
var albums = _albumService.GetAlbumsByArtist(message.Artist.Id);
foreach (Album album in albums)
{
EnsureAlbumCovers(album);
}
_eventAggregator.PublishEvent(new MediaCoversUpdatedEvent(message.Artist));
}
public void HandleAsync(ArtistDeletedEvent message)
{
var path = GetArtistCoverPath(message.Artist.Id);
if (_diskProvider.FolderExists(path))
{
_diskProvider.DeleteFolder(path, true);
}
}
}
}