using System; using System.Collections.Generic; using System.Linq; using FluentValidation; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Common.Extensions; using Lidarr.Api.V1.Artist; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Music; using NzbDrone.Core.ArtistStats; using NzbDrone.SignalR; using Lidarr.Http; using NzbDrone.Core.Download; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Music.Events; namespace Lidarr.Api.V1.Albums { public abstract class AlbumModuleWithSignalR : LidarrRestModuleWithSignalR, IHandle, IHandle, IHandle { protected readonly IAlbumService _albumService; protected readonly IArtistStatisticsService _artistStatisticsService; protected readonly IUpgradableSpecification _qualityUpgradableSpecification; protected AlbumModuleWithSignalR(IAlbumService albumService, IArtistStatisticsService artistStatisticsService, IUpgradableSpecification qualityUpgradableSpecification, IBroadcastSignalRMessage signalRBroadcaster) : base(signalRBroadcaster) { _albumService = albumService; _artistStatisticsService = artistStatisticsService; _qualityUpgradableSpecification = qualityUpgradableSpecification; GetResourceById = GetAlbum; } protected AlbumModuleWithSignalR(IAlbumService albumService, IArtistStatisticsService artistStatisticsService, IUpgradableSpecification qualityUpgradableSpecification, IBroadcastSignalRMessage signalRBroadcaster, string resource) : base(signalRBroadcaster, resource) { _albumService = albumService; _artistStatisticsService = artistStatisticsService; _qualityUpgradableSpecification = qualityUpgradableSpecification; GetResourceById = GetAlbum; } protected AlbumResource GetAlbum(int id) { var album = _albumService.GetAlbum(id); var resource = MapToResource(album, true); return resource; } protected AlbumResource MapToResource(Album album, bool includeArtist) { var resource = album.ToResource(); if (includeArtist) { var artist = album.Artist.Value; resource.Artist = artist.ToResource(); } FetchAndLinkAlbumStatistics(resource); return resource; } protected List MapToResource(List albums, bool includeArtist) { var result = albums.ToResource(); if (includeArtist) { var artistDict = new Dictionary(); for (var i = 0; i < albums.Count; i++) { var album = albums[i]; var resource = result[i]; var artist = artistDict.GetValueOrDefault(albums[i].ArtistMetadataId) ?? album.Artist?.Value; artistDict[artist.ArtistMetadataId] = artist; resource.Artist = artist.ToResource(); } } var artistStats = _artistStatisticsService.ArtistStatistics(); LinkArtistStatistics(result, artistStats); return result; } private void FetchAndLinkAlbumStatistics(AlbumResource resource) { LinkArtistStatistics(resource, _artistStatisticsService.ArtistStatistics(resource.ArtistId)); } private void LinkArtistStatistics(List resources, List artistStatistics) { foreach (var album in resources) { var stats = artistStatistics.SingleOrDefault(ss => ss.ArtistId == album.ArtistId); LinkArtistStatistics(album, stats); } } private void LinkArtistStatistics(AlbumResource resource, ArtistStatistics artistStatistics) { if (artistStatistics?.AlbumStatistics != null) { var dictAlbumStats = artistStatistics.AlbumStatistics.ToDictionary(v => v.AlbumId); resource.Statistics = dictAlbumStats.GetValueOrDefault(resource.Id).ToResource(); } } public void Handle(AlbumGrabbedEvent message) { foreach (var album in message.Album.Albums) { var resource = album.ToResource(); resource.Grabbed = true; BroadcastResourceChange(ModelAction.Updated, resource); } } public void Handle(AlbumEditedEvent message) { BroadcastResourceChange(ModelAction.Updated, message.Album.Id); } public void Handle(TrackImportedEvent message) { BroadcastResourceChange(ModelAction.Updated, message.ImportedTrack.AlbumId); } //public void Handle(TrackDownloadedEvent message) //{ // foreach (var album in message.Album.Albums) // { // BroadcastResourceChange(ModelAction.Updated, album.Id); // } //} } }