You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.7 KiB
77 lines
2.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NLog;
|
|
using NzbDrone.Core.MediaFiles;
|
|
|
|
namespace NzbDrone.Core.Music
|
|
{
|
|
public interface IRefreshTrackService
|
|
{
|
|
bool RefreshTrackInfo(List<Track> add, List<Track> update, List<Tuple<Track, Track>> merge, List<Track> delete, List<Track> upToDate, List<Track> remoteTracks, bool forceUpdateFileTags);
|
|
}
|
|
|
|
public class RefreshTrackService : IRefreshTrackService
|
|
{
|
|
private readonly ITrackService _trackService;
|
|
private readonly IAudioTagService _audioTagService;
|
|
private readonly Logger _logger;
|
|
|
|
public RefreshTrackService(ITrackService trackService,
|
|
IAudioTagService audioTagService,
|
|
Logger logger)
|
|
{
|
|
_trackService = trackService;
|
|
_audioTagService = audioTagService;
|
|
_logger = logger;
|
|
}
|
|
|
|
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)
|
|
{
|
|
var updateList = new List<Track>();
|
|
|
|
// for tracks that need updating, just grab the remote track and set db ids
|
|
foreach (var track in update)
|
|
{
|
|
var remoteTrack = remoteTracks.Single(e => e.ForeignTrackId == track.ForeignTrackId);
|
|
track.UseMetadataFrom(remoteTrack);
|
|
|
|
// 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;
|
|
|
|
if (mergeTarget.TrackFileId == 0)
|
|
{
|
|
mergeTarget.TrackFileId = trackToMerge.TrackFileId;
|
|
}
|
|
|
|
if (!updateList.Contains(mergeTarget))
|
|
{
|
|
updateList.Add(mergeTarget);
|
|
}
|
|
}
|
|
|
|
_trackService.DeleteMany(delete.Concat(merge.Select(x => x.Item1)).ToList());
|
|
_trackService.UpdateMany(updateList);
|
|
|
|
var tagsToUpdate = updateList;
|
|
if (forceUpdateFileTags)
|
|
{
|
|
_logger.Debug("Forcing tag update due to Artist/Album/Release updates");
|
|
tagsToUpdate = updateList.Concat(upToDate).ToList();
|
|
}
|
|
|
|
_audioTagService.SyncTags(tagsToUpdate);
|
|
|
|
return add.Any() || delete.Any() || updateList.Any() || merge.Any();
|
|
}
|
|
}
|
|
}
|