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.
Lidarr/src/NzbDrone.Core/Music/Services/RefreshAlbumReleaseService.cs

120 lines
4.9 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
namespace NzbDrone.Core.Music
{
public interface IRefreshAlbumReleaseService
{
bool RefreshEntityInfo(AlbumRelease entity, List<AlbumRelease> remoteEntityList, bool forceChildRefresh, bool forceUpdateFileTags, DateTime? lastUpdate);
bool RefreshEntityInfo(List<AlbumRelease> releases, List<AlbumRelease> remoteEntityList, bool forceChildRefresh, bool forceUpdateFileTags);
}
public class RefreshAlbumReleaseService : RefreshEntityServiceBase<AlbumRelease, Track>, IRefreshAlbumReleaseService
{
private readonly IReleaseService _releaseService;
private readonly IRefreshTrackService _refreshTrackService;
private readonly ITrackService _trackService;
public RefreshAlbumReleaseService(IReleaseService releaseService,
IArtistMetadataService artistMetadataService,
IRefreshTrackService refreshTrackService,
ITrackService trackService,
Logger logger)
: base(logger, artistMetadataService)
{
_releaseService = releaseService;
_trackService = trackService;
_refreshTrackService = refreshTrackService;
}
protected override RemoteData GetRemoteData(AlbumRelease local, List<AlbumRelease> remote)
{
var result = new RemoteData();
result.Entity = remote.SingleOrDefault(x => x.ForeignReleaseId == local.ForeignReleaseId || x.OldForeignReleaseIds.Contains(local.ForeignReleaseId));
return result;
}
protected override bool IsMerge(AlbumRelease local, AlbumRelease remote)
{
return local.ForeignReleaseId != remote.ForeignReleaseId;
}
protected override UpdateResult UpdateEntity(AlbumRelease local, AlbumRelease remote)
{
if (local.Equals(remote))
{
return UpdateResult.None;
}
local.UseMetadataFrom(remote);
return UpdateResult.UpdateTags;
}
protected override AlbumRelease GetEntityByForeignId(AlbumRelease local)
{
return _releaseService.GetReleaseByForeignReleaseId(local.ForeignReleaseId);
}
protected override void SaveEntity(AlbumRelease local)
{
_releaseService.UpdateMany(new List<AlbumRelease> { local });
}
protected override void DeleteEntity(AlbumRelease local, bool deleteFiles)
{
_releaseService.DeleteMany(new List<AlbumRelease> { local });
}
protected override List<Track> GetRemoteChildren(AlbumRelease remote)
{
return remote.Tracks.Value.DistinctBy(m => m.ForeignTrackId).ToList();
}
protected override List<Track> GetLocalChildren(AlbumRelease entity, List<Track> remoteChildren)
{
return _trackService.GetTracksForRefresh(entity.Id,
remoteChildren.Select(x => x.ForeignTrackId)
.Concat(remoteChildren.SelectMany(x => x.OldForeignTrackIds)).ToList());
}
protected override Tuple<Track, List<Track>> GetMatchingExistingChildren(List<Track> existingChildren, Track remote)
{
var existingChild = existingChildren.SingleOrDefault(x => x.ForeignTrackId == remote.ForeignTrackId);
var mergeChildren = existingChildren.Where(x => remote.OldForeignTrackIds.Contains(x.ForeignTrackId)).ToList();
return Tuple.Create(existingChild, mergeChildren);
}
protected override void PrepareNewChild(Track child, AlbumRelease entity)
{
child.AlbumReleaseId = entity.Id;
child.AlbumRelease = entity;
child.ArtistMetadataId = child.ArtistMetadata.Value.Id;
// make sure title is not null
child.Title = child.Title ?? "Unknown";
}
protected override void PrepareExistingChild(Track local, Track remote, AlbumRelease entity)
{
local.AlbumRelease = entity;
local.AlbumReleaseId = entity.Id;
local.ArtistMetadataId = remote.ArtistMetadata.Value.Id;
remote.UseDbFieldsFrom(local);
}
protected override void AddChildren(List<Track> children)
{
_trackService.InsertMany(children);
}
protected override bool RefreshChildren(SortedChildren localChildren, List<Track> remoteChildren, bool forceChildRefresh, bool forceUpdateFileTags, DateTime? lastUpdate)
{
return _refreshTrackService.RefreshTrackInfo(localChildren.Added, localChildren.Updated, localChildren.Merged, localChildren.Deleted, localChildren.UpToDate, remoteChildren, forceUpdateFileTags);
}
}
}