From 59e7ecfa8a0a583f83c7aebdc209b07cbfd9c3f3 Mon Sep 17 00:00:00 2001 From: Deterous <138427222+Deterous@users.noreply.github.com> Date: Mon, 19 May 2025 21:23:25 +0900 Subject: [PATCH] Better audio-only check (#847) * Better IsAudio() * null deref * Don't set fields if empty * Update Changelist * Requested changes * fix build * fix build again * string literal * C# is dumb * Revert to original * revert further * remove extra comma --- CHANGELIST.md | 1 + MPF.Processors/BaseProcessor.cs | 30 ++++++++++++++++++++++++++++++ MPF.Processors/Redumper.cs | 28 +++++++++++++--------------- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/CHANGELIST.md b/CHANGELIST.md index 5fd54ed6..68304950 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -51,6 +51,7 @@ - Simplify WriteOutputData path handling - Serialize JSON a slightly different way - Add newlines to pkg info printing +- Better audio-only check ### 3.3.0 (2025-01-03) diff --git a/MPF.Processors/BaseProcessor.cs b/MPF.Processors/BaseProcessor.cs index 57cfe0ae..635b7eb7 100644 --- a/MPF.Processors/BaseProcessor.cs +++ b/MPF.Processors/BaseProcessor.cs @@ -640,6 +640,36 @@ namespace MPF.Processors return sb.ToString(); } + /// + /// Returns true if a Cuesheet consists of only Audio tracks, false otherwise + /// + internal static bool IsAudio(string? cue) + { + // Ignore invalid inputs + if (string.IsNullOrEmpty(cue)) + return false; + + bool tracksExist = false; + foreach (string cueLine in cue!.Split(new[] { "\r\n", "\n", "\r" }, StringSplitOptions.None)) + { + string line = cueLine.Trim(); + if (line.Length == 0) + continue; + + string[] tokens = line.Split(new[] { " ", "\t" }, StringSplitOptions.RemoveEmptyEntries); + + if (tokens.Length < 3 || !tokens[0].Equals("TRACK", StringComparison.OrdinalIgnoreCase)) + continue; + + tracksExist = true; + string trackType = tokens[2].ToUpperInvariant(); + if (trackType != "AUDIO" && trackType != "CDG") + return false; + } + + return tracksExist; + } + #endregion } } diff --git a/MPF.Processors/Redumper.cs b/MPF.Processors/Redumper.cs index 1145a0a0..eeebfab8 100644 --- a/MPF.Processors/Redumper.cs +++ b/MPF.Processors/Redumper.cs @@ -71,24 +71,22 @@ namespace MPF.Processors } // Attempt to get multisession data - string cdMultiSessionInfo = GetMultisessionInformation($"{basePath}.log") ?? string.Empty; + string? cdMultiSessionInfo = GetMultisessionInformation($"{basePath}.log"); if (!string.IsNullOrEmpty(cdMultiSessionInfo)) - info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = cdMultiSessionInfo; + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = cdMultiSessionInfo!; - // Attempt to get the universal hash, if it's an audio disc - if (System.IsAudio()) + // Attempt to get extra metadata if it's an audio disc + if (IsAudio(info.TracksAndWriteOffsets.Cuesheet)) { - string universalHash = GetUniversalHash($"{basePath}.log") ?? string.Empty; - info.CommonDiscInfo.CommentsSpecialFields![SiteCode.UniversalHash] = universalHash; - } - - // Attempt to get the non-zero data start, if it's an audio disc - if (System.IsAudio()) - { - string ringNonZeroDataStart = GetRingNonZeroDataStart($"{basePath}.log") ?? string.Empty; - info.CommonDiscInfo.CommentsSpecialFields![SiteCode.RingNonZeroDataStart] = ringNonZeroDataStart; - string ringPerfectAudioOffset = GetRingPerfectAudioOffset($"{basePath}.log") ?? string.Empty; - info.CommonDiscInfo.CommentsSpecialFields![SiteCode.RingPerfectAudioOffset] = ringPerfectAudioOffset; + string? universalHash = GetUniversalHash($"{basePath}.log"); + if (!string.IsNullOrEmpty(universalHash)) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.UniversalHash] = universalHash!; + string? ringNonZeroDataStart = GetRingNonZeroDataStart($"{basePath}.log"); + if (!string.IsNullOrEmpty(ringNonZeroDataStart)) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.RingNonZeroDataStart] = ringNonZeroDataStart!; + string? ringPerfectAudioOffset = GetRingPerfectAudioOffset($"{basePath}.log"); + if (!string.IsNullOrEmpty(ringPerfectAudioOffset)) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.RingPerfectAudioOffset] = ringPerfectAudioOffset!; } break;