using NLog; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Music.Events; using NzbDrone.Core.Organizer; using System; using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Datastore; using NzbDrone.Core.Parser; using System.Text; using System.IO; using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Music { public interface IAlbumService { Album GetAlbum(int albumId); List GetAlbums(IEnumerable albumIds); List GetAlbumsByArtist(int artistId); Album AddAlbum(Album newAlbum); Album FindById(string spotifyId); Album FindByTitle(int artistId, string title); Album FindByTitleInexact(string title); void DeleteAlbum(int albumId, bool deleteFiles); List GetAllAlbums(); Album UpdateAlbum(Album album); List UpdateAlbums(List album); void SetAlbumMonitored(int albumId, bool monitored); void SetMonitored(IEnumerable ids, bool monitored); PagingSpec AlbumsWithoutFiles(PagingSpec pagingSpec); List AlbumsBetweenDates(DateTime start, DateTime end, bool includeUnmonitored); void InsertMany(List albums); void UpdateMany(List albums); void DeleteMany(List albums); void RemoveAddOptions(Album album); } public class AlbumService : IAlbumService, IHandleAsync { private readonly IAlbumRepository _albumRepository; private readonly IEventAggregator _eventAggregator; private readonly ITrackService _trackService; private readonly IBuildFileNames _fileNameBuilder; private readonly Logger _logger; public AlbumService(IAlbumRepository albumRepository, IEventAggregator eventAggregator, ITrackService trackService, IBuildFileNames fileNameBuilder, Logger logger) { _albumRepository = albumRepository; _eventAggregator = eventAggregator; _trackService = trackService; _fileNameBuilder = fileNameBuilder; _logger = logger; } public Album AddAlbum(Album newAlbum) { _albumRepository.Insert(newAlbum); _eventAggregator.PublishEvent(new AlbumAddedEvent(GetAlbum(newAlbum.Id))); return newAlbum; } public void DeleteAlbum(int albumId, bool deleteFiles) { var album = _albumRepository.Get(albumId); _albumRepository.Delete(albumId); _eventAggregator.PublishEvent(new AlbumDeletedEvent(album, deleteFiles)); } public Album FindById(string lidarrId) { return _albumRepository.FindById(lidarrId); } public Album FindByTitle(int artistId, string title) { return _albumRepository.FindByTitle(artistId, title); } public Album FindByTitleInexact(string title) { throw new NotImplementedException(); } public List GetAllAlbums() { return _albumRepository.All().ToList(); } public Album GetAlbum(int albumId) { return _albumRepository.Get(albumId); } public List GetAlbums(IEnumerable albumIds) { return _albumRepository.Get(albumIds).ToList(); } public List GetAlbumsByArtist(int artistId) { return _albumRepository.GetAlbums(artistId).ToList(); } public void RemoveAddOptions(Album album) { _albumRepository.SetFields(album, s => s.AddOptions); } public PagingSpec AlbumsWithoutFiles(PagingSpec pagingSpec) { var albumResult = _albumRepository.AlbumsWithoutFiles(pagingSpec); return albumResult; } public List AlbumsBetweenDates(DateTime start, DateTime end, bool includeUnmonitored) { var albums = _albumRepository.AlbumsBetweenDates(start.ToUniversalTime(), end.ToUniversalTime(), includeUnmonitored); return albums; } public void InsertMany(List albums) { _albumRepository.InsertMany(albums); } public void UpdateMany(List albums) { _albumRepository.UpdateMany(albums); } public void DeleteMany(List albums) { _albumRepository.DeleteMany(albums); } public Album UpdateAlbum(Album album) { var storedAlbum = GetAlbum(album.Id); // Is it Id or iTunesId? var updatedAlbum = _albumRepository.Update(album); _eventAggregator.PublishEvent(new AlbumEditedEvent(updatedAlbum, storedAlbum)); return updatedAlbum; } public void SetAlbumMonitored(int albumId, bool monitored) { var album = _albumRepository.Get(albumId); _albumRepository.SetMonitoredFlat(album, monitored); var tracks = _trackService.GetTracksByAlbum(albumId); foreach (var track in tracks) { track.Monitored = monitored; } _trackService.UpdateTracks(tracks); _logger.Debug("Monitored flag for Album:{0} was set to {1}", albumId, monitored); } public void SetMonitored(IEnumerable ids, bool monitored) { _albumRepository.SetMonitored(ids, monitored); foreach (var id in ids) { var tracks = _trackService.GetTracksByAlbum(id); foreach (var track in tracks) { track.Monitored = monitored; } _trackService.UpdateTracks(tracks); } } public List UpdateAlbums(List album) { _logger.Debug("Updating {0} album", album.Count); _albumRepository.UpdateMany(album); _logger.Debug("{0} albums updated", album.Count); return album; } public void HandleAsync(ArtistDeletedEvent message) { var albums = GetAlbumsByArtist(message.Artist.Id); _albumRepository.DeleteMany(albums); } } }