Move the cue sheet info list into ImportDecisionMakerInfo to eliminate the IMakeImportDecision API change.

Fix a crash when trying to import an album while the artist is not added yet.

(cherry picked from commit d439677e3a0bf5c7f9f92a5ca0b72ad89c6ee912)
This commit is contained in:
zhangdoa 2023-10-15 12:42:26 +02:00
commit 0bb5a10f10
4 changed files with 16 additions and 12 deletions

View file

@ -73,7 +73,9 @@ namespace NzbDrone.Core.MediaFiles
audioFilesForCues.AddRange(cueSheetInfo.MusicFiles); 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) foreach (var cueSheetInfo in cueSheetInfos)
{ {
@ -124,7 +126,8 @@ namespace NzbDrone.Core.MediaFiles
return; 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); addedTracks.AddRange(decision.Item.Tracks);
}); });
@ -314,7 +317,7 @@ namespace NzbDrone.Core.MediaFiles
var parsedAlbumInfo = new ParsedAlbumInfo var parsedAlbumInfo = new ParsedAlbumInfo
{ {
AlbumTitle = cueSheet.Title, AlbumTitle = cueSheet.Title,
ArtistName = artistFromCue.Name, ArtistName = artistFromCue?.Name,
ReleaseDate = cueSheet.Date, ReleaseDate = cueSheet.Date,
}; };

View file

@ -17,7 +17,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
{ {
public interface IIdentificationService public interface IIdentificationService
{ {
List<LocalAlbumRelease> Identify(List<LocalTrack> localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config, List<CueSheetInfo> cueSheetInfos = null); List<LocalAlbumRelease> Identify(List<LocalTrack> localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config);
} }
public class IdentificationService : IIdentificationService public class IdentificationService : IIdentificationService
@ -114,7 +114,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
return releases; return releases;
} }
public List<LocalAlbumRelease> Identify(List<LocalTrack> localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config, List<CueSheetInfo> cueSheetInfos = null) public List<LocalAlbumRelease> Identify(List<LocalTrack> localTracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config)
{ {
// 1 group localTracks so that we think they represent a single release // 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. // 2 get candidates given specified artist, album and release. Candidates can include extra files already on disk.

View file

@ -20,7 +20,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
{ {
public interface IMakeImportDecision public interface IMakeImportDecision
{ {
List<ImportDecision<LocalTrack>> GetImportDecisions(List<IFileInfo> musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config, List<CueSheetInfo> cueSheetInfos = null); List<ImportDecision<LocalTrack>> GetImportDecisions(List<IFileInfo> musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config);
} }
public class IdentificationOverrides public class IdentificationOverrides
@ -34,6 +34,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
{ {
public DownloadClientItem DownloadClientItem { get; set; } public DownloadClientItem DownloadClientItem { get; set; }
public ParsedAlbumInfo ParsedAlbumInfo { get; set; } public ParsedAlbumInfo ParsedAlbumInfo { get; set; }
public List<CueSheetInfo> CueSheetInfos { get; set; } = new List<CueSheetInfo>();
} }
public class ImportDecisionMakerConfig public class ImportDecisionMakerConfig
@ -144,7 +145,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
return Tuple.Create(localTracks, decisions); return Tuple.Create(localTracks, decisions);
} }
public List<ImportDecision<LocalTrack>> GetImportDecisions(List<IFileInfo> musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config, List<CueSheetInfo> cueSheetInfos) public List<ImportDecision<LocalTrack>> GetImportDecisions(List<IFileInfo> musicFiles, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config)
{ {
idOverrides ??= new IdentificationOverrides(); idOverrides ??= new IdentificationOverrides();
itemInfo ??= new ImportDecisionMakerInfo(); itemInfo ??= new ImportDecisionMakerInfo();
@ -154,11 +155,11 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
var decisions = trackData.Item2; var decisions = trackData.Item2;
localTracks.ForEach(x => x.ExistingFile = !config.NewDownload); localTracks.ForEach(x => x.ExistingFile = !config.NewDownload);
if (cueSheetInfos != null) if (!itemInfo.CueSheetInfos.Empty())
{ {
localTracks.ForEach(localTrack => 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; var cueSheet = cueSheetFindResult?.CueSheet;
if (cueSheet != null) 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); var albums = releases.GroupBy(x => x.AlbumRelease?.Album?.Value.ForeignAlbumId);

View file

@ -186,9 +186,9 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual
}; };
var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, itemInfo, config); 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 // paths will be different for new and old files which is why we need to map separately