diff --git a/CHANGELIST.md b/CHANGELIST.md index e9d7e157..9ba12670 100644 --- a/CHANGELIST.md +++ b/CHANGELIST.md @@ -12,6 +12,7 @@ - Use IO implementation of IniFile - Add Xbox Backup Creator support to MPF.Check (Deterous) - Update BinaryObjectScanner to 3.1.12 +- Prefer PlayStation info from Redumper logs (Deterous) ### 3.1.8 (2024-05-09) diff --git a/MPF.Core/Modules/Redumper/Parameters.cs b/MPF.Core/Modules/Redumper/Parameters.cs index 3b23daf0..5917850b 100644 --- a/MPF.Core/Modules/Redumper/Parameters.cs +++ b/MPF.Core/Modules/Redumper/Parameters.cs @@ -423,16 +423,28 @@ namespace MPF.Core.Modules.Redumper break; case RedumpSystem.KonamiPython2: - info.CommonDiscInfo!.EXEDateBuildDate = GetEXEDate($"{basePath}.log"); + // Get metadata from log if possible + if (GetPlayStationInfo($"{basePath}.log", out string? kp2EXEDate, out string? kp2Serial, out string? kp2Version, out var _)) + { + info.CommonDiscInfo!.EXEDateBuildDate = kp2EXEDate; + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = kp2Serial ?? string.Empty; + if (!string.IsNullOrEmpty(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.Region = InfoTool.GetPlayStationRegion(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName]); + info.VersionAndEditions!.Version = kp2Version ?? string.Empty; + } + + // Get metadata from drive if not available from log if (InfoTool.GetPlayStationExecutableInfo(drive?.Name, out var pythonTwoSerial, out Region? pythonTwoRegion, out var pythonTwoDate)) { // Ensure internal serial is pulled from local data - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = pythonTwoSerial ?? string.Empty; - info.CommonDiscInfo.Region = info.CommonDiscInfo.Region ?? pythonTwoRegion; - info.CommonDiscInfo.EXEDateBuildDate ??= pythonTwoDate; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = pythonTwoSerial ?? string.Empty; + info.CommonDiscInfo.Region ??= pythonTwoRegion; + if (string.IsNullOrEmpty(info.CommonDiscInfo.EXEDateBuildDate)) + info.CommonDiscInfo.EXEDateBuildDate = pythonTwoDate; } - - info.VersionAndEditions!.Version = InfoTool.GetPlayStation2Version(drive?.Name) ?? string.Empty; + if (string.IsNullOrEmpty(info.VersionAndEditions!.Version)) + info.VersionAndEditions.Version = InfoTool.GetPlayStation2Version(drive?.Name) ?? string.Empty; break; case RedumpSystem.MicrosoftXbox: @@ -488,13 +500,24 @@ namespace MPF.Core.Modules.Redumper break; case RedumpSystem.SonyPlayStation: - info.CommonDiscInfo!.EXEDateBuildDate = GetEXEDate($"{basePath}.log"); + // Get metadata from log if possible + if (GetPlayStationInfo($"{basePath}.log", out string? psxEXEDate, out string? psxSerial, out var _, out var _)) + { + info.CommonDiscInfo!.EXEDateBuildDate = psxEXEDate; + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = psxSerial ?? string.Empty; + if (!string.IsNullOrEmpty(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.Region = InfoTool.GetPlayStationRegion(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName]); + } + + // Get metadata from drive if not available from log if (InfoTool.GetPlayStationExecutableInfo(drive?.Name, out var playstationSerial, out Region? playstationRegion, out var playstationDate)) { // Ensure internal serial is pulled from local data - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = playstationSerial ?? string.Empty; - info.CommonDiscInfo.Region = info.CommonDiscInfo.Region ?? playstationRegion; - info.CommonDiscInfo.EXEDateBuildDate ??= playstationDate; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = playstationSerial ?? string.Empty; + info.CommonDiscInfo.Region ??= playstationRegion; + if (string.IsNullOrEmpty(info.CommonDiscInfo.EXEDateBuildDate)) + info.CommonDiscInfo.EXEDateBuildDate = playstationDate; } info.CopyProtection!.AntiModchip = GetPlayStationAntiModchipDetected($"{basePath}.log").ToYesNo(); @@ -504,34 +527,70 @@ namespace MPF.Core.Modules.Redumper break; case RedumpSystem.SonyPlayStation2: - info.CommonDiscInfo!.EXEDateBuildDate = GetEXEDate($"{basePath}.log"); + // Get metadata from log if possible + if (GetPlayStationInfo($"{basePath}.log", out string? ps2EXEDate, out string? ps2Serial, out var ps2Version, out var _)) + { + info.CommonDiscInfo!.EXEDateBuildDate = ps2EXEDate; + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = ps2Serial ?? string.Empty; + if (!string.IsNullOrEmpty(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.Region = InfoTool.GetPlayStationRegion(info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName]); + info.VersionAndEditions!.Version = ps2Version ?? string.Empty; + } + + // Get metadata from drive if not available from log if (InfoTool.GetPlayStationExecutableInfo(drive?.Name, out var playstationTwoSerial, out Region? playstationTwoRegion, out var playstationTwoDate)) { // Ensure internal serial is pulled from local data - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = playstationTwoSerial ?? string.Empty; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = playstationTwoSerial ?? string.Empty; info.CommonDiscInfo.Region = info.CommonDiscInfo.Region ?? playstationTwoRegion; - info.CommonDiscInfo.EXEDateBuildDate ??= playstationTwoDate; + if (string.IsNullOrEmpty(info.CommonDiscInfo.EXEDateBuildDate)) + info.CommonDiscInfo.EXEDateBuildDate ??= playstationTwoDate; } - - info.VersionAndEditions!.Version = InfoTool.GetPlayStation2Version(drive?.Name) ?? string.Empty; + if (string.IsNullOrEmpty(info.VersionAndEditions!.Version)) + info.VersionAndEditions.Version = InfoTool.GetPlayStation2Version(drive?.Name) ?? string.Empty; break; case RedumpSystem.SonyPlayStation3: - info.VersionAndEditions!.Version = InfoTool.GetPlayStation3Version(drive?.Name) ?? string.Empty; - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation3Serial(drive?.Name) ?? string.Empty; - string? firmwareVersion = InfoTool.GetPlayStation3FirmwareVersion(drive?.Name); + // Get metadata from log if possible + if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps3Serial, out var ps3Version, out string? firmwareVersion)) + { + info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps3Serial ?? string.Empty; + info.VersionAndEditions!.Version = ps3Version ?? string.Empty; + } + + // Get metadata from drive if not available from log + if (string.IsNullOrEmpty(info.VersionAndEditions!.Version)) + info.VersionAndEditions.Version = InfoTool.GetPlayStation3Version(drive?.Name) ?? string.Empty; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation3Serial(drive?.Name) ?? string.Empty; + firmwareVersion ??= InfoTool.GetPlayStation3FirmwareVersion(drive?.Name); if (firmwareVersion != null) - info.CommonDiscInfo!.ContentsSpecialFields![SiteCode.Patches] = $"PS3 Firmware {firmwareVersion}"; + info.CommonDiscInfo.ContentsSpecialFields![SiteCode.Patches] = $"PS3 Firmware {firmwareVersion}"; break; case RedumpSystem.SonyPlayStation4: - info.VersionAndEditions!.Version = InfoTool.GetPlayStation4Version(drive?.Name) ?? string.Empty; - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation4Serial(drive?.Name) ?? string.Empty; + if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps4Serial, out var ps4Version, out var _)) + { + info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps4Serial ?? string.Empty; + info.VersionAndEditions!.Version = ps4Version ?? string.Empty; + } + if (string.IsNullOrEmpty(info.VersionAndEditions!.Version)) + info.VersionAndEditions.Version = InfoTool.GetPlayStation4Version(drive?.Name) ?? string.Empty; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation4Serial(drive?.Name) ?? string.Empty; break; case RedumpSystem.SonyPlayStation5: - info.VersionAndEditions!.Version = InfoTool.GetPlayStation5Version(drive?.Name) ?? string.Empty; - info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation5Serial(drive?.Name) ?? string.Empty; + if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps5Serial, out var ps5Version, out var _)) + { + info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps5Serial ?? string.Empty; + info.VersionAndEditions!.Version = ps5Version ?? string.Empty; + } + if (string.IsNullOrEmpty(info.VersionAndEditions!.Version)) + info.VersionAndEditions.Version = InfoTool.GetPlayStation5Version(drive?.Name) ?? string.Empty; + if (string.IsNullOrEmpty(info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName])) + info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = InfoTool.GetPlayStation5Serial(drive?.Name) ?? string.Empty; break; } @@ -1750,45 +1809,6 @@ namespace MPF.Core.Modules.Redumper } } - /// - /// Get the EXE Date from the log, if possible - /// - /// Log file location - /// EXE date if possible, null otherwise - public static string? GetEXEDate(string log) - { - // If the file doesn't exist, we can't get the info - if (!File.Exists(log)) - return null; - - try - { - using var sr = File.OpenText(log); - var line = sr.ReadLine(); - while (line != null) - { - // Trim the line for later use - line = line.Trim(); - - // The exe date is listed in a single line - if (line.StartsWith("EXE date:")) - { - // exe date: yyyy-MM-dd - return line.Substring("EXE date: ".Length); - } - - line = sr.ReadLine(); - } - - return null; - } - catch - { - // We don't care what the exception is right now - return null; - } - } - /// /// Get hardware information from the input file, if possible /// @@ -2040,6 +2060,75 @@ namespace MPF.Core.Modules.Redumper } } + /// + /// Get the info from a PlayStation disc, if possible + /// + /// Log file location + /// True if section found, null on error + private static bool GetPlayStationInfo(string log, out string? exeDate, out string? serial, out string? version, out string? firmware) + { + // Set the default values + exeDate = null; serial = null; version = null; firmware = null; + + // If the file doesn't exist, we can't get info from it + if (!File.Exists(log)) + return false; + + try + { + // Fast forward to the PS info line + using var sr = File.OpenText(log); + string? line; + while (!sr.EndOfStream) + { + line = sr.ReadLine()?.TrimStart(); + if (line?.StartsWith("PSX [") == true || + line?.StartsWith("PS2 [") == true || + line?.StartsWith("PS3 [") == true || + line?.StartsWith("PS4 [") == true || + line?.StartsWith("PS5 [") == true) + break; + } + if (sr.EndOfStream) + return false; + + while (!sr.EndOfStream) + { + line = sr.ReadLine()?.TrimStart(); + if (line == null) + break; + + if (line.StartsWith("EXE date:")) + { + exeDate = line.Substring("EXE date: ".Length).Trim(); + } + else if (line.StartsWith("serial:")) + { + serial = line.Substring("serial: ".Length).Trim(); + } + else if (line.StartsWith("version:")) + { + version = line.Substring("version: ".Length).Trim(); + } + else if (line.StartsWith("firmware:")) + { + firmware = line.Substring("firmware: ".Length).Trim(); + } + else + { + break; + } + } + + return true; + } + catch + { + // We don't care what the exception is right now + return false; + } + } + /// /// Get the LibCrypt data from the input file, if possible ///