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.
141 lines
4.7 KiB
141 lines
4.7 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NzbDrone.Common.Cache;
|
|
using NzbDrone.Core.MediaFiles.Events;
|
|
using NzbDrone.Core.Messaging;
|
|
using NzbDrone.Core.Messaging.Events;
|
|
using NzbDrone.Core.Music.Events;
|
|
|
|
namespace NzbDrone.Core.ArtistStats
|
|
{
|
|
public interface IArtistStatisticsService
|
|
{
|
|
List<ArtistStatistics> ArtistStatistics();
|
|
ArtistStatistics ArtistStatistics(int artistId);
|
|
}
|
|
|
|
public class ArtistStatisticsService : IArtistStatisticsService,
|
|
IHandle<ArtistAddedEvent>,
|
|
IHandle<ArtistUpdatedEvent>,
|
|
IHandle<ArtistsDeletedEvent>,
|
|
IHandle<AlbumAddedEvent>,
|
|
IHandle<AlbumDeletedEvent>,
|
|
IHandle<AlbumImportedEvent>,
|
|
IHandle<AlbumEditedEvent>,
|
|
IHandle<AlbumUpdatedEvent>,
|
|
IHandle<TrackFileDeletedEvent>
|
|
{
|
|
private readonly IArtistStatisticsRepository _artistStatisticsRepository;
|
|
private readonly ICached<List<AlbumStatistics>> _cache;
|
|
|
|
public ArtistStatisticsService(IArtistStatisticsRepository artistStatisticsRepository,
|
|
ICacheManager cacheManager)
|
|
{
|
|
_artistStatisticsRepository = artistStatisticsRepository;
|
|
_cache = cacheManager.GetCache<List<AlbumStatistics>>(GetType());
|
|
}
|
|
|
|
public List<ArtistStatistics> ArtistStatistics()
|
|
{
|
|
var albumStatistics = _cache.Get("AllArtists", () => _artistStatisticsRepository.ArtistStatistics());
|
|
|
|
return albumStatistics.GroupBy(s => s.ArtistId).Select(s => MapArtistStatistics(s.ToList())).ToList();
|
|
}
|
|
|
|
public ArtistStatistics ArtistStatistics(int artistId)
|
|
{
|
|
var stats = _cache.Get(artistId.ToString(), () => _artistStatisticsRepository.ArtistStatistics(artistId));
|
|
|
|
if (stats == null || stats.Count == 0)
|
|
{
|
|
return new ArtistStatistics();
|
|
}
|
|
|
|
return MapArtistStatistics(stats);
|
|
}
|
|
|
|
private ArtistStatistics MapArtistStatistics(List<AlbumStatistics> albumStatistics)
|
|
{
|
|
var artistStatistics = new ArtistStatistics
|
|
{
|
|
AlbumStatistics = albumStatistics,
|
|
AlbumCount = albumStatistics.Count,
|
|
ArtistId = albumStatistics.First().ArtistId,
|
|
TrackFileCount = albumStatistics.Sum(s => s.TrackFileCount),
|
|
TrackCount = albumStatistics.Sum(s => s.TrackCount),
|
|
TotalTrackCount = albumStatistics.Sum(s => s.TotalTrackCount),
|
|
SizeOnDisk = albumStatistics.Sum(s => s.SizeOnDisk)
|
|
};
|
|
|
|
return artistStatistics;
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(ArtistAddedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Artist.Id.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(ArtistUpdatedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Artist.Id.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(ArtistsDeletedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
|
|
foreach (var artist in message.Artists)
|
|
{
|
|
_cache.Remove(artist.Id.ToString());
|
|
}
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(AlbumAddedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Album.ArtistId.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(AlbumDeletedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Album.ArtistId.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(AlbumImportedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Artist.Id.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(AlbumEditedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Album.ArtistId.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(AlbumUpdatedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.Album.ArtistId.ToString());
|
|
}
|
|
|
|
[EventHandleOrder(EventHandleOrder.First)]
|
|
public void Handle(TrackFileDeletedEvent message)
|
|
{
|
|
_cache.Remove("AllArtists");
|
|
_cache.Remove(message.TrackFile.Artist.Value.Id.ToString());
|
|
}
|
|
}
|
|
}
|