From 1f9adce15d1a7b440d2c307675fc24beec0c92df Mon Sep 17 00:00:00 2001 From: zhangdoa Date: Thu, 12 Oct 2023 18:23:52 +0200 Subject: [PATCH] Create a cue file for the move file operation in the same way as the copy file operation. Use the correct ID overrides for processing grouped cue sheet files. (cherry picked from commit 6f069389bf23bbb0fc220463795bd03d81da7cfe) --- .../MediaFiles/DiskScanService.cs | 2 +- .../MediaFiles/TrackFileMovingService.cs | 35 +++++++++++-------- .../TrackImport/ImportDecisionMaker.cs | 2 +- .../TrackImport/Manual/ManualImportService.cs | 19 ++++++---- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index 145f40cd6..ec202e298 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -116,7 +116,7 @@ namespace NzbDrone.Core.MediaFiles audioFilesForCues.AddRange(cueSheetInfo.MusicFiles); } - decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFilesForCues, cueSheetInfos[0].IdOverrides, itemInfo, config, cueSheetInfos)); + decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFilesForCues, cueSheetInfoGroup.First().IdOverrides, itemInfo, config, cueSheetInfos)); foreach (var cueSheetInfo in cueSheetInfos) { diff --git a/src/NzbDrone.Core/MediaFiles/TrackFileMovingService.cs b/src/NzbDrone.Core/MediaFiles/TrackFileMovingService.cs index 5872047ba..7e24955d1 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackFileMovingService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackFileMovingService.cs @@ -80,6 +80,8 @@ namespace NzbDrone.Core.MediaFiles EnsureTrackFolder(trackFile, localTrack, filePath); + TryToCreateCueFile(localTrack, filePath); + _logger.Debug("Moving track file: {0} to {1}", trackFile.Path, filePath); return TransferFile(trackFile, localTrack.Artist, localTrack.Tracks, filePath, TransferMode.Move); @@ -91,20 +93,7 @@ namespace NzbDrone.Core.MediaFiles EnsureTrackFolder(trackFile, localTrack, filePath); - if (localTrack.IsSingleFileRelease && !localTrack.CueSheetPath.Empty()) - { - var directory = Path.GetDirectoryName(filePath); - var fileName = Path.GetFileNameWithoutExtension(filePath); - var cueSheetPath = Path.Combine(directory, fileName + ".cue"); - _diskTransferService.TransferFile(localTrack.CueSheetPath, cueSheetPath, TransferMode.Copy); - var lines = new List(File.ReadAllLines(cueSheetPath)); - var fileLineIndex = lines.FindIndex(line => line.Contains("FILE")); - if (fileLineIndex != -1) - { - lines[fileLineIndex] = "FILE \"" + Path.GetFileName(filePath) + "\" WAVE"; - File.WriteAllLines(cueSheetPath, lines); - } - } + TryToCreateCueFile(localTrack, filePath); if (_configService.CopyUsingHardlinks) { @@ -116,6 +105,24 @@ namespace NzbDrone.Core.MediaFiles return TransferFile(trackFile, localTrack.Artist, localTrack.Tracks, filePath, TransferMode.Copy); } + private void TryToCreateCueFile(LocalTrack localTrack, string trackFilePath) + { + if (localTrack.IsSingleFileRelease && !localTrack.CueSheetPath.Empty()) + { + var directory = Path.GetDirectoryName(trackFilePath); + var fileName = Path.GetFileNameWithoutExtension(trackFilePath); + var cueSheetPath = Path.Combine(directory, fileName + ".cue"); + _diskTransferService.TransferFile(localTrack.CueSheetPath, cueSheetPath, TransferMode.Copy, true); + var lines = new List(File.ReadAllLines(cueSheetPath)); + var fileLineIndex = lines.FindIndex(line => line.Contains("FILE")); + if (fileLineIndex != -1) + { + lines[fileLineIndex] = "FILE \"" + Path.GetFileName(trackFilePath) + "\" WAVE"; + File.WriteAllLines(cueSheetPath, lines); + } + } + } + private TrackFile TransferFile(TrackFile trackFile, Artist artist, List tracks, string destinationFilePath, TransferMode mode) { Ensure.That(trackFile, () => trackFile).IsNotNull(); diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs index 3236d82c1..7cd06bd52 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportDecisionMaker.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport public class CueSheetInfo { - public List MusicFiles { get; set; } + public List MusicFiles { get; set; } = new List(); public IdentificationOverrides IdOverrides { get; set; } public CueSheet CueSheet { get; set; } public bool IsForMediaFile(string path) => CueSheet != null && CueSheet.Files.Count > 0 && CueSheet.Files.Any(x => Path.GetFileName(path) == x.Name); diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index 598ebf4b1..f7c1d1da3 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -166,13 +166,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual var cueSheetInfosGroupedByDiscId = cueSheetInfos.GroupBy(x => x.CueSheet.DiscID).ToList(); foreach (var cueSheetInfoGroup in cueSheetInfosGroupedByDiscId) { - var audioFilesForCues = new List(); - foreach (var cueSheetInfo in cueSheetInfoGroup) - { - audioFilesForCues.AddRange(cueSheetInfo.MusicFiles); - } - - var manualImportItems = ProcessFolder(downloadId, cueSheetInfos[0].IdOverrides, filter, replaceExistingFiles, downloadClientItem, cueSheetInfos[0].IdOverrides.Album.Title, audioFilesForCues, cueSheetInfos); + var manualImportItems = ProcessFolder(downloadId, filter, replaceExistingFiles, downloadClientItem, cueSheetInfoGroup.ToList()); results.AddRange(manualImportItems); RemoveProcessedAudioFiles(audioFiles, cueSheetInfos, manualImportItems); @@ -208,6 +202,17 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual } } + private List ProcessFolder(string downloadId, FilterFilesType filter, bool replaceExistingFiles, DownloadClientItem downloadClientItem, List cueSheetInfos) + { + var audioFilesForCues = new List(); + foreach (var cueSheetInfo in cueSheetInfos) + { + audioFilesForCues.AddRange(cueSheetInfo.MusicFiles); + } + + return ProcessFolder(downloadId, cueSheetInfos[0].IdOverrides, filter, replaceExistingFiles, downloadClientItem, cueSheetInfos[0].CueSheet.Title, audioFilesForCues, cueSheetInfos); + } + private List ProcessFolder(string downloadId, IdentificationOverrides idOverrides, FilterFilesType filter, bool replaceExistingFiles, DownloadClientItem downloadClientItem, string albumTitle, List audioFiles, List cueSheetInfos = null) { idOverrides ??= new IdentificationOverrides();