You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Sonarr/src/NzbDrone.Core/SeriesStats/SeriesStatisticsService.cs

65 lines
2.7 KiB

using System.Collections.Generic;
using System.Linq;
namespace NzbDrone.Core.SeriesStats
{
public interface ISeriesStatisticsService
{
List<SeriesStatistics> SeriesStatistics();
SeriesStatistics SeriesStatistics(int seriesId);
}
public class SeriesStatisticsService : ISeriesStatisticsService
{
private readonly ISeriesStatisticsRepository _seriesStatisticsRepository;
public SeriesStatisticsService(ISeriesStatisticsRepository seriesStatisticsRepository)
{
_seriesStatisticsRepository = seriesStatisticsRepository;
}
public List<SeriesStatistics> SeriesStatistics()
{
var seasonStatistics = _seriesStatisticsRepository.SeriesStatistics();
return seasonStatistics.GroupBy(s => s.SeriesId).Select(s => MapSeriesStatistics(s.ToList())).ToList();
}
public SeriesStatistics SeriesStatistics(int seriesId)
{
var stats = _seriesStatisticsRepository.SeriesStatistics(seriesId);
if (stats == null || stats.Count == 0)
{
return new SeriesStatistics();
}
return MapSeriesStatistics(stats);
}
private SeriesStatistics MapSeriesStatistics(List<SeasonStatistics> seasonStatistics)
{
var seriesStatistics = new SeriesStatistics
{
SeasonStatistics = seasonStatistics,
SeriesId = seasonStatistics.First().SeriesId,
EpisodeFileCount = seasonStatistics.Sum(s => s.EpisodeFileCount),
EpisodeCount = seasonStatistics.Sum(s => s.EpisodeCount),
TotalEpisodeCount = seasonStatistics.Sum(s => s.TotalEpisodeCount),
SizeOnDisk = seasonStatistics.Sum(s => s.SizeOnDisk),
ReleaseGroups = seasonStatistics.SelectMany(s => s.ReleaseGroups).Distinct().ToList()
};
var nextAiring = seasonStatistics.Where(s => s.NextAiring != null).MinBy(s => s.NextAiring);
var previousAiring = seasonStatistics.Where(s => s.PreviousAiring != null).MaxBy(s => s.PreviousAiring);
var lastAired = seasonStatistics.Where(s => s.SeasonNumber > 0 && s.LastAired != null).MaxBy(s => s.LastAired);
seriesStatistics.NextAiringString = nextAiring?.NextAiringString;
seriesStatistics.PreviousAiringString = previousAiring?.PreviousAiringString;
seriesStatistics.LastAiredString = lastAired?.LastAiredString;
return seriesStatistics;
}
}
}