diff --git a/src/NzbDrone.Core/MediaFiles/CueSheetService.cs b/src/NzbDrone.Core/MediaFiles/CueSheetService.cs index 2783c4435..98c048e35 100644 --- a/src/NzbDrone.Core/MediaFiles/CueSheetService.cs +++ b/src/NzbDrone.Core/MediaFiles/CueSheetService.cs @@ -73,7 +73,9 @@ namespace NzbDrone.Core.MediaFiles audioFilesForCues.AddRange(cueSheetInfo.MusicFiles); } - decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFilesForCues, cueSheetInfoGroup.First().IdOverrides, itemInfo, config, cueSheetInfos)); + var itemInfoWithCueSheetInfos = itemInfo; + itemInfoWithCueSheetInfos.CueSheetInfos = cueSheetInfoGroup.ToList(); + decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFilesForCues, cueSheetInfoGroup.First().IdOverrides, itemInfoWithCueSheetInfos, config)); foreach (var cueSheetInfo in cueSheetInfos) { @@ -124,7 +126,8 @@ namespace NzbDrone.Core.MediaFiles return; } - decision.Item.Tracks = tracksFromRelease.Where(trackFromRelease => !addedTracks.Contains(trackFromRelease) && tracksFromCueSheet.Any(trackFromCueSheet => string.Equals(trackFromCueSheet.Title, trackFromRelease.Title, StringComparison.InvariantCultureIgnoreCase))).ToList(); + // TODO diacritics could cause false positives here + decision.Item.Tracks = tracksFromRelease.Where(trackFromRelease => !addedTracks.Contains(trackFromRelease) && tracksFromCueSheet.Any(trackFromCueSheet => string.Equals(trackFromCueSheet.Title, trackFromRelease.Title, StringComparison.OrdinalIgnoreCase))).ToList(); addedTracks.AddRange(decision.Item.Tracks); }); @@ -314,7 +317,7 @@ namespace NzbDrone.Core.MediaFiles var parsedAlbumInfo = new ParsedAlbumInfo { AlbumTitle = cueSheet.Title, - ArtistName = artistFromCue.Name, + ArtistName = artistFromCue?.Name, ReleaseDate = cueSheet.Date, }; diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Identification/IdentificationService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Identification/IdentificationService.cs index b45159e2f..058648eb1 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Identification/IdentificationService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Identification/IdentificationService.cs @@ -17,7 +17,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification { public interface IIdentificationService { - List Identify(List localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config, List cueSheetInfos = null); + List Identify(List localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config); } public class IdentificationService : IIdentificationService @@ -114,7 +114,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification return releases; } - public List Identify(List localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config, List cueSheetInfos = null) + public List Identify(List localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config) { // 1 group localTracks so that we think they represent a single release // 2 get candidates given specified artist, album and release. Candidates can include extra files already on disk. diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs index 2a395a4f3..07cf098c0 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport { public interface IMakeImportDecision { - List> GetImportDecisions(List musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config, List cueSheetInfos = null); + List> GetImportDecisions(List musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config); } public class IdentificationOverrides @@ -34,6 +34,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport { public DownloadClientItem DownloadClientItem { get; set; } public ParsedAlbumInfo ParsedAlbumInfo { get; set; } + public List CueSheetInfos { get; set; } = new List(); } public class ImportDecisionMakerConfig @@ -144,7 +145,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport return Tuple.Create(localTracks, decisions); } - public List> GetImportDecisions(List musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config, List cueSheetInfos) + public List> GetImportDecisions(List musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config) { idOverrides ??= new IdentificationOverrides(); itemInfo ??= new ImportDecisionMakerInfo(); @@ -154,11 +155,11 @@ namespace NzbDrone.Core.MediaFiles.TrackImport var decisions = trackData.Item2; localTracks.ForEach(x => x.ExistingFile = !config.NewDownload); - if (cueSheetInfos != null) + if (!itemInfo.CueSheetInfos.Empty()) { localTracks.ForEach(localTrack => { - var cueSheetFindResult = cueSheetInfos.Find(x => x.IsForMediaFile(localTrack.Path)); + var cueSheetFindResult = itemInfo.CueSheetInfos.Find(x => x.IsForMediaFile(localTrack.Path)); var cueSheet = cueSheetFindResult?.CueSheet; if (cueSheet != null) { @@ -186,7 +187,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport }); } - var releases = _identificationService.Identify(localTracks, idOverrides, config, cueSheetInfos); + var releases = _identificationService.Identify(localTracks, idOverrides, config); var albums = releases.GroupBy(x => x.AlbumRelease?.Album?.Value.ForeignAlbumId); diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index c64102657..ad0f0f68c 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -186,9 +186,9 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual }; var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, itemInfo, config); - if (audioFiles.Count > 0) + if (!audioFiles.Empty()) { - decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFiles, idOverrides, itemInfo, config, cueSheetInfos)); + decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFiles, idOverrides, itemInfo, config)); } // paths will be different for new and old files which is why we need to map separately