using System; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Music { public interface IRefreshAlbumReleaseService { bool RefreshEntityInfo(AlbumRelease entity, List remoteEntityList, bool forceChildRefresh, bool forceUpdateFileTags, DateTime? lastUpdate); bool RefreshEntityInfo(List releases, List remoteEntityList, bool forceChildRefresh, bool forceUpdateFileTags); } public class RefreshAlbumReleaseService : RefreshEntityServiceBase, 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 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 { local }); } protected override void DeleteEntity(AlbumRelease local, bool deleteFiles) { _releaseService.DeleteMany(new List { local }); } protected override List GetRemoteChildren(AlbumRelease remote) { return remote.Tracks.Value.DistinctBy(m => m.ForeignTrackId).ToList(); } protected override List GetLocalChildren(AlbumRelease entity, List remoteChildren) { return _trackService.GetTracksForRefresh(entity.Id, remoteChildren.Select(x => x.ForeignTrackId) .Concat(remoteChildren.SelectMany(x => x.OldForeignTrackIds))); } protected override Tuple> GetMatchingExistingChildren(List 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 children) { _trackService.InsertMany(children); } protected override bool RefreshChildren(SortedChildren localChildren, List remoteChildren, bool forceChildRefresh, bool forceUpdateFileTags, DateTime? lastUpdate) { return _refreshTrackService.RefreshTrackInfo(localChildren.Added, localChildren.Updated, localChildren.Merged, localChildren.Deleted, localChildren.UpToDate, remoteChildren, forceUpdateFileTags); } } }