2017-09-24 19:44:25 +00:00
|
|
|
using NLog;
|
2019-03-15 12:10:45 +00:00
|
|
|
using NzbDrone.Core.MediaFiles;
|
2017-05-07 16:58:24 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Music
|
|
|
|
{
|
|
|
|
public interface IRefreshTrackService
|
|
|
|
{
|
2019-07-09 20:14:05 +00:00
|
|
|
bool RefreshTrackInfo(List<Track> add, List<Track> update, List<Tuple<Track, Track> > merge, List<Track> delete, List<Track> upToDate, List<Track> remoteTracks, bool forceUpdateFileTags);
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public class RefreshTrackService : IRefreshTrackService
|
|
|
|
{
|
|
|
|
private readonly ITrackService _trackService;
|
2019-03-15 12:10:45 +00:00
|
|
|
private readonly IAudioTagService _audioTagService;
|
2017-05-07 16:58:24 +00:00
|
|
|
private readonly Logger _logger;
|
|
|
|
|
2019-03-15 12:10:45 +00:00
|
|
|
public RefreshTrackService(ITrackService trackService,
|
|
|
|
IAudioTagService audioTagService,
|
|
|
|
Logger logger)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
|
|
|
_trackService = trackService;
|
2019-03-15 12:10:45 +00:00
|
|
|
_audioTagService = audioTagService;
|
2017-05-07 16:58:24 +00:00
|
|
|
_logger = logger;
|
|
|
|
}
|
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
public bool RefreshTrackInfo(List<Track> add, List<Track> update, List<Tuple<Track, Track> > merge, List<Track> delete, List<Track> upToDate, List<Track> remoteTracks, bool forceUpdateFileTags)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
2019-07-09 20:14:05 +00:00
|
|
|
var updateList = new List<Track>();
|
2017-05-07 16:58:24 +00:00
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
// for tracks that need updating, just grab the remote track and set db ids
|
2019-08-27 20:23:35 +00:00
|
|
|
foreach (var track in update)
|
2018-12-15 00:02:43 +00:00
|
|
|
{
|
2019-08-27 20:23:35 +00:00
|
|
|
var remoteTrack = remoteTracks.Single(e => e.ForeignTrackId == track.ForeignTrackId);
|
|
|
|
track.UseMetadataFrom(remoteTrack);
|
2019-07-09 20:14:05 +00:00
|
|
|
|
|
|
|
// make sure title is not null
|
|
|
|
track.Title = track.Title ?? "Unknown";
|
|
|
|
updateList.Add(track);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Move trackfiles from merged entities into new one
|
|
|
|
foreach (var item in merge)
|
|
|
|
{
|
|
|
|
var trackToMerge = item.Item1;
|
|
|
|
var mergeTarget = item.Item2;
|
2017-05-07 16:58:24 +00:00
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
if (mergeTarget.TrackFileId == 0)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
2019-07-09 20:14:05 +00:00
|
|
|
mergeTarget.TrackFileId = trackToMerge.TrackFileId;
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
if (!updateList.Contains(mergeTarget))
|
2019-03-15 12:10:45 +00:00
|
|
|
{
|
2019-07-09 20:14:05 +00:00
|
|
|
updateList.Add(mergeTarget);
|
2019-03-15 12:10:45 +00:00
|
|
|
}
|
2018-12-15 00:02:43 +00:00
|
|
|
}
|
2017-05-07 16:58:24 +00:00
|
|
|
|
2019-08-27 20:23:35 +00:00
|
|
|
_trackService.DeleteMany(delete.Concat(merge.Select(x => x.Item1)).ToList());
|
|
|
|
_trackService.UpdateMany(updateList);
|
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
var tagsToUpdate = updateList;
|
|
|
|
if (forceUpdateFileTags)
|
2017-05-07 16:58:24 +00:00
|
|
|
{
|
2019-07-09 20:14:05 +00:00
|
|
|
_logger.Debug("Forcing tag update due to Artist/Album/Release updates");
|
|
|
|
tagsToUpdate = updateList.Concat(upToDate).ToList();
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
2019-07-09 20:14:05 +00:00
|
|
|
_audioTagService.SyncTags(tagsToUpdate);
|
2019-06-08 19:13:58 +00:00
|
|
|
|
2019-07-09 20:14:05 +00:00
|
|
|
return delete.Any() || updateList.Any() || merge.Any();
|
2017-05-07 16:58:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|