2017-09-24 19:44:25 +00:00
|
|
|
using NLog;
|
2017-05-07 16:58:24 +00:00
|
|
|
using NzbDrone.Common.Extensions;
|
|
|
|
using NzbDrone.Core.Messaging.Events;
|
|
|
|
using NzbDrone.Core.Music.Events;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Music
|
|
|
|
{
|
|
|
|
public interface IRefreshTrackService
|
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
void RefreshTrackInfo(Album album, IEnumerable<Track> remoteTracks);
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public class RefreshTrackService : IRefreshTrackService
|
|
|
|
{
|
|
|
|
private readonly ITrackService _trackService;
|
2017-07-03 18:39:06 +00:00
|
|
|
private readonly IAlbumService _albumService;
|
2017-05-07 16:58:24 +00:00
|
|
|
private readonly IEventAggregator _eventAggregator;
|
|
|
|
private readonly Logger _logger;
|
|
|
|
|
2017-07-03 18:39:06 +00:00
|
|
|
public RefreshTrackService(ITrackService trackService, IAlbumService albumService, IEventAggregator eventAggregator, Logger logger)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
|
|
|
_trackService = trackService;
|
2017-07-03 18:39:06 +00:00
|
|
|
_albumService = albumService;
|
2017-05-07 16:58:24 +00:00
|
|
|
_eventAggregator = eventAggregator;
|
|
|
|
_logger = logger;
|
|
|
|
}
|
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
public void RefreshTrackInfo(Album album, IEnumerable<Track> remoteTracks)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
_logger.Info("Starting track info refresh for: {0}", album);
|
2017-05-07 16:58:24 +00:00
|
|
|
var successCount = 0;
|
|
|
|
var failCount = 0;
|
|
|
|
|
2017-07-03 18:39:06 +00:00
|
|
|
album = _albumService.FindById(album.ForeignAlbumId);
|
|
|
|
|
2017-09-24 19:44:25 +00:00
|
|
|
var existingTracks = _trackService.GetTracksByAlbum(album.Id);
|
2017-05-07 16:58:24 +00:00
|
|
|
|
|
|
|
var updateList = new List<Track>();
|
|
|
|
var newList = new List<Track>();
|
2017-07-03 18:39:06 +00:00
|
|
|
var dupeFreeRemoteTracks = remoteTracks.DistinctBy(m => new { m.ForeignTrackId, m.TrackNumber }).ToList();
|
2017-05-07 16:58:24 +00:00
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
foreach (var track in OrderTracks(album, dupeFreeRemoteTracks))
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
var trackToUpdate = GetTrackToUpdate(album, track, existingTracks);
|
2017-05-07 16:58:24 +00:00
|
|
|
|
|
|
|
if (trackToUpdate != null)
|
|
|
|
{
|
|
|
|
existingTracks.Remove(trackToUpdate);
|
|
|
|
updateList.Add(trackToUpdate);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
trackToUpdate = new Track();
|
2017-06-18 02:27:01 +00:00
|
|
|
trackToUpdate.Monitored = album.Monitored;
|
2017-07-03 18:39:06 +00:00
|
|
|
trackToUpdate.Id = track.Id;
|
2017-05-07 16:58:24 +00:00
|
|
|
newList.Add(trackToUpdate);
|
|
|
|
}
|
2017-05-07 22:50:07 +00:00
|
|
|
|
2017-07-03 18:39:06 +00:00
|
|
|
// TODO: Use object mapper to automatically handle this
|
2017-06-13 03:03:36 +00:00
|
|
|
trackToUpdate.ForeignTrackId = track.ForeignTrackId;
|
2017-05-07 16:58:24 +00:00
|
|
|
trackToUpdate.TrackNumber = track.TrackNumber;
|
2017-11-16 02:24:33 +00:00
|
|
|
trackToUpdate.AbsoluteTrackNumber = track.AbsoluteTrackNumber;
|
2017-05-07 16:58:24 +00:00
|
|
|
trackToUpdate.Title = track.Title ?? "Unknown";
|
2017-06-18 02:27:01 +00:00
|
|
|
trackToUpdate.AlbumId = album.Id;
|
2017-07-03 18:39:06 +00:00
|
|
|
trackToUpdate.Album = track.Album ?? album;
|
2017-06-13 03:03:36 +00:00
|
|
|
trackToUpdate.Explicit = track.Explicit;
|
2017-06-18 02:27:01 +00:00
|
|
|
trackToUpdate.ArtistId = album.ArtistId;
|
2017-05-07 22:50:07 +00:00
|
|
|
trackToUpdate.Compilation = track.Compilation;
|
2017-08-14 02:58:42 +00:00
|
|
|
trackToUpdate.Duration = track.Duration;
|
2017-11-16 02:24:33 +00:00
|
|
|
trackToUpdate.MediumNumber = track.MediumNumber;
|
2017-05-07 22:50:07 +00:00
|
|
|
|
2017-05-07 16:58:24 +00:00
|
|
|
|
|
|
|
successCount++;
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
_logger.Fatal(e, "An error has occurred while updating track info for album {0}. {1}", album, track);
|
2017-05-07 16:58:24 +00:00
|
|
|
failCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var allTracks = new List<Track>();
|
|
|
|
allTracks.AddRange(newList);
|
|
|
|
allTracks.AddRange(updateList);
|
|
|
|
|
|
|
|
// TODO: See if anything needs to be done here
|
|
|
|
//AdjustMultiEpisodeAirTime(artist, allTracks);
|
|
|
|
//AdjustDirectToDvdAirDate(artist, allTracks);
|
|
|
|
|
|
|
|
_trackService.DeleteMany(existingTracks);
|
|
|
|
_trackService.UpdateMany(updateList);
|
|
|
|
_trackService.InsertMany(newList);
|
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
_eventAggregator.PublishEvent(new TrackInfoRefreshedEvent(album, newList, updateList));
|
2017-05-07 16:58:24 +00:00
|
|
|
|
|
|
|
if (failCount != 0)
|
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
_logger.Info("Finished track refresh for album: {0}. Successful: {1} - Failed: {2} ",
|
|
|
|
album.Title, successCount, failCount);
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-06-18 02:27:01 +00:00
|
|
|
_logger.Info("Finished track refresh for album: {0}.", album);
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool GetMonitoredStatus(Track track, IEnumerable<Album> albums)
|
|
|
|
{
|
2017-11-16 02:24:33 +00:00
|
|
|
if (track.AbsoluteTrackNumber == 0 /*&& track.AlbumId != 1*/)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-06-13 03:03:36 +00:00
|
|
|
var album = albums.SingleOrDefault(c => c.Id == track.AlbumId);
|
2017-05-07 16:58:24 +00:00
|
|
|
return album == null || album.Monitored;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
private Track GetTrackToUpdate(Album album, Track track, List<Track> existingTracks)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
2017-07-03 18:39:06 +00:00
|
|
|
var result = existingTracks.FirstOrDefault(e => e.ForeignTrackId == track.ForeignTrackId && e.TrackNumber == track.TrackNumber);
|
|
|
|
return result;
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
|
2017-06-18 02:27:01 +00:00
|
|
|
private IEnumerable<Track> OrderTracks(Album album, List<Track> tracks)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
|
|
|
return tracks.OrderBy(e => e.AlbumId).ThenBy(e => e.TrackNumber);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|