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)
pull/4200/head
zhangdoa 7 months ago
parent 2d5b6a1def
commit 0bb5a10f10

@ -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,
};

@ -17,7 +17,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
{
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
@ -114,7 +114,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
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
// 2 get candidates given specified artist, album and release. Candidates can include extra files already on disk.

@ -20,7 +20,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
{
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
@ -34,6 +34,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
{
public DownloadClientItem DownloadClientItem { get; set; }
public ParsedAlbumInfo ParsedAlbumInfo { get; set; }
public List<CueSheetInfo> CueSheetInfos { get; set; } = new List<CueSheetInfo>();
}
public class ImportDecisionMakerConfig
@ -144,7 +145,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport
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();
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);

@ -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

Loading…
Cancel
Save