sonarr-repo-only/src/Sonarr.Api.V3/Episodes/EpisodeModuleWithSignalR.cs

157 lines
5.7 KiB
C#
Raw Normal View History

2017-02-11 06:46:39 +00:00
using System.Collections.Generic;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.DecisionEngine.Specifications;
2017-02-11 06:46:39 +00:00
using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR;
using Sonarr.Api.V3.EpisodeFiles;
using Sonarr.Api.V3.Series;
using Sonarr.Http;
namespace Sonarr.Api.V3.Episodes
{
public abstract class EpisodeModuleWithSignalR : SonarrRestModuleWithSignalR<EpisodeResource, Episode>,
IHandle<EpisodeGrabbedEvent>,
IHandle<EpisodeImportedEvent>,
IHandle<EpisodeFileDeletedEvent>
{
protected readonly IEpisodeService _episodeService;
protected readonly ISeriesService _seriesService;
2015-07-12 16:44:33 +00:00
protected readonly IUpgradableSpecification _upgradableSpecification;
2017-02-11 06:46:39 +00:00
protected EpisodeModuleWithSignalR(IEpisodeService episodeService,
ISeriesService seriesService,
2015-07-12 16:44:33 +00:00
IUpgradableSpecification upgradableSpecification,
2017-02-11 06:46:39 +00:00
IBroadcastSignalRMessage signalRBroadcaster)
: base(signalRBroadcaster)
{
_episodeService = episodeService;
_seriesService = seriesService;
2015-07-12 16:44:33 +00:00
_upgradableSpecification = upgradableSpecification;
2017-02-11 06:46:39 +00:00
GetResourceById = GetEpisode;
}
protected EpisodeModuleWithSignalR(IEpisodeService episodeService,
ISeriesService seriesService,
2015-07-12 16:44:33 +00:00
IUpgradableSpecification upgradableSpecification,
2017-02-11 06:46:39 +00:00
IBroadcastSignalRMessage signalRBroadcaster,
string resource)
: base(signalRBroadcaster, resource)
{
_episodeService = episodeService;
_seriesService = seriesService;
2015-07-12 16:44:33 +00:00
_upgradableSpecification = upgradableSpecification;
2017-02-11 06:46:39 +00:00
GetResourceById = GetEpisode;
}
protected EpisodeResource GetEpisode(int id)
{
var episode = _episodeService.GetEpisode(id);
var resource = MapToResource(episode, true, true, true);
return resource;
}
protected override EpisodeResource GetResourceByIdForBroadcast(int id)
{
var episode = _episodeService.GetEpisode(id);
var resource = MapToResource(episode, false, false, false);
return resource;
}
2017-02-11 06:46:39 +00:00
protected EpisodeResource MapToResource(Episode episode, bool includeSeries, bool includeEpisodeFile, bool includeImages)
{
var resource = episode.ToResource();
if (includeSeries || includeEpisodeFile || includeImages)
{
var series = episode.Series ?? _seriesService.GetSeries(episode.SeriesId);
if (includeSeries)
{
resource.Series = series.ToResource();
}
if (includeEpisodeFile && episode.EpisodeFileId != 0)
{
2015-07-12 16:44:33 +00:00
resource.EpisodeFile = episode.EpisodeFile.Value.ToResource(series, _upgradableSpecification);
2017-02-11 06:46:39 +00:00
}
if (includeImages)
{
resource.Images = episode.Images;
}
}
return resource;
}
protected List<EpisodeResource> MapToResource(List<Episode> episodes, bool includeSeries, bool includeEpisodeFile, bool includeImages)
{
var result = episodes.ToResource();
if (includeSeries || includeEpisodeFile || includeImages)
{
var seriesDict = new Dictionary<int, NzbDrone.Core.Tv.Series>();
for (var i = 0; i < episodes.Count; i++)
{
var episode = episodes[i];
var resource = result[i];
var series = episode.Series ?? seriesDict.GetValueOrDefault(episodes[i].SeriesId) ?? _seriesService.GetSeries(episodes[i].SeriesId);
seriesDict[series.Id] = series;
if (includeSeries)
{
resource.Series = series.ToResource();
}
if (includeEpisodeFile && episode.EpisodeFileId != 0)
{
2015-07-12 16:44:33 +00:00
resource.EpisodeFile = episode.EpisodeFile.Value.ToResource(series, _upgradableSpecification);
2017-02-11 06:46:39 +00:00
}
if (includeImages)
{
resource.Images = episode.Images;
}
}
}
return result;
}
public void Handle(EpisodeGrabbedEvent message)
{
foreach (var episode in message.Episode.Episodes)
{
var resource = episode.ToResource();
resource.Grabbed = true;
BroadcastResourceChange(ModelAction.Updated, resource);
}
}
public void Handle(EpisodeImportedEvent message)
{
foreach (var episode in message.EpisodeInfo.Episodes)
{
BroadcastResourceChange(ModelAction.Updated, episode.Id);
}
}
public void Handle(EpisodeFileDeletedEvent message)
{
foreach (var episode in message.EpisodeFile.Episodes.Value)
{
BroadcastResourceChange(ModelAction.Updated, episode.Id);
}
}
}
}