Lidarr/src/NzbDrone.Core/MediaCover/MediaCoverService.cs

176 lines
6.2 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events;
namespace NzbDrone.Core.MediaCover
{
2014-01-22 05:22:09 +00:00
public interface IMapCoversToLocal
{
void ConvertToLocalUrls(int seriesId, IEnumerable<MediaCover> covers);
string GetCoverPath(int seriesId, MediaCoverTypes mediaCoverTypes, int? height = null);
2014-01-22 05:22:09 +00:00
}
public class MediaCoverService :
IHandleAsync<SeriesUpdatedEvent>,
IHandleAsync<SeriesDeletedEvent>,
IMapCoversToLocal
{
private readonly IImageResizer _resizer;
2014-09-11 23:49:41 +00:00
private readonly IHttpClient _httpClient;
2013-05-10 23:53:50 +00:00
private readonly IDiskProvider _diskProvider;
private readonly ICoverExistsSpecification _coverExistsSpecification;
private readonly IConfigFileProvider _configFileProvider;
2014-01-26 07:14:55 +00:00
private readonly IEventAggregator _eventAggregator;
private readonly Logger _logger;
private readonly string _coverRootFolder;
public MediaCoverService(IImageResizer resizer,
IHttpClient httpClient,
2014-01-26 07:14:55 +00:00
IDiskProvider diskProvider,
IAppFolderInfo appFolderInfo,
2014-09-11 23:49:41 +00:00
ICoverExistsSpecification coverExistsSpecification,
IConfigFileProvider configFileProvider,
2014-01-26 07:14:55 +00:00
IEventAggregator eventAggregator,
Logger logger)
{
_resizer = resizer;
2014-09-11 23:49:41 +00:00
_httpClient = httpClient;
_diskProvider = diskProvider;
_coverExistsSpecification = coverExistsSpecification;
_configFileProvider = configFileProvider;
2014-01-26 07:14:55 +00:00
_eventAggregator = eventAggregator;
_logger = logger;
_coverRootFolder = appFolderInfo.GetMediaCoverPath();
}
public string GetCoverPath(int seriesId, MediaCoverTypes coverTypes, int? height = null)
{
var heightSuffix = height.HasValue ? "-" + height.ToString() : "";
return Path.Combine(GetSeriesCoverPath(seriesId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg");
2014-01-22 05:22:09 +00:00
}
public void ConvertToLocalUrls(int seriesId, IEnumerable<MediaCover> covers)
{
foreach (var mediaCover in covers)
{
var filePath = GetCoverPath(seriesId, mediaCover.CoverType);
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + seriesId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg";
if (_diskProvider.FileExists(filePath))
{
var lastWrite = _diskProvider.FileGetLastWrite(filePath);
2014-01-22 05:22:09 +00:00
mediaCover.Url += "?lastWrite=" + lastWrite.Ticks;
}
}
}
private string GetSeriesCoverPath(int seriesId)
{
return Path.Combine(_coverRootFolder, seriesId.ToString());
}
private void EnsureCovers(Series series)
{
2013-03-31 20:25:39 +00:00
foreach (var cover in series.Images)
{
var fileName = GetCoverPath(series.Id, cover.CoverType);
try
{
if (!_coverExistsSpecification.AlreadyExists(cover.Url, fileName))
{
DownloadCover(series, cover);
EnsureResizedCovers(series, cover, true);
}
else
{
EnsureResizedCovers(series, cover, false);
}
}
catch (WebException e)
{
2013-08-30 02:05:33 +00:00
_logger.Warn(string.Format("Couldn't download media cover for {0}. {1}", series, e.Message));
}
catch (Exception e)
{
_logger.ErrorException("Couldn't download media cover for " + series, e);
}
}
}
private void DownloadCover(Series series, MediaCover cover)
{
var fileName = GetCoverPath(series.Id, cover.CoverType);
_logger.Info("Downloading {0} for {1} {2}", cover.CoverType, series, cover.Url);
2014-09-11 23:49:41 +00:00
_httpClient.DownloadFile(cover.Url, fileName);
}
private void EnsureResizedCovers(Series series, MediaCover cover, bool forceResize)
{
int[] heights;
switch (cover.CoverType)
{
default:
return;
case MediaCoverTypes.Poster:
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;
}
foreach (var height in heights)
{
var mainFileName = GetCoverPath(series.Id, cover.CoverType);
var resizeFileName = GetCoverPath(series.Id, cover.CoverType, height);
if (forceResize || !_diskProvider.FileExists(resizeFileName))
{
_logger.Debug("Resizing {0}-{1} for {2}", cover.CoverType, height, series);
_resizer.Resize(mainFileName, resizeFileName, height);
}
}
}
2014-01-22 05:22:09 +00:00
public void HandleAsync(SeriesUpdatedEvent message)
{
EnsureCovers(message.Series);
2014-01-26 07:14:55 +00:00
_eventAggregator.PublishEvent(new MediaCoversUpdatedEvent(message.Series));
2014-01-22 05:22:09 +00:00
}
public void HandleAsync(SeriesDeletedEvent message)
{
var path = GetSeriesCoverPath(message.Series.Id);
if (_diskProvider.FolderExists(path))
{
_diskProvider.DeleteFolder(path, true);
}
}
}
}