From ded6e966e3ceceb89fa760a249154883531fe48c Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Tue, 19 Aug 2014 00:24:44 +0200 Subject: [PATCH] New: Episode quality badges are now styled differently for episodes that haven't met quality cutoff yet. --- .../EpisodeFiles/EpisodeFileModule.cs | 8 +++++- .../EpisodeFiles/EpisodeFileResource.cs | 2 ++ src/NzbDrone.Api/Episodes/EpisodeModule.cs | 26 ++++++++++++++++--- .../Episodes/EpisodeModuleWithSignalR.cs | 2 +- src/NzbDrone.Api/Episodes/EpisodeResource.cs | 3 ++- src/UI/Cells/EpisodeStatusCell.js | 8 +++++- src/UI/Cells/cells.less | 6 +++++ 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Api/EpisodeFiles/EpisodeFileModule.cs b/src/NzbDrone.Api/EpisodeFiles/EpisodeFileModule.cs index 7a87ff338..98af26a4a 100644 --- a/src/NzbDrone.Api/EpisodeFiles/EpisodeFileModule.cs +++ b/src/NzbDrone.Api/EpisodeFiles/EpisodeFileModule.cs @@ -11,6 +11,7 @@ using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Tv; +using NzbDrone.Core.DecisionEngine; namespace NzbDrone.Api.EpisodeFiles { @@ -20,18 +21,21 @@ namespace NzbDrone.Api.EpisodeFiles private readonly IMediaFileService _mediaFileService; private readonly IRecycleBinProvider _recycleBinProvider; private readonly ISeriesService _seriesService; + private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification; private readonly Logger _logger; public EpisodeModule(ICommandExecutor commandExecutor, IMediaFileService mediaFileService, IRecycleBinProvider recycleBinProvider, ISeriesService seriesService, + IQualityUpgradableSpecification qualityUpgradableSpecification, Logger logger) : base(commandExecutor) { _mediaFileService = mediaFileService; _recycleBinProvider = recycleBinProvider; _seriesService = seriesService; + _qualityUpgradableSpecification = qualityUpgradableSpecification; _logger = logger; GetResourceById = GetEpisodeFile; GetResourceAll = GetEpisodeFiles; @@ -80,11 +84,13 @@ namespace NzbDrone.Api.EpisodeFiles _mediaFileService.Delete(episodeFile); } - private static EpisodeFileResource MapToResource(Core.Tv.Series series, EpisodeFile episodeFile) + private EpisodeFileResource MapToResource(Core.Tv.Series series, EpisodeFile episodeFile) { var resource = episodeFile.InjectTo(); resource.Path = Path.Combine(series.Path, episodeFile.RelativePath); + resource.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, episodeFile.Quality); + return resource; } diff --git a/src/NzbDrone.Api/EpisodeFiles/EpisodeFileResource.cs b/src/NzbDrone.Api/EpisodeFiles/EpisodeFileResource.cs index 696e367eb..594f4f5b1 100644 --- a/src/NzbDrone.Api/EpisodeFiles/EpisodeFileResource.cs +++ b/src/NzbDrone.Api/EpisodeFiles/EpisodeFileResource.cs @@ -14,5 +14,7 @@ namespace NzbDrone.Api.EpisodeFiles public DateTime DateAdded { get; set; } public String SceneName { get; set; } public QualityModel Quality { get; set; } + + public Boolean QualityCutoffNotMet { get; set; } } } diff --git a/src/NzbDrone.Api/Episodes/EpisodeModule.cs b/src/NzbDrone.Api/Episodes/EpisodeModule.cs index 96ddf161a..3dbb16064 100644 --- a/src/NzbDrone.Api/Episodes/EpisodeModule.cs +++ b/src/NzbDrone.Api/Episodes/EpisodeModule.cs @@ -2,17 +2,23 @@ using NzbDrone.Api.REST; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Tv; +using NzbDrone.Api.Mapping; +using NzbDrone.Core.DecisionEngine; namespace NzbDrone.Api.Episodes { - public class EpisodeModule : EpisodeModuleWithSignalR + public class EpisodeModule : EpisodeModuleWithSignalR { + private readonly ISeriesService _seriesService; private readonly IEpisodeService _episodeService; + private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification; - public EpisodeModule(ICommandExecutor commandExecutor, IEpisodeService episodeService) + public EpisodeModule(ICommandExecutor commandExecutor, ISeriesService seriesService, IEpisodeService episodeService, IQualityUpgradableSpecification qualityUpgradableSpecification) : base(episodeService, commandExecutor) { + _seriesService = seriesService; _episodeService = episodeService; + _qualityUpgradableSpecification = qualityUpgradableSpecification; GetResourceAll = GetEpisodes; UpdateResource = SetMonitored; @@ -27,7 +33,21 @@ namespace NzbDrone.Api.Episodes throw new BadRequestException("seriesId is missing"); } - return ToListResource(() => _episodeService.GetEpisodeBySeries(seriesId.Value)); + var series = _seriesService.GetSeries(seriesId.Value); + + var resources = new List(); + foreach (var episode in _episodeService.GetEpisodeBySeries(seriesId.Value)) + { + var resource = episode.InjectTo(); + if (episode.EpisodeFile.IsLoaded) + { + resource.EpisodeFile.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(series.Profile.Value, episode.EpisodeFile.Value.Quality); + } + + resources.Add(resource); + } + + return resources; } private void SetMonitored(EpisodeResource episodeResource) diff --git a/src/NzbDrone.Api/Episodes/EpisodeModuleWithSignalR.cs b/src/NzbDrone.Api/Episodes/EpisodeModuleWithSignalR.cs index e25d1bd6b..a1ba8b57f 100644 --- a/src/NzbDrone.Api/Episodes/EpisodeModuleWithSignalR.cs +++ b/src/NzbDrone.Api/Episodes/EpisodeModuleWithSignalR.cs @@ -9,7 +9,7 @@ using NzbDrone.Core.Tv; namespace NzbDrone.Api.Episodes { public abstract class EpisodeModuleWithSignalR : NzbDroneRestModuleWithSignalR, - IHandle, + IHandle, IHandle { private readonly IEpisodeService _episodeService; diff --git a/src/NzbDrone.Api/Episodes/EpisodeResource.cs b/src/NzbDrone.Api/Episodes/EpisodeResource.cs index b3a7d1058..50d274143 100644 --- a/src/NzbDrone.Api/Episodes/EpisodeResource.cs +++ b/src/NzbDrone.Api/Episodes/EpisodeResource.cs @@ -1,5 +1,6 @@ using System; using Newtonsoft.Json; +using NzbDrone.Api.EpisodeFiles; using NzbDrone.Api.REST; using NzbDrone.Core.MediaFiles; @@ -15,7 +16,7 @@ namespace NzbDrone.Api.Episodes public String AirDate { get; set; } public DateTime? AirDateUtc { get; set; } public String Overview { get; set; } - public EpisodeFile EpisodeFile { get; set; } + public EpisodeFileResource EpisodeFile { get; set; } public Boolean HasFile { get; set; } public Boolean Monitored { get; set; } diff --git a/src/UI/Cells/EpisodeStatusCell.js b/src/UI/Cells/EpisodeStatusCell.js index 494be0195..84272bfc1 100644 --- a/src/UI/Cells/EpisodeStatusCell.js +++ b/src/UI/Cells/EpisodeStatusCell.js @@ -52,7 +52,13 @@ define( title += ' - {0}'.format(size); } - this.$el.html('{1}'.format(title, quality.quality.name)); + if (this.episodeFile.get('qualityCutoffNotMet')) { + this.$el.html('{1}'.format(title, quality.quality.name)); + } + else { + this.$el.html('{1}'.format(title, quality.quality.name)); + } + return; } diff --git a/src/UI/Cells/cells.less b/src/UI/Cells/cells.less index e4517edf5..0f915fc94 100644 --- a/src/UI/Cells/cells.less +++ b/src/UI/Cells/cells.less @@ -86,6 +86,12 @@ td.episode-status-cell, td.quality-cell { font-size: 9px; } + .badge-inverse { + background-color: #eee; + border: 1px solid @badge-bg; + color: @badge-bg; + } + .progress { height : 10px; margin-top : 5px;