using System; using System.Collections.Generic; using System.Linq; using FluentValidation; using NzbDrone.Core.MediaCover; using NzbDrone.Core.SeriesStats; using NzbDrone.Core.Tv; using NzbDrone.Api.Validation; using NzbDrone.Api.Mapping; namespace NzbDrone.Api.Series { public class SeriesModule : NzbDroneRestModule { private readonly ISeriesService _seriesService; private readonly ISeriesStatisticsService _seriesStatisticsService; private readonly IMapCoversToLocal _coverMapper; public SeriesModule(ISeriesService seriesService, ISeriesStatisticsService seriesStatisticsService, IMapCoversToLocal coverMapper) : base("/Series") { _seriesService = seriesService; _seriesStatisticsService = seriesStatisticsService; _coverMapper = coverMapper; GetResourceAll = AllSeries; GetResourceById = GetSeries; CreateResource = AddSeries; UpdateResource = UpdateSeries; DeleteResource = DeleteSeries; SharedValidator.RuleFor(s => s.QualityProfileId).ValidId(); PutValidator.RuleFor(s => s.Path).IsValidPath(); PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => String.IsNullOrEmpty(s.RootFolderPath)); PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => String.IsNullOrEmpty(s.Path)); PostValidator.RuleFor(s => s.Title).NotEmpty(); } private SeriesResource GetSeries(int id) { var series = _seriesService.GetSeries(id); return GetSeriesResource(series); } private SeriesResource GetSeriesResource(Core.Tv.Series series) { if (series == null) return null; var resource = series.InjectTo(); MapCoversToLocal(resource); FetchAndLinkSeriesStatistics(resource); return resource; } private List AllSeries() { var seriesStats = _seriesStatisticsService.SeriesStatistics(); var seriesResources = ToListResource(_seriesService.GetAllSeries); MapCoversToLocal(seriesResources.ToArray()); LinkSeriesStatistics(seriesResources, seriesStats); return seriesResources; } private int AddSeries(SeriesResource seriesResource) { return GetNewId(_seriesService.AddSeries, seriesResource); } private void UpdateSeries(SeriesResource seriesResource) { GetNewId(_seriesService.UpdateSeries, seriesResource); } private void DeleteSeries(int id) { var deleteFiles = false; var deleteFilesQuery = Request.Query.deleteFiles; if (deleteFilesQuery.HasValue) { deleteFiles = Convert.ToBoolean(deleteFilesQuery.Value); } _seriesService.DeleteSeries(id, deleteFiles); } private void MapCoversToLocal(params SeriesResource[] series) { foreach (var seriesResource in series) { _coverMapper.ConvertToLocalUrls(seriesResource.Id, seriesResource.Images); } } private void FetchAndLinkSeriesStatistics(SeriesResource resource) { LinkSeriesStatistics(resource, _seriesStatisticsService.SeriesStatistics(resource.Id)); } private void LinkSeriesStatistics(List resources, List seriesStatistics) { foreach (var series in resources) { var stats = seriesStatistics.SingleOrDefault(ss => ss.SeriesId == series.Id); if (stats == null) continue; LinkSeriesStatistics(series, stats); } } private void LinkSeriesStatistics(SeriesResource resource, SeriesStatistics seriesStatistics) { resource.EpisodeCount = seriesStatistics.EpisodeCount; resource.EpisodeFileCount = seriesStatistics.EpisodeFileCount; resource.SeasonCount = seriesStatistics.SeasonCount; resource.NextAiring = seriesStatistics.NextAiring; } } }