diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index 436a2404f..42e82a293 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -29,6 +29,7 @@ + diff --git a/src/NzbDrone.Core/MediaFiles/CueSheetService.cs b/src/NzbDrone.Core/MediaFiles/CueSheetService.cs index 7517a7769..28a8f160b 100644 --- a/src/NzbDrone.Core/MediaFiles/CueSheetService.cs +++ b/src/NzbDrone.Core/MediaFiles/CueSheetService.cs @@ -3,12 +3,13 @@ using System.Collections.Generic; using System.IO; using System.IO.Abstractions; using System.Linq; -using System.Text; using System.Text.RegularExpressions; +using NLog; using NzbDrone.Core.MediaFiles.TrackImport; using NzbDrone.Core.Music; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; +using UtfUnknown; namespace NzbDrone.Core.MediaFiles { @@ -22,13 +23,14 @@ namespace NzbDrone.Core.MediaFiles public interface ICueSheetService { - List> GetImportDecisions(ref List mediaFileList, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config); + List> GetImportDecisions(ref List mediaFileList, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config); } public class CueSheetService : ICueSheetService { private readonly IParsingService _parsingService; private readonly IMakeImportDecision _importDecisionMaker; + private readonly Logger _logger; private static string _FileKey = "FILE"; private static string _TrackKey = "TRACK"; @@ -40,13 +42,15 @@ namespace NzbDrone.Core.MediaFiles private static string _TitleKey = "TITLE"; public CueSheetService(IParsingService parsingService, - IMakeImportDecision importDecisionMaker) + IMakeImportDecision importDecisionMaker, + Logger logger) { _parsingService = parsingService; _importDecisionMaker = importDecisionMaker; + _logger = logger; } - public List> GetImportDecisions(ref List mediaFileList, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config) + public List> GetImportDecisions(ref List mediaFileList, IdentificationOverrides idOverrides, ImportDecisionMakerInfo itemInfo, ImportDecisionMakerConfig config) { var decisions = new List>(); var cueFiles = mediaFileList.Where(x => x.Extension.Equals(".cue")).ToList(); @@ -60,6 +64,10 @@ namespace NzbDrone.Core.MediaFiles foreach (var cueFile in cueFiles) { var cueSheetInfo = GetCueSheetInfo(cueFile, mediaFileList); + if (idOverrides != null) + { + cueSheetInfo.IdOverrides = idOverrides; + } var addedCueSheetInfo = cueSheetInfos.Find(existingCueSheetInfo => existingCueSheetInfo.CueSheet.DiscID == cueSheetInfo.CueSheet.DiscID); if (addedCueSheetInfo == null) @@ -161,7 +169,10 @@ namespace NzbDrone.Core.MediaFiles using (var fs = fileInfo.OpenRead()) { var bytes = new byte[fileInfo.Length]; - var encoding = new UTF8Encoding(true); + var result = CharsetDetector.DetectFromFile(fileInfo.FullName); // or pass FileInfo + var encoding = result.Detected.Encoding; + _logger.Debug("Detected encoding {0} for {1}", encoding.WebName, fileInfo.FullName); + string content; while (fs.Read(bytes, 0, bytes.Length) > 0) { @@ -369,6 +380,8 @@ namespace NzbDrone.Core.MediaFiles return cueSheetInfo; } + cueSheetInfo.IdOverrides.Artist = artistFromCue; + var parsedAlbumInfo = new ParsedAlbumInfo { AlbumTitle = cueSheet.Title, diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index 3504b619b..2a157d828 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -102,7 +102,7 @@ namespace NzbDrone.Core.MediaFiles var decisions = new List>(); - decisions.AddRange(_cueSheetService.GetImportDecisions(ref mediaFileList, itemInfo, config)); + decisions.AddRange(_cueSheetService.GetImportDecisions(ref mediaFileList, null, itemInfo, config)); decisions.AddRange(_importDecisionMaker.GetImportDecisions(mediaFileList, null, itemInfo, config)); decisionsStopwatch.Stop(); diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index ad0f0f68c..37efd9a96 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -185,7 +185,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual AddNewArtists = false }; - var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, itemInfo, config); + var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, null, itemInfo, config); if (!audioFiles.Empty()) { decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFiles, idOverrides, itemInfo, config)); @@ -251,7 +251,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual AlbumRelease = group.First().Release }; - var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, itemInfo, config); + var decisions = _cueSheetService.GetImportDecisions(ref audioFiles, idOverride, itemInfo, config); if (audioFiles.Count > 0) { decisions.AddRange(_importDecisionMaker.GetImportDecisions(audioFiles, idOverride, itemInfo, config));