using System; using System.Collections.Generic; using System.IO; using System.Net; using NLog; using NzbDrone.Common; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Messaging; using NzbDrone.Core.Tv; using NzbDrone.Core.Tv.Events; namespace NzbDrone.Core.MediaCover { public class MediaCoverService : IHandleAsync, IHandleAsync, IMapCoversToLocal { private readonly IHttpProvider _httpProvider; private readonly IDiskProvider _diskProvider; private readonly ICoverExistsSpecification _coverExistsSpecification; private readonly Logger _logger; private readonly string _coverRootFolder; public MediaCoverService(IHttpProvider httpProvider, IDiskProvider diskProvider, IAppFolderInfo appFolderInfo, ICoverExistsSpecification coverExistsSpecification, Logger logger) { _httpProvider = httpProvider; _diskProvider = diskProvider; _coverExistsSpecification = coverExistsSpecification; _logger = logger; _coverRootFolder = appFolderInfo.GetMediaCoverPath(); } public void HandleAsync(SeriesUpdatedEvent message) { EnsureCovers(message.Series); } private void EnsureCovers(Series series) { foreach (var cover in series.Images) { var fileName = GetCoverPath(series.Id, cover.CoverType); try { if (!_coverExistsSpecification.AlreadyExists(cover.Url, fileName)) { DownloadCover(series, cover); } } catch (WebException e) { _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); _httpProvider.DownloadFile(cover.Url, fileName); } public void HandleAsync(SeriesDeletedEvent message) { var path = GetSeriesCoverPath(message.Series.Id); if (_diskProvider.FolderExists(path)) { _diskProvider.DeleteFolder(path, true); } } private string GetCoverPath(int seriesId, MediaCoverTypes coverTypes) { return Path.Combine(GetSeriesCoverPath(seriesId), coverTypes.ToString().ToLower() + ".jpg"); } private string GetSeriesCoverPath(int seriesId) { return Path.Combine(_coverRootFolder, seriesId.ToString()); } public void ConvertToLocalUrls(int seriesId, IEnumerable covers) { foreach (var mediaCover in covers) { var filePath = GetCoverPath(seriesId, mediaCover.CoverType); mediaCover.Url = @"/MediaCover/" + seriesId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg"; if (_diskProvider.FileExists(filePath)) { var lastWrite = _diskProvider.GetLastFileWrite(filePath); mediaCover.Url += "?lastWrite=" + lastWrite.Ticks; } } } } public interface IMapCoversToLocal { void ConvertToLocalUrls(int seriesId, IEnumerable covers); } }