2017-09-18 03:20:36 +00:00
|
|
|
using NLog;
|
2017-06-18 02:27:01 +00:00
|
|
|
using NzbDrone.Common.Extensions;
|
|
|
|
using NzbDrone.Core.Messaging.Events;
|
|
|
|
using NzbDrone.Core.Music.Events;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using NzbDrone.Core.Organizer;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Music
|
|
|
|
{
|
|
|
|
public interface IRefreshAlbumService
|
|
|
|
{
|
|
|
|
void RefreshAlbumInfo(Artist artist, IEnumerable<Album> remoteAlbums);
|
|
|
|
}
|
|
|
|
|
|
|
|
public class RefreshAlbumService : IRefreshAlbumService
|
|
|
|
{
|
|
|
|
private readonly IAlbumService _albumService;
|
|
|
|
private readonly IRefreshTrackService _refreshTrackService;
|
2017-07-03 18:39:06 +00:00
|
|
|
private readonly IBuildFileNames _fileNameBuilder;
|
2017-06-18 02:27:01 +00:00
|
|
|
private readonly IEventAggregator _eventAggregator;
|
|
|
|
private readonly Logger _logger;
|
|
|
|
|
2017-07-03 18:39:06 +00:00
|
|
|
public RefreshAlbumService(IAlbumService albumService, IBuildFileNames fileNameBuilder, IRefreshTrackService refreshTrackService, IEventAggregator eventAggregator, Logger logger)
|
2017-06-18 02:27:01 +00:00
|
|
|
{
|
|
|
|
_albumService = albumService;
|
2017-07-03 18:39:06 +00:00
|
|
|
_fileNameBuilder = fileNameBuilder;
|
2017-06-18 02:27:01 +00:00
|
|
|
_refreshTrackService = refreshTrackService;
|
|
|
|
_eventAggregator = eventAggregator;
|
|
|
|
_logger = logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void RefreshAlbumInfo(Artist artist, IEnumerable<Album> remoteAlbums)
|
|
|
|
{
|
|
|
|
_logger.Info("Starting album info refresh for: {0}", artist);
|
|
|
|
var successCount = 0;
|
|
|
|
var failCount = 0;
|
|
|
|
|
|
|
|
var existingAlbums = _albumService.GetAlbumsByArtist(artist.Id);
|
|
|
|
|
|
|
|
var updateList = new List<Album>();
|
|
|
|
var newList = new List<Album>();
|
|
|
|
var dupeFreeRemoteAlbums = remoteAlbums.DistinctBy(m => new { m.ForeignAlbumId, m.ReleaseDate }).ToList();
|
|
|
|
|
|
|
|
foreach (var album in OrderAlbums(artist, dupeFreeRemoteAlbums))
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var albumToUpdate = GetAlbumToUpdate(artist, album, existingAlbums);
|
|
|
|
|
|
|
|
if (albumToUpdate != null)
|
|
|
|
{
|
|
|
|
existingAlbums.Remove(albumToUpdate);
|
|
|
|
updateList.Add(albumToUpdate);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
albumToUpdate = new Album();
|
|
|
|
albumToUpdate.Monitored = artist.Monitored;
|
2017-07-03 18:39:06 +00:00
|
|
|
albumToUpdate.ProfileId = artist.ProfileId;
|
|
|
|
albumToUpdate.Added = DateTime.UtcNow;
|
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
newList.Add(albumToUpdate);
|
|
|
|
}
|
|
|
|
|
2017-07-03 18:39:06 +00:00
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
albumToUpdate.ForeignAlbumId = album.ForeignAlbumId;
|
2017-07-03 18:39:06 +00:00
|
|
|
albumToUpdate.LastInfoSync = DateTime.UtcNow;
|
2017-06-18 02:27:01 +00:00
|
|
|
albumToUpdate.CleanTitle = album.CleanTitle;
|
|
|
|
albumToUpdate.Title = album.Title ?? "Unknown";
|
2017-10-08 20:07:54 +00:00
|
|
|
albumToUpdate.CleanTitle = Parser.Parser.CleanArtistName(albumToUpdate.Title);
|
2017-06-18 02:27:01 +00:00
|
|
|
albumToUpdate.ArtistId = artist.Id;
|
|
|
|
albumToUpdate.AlbumType = album.AlbumType;
|
2017-11-26 03:51:37 +00:00
|
|
|
albumToUpdate.SecondaryTypes = album.SecondaryTypes;
|
2017-07-03 18:39:06 +00:00
|
|
|
albumToUpdate.Genres = album.Genres;
|
2017-11-16 02:24:33 +00:00
|
|
|
albumToUpdate.Media = album.Media;
|
2017-09-18 03:20:36 +00:00
|
|
|
albumToUpdate.Label = album.Label;
|
2017-07-03 18:39:06 +00:00
|
|
|
albumToUpdate.Images = album.Images;
|
|
|
|
albumToUpdate.ReleaseDate = album.ReleaseDate;
|
2017-08-14 02:58:42 +00:00
|
|
|
albumToUpdate.Duration = album.Tracks.Sum(track => track.Duration);
|
2017-06-18 02:27:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
successCount++;
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
_logger.Fatal(e, "An error has occurred while updating track info for artist {0}. {1}", artist, album);
|
|
|
|
failCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var allAlbums = new List<Album>();
|
|
|
|
allAlbums.AddRange(newList);
|
|
|
|
allAlbums.AddRange(updateList);
|
|
|
|
|
|
|
|
// TODO: See if anything needs to be done here
|
|
|
|
//AdjustMultiEpisodeAirTime(artist, allTracks);
|
|
|
|
//AdjustDirectToDvdAirDate(artist, allTracks);
|
|
|
|
|
|
|
|
_albumService.DeleteMany(existingAlbums);
|
|
|
|
_albumService.UpdateMany(updateList);
|
|
|
|
_albumService.InsertMany(newList);
|
|
|
|
|
|
|
|
_eventAggregator.PublishEvent(new AlbumInfoRefreshedEvent(artist, newList, updateList));
|
|
|
|
|
|
|
|
if (failCount != 0)
|
|
|
|
{
|
|
|
|
_logger.Info("Finished album refresh for artist: {0}. Successful: {1} - Failed: {2} ",
|
|
|
|
artist.Name, successCount, failCount);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_logger.Info("Finished album refresh for artist: {0}.", artist);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool GetMonitoredStatus(Album album, IEnumerable<Artist> artists)
|
|
|
|
{
|
|
|
|
var artist = artists.SingleOrDefault(c => c.Id == album.ArtistId);
|
|
|
|
return album == null || album.Monitored;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Album GetAlbumToUpdate(Artist artist, Album album, List<Album> existingAlbums)
|
|
|
|
{
|
2017-07-03 18:39:06 +00:00
|
|
|
return existingAlbums.FirstOrDefault(e => e.ForeignAlbumId == album.ForeignAlbumId/* && e.ReleaseDate == album.ReleaseDate*/);
|
2017-06-18 02:27:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private IEnumerable<Album> OrderAlbums(Artist artist, List<Album> albums)
|
|
|
|
{
|
|
|
|
return albums.OrderBy(e => e.ForeignAlbumId).ThenBy(e => e.ReleaseDate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|