using System; using System.IO; using NzbDrone.Api.EpisodeFiles; using NzbDrone.Api.Mapping; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Tv; using NzbDrone.SignalR; namespace NzbDrone.Api.Episodes { public abstract class EpisodeModuleWithSignalR : NzbDroneRestModuleWithSignalR, IHandle, IHandle { protected readonly IEpisodeService _episodeService; protected readonly IQualityUpgradableSpecification _qualityUpgradableSpecification; protected EpisodeModuleWithSignalR(IEpisodeService episodeService, IQualityUpgradableSpecification qualityUpgradableSpecification, IBroadcastSignalRMessage signalRBroadcaster) : base(signalRBroadcaster) { _episodeService = episodeService; _qualityUpgradableSpecification = qualityUpgradableSpecification; GetResourceById = GetEpisode; } protected EpisodeModuleWithSignalR(IEpisodeService episodeService, IQualityUpgradableSpecification qualityUpgradableSpecification, IBroadcastSignalRMessage signalRBroadcaster, String resource) : base(signalRBroadcaster, resource) { _episodeService = episodeService; _qualityUpgradableSpecification = qualityUpgradableSpecification; GetResourceById = GetEpisode; } protected EpisodeResource GetEpisode(int id) { var episode = _episodeService.GetEpisode(id); episode.EpisodeFile.LazyLoad(); return ToResource(episode); } protected override EpisodeResource ToResource(TModel model) { var resource = base.ToResource(model); var episode = model as Episode; if (episode != null) { if (episode.EpisodeFile.IsLoaded && episode.EpisodeFile.Value != null) { resource.EpisodeFile = episode.EpisodeFile.Value.InjectTo(); resource.EpisodeFile.Path = Path.Combine(episode.Series.Path, episode.EpisodeFile.Value.RelativePath); resource.EpisodeFile.QualityCutoffNotMet = _qualityUpgradableSpecification.CutoffNotMet(episode.Series.Profile.Value, episode.EpisodeFile.Value.Quality); } } return resource; } public void Handle(EpisodeGrabbedEvent message) { foreach (var episode in message.Episode.Episodes) { var resource = episode.InjectTo(); resource.Grabbed = true; BroadcastResourceChange(ModelAction.Updated, resource); } } public void Handle(EpisodeDownloadedEvent message) { foreach (var episode in message.Episode.Episodes) { BroadcastResourceChange(ModelAction.Updated, episode.Id); } } } }