mirror of
https://github.com/SabreTools/MPF.git
synced 2026-02-04 21:30:11 +00:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee7cde6360 | ||
|
|
8e9edf43ac | ||
|
|
51115430cb | ||
|
|
7cf108828e | ||
|
|
020390af65 | ||
|
|
e04ceb953c | ||
|
|
363b018cb7 | ||
|
|
cf025522ef | ||
|
|
0fb8bf5c29 | ||
|
|
e280745eee | ||
|
|
fb306750e6 | ||
|
|
da5a514482 | ||
|
|
fc288e1c46 | ||
|
|
102acb9ebf | ||
|
|
b76b2a69f5 | ||
|
|
254ad6cfd0 | ||
|
|
f432f438ab | ||
|
|
e890243830 | ||
|
|
6493b462f1 | ||
|
|
54c0716ea9 | ||
|
|
7fbb5133d7 | ||
|
|
993a0fd7d3 | ||
|
|
47878fee1f | ||
|
|
4cb8a31505 | ||
|
|
0685972842 | ||
|
|
5b1cc3c715 | ||
|
|
572f0d5095 | ||
|
|
23bafad3db | ||
|
|
c7b77e4bd7 | ||
|
|
755eee4441 | ||
|
|
fca2c53d6c | ||
|
|
8f6f5f6ef0 | ||
|
|
2e9970ee6a | ||
|
|
4fa1273111 | ||
|
|
d3993a48e4 | ||
|
|
d522bb6c76 | ||
|
|
816672a817 | ||
|
|
f8171da306 | ||
|
|
ce073e5fbf | ||
|
|
28205e42f0 | ||
|
|
0160366530 | ||
|
|
663477d408 | ||
|
|
bd2e012eef | ||
|
|
a514374169 | ||
|
|
f73c0730e2 | ||
|
|
a658c80de7 | ||
|
|
b806bc6cd1 | ||
|
|
cf9675f620 | ||
|
|
ea18051709 | ||
|
|
4fdf8e5dde | ||
|
|
a4616d139d | ||
|
|
0f09a9c913 | ||
|
|
48ffd6f40c | ||
|
|
6612c8ea4d | ||
|
|
68d1a0664a | ||
|
|
86d8590789 | ||
|
|
e23427d7c9 | ||
|
|
cd19a2e4a0 | ||
|
|
000e7d88a8 | ||
|
|
e3beb1ef77 | ||
|
|
a3a75b1c2d | ||
|
|
11850a8d6b | ||
|
|
bf6b58d64b | ||
|
|
1789334625 | ||
|
|
9520f58240 | ||
|
|
48e5e01729 | ||
|
|
8c7959fb08 | ||
|
|
8ef7543cf1 | ||
|
|
f9e39ee4be | ||
|
|
0a4621c963 |
@@ -1,3 +1,75 @@
|
||||
### 3.4.0 (2025-09-25)
|
||||
|
||||
- Remove media type from Check Dump UI
|
||||
- Always trust the output files for processing
|
||||
- UI consistency when parameters are editable
|
||||
- Let the processor always deal with unsupported
|
||||
- Put a try/catch around GenerateArtifacts
|
||||
- Reduce preprocessing in DumpEnvironment
|
||||
- Update RedumpLib to 1.6.9
|
||||
- Treat all UMD as DL visually
|
||||
- Add CopyUpdateUrlToClipboard option
|
||||
- Fix inconsistency with newlines
|
||||
- Update Aaru to build 5.4.1
|
||||
- Fix for C2 error doubling issue (fuzz6001)
|
||||
- Update RedumpLib and LibIRD
|
||||
- Update LibIRD
|
||||
- Update redumper to build 653
|
||||
- Minor cleanup
|
||||
- Update test Nuget packages
|
||||
- Update RedumpLib to 1.7.1
|
||||
- Support multisession cache files
|
||||
- Update DIC to 20250901 (Windows/Linux only)
|
||||
- Fix UIC processing logic
|
||||
- Update RedumpLib, detect Playmaji Polymega system
|
||||
- Update redumper to b655
|
||||
- Support new versioning format in redumper (fuzz6001)
|
||||
- Add RedumperRefineSectorMode setting
|
||||
- Update BinaryObjectScanner to 3.4.0
|
||||
- Add context-sensitive protections helper method
|
||||
- Further flesh out framework
|
||||
- Add filters to handle Release Control output (Bestest)
|
||||
- Cleanup last commits, add tests
|
||||
- Update BinaryObjectScanner to 3.4.2
|
||||
- Update RedumpLib to 1.7.4
|
||||
|
||||
### 3.3.3 (2025-07-18)
|
||||
|
||||
- Handle layers for PS3CFW
|
||||
- Further clarify configuration requirements for CLI
|
||||
- Ignore volume labels with path separators
|
||||
- Reduce media-specific checks where unnecessary
|
||||
- Add DetermineMediaType scaffolding and tests
|
||||
- Fill out DetermineMediaType for Redumper
|
||||
- Fill out DetermineMediaType for Aaru
|
||||
- Fill out DetermineMediaType for DiscImageCreator
|
||||
- Enable Check to determine media type automatically
|
||||
- Fix missed test updates
|
||||
- Rename disc info to media info
|
||||
- Fix start index in Check
|
||||
- Use the correct base path for Check
|
||||
- Update redumper to build 611
|
||||
- IsAudio cleanup
|
||||
- IsAudio cleanup cleanup
|
||||
- Remove dead code in DIC processor
|
||||
- Set some default values for CLI
|
||||
- Address nullable default value
|
||||
- Better handling of Xbox/360, redumper build 613
|
||||
- Use reasonable default names for PlayStation systems
|
||||
- Swap PS1/2 back to original name handling
|
||||
- Only use serial for PS3/4/5 if no custom volume label
|
||||
- Fix unnecessary null assignment
|
||||
- Empty should be null (fuzz6001)
|
||||
- Remove legacy codes from info window
|
||||
- Net Yaroze only for PS1
|
||||
- Update RedumpLib to 1.6.8
|
||||
- Add new help and version flags for CLI and Check
|
||||
- Strip errant whitespace during path normalization
|
||||
- Simplify code from previous commit
|
||||
- Better handle mixed-separator paths
|
||||
- Slightly better IRD organization
|
||||
- Update redumper to build 631
|
||||
|
||||
### 3.3.2 (2025-06-12)
|
||||
|
||||
- Include Aaru in automatic builds
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
|
||||
<!-- Package Properties -->
|
||||
<Title>MPF CLI</Title>
|
||||
@@ -43,7 +43,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -91,7 +91,7 @@ namespace MPF.CLI
|
||||
case InternalProgram.Aaru:
|
||||
if (!File.Exists(options.AaruPath))
|
||||
{
|
||||
DisplayHelp("A path needs to be supplied for Aaru, exiting...");
|
||||
DisplayHelp("A path needs to be supplied in config.json for Aaru, exiting...");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -99,7 +99,7 @@ namespace MPF.CLI
|
||||
case InternalProgram.DiscImageCreator:
|
||||
if (!File.Exists(options.DiscImageCreatorPath))
|
||||
{
|
||||
DisplayHelp("A path needs to be supplied for DIC, exiting...");
|
||||
DisplayHelp("A path needs to be supplied in config.json for DIC, exiting...");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -107,7 +107,7 @@ namespace MPF.CLI
|
||||
case InternalProgram.Redumper:
|
||||
if (!File.Exists(options.RedumperPath))
|
||||
{
|
||||
DisplayHelp("A path needs to be supplied for Redumper, exiting...");
|
||||
DisplayHelp("A path needs to be supplied in config.json for Redumper, exiting...");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -126,7 +126,7 @@ namespace MPF.CLI
|
||||
|
||||
// Normalize the file path
|
||||
if (opts.FilePath != null)
|
||||
opts.FilePath = Path.GetFullPath(opts.FilePath);
|
||||
opts.FilePath = FrontendTool.NormalizeOutputPaths(opts.FilePath, getFullPath: true);
|
||||
|
||||
// Get the speed from the options
|
||||
int speed = opts.DriveSpeed ?? FrontendTool.GetDefaultSpeedForMediaType(mediaType, options);
|
||||
@@ -137,23 +137,23 @@ namespace MPF.CLI
|
||||
opts.FilePath,
|
||||
drive,
|
||||
knownSystem,
|
||||
mediaType,
|
||||
options.InternalProgram,
|
||||
parameters: null);
|
||||
options.InternalProgram);
|
||||
env.SetExecutionContext(mediaType, null);
|
||||
env.SetProcessor();
|
||||
|
||||
// Process the parameters
|
||||
string? paramStr = opts.CustomParams ?? env.GetFullParameters(speed);
|
||||
string? paramStr = opts.CustomParams ?? env.GetFullParameters(mediaType, speed);
|
||||
if (string.IsNullOrEmpty(paramStr))
|
||||
{
|
||||
DisplayHelp("No valid environment could be created, exiting...");
|
||||
return;
|
||||
}
|
||||
|
||||
env.SetExecutionContext(paramStr);
|
||||
env.SetExecutionContext(mediaType, paramStr);
|
||||
|
||||
// Invoke the dumping program
|
||||
Console.WriteLine($"Invoking {options.InternalProgram} using '{paramStr}'");
|
||||
var dumpResult = env.Run().GetAwaiter().GetResult();
|
||||
var dumpResult = env.Run(mediaType).GetAwaiter().GetResult();
|
||||
Console.WriteLine(dumpResult.Message);
|
||||
if (!dumpResult)
|
||||
return;
|
||||
@@ -173,9 +173,9 @@ namespace MPF.CLI
|
||||
opts.FilePath,
|
||||
drive,
|
||||
knownSystem,
|
||||
mediaType,
|
||||
internalProgram: null,
|
||||
parameters: null);
|
||||
internalProgram: null);
|
||||
env.SetExecutionContext(mediaType, null);
|
||||
env.SetProcessor();
|
||||
}
|
||||
|
||||
// Finally, attempt to do the output dance
|
||||
@@ -197,7 +197,8 @@ namespace MPF.CLI
|
||||
Console.WriteLine("MPF.CLI <mediatype> <system> [options]");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Standalone Options:");
|
||||
Console.WriteLine("-h, -? Show this help text");
|
||||
Console.WriteLine("-h, -?, --help Show this help text");
|
||||
Console.WriteLine("--version Print the program version");
|
||||
Console.WriteLine("-lc, --listcodes List supported comment/content site codes");
|
||||
Console.WriteLine("-lm, --listmedia List supported media types");
|
||||
Console.WriteLine("-ls, --listsystems List supported system types");
|
||||
@@ -206,7 +207,7 @@ namespace MPF.CLI
|
||||
Console.WriteLine();
|
||||
|
||||
Console.WriteLine("CLI Options:");
|
||||
Console.WriteLine("-u, --use <program> Override default dumping program");
|
||||
Console.WriteLine("-u, --use <program> Override configured dumping program name");
|
||||
Console.WriteLine("-d, --device <devicepath> Physical drive path (Required if no custom parameters set)");
|
||||
Console.WriteLine("-m, --mounted <dirpath> Mounted filesystem path for additional checks");
|
||||
Console.WriteLine("-f, --file \"<filepath>\" Output file path (Required if no custom parameters set)");
|
||||
@@ -214,6 +215,11 @@ namespace MPF.CLI
|
||||
Console.WriteLine("-c, --custom \"<params>\" Custom parameters to use");
|
||||
Console.WriteLine();
|
||||
|
||||
Console.WriteLine("Dumping program paths and other settings can be found in the config.json file");
|
||||
Console.WriteLine("generated next to the program by default. Ensure that all settings are to user");
|
||||
Console.WriteLine("preference before running MPF.CLI.");
|
||||
Console.WriteLine();
|
||||
|
||||
Console.WriteLine("Custom dumping parameters, if used, will fully replace the default parameters.");
|
||||
Console.WriteLine("All dumping parameters need to be supplied if doing this.");
|
||||
Console.WriteLine("Otherwise, both a drive path and output file path are required.");
|
||||
@@ -230,9 +236,12 @@ namespace MPF.CLI
|
||||
private static CommandOptions InteractiveMode(Options options, out MediaType mediaType, out RedumpSystem? system)
|
||||
{
|
||||
// Create return values
|
||||
var opts = new CommandOptions();
|
||||
var opts = new CommandOptions
|
||||
{
|
||||
FilePath = Path.Combine(options.DefaultOutputPath ?? "ISO", "track.bin"),
|
||||
};
|
||||
mediaType = MediaType.NONE;
|
||||
system = null;
|
||||
system = options.DefaultSystem;
|
||||
|
||||
// Create state values
|
||||
string? result = string.Empty;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
|
||||
<!-- Package Properties -->
|
||||
<Title>MPF Check</Title>
|
||||
@@ -43,7 +43,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -54,7 +54,6 @@ namespace MPF.Check
|
||||
|
||||
// Setup common outputs
|
||||
CommandOptions opts;
|
||||
MediaType mediaType;
|
||||
RedumpSystem? knownSystem;
|
||||
int startIndex;
|
||||
|
||||
@@ -62,14 +61,14 @@ namespace MPF.Check
|
||||
if (args.Length > 0 && (args[0] == "-i" || args[0] == "--interactive"))
|
||||
{
|
||||
startIndex = 1;
|
||||
opts = InteractiveMode(options, out mediaType, out knownSystem);
|
||||
opts = InteractiveMode(options, out knownSystem);
|
||||
}
|
||||
|
||||
// Use normal commandline parameters
|
||||
else
|
||||
{
|
||||
// Try processing the common arguments
|
||||
bool success = OptionsLoader.ProcessCommonArguments(args, out mediaType, out knownSystem, out var error);
|
||||
bool success = OptionsLoader.ProcessCommonArguments(args, out knownSystem, out var error);
|
||||
if (!success)
|
||||
{
|
||||
DisplayHelp(error);
|
||||
@@ -77,7 +76,7 @@ namespace MPF.Check
|
||||
}
|
||||
|
||||
// Loop through and process options
|
||||
startIndex = 2;
|
||||
startIndex = 1;
|
||||
opts = LoadFromArguments(args, options, ref startIndex);
|
||||
}
|
||||
|
||||
@@ -121,7 +120,12 @@ namespace MPF.Check
|
||||
if (!string.IsNullOrEmpty(opts.DevicePath))
|
||||
drive = Drive.Create(null, opts.DevicePath!);
|
||||
|
||||
var env = new DumpEnvironment(options, filepath, drive, knownSystem, mediaType, internalProgram: null, parameters: null);
|
||||
var env = new DumpEnvironment(options,
|
||||
filepath,
|
||||
drive,
|
||||
knownSystem,
|
||||
internalProgram: null);
|
||||
env.SetProcessor();
|
||||
|
||||
// Finally, attempt to do the output dance
|
||||
var result = env.VerifyAndSaveDumpOutput(seedInfo: opts.Seed)
|
||||
@@ -140,10 +144,11 @@ namespace MPF.Check
|
||||
Console.WriteLine(error);
|
||||
|
||||
Console.WriteLine("Usage:");
|
||||
Console.WriteLine("MPF.Check <mediatype> <system> [options] </path/to/output.cue/iso> ...");
|
||||
Console.WriteLine("MPF.Check <system> [options] </path/to/output.cue/iso> ...");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Standalone Options:");
|
||||
Console.WriteLine("-h, -? Show this help text");
|
||||
Console.WriteLine("-h, -?, --help Show this help text");
|
||||
Console.WriteLine("--version Print the program version");
|
||||
Console.WriteLine("-lc, --listcodes List supported comment/content site codes");
|
||||
Console.WriteLine("-lm, --listmedia List supported media types");
|
||||
Console.WriteLine("-ls, --listsystems List supported system types");
|
||||
@@ -178,11 +183,10 @@ namespace MPF.Check
|
||||
/// <summary>
|
||||
/// Enable interactive mode for entering information
|
||||
/// </summary>
|
||||
private static CommandOptions InteractiveMode(Options options, out MediaType mediaType, out RedumpSystem? system)
|
||||
private static CommandOptions InteractiveMode(Options options, out RedumpSystem? system)
|
||||
{
|
||||
// Create return values
|
||||
var opts = new CommandOptions();
|
||||
mediaType = MediaType.NONE;
|
||||
system = null;
|
||||
|
||||
// These values require multiple parts to be active
|
||||
@@ -199,25 +203,24 @@ namespace MPF.Check
|
||||
Console.WriteLine("MPF.Check Interactive Mode - Main Menu");
|
||||
Console.WriteLine("-------------------------");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"1) Set media type (Currently '{mediaType}')");
|
||||
Console.WriteLine($"2) Set system (Currently '{system}')");
|
||||
Console.WriteLine($"3) Set dumping program (Currently '{options.InternalProgram}')");
|
||||
Console.WriteLine($"4) Set seed path (Currently '{opts.Seed}')");
|
||||
Console.WriteLine($"5) Add placeholders (Currently '{options.AddPlaceholders}')");
|
||||
Console.WriteLine($"6) Create IRD (Currently '{options.CreateIRDAfterDumping}')");
|
||||
Console.WriteLine($"7) Attempt Redump matches (Currently '{options.RetrieveMatchInformation}')");
|
||||
Console.WriteLine($"8) Redump credentials (Currently '{options.RedumpUsername}')");
|
||||
Console.WriteLine($"9) Pull all information (Currently '{options.PullAllInformation}')");
|
||||
Console.WriteLine($"A) Set device path (Currently '{opts.DevicePath}')");
|
||||
Console.WriteLine($"B) Scan for protection (Currently '{scan}')");
|
||||
Console.WriteLine($"C) Scan archives for protection (Currently '{enableArchives}')");
|
||||
Console.WriteLine($"D) Debug protection scan output (Currently '{enableDebug}')");
|
||||
Console.WriteLine($"E) Hide drive letters in protection output (Currently '{hideDriveLetters}')");
|
||||
Console.WriteLine($"F) Hide filename suffix (Currently '{options.AddFilenameSuffix}')");
|
||||
Console.WriteLine($"G) Output submission JSON (Currently '{options.OutputSubmissionJSON}')");
|
||||
Console.WriteLine($"H) Include JSON artifacts (Currently '{options.IncludeArtifacts}')");
|
||||
Console.WriteLine($"I) Compress logs (Currently '{options.CompressLogFiles}')");
|
||||
Console.WriteLine($"J) Delete unnecessary files (Currently '{options.DeleteUnnecessaryFiles}')");
|
||||
Console.WriteLine($"1) Set system (Currently '{system}')");
|
||||
Console.WriteLine($"2) Set dumping program (Currently '{options.InternalProgram}')");
|
||||
Console.WriteLine($"3) Set seed path (Currently '{opts.Seed}')");
|
||||
Console.WriteLine($"4) Add placeholders (Currently '{options.AddPlaceholders}')");
|
||||
Console.WriteLine($"5) Create IRD (Currently '{options.CreateIRDAfterDumping}')");
|
||||
Console.WriteLine($"6) Attempt Redump matches (Currently '{options.RetrieveMatchInformation}')");
|
||||
Console.WriteLine($"7) Redump credentials (Currently '{options.RedumpUsername}')");
|
||||
Console.WriteLine($"8) Pull all information (Currently '{options.PullAllInformation}')");
|
||||
Console.WriteLine($"9) Set device path (Currently '{opts.DevicePath}')");
|
||||
Console.WriteLine($"A) Scan for protection (Currently '{scan}')");
|
||||
Console.WriteLine($"B) Scan archives for protection (Currently '{enableArchives}')");
|
||||
Console.WriteLine($"C) Debug protection scan output (Currently '{enableDebug}')");
|
||||
Console.WriteLine($"D) Hide drive letters in protection output (Currently '{hideDriveLetters}')");
|
||||
Console.WriteLine($"E) Hide filename suffix (Currently '{options.AddFilenameSuffix}')");
|
||||
Console.WriteLine($"F) Output submission JSON (Currently '{options.OutputSubmissionJSON}')");
|
||||
Console.WriteLine($"G) Include JSON artifacts (Currently '{options.IncludeArtifacts}')");
|
||||
Console.WriteLine($"H) Compress logs (Currently '{options.CompressLogFiles}')");
|
||||
Console.WriteLine($"I) Delete unnecessary files (Currently '{options.DeleteUnnecessaryFiles}')");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine($"Q) Exit the program");
|
||||
Console.WriteLine($"X) Start checking");
|
||||
@@ -227,64 +230,61 @@ namespace MPF.Check
|
||||
switch (result)
|
||||
{
|
||||
case "1":
|
||||
goto mediaType;
|
||||
case "2":
|
||||
goto system;
|
||||
case "3":
|
||||
case "2":
|
||||
goto dumpingProgram;
|
||||
case "4":
|
||||
case "3":
|
||||
goto seedPath;
|
||||
case "5":
|
||||
case "4":
|
||||
options.AddPlaceholders = !options.AddPlaceholders;
|
||||
goto root;
|
||||
case "6":
|
||||
case "5":
|
||||
options.CreateIRDAfterDumping = !options.CreateIRDAfterDumping;
|
||||
goto root;
|
||||
case "7":
|
||||
case "6":
|
||||
options.RetrieveMatchInformation = !options.RetrieveMatchInformation;
|
||||
goto root;
|
||||
case "8":
|
||||
case "7":
|
||||
goto redumpCredentials;
|
||||
case "9":
|
||||
case "8":
|
||||
options.PullAllInformation = !options.PullAllInformation;
|
||||
goto root;
|
||||
case "9":
|
||||
goto devicePath;
|
||||
case "a":
|
||||
case "A":
|
||||
goto devicePath;
|
||||
scan = !scan;
|
||||
goto root;
|
||||
case "b":
|
||||
case "B":
|
||||
scan = !scan;
|
||||
enableArchives = !enableArchives;
|
||||
goto root;
|
||||
case "c":
|
||||
case "C":
|
||||
enableArchives = !enableArchives;
|
||||
enableDebug = !enableDebug;
|
||||
goto root;
|
||||
case "d":
|
||||
case "D":
|
||||
enableDebug = !enableDebug;
|
||||
hideDriveLetters = !hideDriveLetters;
|
||||
goto root;
|
||||
case "e":
|
||||
case "E":
|
||||
hideDriveLetters = !hideDriveLetters;
|
||||
options.AddFilenameSuffix = !options.AddFilenameSuffix;
|
||||
goto root;
|
||||
case "f":
|
||||
case "F":
|
||||
options.AddFilenameSuffix = !options.AddFilenameSuffix;
|
||||
options.OutputSubmissionJSON = !options.OutputSubmissionJSON;
|
||||
goto root;
|
||||
case "g":
|
||||
case "G":
|
||||
options.OutputSubmissionJSON = !options.OutputSubmissionJSON;
|
||||
options.IncludeArtifacts = !options.IncludeArtifacts;
|
||||
goto root;
|
||||
case "h":
|
||||
case "H":
|
||||
options.IncludeArtifacts = !options.IncludeArtifacts;
|
||||
options.CompressLogFiles = !options.CompressLogFiles;
|
||||
goto root;
|
||||
case "i":
|
||||
case "I":
|
||||
options.CompressLogFiles = !options.CompressLogFiles;
|
||||
goto root;
|
||||
case "j":
|
||||
case "J":
|
||||
options.DeleteUnnecessaryFiles = !options.DeleteUnnecessaryFiles;
|
||||
goto root;
|
||||
|
||||
@@ -308,14 +308,6 @@ namespace MPF.Check
|
||||
goto root;
|
||||
}
|
||||
|
||||
mediaType:
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Input the media type and press Enter:");
|
||||
Console.Write("> ");
|
||||
result = Console.ReadLine();
|
||||
mediaType = OptionsLoader.ToMediaType(result);
|
||||
goto root;
|
||||
|
||||
system:
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Input the system and press Enter:");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
|
||||
<CheckEolTargetFramework>false</CheckEolTargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
@@ -14,13 +14,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.13.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.14.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.21.0" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.24.0" />
|
||||
<PackageReference Include="xunit.assert" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.core" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.extensibility.core" Version="2.9.3" />
|
||||
@@ -29,7 +29,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -66,11 +66,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Disc
|
||||
|
||||
[Theory]
|
||||
[InlineData("disc -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("disc --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("disc -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("disc --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DiscTest(string parameters)
|
||||
{
|
||||
string? expected = "disc --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "disc --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -93,11 +93,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Rings
|
||||
|
||||
[Theory]
|
||||
[InlineData("rings -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("rings --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("rings -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("rings --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void RingsTest(string parameters)
|
||||
{
|
||||
string? expected = "rings --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "rings --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -109,11 +109,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Dump
|
||||
|
||||
[Theory]
|
||||
[InlineData("dump -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DumpTest(string parameters)
|
||||
{
|
||||
string? expected = "dump --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "dump --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -125,11 +125,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region DumpExtra
|
||||
|
||||
[Theory]
|
||||
[InlineData("dump::extra -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump::extra --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump::extra -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dump::extra --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DumpExtraTest(string parameters)
|
||||
{
|
||||
string? expected = "dump::extra --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "dump::extra --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -141,11 +141,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Refine
|
||||
|
||||
[Theory]
|
||||
[InlineData("refine -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("refine --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("refine -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("refine --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void RefineTest(string parameters)
|
||||
{
|
||||
string? expected = "refine --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "refine --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -157,11 +157,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Verify
|
||||
|
||||
[Theory]
|
||||
[InlineData("verify -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("verify --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("verify -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("verify --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void VerifyTest(string parameters)
|
||||
{
|
||||
string? expected = "verify --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "verify --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -173,11 +173,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region DVDKey
|
||||
|
||||
[Theory]
|
||||
[InlineData("dvdkey -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdkey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdkey -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdkey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DVDKeyTest(string parameters)
|
||||
{
|
||||
string? expected = "dvdkey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "dvdkey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -189,11 +189,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Eject
|
||||
|
||||
[Theory]
|
||||
[InlineData("eject -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("eject --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("eject -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("eject --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void EjectTest(string parameters)
|
||||
{
|
||||
string? expected = "eject --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "eject --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -205,11 +205,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region DVDIsoKey
|
||||
|
||||
[Theory]
|
||||
[InlineData("dvdisokey -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdisokey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdisokey -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("dvdisokey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DVDIsoKeyTest(string parameters)
|
||||
{
|
||||
string? expected = "dvdisokey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "dvdisokey --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -221,11 +221,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Protection
|
||||
|
||||
[Theory]
|
||||
[InlineData("protection -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("protection --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs --disable-cdtext")]
|
||||
[InlineData("protection -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("protection --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs --disable-cdtext")]
|
||||
public void ProtectionTest(string parameters)
|
||||
{
|
||||
string? expected = "protection --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "protection --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -237,11 +237,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Split
|
||||
|
||||
[Theory]
|
||||
[InlineData("split -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("split --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("split -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("split --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void SplitTest(string parameters)
|
||||
{
|
||||
string? expected = "split --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "split --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -253,11 +253,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Hash
|
||||
|
||||
[Theory]
|
||||
[InlineData("hash -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("hash --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("hash -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("hash --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void HashTest(string parameters)
|
||||
{
|
||||
string? expected = "hash --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "hash --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -269,11 +269,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Info
|
||||
|
||||
[Theory]
|
||||
[InlineData("info -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("info --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("info -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("info --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void InfoTest(string parameters)
|
||||
{
|
||||
string? expected = "info --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "info --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -285,11 +285,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Skeleton
|
||||
|
||||
[Theory]
|
||||
[InlineData("skeleton -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("skeleton --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("skeleton -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("skeleton --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void SkeletonTest(string parameters)
|
||||
{
|
||||
string? expected = "skeleton --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "skeleton --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -301,11 +301,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Subchannel
|
||||
|
||||
[Theory]
|
||||
[InlineData("subchannel -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("subchannel --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("subchannel -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("subchannel --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void SubchannelTest(string parameters)
|
||||
{
|
||||
string? expected = "subchannel --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "subchannel --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -317,11 +317,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region Debug
|
||||
|
||||
[Theory]
|
||||
[InlineData("debug -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DebugTest(string parameters)
|
||||
{
|
||||
string? expected = "debug --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "debug --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -333,11 +333,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region FixMSF
|
||||
|
||||
[Theory]
|
||||
[InlineData("fixmsf -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("fixmsf --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("fixmsf -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("fixmsf --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void FixMSFTest(string parameters)
|
||||
{
|
||||
string? expected = "fixmsf --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "fixmsf --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -348,11 +348,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region DebugFlip
|
||||
|
||||
[Theory]
|
||||
[InlineData("debug::flip -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug::flip --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug::flip -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("debug::flip --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DebugFlipTest(string parameters)
|
||||
{
|
||||
string? expected = "debug::flip --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "debug::flip --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
@@ -363,11 +363,11 @@ namespace MPF.ExecutionContexts.Test
|
||||
#region DriveTest
|
||||
|
||||
[Theory]
|
||||
[InlineData("drive::test -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("drive::test --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("drive::test -h --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
[InlineData("drive::test --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=path --image-name=image --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs")]
|
||||
public void DriveTestTest(string parameters)
|
||||
{
|
||||
string? expected = "drive::test --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
string? expected = "drive::test --help --version --verbose --auto-eject --skeleton --drive=dr --speed=8 --retries=0 --image-path=\"path\" --image-name=\"image\" --overwrite --drive-type=dt --drive-read-offset=0 --drive-c2-shift=0 --drive-pregap-start=0 --drive-read-method=drm --drive-sector-order=dso --plextor-skip-leadin --plextor-leadin-retries=0 --asus-skip-leadout --disable-cdtext --force-offset=0 --audio-silence-threshold=0 --correct-offset-shift --offset-shift-relocate --force-split --leave-unchanged --force-qtoc --skip-fill=0 --iso9660-trim --lba-start=0 --lba-end=0 --refine-subchannel --refine-sector-mode --skip=0 --dump-write-offset=0 --dump-read-size=0 --overread-leadout --force-unscrambled --legacy-subs";
|
||||
var context = new ExecutionContext(parameters);
|
||||
string? actual = context.GenerateParameters();
|
||||
Assert.Equal(expected, actual);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
<WarningsNotAsErrors>NU5104</WarningsNotAsErrors>
|
||||
|
||||
<!-- Package Properties -->
|
||||
@@ -32,7 +32,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -21,6 +21,8 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
public const string Info = "info";
|
||||
public const string Skeleton = "skeleton";
|
||||
public const string FlashMT1339 = "flash::mt1339";
|
||||
public const string FlashSD616 = "flash::sd616";
|
||||
public const string FlashPlextor = "flash::plextor";
|
||||
public const string Subchannel = "subchannel";
|
||||
public const string Debug = "debug";
|
||||
public const string FixMSF = "fixmsf";
|
||||
|
||||
@@ -87,6 +87,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
[FlagStrings.PlextorSkipLeadin] = new FlagInput(FlagStrings.PlextorSkipLeadin),
|
||||
[FlagStrings.PlextorLeadinRetries] = new Int32Input(FlagStrings.PlextorLeadinRetries),
|
||||
[FlagStrings.PlextorLeadinForceStore] = new FlagInput(FlagStrings.PlextorLeadinForceStore),
|
||||
[FlagStrings.KreonPartialSS] = new FlagInput(FlagStrings.KreonPartialSS),
|
||||
[FlagStrings.AsusSkipLeadout] = new FlagInput(FlagStrings.AsusSkipLeadout),
|
||||
[FlagStrings.AsusLeadoutRetries] = new Int32Input(FlagStrings.AsusLeadoutRetries),
|
||||
[FlagStrings.DisableCDText] = new FlagInput(FlagStrings.DisableCDText),
|
||||
@@ -113,6 +114,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
[FlagStrings.LBAStart] = new Int32Input(FlagStrings.LBAStart),
|
||||
[FlagStrings.LBAEnd] = new Int32Input(FlagStrings.LBAEnd),
|
||||
[FlagStrings.RefineSubchannel] = new FlagInput(FlagStrings.RefineSubchannel),
|
||||
[FlagStrings.RefineSectorMode] = new FlagInput(FlagStrings.RefineSectorMode),
|
||||
[FlagStrings.Skip] = new StringInput(FlagStrings.Skip),
|
||||
[FlagStrings.DumpWriteOffset] = new Int32Input(FlagStrings.DumpWriteOffset),
|
||||
[FlagStrings.DumpReadSize] = new Int32Input(FlagStrings.DumpReadSize),
|
||||
@@ -183,6 +185,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
FlagStrings.PlextorSkipLeadin,
|
||||
FlagStrings.PlextorLeadinRetries,
|
||||
FlagStrings.PlextorLeadinForceStore,
|
||||
FlagStrings.KreonPartialSS,
|
||||
FlagStrings.AsusSkipLeadout,
|
||||
FlagStrings.AsusLeadoutRetries,
|
||||
FlagStrings.DisableCDText,
|
||||
@@ -209,6 +212,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
FlagStrings.LBAStart,
|
||||
FlagStrings.LBAEnd,
|
||||
FlagStrings.RefineSubchannel,
|
||||
FlagStrings.RefineSectorMode,
|
||||
FlagStrings.Skip,
|
||||
FlagStrings.DumpWriteOffset,
|
||||
FlagStrings.DumpReadSize,
|
||||
@@ -346,7 +350,6 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
}
|
||||
|
||||
string? readMethod = GetStringSetting(options, SettingConstants.ReadMethod, SettingConstants.ReadMethodDefault);
|
||||
|
||||
if (!string.IsNullOrEmpty(readMethod) && readMethod != ReadMethod.NONE.ToString())
|
||||
{
|
||||
this[FlagStrings.DriveReadMethod] = true;
|
||||
@@ -386,7 +389,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
}
|
||||
|
||||
int retries = GetInt32Setting(options, SettingConstants.RereadCount, SettingConstants.RereadCountDefault);
|
||||
if(retries > 0)
|
||||
if (retries > 0)
|
||||
{
|
||||
this[FlagStrings.Retries] = true;
|
||||
(_inputs[FlagStrings.Retries] as Int32Input)?.SetValue(retries);
|
||||
@@ -398,6 +401,12 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
this[FlagStrings.PlextorLeadinRetries] = true;
|
||||
(_inputs[FlagStrings.PlextorLeadinRetries] as Int32Input)?.SetValue(leadinRetries);
|
||||
}
|
||||
|
||||
if (GetBooleanSetting(options, SettingConstants.RefineSectorMode, SettingConstants.RefineSectorModeDefault))
|
||||
{
|
||||
this[FlagStrings.RefineSectorMode] = true;
|
||||
(_inputs[FlagStrings.RefineSectorMode] as FlagInput)?.SetValue(true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
@@ -440,6 +449,8 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
case CommandStrings.Info:
|
||||
case CommandStrings.Skeleton:
|
||||
case CommandStrings.FlashMT1339:
|
||||
case CommandStrings.FlashSD616:
|
||||
case CommandStrings.FlashPlextor:
|
||||
case CommandStrings.Subchannel:
|
||||
case CommandStrings.Debug:
|
||||
case CommandStrings.FixMSF:
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
public const string PlextorSkipLeadin = "--plextor-skip-leadin";
|
||||
public const string PlextorLeadinRetries = "--plextor-leadin-retries";
|
||||
public const string PlextorLeadinForceStore = "--plextor-leadin-force-store";
|
||||
public const string KreonPartialSS = "--kreon-partial-ss";
|
||||
public const string AsusSkipLeadout = "--asus-skip-leadout";
|
||||
public const string AsusLeadoutRetries = "--asus-leadout-retries";
|
||||
public const string DisableCDText = "--disable-cdtext";
|
||||
@@ -79,6 +80,7 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
public const string LBAStart = "--lba-start";
|
||||
public const string LBAEnd = "--lba-end";
|
||||
public const string RefineSubchannel = "--refine-subchannel";
|
||||
public const string RefineSectorMode = "--refine-sector-mode";
|
||||
public const string Skip = "--skip";
|
||||
public const string DumpWriteOffset = "--dump-write-offset";
|
||||
public const string DumpReadSize = "--dump-read-size";
|
||||
|
||||
@@ -17,6 +17,9 @@ namespace MPF.ExecutionContexts.Redumper
|
||||
public const string ReadMethod = "RedumperReadMethod";
|
||||
public static readonly string ReadMethodDefault = Redumper.ReadMethod.NONE.ToString();
|
||||
|
||||
public const string RefineSectorMode = "RedumperRefineSectorMode";
|
||||
public const bool RefineSectorModeDefault = false;
|
||||
|
||||
public const string RereadCount = "RedumperRereadCount";
|
||||
public const int RereadCountDefault = 20;
|
||||
|
||||
|
||||
@@ -22,9 +22,15 @@ namespace MPF.Frontend.Test
|
||||
? Drive.Create(InternalDriveType.Floppy, letter.ToString())
|
||||
: Drive.Create(InternalDriveType.Optical, letter.ToString());
|
||||
|
||||
var env = new DumpEnvironment(options, string.Empty, drive, RedumpSystem.IBMPCcompatible, mediaType, null, parameters);
|
||||
var env = new DumpEnvironment(options,
|
||||
string.Empty,
|
||||
drive,
|
||||
RedumpSystem.IBMPCcompatible,
|
||||
null);
|
||||
env.SetExecutionContext(mediaType, parameters);
|
||||
env.SetProcessor();
|
||||
|
||||
bool actual = env.ParametersValid();
|
||||
bool actual = env.ParametersValid(mediaType);
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
|
||||
<CheckEolTargetFramework>false</CheckEolTargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
@@ -14,13 +14,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.13.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.14.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.21.0" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.24.0" />
|
||||
<PackageReference Include="xunit.assert" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.core" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.extensibility.core" Version="2.9.3" />
|
||||
@@ -29,7 +29,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -81,6 +81,8 @@ namespace MPF.Frontend.Test.Tools
|
||||
[InlineData("1.2.3.4..bin", true, "1.2.3.4..bin")]
|
||||
[InlineData("dir/filename.bin", false, "dir/filename.bin")]
|
||||
[InlineData("dir/filename.bin", true, "dir/filename.bin")]
|
||||
[InlineData(" dir / filename.bin", false, "dir/filename.bin")]
|
||||
[InlineData(" dir / filename.bin", true, "dir/filename.bin")]
|
||||
[InlineData("\0dir/\0filename.bin", false, "_dir/_filename.bin")]
|
||||
[InlineData("\0dir/\0filename.bin", true, "_dir/_filename.bin")]
|
||||
public void NormalizeOutputPathsTest(string? path, bool getFullPath, string expected)
|
||||
|
||||
@@ -9,24 +9,6 @@ namespace MPF.Frontend.Test.Tools
|
||||
{
|
||||
public class InfoToolTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(null, "")]
|
||||
[InlineData(" ", " ")]
|
||||
[InlineData("super\\blah.bin", "super\\blah.bin")]
|
||||
[InlineData("super\\hero\\blah.bin", "super\\hero\\blah.bin")]
|
||||
[InlineData("super.hero\\blah.bin", "super.hero\\blah.bin")]
|
||||
[InlineData("superhero\\blah.rev.bin", "superhero\\blah.rev.bin")]
|
||||
[InlineData("super&hero\\blah.bin", "super&hero\\blah.bin")]
|
||||
[InlineData("superhero\\blah&foo.bin", "superhero\\blah&foo.bin")]
|
||||
public void NormalizeOutputPathsTest(string? outputPath, string? expectedPath)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(expectedPath))
|
||||
expectedPath = Path.GetFullPath(expectedPath);
|
||||
|
||||
string actualPath = FrontendTool.NormalizeOutputPaths(outputPath, true);
|
||||
Assert.Equal(expectedPath, actualPath);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ProcessSpecialFieldsCompleteTest()
|
||||
{
|
||||
|
||||
@@ -8,12 +8,114 @@ namespace MPF.Frontend.Test.Tools
|
||||
{
|
||||
public class ProtectionToolTests
|
||||
{
|
||||
#region SanitizeContextSensitiveProtections
|
||||
|
||||
[Fact]
|
||||
public void SanitizeContextSensitiveProtections_Empty_NoException()
|
||||
{
|
||||
Dictionary<string, List<string>>? protections = [];
|
||||
var actual = ProtectionTool.SanitizeContextSensitiveProtections(protections);
|
||||
Assert.NotNull(actual);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SanitizeContextSensitiveProtections_NoMatch_NoChange()
|
||||
{
|
||||
Dictionary<string, List<string>>? protections = [];
|
||||
protections["File1"] = ["Protection 1", "Protection 2"];
|
||||
|
||||
var actual = ProtectionTool.SanitizeContextSensitiveProtections(protections);
|
||||
Assert.NotNull(actual);
|
||||
|
||||
string[] keys = [.. actual.Keys];
|
||||
Assert.Contains("File1", keys);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SanitizeContextSensitiveProtections_Match_NoSub_NoChange()
|
||||
{
|
||||
Dictionary<string, List<string>>? protections = [];
|
||||
protections["File1"] = ["Protection 1", "Protection 2"];
|
||||
protections["File2"] = ["SecuROM Release Control - ANYTHING", "Protection 2"];
|
||||
protections["File3"] = ["Protection 1", "SecuROM Release Control -"];
|
||||
|
||||
var actual = ProtectionTool.SanitizeContextSensitiveProtections(protections);
|
||||
Assert.NotNull(actual);
|
||||
|
||||
string[] keys = [.. actual.Keys];
|
||||
Assert.Contains("File1", keys);
|
||||
Assert.Contains("File2", keys);
|
||||
Assert.Contains("File3", keys);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SanitizeContextSensitiveProtections_Match_Sub_Change()
|
||||
{
|
||||
Dictionary<string, List<string>>? protections = [];
|
||||
protections["File1"] = ["Protection 1", "Protection 2"];
|
||||
protections["File2"] = ["SecuROM Release Control - ANYTHING"];
|
||||
protections["File2/FileA"] = ["ANYTHING GitHub ANYTHING"];
|
||||
protections["File2/FileB"] = ["SecuROM 7"];
|
||||
protections["File2/FileC"] = ["SecuROM 8"];
|
||||
protections["File2/FileD"] = ["SecuROM Content Activation"];
|
||||
protections["File2/FileE"] = ["SecuROM Data File Activation"];
|
||||
protections["File2/FileF"] = ["Unlock"];
|
||||
|
||||
var actual = ProtectionTool.SanitizeContextSensitiveProtections(protections);
|
||||
Assert.NotNull(actual);
|
||||
|
||||
string[] keys = [.. actual.Keys];
|
||||
Assert.Contains("File1", keys);
|
||||
Assert.Contains("File2", keys);
|
||||
Assert.Contains("File2/FileA", keys);
|
||||
Assert.DoesNotContain("File2/FileB", keys);
|
||||
Assert.DoesNotContain("File2/FileC", keys);
|
||||
Assert.DoesNotContain("File2/FileD", keys);
|
||||
Assert.DoesNotContain("File2/FileE", keys);
|
||||
Assert.DoesNotContain("File2/FileF", keys);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SanitizeContextSensitiveProtections_MultiMatch_Sub_Change()
|
||||
{
|
||||
Dictionary<string, List<string>>? protections = [];
|
||||
protections["File1"] = ["Protection 1", "Protection 2"];
|
||||
protections["File2"] = ["SecuROM Release Control - ANYTHING"];
|
||||
protections["File2/FileA"] = ["ANYTHING GitHub ANYTHING"];
|
||||
protections["File2/FileB"] = ["SecuROM 7"];
|
||||
protections["File2/FileC"] = ["SecuROM 8"];
|
||||
protections["File3"] = ["SecuROM Release Control - ANYTHING"];
|
||||
protections["File3/FileD"] = ["SecuROM Content Activation"];
|
||||
protections["File3/FileE"] = ["SecuROM Data File Activation"];
|
||||
protections["File3/FileF"] = ["Unlock"];
|
||||
|
||||
var actual = ProtectionTool.SanitizeContextSensitiveProtections(protections);
|
||||
Assert.NotNull(actual);
|
||||
|
||||
string[] keys = [.. actual.Keys];
|
||||
Assert.Contains("File1", keys);
|
||||
Assert.Contains("File2", keys);
|
||||
Assert.Contains("File2/FileA", keys);
|
||||
Assert.DoesNotContain("File2/FileB", keys);
|
||||
Assert.DoesNotContain("File2/FileC", keys);
|
||||
Assert.Contains("File3", keys);
|
||||
Assert.DoesNotContain("File3/FileD", keys);
|
||||
Assert.DoesNotContain("File3/FileE", keys);
|
||||
Assert.DoesNotContain("File3/FileF", keys);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region SanitizeFoundProtections
|
||||
|
||||
[Fact]
|
||||
public void SanitizeFoundProtections_Exception()
|
||||
{
|
||||
List<string> protections =
|
||||
[
|
||||
"Anything Else Protection",
|
||||
"[Access issue when opening file",
|
||||
"[Exception opening file",
|
||||
];
|
||||
|
||||
@@ -615,6 +717,21 @@ namespace MPF.Frontend.Test.Tools
|
||||
Assert.Equal(expected, sanitized);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SanitizeFoundProtections_SecuROM()
|
||||
{
|
||||
List<string> protections =
|
||||
[
|
||||
"SecuROM Release Control",
|
||||
"SecuROM Release Control - ANYTHING",
|
||||
"SecuROM Release Control - ANYTHING ELSE",
|
||||
"SecuROM Release Control - EVEN MORE",
|
||||
];
|
||||
|
||||
string sanitized = ProtectionTool.SanitizeFoundProtections(protections);
|
||||
Assert.Equal("SecuROM Release Control", sanitized);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0)]
|
||||
[InlineData(1)]
|
||||
@@ -669,5 +786,7 @@ namespace MPF.Frontend.Test.Tools
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,11 +61,6 @@ namespace MPF.Frontend
|
||||
/// </summary>
|
||||
private readonly RedumpSystem? _system;
|
||||
|
||||
/// <summary>
|
||||
/// Currently selected media type
|
||||
/// </summary>
|
||||
private readonly MediaType? _type;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Passthrough Fields
|
||||
@@ -114,16 +109,12 @@ namespace MPF.Frontend
|
||||
/// <param name="outputPath"></param>
|
||||
/// <param name="drive"></param>
|
||||
/// <param name="system"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="internalProgram"></param>
|
||||
/// <param name="parameters"></param>
|
||||
public DumpEnvironment(Options options,
|
||||
string? outputPath,
|
||||
Drive? drive,
|
||||
RedumpSystem? system,
|
||||
MediaType? type,
|
||||
InternalProgram? internalProgram,
|
||||
string? parameters)
|
||||
InternalProgram? internalProgram)
|
||||
{
|
||||
// Set options object
|
||||
_options = options;
|
||||
@@ -134,12 +125,7 @@ namespace MPF.Frontend
|
||||
// UI information
|
||||
_drive = drive;
|
||||
_system = system ?? options.DefaultSystem;
|
||||
_type = type ?? MediaType.NONE;
|
||||
_internalProgram = internalProgram ?? options.InternalProgram;
|
||||
|
||||
// Dumping program
|
||||
SetExecutionContext(parameters);
|
||||
SetProcessor();
|
||||
}
|
||||
|
||||
#region Internal Program Management
|
||||
@@ -147,28 +133,28 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Check output path for matching logs from all dumping programs
|
||||
/// </summary>
|
||||
public InternalProgram? CheckForMatchingProgram(string? outputDirectory, string outputFilename)
|
||||
public InternalProgram? CheckForMatchingProgram(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// If a complete dump exists from a different program
|
||||
InternalProgram? programFound = null;
|
||||
if (programFound == null && _internalProgram != InternalProgram.Redumper)
|
||||
{
|
||||
var processor = new Processors.Redumper(_system, _type);
|
||||
var missingFiles = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Processors.Redumper(_system);
|
||||
var missingFiles = processor.FoundAllFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (missingFiles.Count == 0)
|
||||
programFound = InternalProgram.Redumper;
|
||||
}
|
||||
if (programFound == null && _internalProgram != InternalProgram.DiscImageCreator)
|
||||
{
|
||||
var processor = new Processors.DiscImageCreator(_system, _type);
|
||||
var missingFiles = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Processors.DiscImageCreator(_system);
|
||||
var missingFiles = processor.FoundAllFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (missingFiles.Count == 0)
|
||||
programFound = InternalProgram.DiscImageCreator;
|
||||
}
|
||||
if (programFound == null && _internalProgram != InternalProgram.Aaru)
|
||||
{
|
||||
var processor = new Processors.Aaru(_system, _type);
|
||||
var missingFiles = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Processors.Aaru(_system);
|
||||
var missingFiles = processor.FoundAllFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (missingFiles.Count == 0)
|
||||
programFound = InternalProgram.Aaru;
|
||||
}
|
||||
@@ -179,26 +165,26 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Check output path for partial logs from all dumping programs
|
||||
/// </summary>
|
||||
public InternalProgram? CheckForPartialProgram(string? outputDirectory, string outputFilename)
|
||||
public InternalProgram? CheckForPartialProgram(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// If a complete dump exists from a different program
|
||||
InternalProgram? programFound = null;
|
||||
if (programFound == null && _internalProgram != InternalProgram.Redumper)
|
||||
{
|
||||
var processor = new Processors.Redumper(_system, _type);
|
||||
if (processor.FoundAnyFiles(outputDirectory, outputFilename))
|
||||
var processor = new Processors.Redumper(_system);
|
||||
if (processor.FoundAnyFiles(mediaType, outputDirectory, outputFilename))
|
||||
programFound = InternalProgram.Redumper;
|
||||
}
|
||||
if (programFound == null && _internalProgram != InternalProgram.DiscImageCreator)
|
||||
{
|
||||
var processor = new Processors.DiscImageCreator(_system, _type);
|
||||
if (processor.FoundAnyFiles(outputDirectory, outputFilename))
|
||||
var processor = new Processors.DiscImageCreator(_system);
|
||||
if (processor.FoundAnyFiles(mediaType, outputDirectory, outputFilename))
|
||||
programFound = InternalProgram.DiscImageCreator;
|
||||
}
|
||||
if (programFound == null && _internalProgram != InternalProgram.Aaru)
|
||||
{
|
||||
var processor = new Processors.Aaru(_system, _type);
|
||||
if (processor.FoundAnyFiles(outputDirectory, outputFilename))
|
||||
var processor = new Processors.Aaru(_system);
|
||||
if (processor.FoundAnyFiles(mediaType, outputDirectory, outputFilename))
|
||||
programFound = InternalProgram.Aaru;
|
||||
}
|
||||
|
||||
@@ -208,8 +194,9 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Set the parameters object based on the internal program and parameters string
|
||||
/// </summary>
|
||||
/// <param name="mediaType">MediaType for specialized dumping parameters</param>
|
||||
/// <param name="parameters">String representation of the parameters</param>
|
||||
public bool SetExecutionContext(string? parameters)
|
||||
public bool SetExecutionContext(MediaType? mediaType, string? parameters)
|
||||
{
|
||||
_executionContext = _internalProgram switch
|
||||
{
|
||||
@@ -226,7 +213,7 @@ namespace MPF.Frontend
|
||||
if (_executionContext != null)
|
||||
{
|
||||
_executionContext.RedumpSystem = _system;
|
||||
_executionContext.MediaType = _type;
|
||||
_executionContext.MediaType = mediaType;
|
||||
|
||||
// Set some parameters, if not already set
|
||||
OutputPath ??= _executionContext.OutputPath!;
|
||||
@@ -243,13 +230,13 @@ namespace MPF.Frontend
|
||||
{
|
||||
_processor = _internalProgram switch
|
||||
{
|
||||
InternalProgram.Aaru => new Processors.Aaru(_system, _type),
|
||||
InternalProgram.CleanRip => new CleanRip(_system, _type),
|
||||
InternalProgram.DiscImageCreator => new DiscImageCreator(_system, _type),
|
||||
InternalProgram.PS3CFW => new PS3CFW(_system, _type),
|
||||
InternalProgram.Redumper => new Redumper(_system, _type),
|
||||
InternalProgram.UmdImageCreator => new UmdImageCreator(_system, _type),
|
||||
InternalProgram.XboxBackupCreator => new XboxBackupCreator(_system, _type),
|
||||
InternalProgram.Aaru => new Processors.Aaru(_system),
|
||||
InternalProgram.CleanRip => new CleanRip(_system),
|
||||
InternalProgram.DiscImageCreator => new DiscImageCreator(_system),
|
||||
InternalProgram.PS3CFW => new PS3CFW(_system),
|
||||
InternalProgram.Redumper => new Redumper(_system),
|
||||
InternalProgram.UmdImageCreator => new UmdImageCreator(_system),
|
||||
InternalProgram.XboxBackupCreator => new XboxBackupCreator(_system),
|
||||
|
||||
// If no dumping program found, set to null
|
||||
InternalProgram.NONE => null,
|
||||
@@ -262,12 +249,13 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Get the full parameter string for either DiscImageCreator or Aaru
|
||||
/// </summary>
|
||||
/// <param name="mediaType">MediaType for specialized dumping parameters</param>
|
||||
/// <param name="driveSpeed">Nullable int representing the drive speed</param>
|
||||
/// <returns>String representing the params, null on error</returns>
|
||||
public string? GetFullParameters(int? driveSpeed)
|
||||
public string? GetFullParameters(MediaType? mediaType, int? driveSpeed)
|
||||
{
|
||||
// Populate with the correct params for inputs (if we're not on the default option)
|
||||
if (_system != null && _type != MediaType.NONE)
|
||||
if (_system != null && mediaType != MediaType.NONE)
|
||||
{
|
||||
// If drive letter is invalid, skip this
|
||||
if (_drive == null)
|
||||
@@ -276,9 +264,9 @@ namespace MPF.Frontend
|
||||
// Set the proper parameters
|
||||
_executionContext = _internalProgram switch
|
||||
{
|
||||
InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(_system, _type, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(_system, _type, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(_system, _type, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
InternalProgram.Aaru => new ExecutionContexts.Aaru.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
InternalProgram.DiscImageCreator => new ExecutionContexts.DiscImageCreator.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
InternalProgram.Redumper => new ExecutionContexts.Redumper.ExecutionContext(_system, mediaType, _drive.Name, OutputPath, driveSpeed, _options.Settings),
|
||||
|
||||
// If no dumping program found, set to null
|
||||
InternalProgram.NONE => null,
|
||||
@@ -304,9 +292,9 @@ namespace MPF.Frontend
|
||||
/// </summary>
|
||||
/// <param name="type">MediaType value to check</param>
|
||||
/// <returns>True if the media has variable dumping speeds, false otherwise</returns>
|
||||
public bool DoesSupportDriveSpeed()
|
||||
public bool DoesSupportDriveSpeed(MediaType? mediaType)
|
||||
{
|
||||
return _type switch
|
||||
return mediaType switch
|
||||
{
|
||||
MediaType.CDROM
|
||||
or MediaType.DVD
|
||||
@@ -320,22 +308,22 @@ namespace MPF.Frontend
|
||||
};
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="BaseProcessor.FoundAllFiles(string?, string)"/>
|
||||
public bool FoundAllFiles(string? outputDirectory, string outputFilename)
|
||||
/// <inheritdoc cref="BaseProcessor.FoundAllFiles(MediaType?, string?, string)"/>
|
||||
public bool FoundAllFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
if (_processor == null)
|
||||
return false;
|
||||
|
||||
return _processor.FoundAllFiles(outputDirectory, outputFilename).Count == 0;
|
||||
return _processor.FoundAllFiles(mediaType, outputDirectory, outputFilename).Count == 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="BaseProcessor.FoundAnyFiles(string?, string)"/>
|
||||
public bool FoundAnyFiles(string? outputDirectory, string outputFilename)
|
||||
/// <inheritdoc cref="BaseProcessor.FoundAnyFiles(MediaType?, string?, string)"/>
|
||||
public bool FoundAnyFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
if (_processor == null)
|
||||
return false;
|
||||
|
||||
return _processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
return _processor.FoundAnyFiles(mediaType, outputDirectory, outputFilename);
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="BaseExecutionContext.GetDefaultExtension(MediaType?)"/>
|
||||
@@ -359,14 +347,14 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Verify that, given a system and a media type, they are correct
|
||||
/// </summary>
|
||||
public ResultEventArgs GetSupportStatus()
|
||||
public ResultEventArgs GetSupportStatus(MediaType? mediaType)
|
||||
{
|
||||
// No system chosen, update status
|
||||
if (_system == null)
|
||||
return ResultEventArgs.Failure("Please select a valid system");
|
||||
|
||||
// If we're on an unsupported type, update the status accordingly
|
||||
return _type switch
|
||||
return mediaType switch
|
||||
{
|
||||
// Fully supported types
|
||||
MediaType.BluRay
|
||||
@@ -377,22 +365,22 @@ namespace MPF.Frontend
|
||||
or MediaType.CompactFlash
|
||||
or MediaType.SDCard
|
||||
or MediaType.FlashDrive
|
||||
or MediaType.HDDVD => ResultEventArgs.Success($"{_type.LongName()} ready to dump"),
|
||||
or MediaType.HDDVD => ResultEventArgs.Success($"{mediaType.LongName()} ready to dump"),
|
||||
|
||||
// Partially supported types
|
||||
MediaType.GDROM
|
||||
or MediaType.NintendoGameCubeGameDisc
|
||||
or MediaType.NintendoWiiOpticalDisc
|
||||
or MediaType.NintendoWiiUOpticalDisc => ResultEventArgs.Success($"{_type.LongName()} partially supported for dumping"),
|
||||
or MediaType.NintendoWiiUOpticalDisc => ResultEventArgs.Success($"{mediaType.LongName()} partially supported for dumping"),
|
||||
|
||||
// Special case for other supported tools
|
||||
MediaType.UMD => ResultEventArgs.Failure($"{_type.LongName()} supported for submission info parsing"),
|
||||
MediaType.UMD => ResultEventArgs.Failure($"{mediaType.LongName()} supported for submission info parsing"),
|
||||
|
||||
// Specifically unknown type
|
||||
MediaType.NONE => ResultEventArgs.Failure($"Please select a valid media type"),
|
||||
|
||||
// Undumpable but recognized types
|
||||
_ => ResultEventArgs.Failure($"{_type.LongName()} media are not supported for dumping"),
|
||||
_ => ResultEventArgs.Failure($"{mediaType.LongName()} media are not supported for dumping"),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -420,8 +408,9 @@ namespace MPF.Frontend
|
||||
/// <summary>
|
||||
/// Execute the initial invocation of the dumping programs
|
||||
/// </summary>
|
||||
/// <param name="mediaType">MediaType for specialized dumping parameters</param>
|
||||
/// <param name="progress">Optional result progress callback</param>
|
||||
public async Task<ResultEventArgs> Run(IProgress<ResultEventArgs>? progress = null)
|
||||
public async Task<ResultEventArgs> Run(MediaType? mediaType, IProgress<ResultEventArgs>? progress = null)
|
||||
{
|
||||
// If we don't have parameters
|
||||
if (_executionContext == null)
|
||||
@@ -436,7 +425,7 @@ namespace MPF.Frontend
|
||||
}
|
||||
|
||||
// Check that we have the basics for dumping
|
||||
ResultEventArgs result = IsValidForDump();
|
||||
ResultEventArgs result = IsValidForDump(mediaType);
|
||||
if (!result)
|
||||
return result;
|
||||
|
||||
@@ -494,13 +483,8 @@ namespace MPF.Frontend
|
||||
var outputDirectory = Path.GetDirectoryName(OutputPath);
|
||||
var outputFilename = Path.GetFileName(OutputPath);
|
||||
|
||||
// Check to make sure that the output had all the correct files
|
||||
List<string> missingFiles = _processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
if (missingFiles.Count > 0)
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Failure($"There were files missing from the output:\n{string.Join("\n", [.. missingFiles])}"));
|
||||
return ResultEventArgs.Failure("Error! Please check output directory as dump may be incomplete!");
|
||||
}
|
||||
// Determine the media type from the processor
|
||||
MediaType? mediaType = _processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
|
||||
// Extract the information from the output files
|
||||
resultProgress.Report(ResultEventArgs.Success("Extracting output information from output files..."));
|
||||
@@ -508,12 +492,20 @@ namespace MPF.Frontend
|
||||
OutputPath,
|
||||
_drive,
|
||||
_system,
|
||||
_type,
|
||||
mediaType,
|
||||
_options,
|
||||
_processor,
|
||||
resultProgress,
|
||||
protectionProgress);
|
||||
resultProgress.Report(ResultEventArgs.Success("Extracting information complete!"));
|
||||
if (submissionInfo == null)
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Failure("There was an issue extracting information!"));
|
||||
return ResultEventArgs.Failure();
|
||||
}
|
||||
else
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Success("Extracting information complete!"));
|
||||
}
|
||||
|
||||
// Inject seed submission info data, if necessary
|
||||
if (seedInfo != null)
|
||||
@@ -526,12 +518,12 @@ namespace MPF.Frontend
|
||||
// Get user-modifiable information if configured to
|
||||
if (_options.PromptForDiscInformation && processUserInfo != null)
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Success("Waiting for additional disc information..."));
|
||||
resultProgress.Report(ResultEventArgs.Success("Waiting for additional media information..."));
|
||||
bool? filledInfo = processUserInfo.Invoke(_options, ref submissionInfo);
|
||||
if (filledInfo == true)
|
||||
resultProgress.Report(ResultEventArgs.Success("Additional disc information added!"));
|
||||
resultProgress.Report(ResultEventArgs.Success("Additional media information added!"));
|
||||
else
|
||||
resultProgress.Report(ResultEventArgs.Success("Disc information skipped!"));
|
||||
resultProgress.Report(ResultEventArgs.Success("Media information skipped!"));
|
||||
}
|
||||
|
||||
// Process special fields for site codes
|
||||
@@ -593,7 +585,7 @@ namespace MPF.Frontend
|
||||
await Task.Run(() =>
|
||||
#endif
|
||||
{
|
||||
bool compressSuccess = _processor.CompressLogFiles(outputDirectory, outputFilename, filenameSuffix, out string compressResult);
|
||||
bool compressSuccess = _processor.CompressLogFiles(mediaType, outputDirectory, outputFilename, filenameSuffix, out string compressResult);
|
||||
if (compressSuccess)
|
||||
resultProgress.Report(ResultEventArgs.Success(compressResult));
|
||||
else
|
||||
@@ -607,7 +599,7 @@ namespace MPF.Frontend
|
||||
if (_options.DeleteUnnecessaryFiles)
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Success("Deleting unnecessary files..."));
|
||||
bool deleteSuccess = _processor.DeleteUnnecessaryFiles(outputDirectory, outputFilename, out string deleteResult);
|
||||
bool deleteSuccess = _processor.DeleteUnnecessaryFiles(mediaType, outputDirectory, outputFilename, out string deleteResult);
|
||||
if (deleteSuccess)
|
||||
resultProgress.Report(ResultEventArgs.Success(deleteResult));
|
||||
else
|
||||
@@ -615,10 +607,10 @@ namespace MPF.Frontend
|
||||
}
|
||||
|
||||
// Create PS3 IRD, if required
|
||||
if (_options.CreateIRDAfterDumping && _system == RedumpSystem.SonyPlayStation3 && _type == MediaType.BluRay)
|
||||
if (_options.CreateIRDAfterDumping && _system == RedumpSystem.SonyPlayStation3 && mediaType == MediaType.BluRay)
|
||||
{
|
||||
resultProgress.Report(ResultEventArgs.Success("Creating IRD... please wait!"));
|
||||
bool deleteSuccess = await WriteIRD(OutputPath, submissionInfo?.Extras?.DiscKey, submissionInfo?.Extras?.DiscID, submissionInfo?.Extras?.PIC, submissionInfo?.SizeAndChecksums?.Layerbreak, submissionInfo?.SizeAndChecksums?.CRC32);
|
||||
bool deleteSuccess = await IRDTool.WriteIRD(OutputPath, submissionInfo?.Extras?.DiscKey, submissionInfo?.Extras?.DiscID, submissionInfo?.Extras?.PIC, submissionInfo?.SizeAndChecksums?.Layerbreak, submissionInfo?.SizeAndChecksums?.CRC32);
|
||||
if (deleteSuccess)
|
||||
resultProgress.Report(ResultEventArgs.Success("IRD created!"));
|
||||
else
|
||||
@@ -633,18 +625,18 @@ namespace MPF.Frontend
|
||||
/// Checks if the parameters are valid
|
||||
/// </summary>
|
||||
/// <returns>True if the configuration is valid, false otherwise</returns>
|
||||
internal bool ParametersValid()
|
||||
internal bool ParametersValid(MediaType? mediaType)
|
||||
{
|
||||
// Missing drive means it can never be valid
|
||||
if (_drive == null)
|
||||
return false;
|
||||
|
||||
bool parametersValid = _executionContext?.IsValid() ?? false;
|
||||
bool floppyValid = !(_drive.InternalDriveType == InternalDriveType.Floppy ^ _type == MediaType.FloppyDisk);
|
||||
bool floppyValid = !(_drive.InternalDriveType == InternalDriveType.Floppy ^ mediaType == MediaType.FloppyDisk);
|
||||
|
||||
// TODO: HardDisk being in the Removable category is a hack, fix this later
|
||||
bool removableDiskValid = !((_drive.InternalDriveType == InternalDriveType.Removable || _drive.InternalDriveType == InternalDriveType.HardDisk)
|
||||
^ (_type == MediaType.CompactFlash || _type == MediaType.SDCard || _type == MediaType.FlashDrive || _type == MediaType.HardDisk));
|
||||
^ (mediaType == MediaType.CompactFlash || mediaType == MediaType.SDCard || mediaType == MediaType.FlashDrive || mediaType == MediaType.HardDisk));
|
||||
|
||||
return parametersValid && floppyValid && removableDiskValid;
|
||||
}
|
||||
@@ -653,10 +645,10 @@ namespace MPF.Frontend
|
||||
/// Validate the current environment is ready for a dump
|
||||
/// </summary>
|
||||
/// <returns>Result instance with the outcome</returns>
|
||||
private ResultEventArgs IsValidForDump()
|
||||
private ResultEventArgs IsValidForDump(MediaType? mediaType)
|
||||
{
|
||||
// Validate that everything is good
|
||||
if (_executionContext == null || !ParametersValid())
|
||||
if (_executionContext == null || !ParametersValid(mediaType))
|
||||
return ResultEventArgs.Failure("Error! Current configuration is not supported!");
|
||||
|
||||
// Fix the output paths, just in case
|
||||
@@ -676,7 +668,7 @@ namespace MPF.Frontend
|
||||
return ResultEventArgs.Failure("Error! Cannot dump same drive that executable resides on!");
|
||||
|
||||
// Validate that the current configuration is supported
|
||||
return GetSupportStatus();
|
||||
return GetSupportStatus(mediaType);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -842,66 +834,6 @@ namespace MPF.Frontend
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an IRD and write it to the specified output directory with optional filename suffix
|
||||
/// </summary>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="filenameSuffix">Optional suffix to append to the filename</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>True on success, false on error</returns>
|
||||
private static async Task<bool> WriteIRD(string isoPath,
|
||||
string? discKeyString,
|
||||
string? discIDString,
|
||||
string? picString,
|
||||
long? layerbreak,
|
||||
string? crc32)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Output IRD file path
|
||||
string irdPath = Path.ChangeExtension(isoPath, ".ird");
|
||||
|
||||
// Parse disc key from submission info (Required)
|
||||
byte[]? discKey = ProcessingTool.ParseHexKey(discKeyString);
|
||||
if (discKey == null)
|
||||
return false;
|
||||
|
||||
// Parse Disc ID from submission info (Optional)
|
||||
byte[]? discID = ProcessingTool.ParseDiscID(discIDString);
|
||||
|
||||
// Parse PIC from submission info (Optional)
|
||||
byte[]? pic = ProcessingTool.ParsePIC(picString);
|
||||
|
||||
// Parse CRC32 strings into ISO hash for Unique ID field (Optional)
|
||||
uint? uid = ProcessingTool.ParseCRC32(crc32);
|
||||
|
||||
// Ensure layerbreak value is valid (Optional)
|
||||
layerbreak = ProcessingTool.ParseLayerbreak(layerbreak);
|
||||
|
||||
// Create Redump-style reproducible IRD
|
||||
#if NET40
|
||||
LibIRD.ReIRD ird = await Task.Factory.StartNew(() =>
|
||||
#else
|
||||
LibIRD.ReIRD ird = await Task.Run(() =>
|
||||
#endif
|
||||
new LibIRD.ReIRD(isoPath, discKey, layerbreak, uid));
|
||||
if (pic != null)
|
||||
ird.PIC = pic;
|
||||
if (discID != null && ird.DiscID[15] != 0x00)
|
||||
ird.DiscID = discID;
|
||||
|
||||
// Write IRD to file
|
||||
ird.Write(irdPath);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// We don't care what the error is
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
|
||||
<!-- Package Properties -->
|
||||
<Authors>Matt Nadareski;ReignStumble;Jakz</Authors>
|
||||
@@ -31,12 +31,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BinaryObjectScanner" Version="3.3.4" />
|
||||
<PackageReference Include="LibIRD" Version="0.9.3" />
|
||||
<PackageReference Include="BinaryObjectScanner" Version="3.4.2" />
|
||||
<PackageReference Include="LibIRD" Version="1.0.0" />
|
||||
<PackageReference Include="Microsoft.Management.Infrastructure" Version="3.0.0" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
<PackageReference Include="Microsoft.Net.Http" Version="2.2.29" Condition="$(TargetFramework.StartsWith(`net452`))" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="MinThreadingBridge" Version="0.11.4" Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`)) OR $(TargetFramework.StartsWith(`net40`))" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
<PackageReference Include="System.Net.Http" Version="4.3.4" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -123,6 +123,15 @@ namespace MPF.Frontend
|
||||
set { Settings["CheckForUpdatesOnStartup"] = value.ToString(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Try to copy the update URL to the clipboard if one is found
|
||||
/// </summary>
|
||||
public bool CopyUpdateUrlToClipboard
|
||||
{
|
||||
get { return GetBooleanSetting(Settings, "CopyUpdateUrlToClipboard", true); }
|
||||
set { Settings["CopyUpdateUrlToClipboard"] = value.ToString(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fast update label - Skips disc checks and updates path only
|
||||
/// </summary>
|
||||
@@ -427,6 +436,15 @@ namespace MPF.Frontend
|
||||
set { Settings[RedumperSettings.RereadCount] = value.ToString(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Enable the refine sector mode flag by default
|
||||
/// </summary>
|
||||
public bool RedumperRefineSectorMode
|
||||
{
|
||||
get { return GetBooleanSetting(Settings, RedumperSettings.RefineSectorMode, RedumperSettings.RefineSectorModeDefault); }
|
||||
set { Settings[RedumperSettings.RefineSectorMode] = value.ToString(); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Extra Dumping Options
|
||||
@@ -450,7 +468,7 @@ namespace MPF.Frontend
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show the disc information window after dumping
|
||||
/// Show the media information window after dumping
|
||||
/// </summary>
|
||||
public bool PromptForDiscInformation
|
||||
{
|
||||
@@ -486,7 +504,7 @@ namespace MPF.Frontend
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show disc eject reminder before the disc information window is shown
|
||||
/// Show disc eject reminder before the media information window is shown
|
||||
/// </summary>
|
||||
public bool ShowDiscEjectReminder
|
||||
{
|
||||
|
||||
108
MPF.Frontend/Progress.cs
Normal file
108
MPF.Frontend/Progress.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
#if NET20 || NET35 || NET40
|
||||
|
||||
// Licensed to the .NET Foundation under one or more agreements.
|
||||
// The .NET Foundation licenses this file to you under the MIT license.
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace MPF.Frontend
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides an IProgress{T} that invokes callbacks for each reported progress value.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Specifies the type of the progress report value.</typeparam>
|
||||
/// <remarks>
|
||||
/// Any handler provided to the constructor or event handlers registered with
|
||||
/// the <see cref="ProgressChanged"/> event are invoked through a
|
||||
/// <see cref="SynchronizationContext"/> instance captured
|
||||
/// when the instance is constructed. If there is no current SynchronizationContext
|
||||
/// at the time of construction, the callbacks will be invoked on the ThreadPool.
|
||||
/// </remarks>
|
||||
/// <see href="https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Progress.cs"/>
|
||||
internal class Progress<T> : IProgress<T> where T : EventArgs
|
||||
{
|
||||
/// <summary>The synchronization context captured upon construction. This will never be null.</summary>
|
||||
private readonly SynchronizationContext? _synchronizationContext;
|
||||
/// <summary>The handler specified to the constructor. This may be null.</summary>
|
||||
private readonly Action<T>? _handler;
|
||||
/// <summary>A cached delegate used to post invocation to the synchronization context.</summary>
|
||||
private readonly SendOrPostCallback _invokeHandlers;
|
||||
|
||||
/// <summary>Initializes the <see cref="Progress{T}"/>.</summary>
|
||||
public Progress()
|
||||
{
|
||||
// Capture the current synchronization context.
|
||||
// If there is no current context, we use a default instance targeting the ThreadPool.
|
||||
_synchronizationContext = SynchronizationContext.Current ?? ProgressStatics.DefaultContext;
|
||||
Debug.Assert(_synchronizationContext != null);
|
||||
_invokeHandlers = new SendOrPostCallback(InvokeHandlers);
|
||||
}
|
||||
|
||||
/// <summary>Initializes the <see cref="Progress{T}"/> with the specified callback.</summary>
|
||||
/// <param name="handler">
|
||||
/// A handler to invoke for each reported progress value. This handler will be invoked
|
||||
/// in addition to any delegates registered with the <see cref="ProgressChanged"/> event.
|
||||
/// Depending on the <see cref="SynchronizationContext"/> instance captured by
|
||||
/// the <see cref="Progress{T}"/> at construction, it's possible that this handler instance
|
||||
/// could be invoked concurrently with itself.
|
||||
/// </param>
|
||||
/// <exception cref="ArgumentNullException">The <paramref name="handler"/> is null (<see langword="Nothing" /> in Visual Basic).</exception>
|
||||
public Progress(Action<T> handler) : this()
|
||||
{
|
||||
_handler = handler ?? throw new ArgumentNullException(nameof(handler));
|
||||
}
|
||||
|
||||
/// <summary>Raised for each reported progress value.</summary>
|
||||
/// <remarks>
|
||||
/// Handlers registered with this event will be invoked on the
|
||||
/// <see cref="SynchronizationContext"/> captured when the instance was constructed.
|
||||
/// </remarks>
|
||||
public event EventHandler<T>? ProgressChanged;
|
||||
|
||||
/// <summary>Reports a progress change.</summary>
|
||||
/// <param name="value">The value of the updated progress.</param>
|
||||
protected virtual void OnReport(T value)
|
||||
{
|
||||
// If there's no handler, don't bother going through the sync context.
|
||||
// Inside the callback, we'll need to check again, in case
|
||||
// an event handler is removed between now and then.
|
||||
Action<T>? handler = _handler;
|
||||
EventHandler<T>? changedEvent = ProgressChanged;
|
||||
if (handler != null || changedEvent != null)
|
||||
{
|
||||
// Post the processing to the sync context.
|
||||
// (If T is a value type, it will get boxed here.)
|
||||
_synchronizationContext?.Post(_invokeHandlers, value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Reports a progress change.</summary>
|
||||
/// <param name="value">The value of the updated progress.</param>
|
||||
void IProgress<T>.Report(T value) { OnReport(value); }
|
||||
|
||||
/// <summary>Invokes the action and event callbacks.</summary>
|
||||
/// <param name="state">The progress value.</param>
|
||||
private void InvokeHandlers(object? state)
|
||||
{
|
||||
T value = (T)state!;
|
||||
|
||||
Action<T>? handler = _handler;
|
||||
EventHandler<T>? changedEvent = ProgressChanged;
|
||||
|
||||
handler?.Invoke(value);
|
||||
changedEvent?.Invoke(this, value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Holds static values for <see cref="Progress{T}"/>.</summary>
|
||||
/// <remarks>This avoids one static instance per type T.</remarks>
|
||||
internal static class ProgressStatics
|
||||
{
|
||||
/// <summary>A default synchronization context that targets the ThreadPool.</summary>
|
||||
internal static readonly SynchronizationContext DefaultContext = new();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
|
||||
namespace MPF.Frontend.Tools
|
||||
@@ -522,7 +523,6 @@ namespace MPF.Frontend.Tools
|
||||
/// <param name="path">Path value to normalize</param>
|
||||
public static string NormalizeOutputPaths(string? path, bool getFullPath)
|
||||
{
|
||||
// The easy way
|
||||
try
|
||||
{
|
||||
// If we have an invalid path
|
||||
@@ -536,21 +536,27 @@ namespace MPF.Frontend.Tools
|
||||
|
||||
// Remove invalid path characters
|
||||
foreach (char c in Path.GetInvalidPathChars())
|
||||
{
|
||||
path = path.Replace(c, '_');
|
||||
}
|
||||
|
||||
// Try getting the combined path and returning that directly
|
||||
string fullPath = getFullPath ? Path.GetFullPath(path) : path;
|
||||
var fullDirectory = Path.GetDirectoryName(fullPath);
|
||||
string fullFile = Path.GetFileName(fullPath);
|
||||
var fullDirectory = Path.GetDirectoryName(fullPath)?.Trim();
|
||||
string fullFile = Path.GetFileName(fullPath).Trim();
|
||||
|
||||
// Remove invalid filename characters
|
||||
foreach (char c in Path.GetInvalidFileNameChars())
|
||||
{
|
||||
fullFile = fullFile.Replace(c, '_');
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(fullDirectory))
|
||||
return fullFile;
|
||||
else
|
||||
return Path.Combine(fullDirectory, fullFile);
|
||||
// Rebuild the path, if necessary
|
||||
if (!string.IsNullOrEmpty(fullDirectory))
|
||||
fullFile = Path.Combine(fullDirectory, fullFile);
|
||||
|
||||
// Remove spaces before and after separators
|
||||
return Regex.Replace(fullFile, @"\s*([\\|/])\s*", @"$1");
|
||||
}
|
||||
catch { }
|
||||
|
||||
|
||||
99
MPF.Frontend/Tools/IRDTool.cs
Normal file
99
MPF.Frontend/Tools/IRDTool.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using MPF.Processors;
|
||||
|
||||
namespace MPF.Frontend.Tools
|
||||
{
|
||||
internal static class IRDTool
|
||||
{
|
||||
/// <summary>
|
||||
/// Create an IRD and write it next to the input ISO path
|
||||
/// </summary>
|
||||
/// <param name="isoPath">Path to the original ISO</param>
|
||||
/// <param name="discKeyString">Required hexadecimal disc key as a string</param>
|
||||
/// <param name="discIDString">Optional hexadecimal disc ID as a string</param>
|
||||
/// <param name="picString">Optional string representation of the PIC information</param>
|
||||
/// <param name="layerbreak">Optional disc layerbreak value</param>
|
||||
/// <param name="crc32">Optional ISO CRC-32 value for the Unique ID field</param>
|
||||
/// <returns>True on success, false on error</returns>
|
||||
public static async Task<bool> WriteIRD(string isoPath,
|
||||
string? discKeyString,
|
||||
string? discIDString,
|
||||
string? picString,
|
||||
long? layerbreak,
|
||||
string? crc32)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Parse string values into required formats
|
||||
byte[]? discKey = ProcessingTool.ParseHexKey(discKeyString);
|
||||
byte[]? discID = ProcessingTool.ParseDiscID(discIDString);
|
||||
byte[]? pic = ProcessingTool.ParsePIC(picString);
|
||||
uint? uid = ProcessingTool.ParseCRC32(crc32);
|
||||
|
||||
return await WriteIRD(isoPath, discKey, discID, pic, layerbreak, uid);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// We don't care what the error is
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an IRD and write it next to the input ISO path
|
||||
/// </summary>
|
||||
/// <param name="isoPath">Path to the original ISO</param>
|
||||
/// <param name="discKey">Required hexadecimal disc key as a byte array</param>
|
||||
/// <param name="discID">Optional hexadecimal disc ID as a byte array</param>
|
||||
/// <param name="pic">Optional byte array representation of the PIC information</param>
|
||||
/// <param name="layerbreak">Optional disc layerbreak value</param>
|
||||
/// <param name="uid">Optional ISO CRC-32 value for the Unique ID field</param>
|
||||
/// <returns>True on success, false on error</returns>
|
||||
public static async Task<bool> WriteIRD(string isoPath,
|
||||
byte[]? discKey,
|
||||
byte[]? discID,
|
||||
byte[]? pic,
|
||||
long? layerbreak,
|
||||
uint? uid)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Fail on a missing disc key
|
||||
if (discKey == null)
|
||||
return false;
|
||||
|
||||
// Output IRD file path
|
||||
string irdPath = Path.ChangeExtension(isoPath, ".ird");
|
||||
|
||||
// Ensure layerbreak value is valid
|
||||
layerbreak = ProcessingTool.ParseLayerbreak(layerbreak);
|
||||
|
||||
// Create Redump-style reproducible IRD
|
||||
#if NET40
|
||||
LibIRD.ReIRD ird = await Task.Factory.StartNew(() =>
|
||||
#else
|
||||
LibIRD.ReIRD ird = await Task.Run(() =>
|
||||
#endif
|
||||
new LibIRD.ReIRD(isoPath, discKey, layerbreak, uid));
|
||||
|
||||
// Set optional fields if valid
|
||||
if (pic != null)
|
||||
ird.PIC = pic;
|
||||
if (discID != null && ird.DiscID[15] != 0x00)
|
||||
ird.DiscID = discID;
|
||||
|
||||
// Write IRD to file
|
||||
ird.Write(irdPath);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// We don't care what the error is
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,9 +39,15 @@ namespace MPF.Frontend.Tools
|
||||
public static bool? ProcessStandaloneArguments(string[] args)
|
||||
{
|
||||
// Help options
|
||||
if (args.Length == 0 || args[0] == "-h" || args[0] == "-?")
|
||||
if (args.Length == 0 || args[0] == "-h" || args[0] == "-?" || args[0] == "--help")
|
||||
return null;
|
||||
|
||||
if (args[0] == "--version")
|
||||
{
|
||||
Console.WriteLine(FrontendTool.GetCurrentVersion() ?? "Unknown version");
|
||||
return true;
|
||||
}
|
||||
|
||||
// List options
|
||||
if (args[0] == "-lc" || args[0] == "--listcodes")
|
||||
{
|
||||
@@ -87,6 +93,32 @@ namespace MPF.Frontend.Tools
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Process common arguments for all functionality
|
||||
/// </summary>
|
||||
/// <returns>True if all arguments pass, false otherwise</returns>
|
||||
public static bool ProcessCommonArguments(string[] args, out RedumpSystem? system, out string? message)
|
||||
{
|
||||
// All other use requires at least 3 arguments
|
||||
if (args.Length < 2)
|
||||
{
|
||||
system = null;
|
||||
message = "Invalid number of arguments";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check the RedumpSystem
|
||||
system = Extensions.ToRedumpSystem(args[0].Trim('"'));
|
||||
if (system == null)
|
||||
{
|
||||
message = $"{args[0]} is not a recognized system";
|
||||
return false;
|
||||
}
|
||||
|
||||
message = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Process common arguments for all functionality
|
||||
/// </summary>
|
||||
|
||||
@@ -549,7 +549,7 @@ namespace MPF.Frontend.Tools
|
||||
var appPkgHeader = appPkgHeaderDeserializer.Deserialize(fileStream);
|
||||
|
||||
if (appPkgHeader != null)
|
||||
pkgInfo += $"{appPkgHeader.ContentID}" + Environment.NewLine;
|
||||
pkgInfo += $"{appPkgHeader.ContentID}{Environment.NewLine}";
|
||||
}
|
||||
|
||||
if (pkgInfo == "")
|
||||
@@ -700,7 +700,7 @@ namespace MPF.Frontend.Tools
|
||||
var appPkgHeader = appPkgHeaderDeserializer.Deserialize(fileStream);
|
||||
|
||||
if (appPkgHeader != null)
|
||||
pkgInfo += $"{appPkgHeader.ContentID}" + Environment.NewLine;
|
||||
pkgInfo += $"{appPkgHeader.ContentID}{Environment.NewLine}";
|
||||
}
|
||||
|
||||
if (pkgInfo == "")
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace MPF.Frontend.Tools
|
||||
/// <param name="options">Options object that determines what to scan</param>
|
||||
/// <param name="progress">Optional progress callback</param>
|
||||
/// <returns>Set of all detected copy protections with an optional error string</returns>
|
||||
public static async Task<ProtectionDictionary> RunProtectionScanOnPath(string path,
|
||||
public static async Task<Dictionary<string, List<string>>> RunProtectionScanOnPath(string path,
|
||||
Options options,
|
||||
IProgress<ProtectionProgress>? progress = null)
|
||||
{
|
||||
@@ -97,9 +97,6 @@ namespace MPF.Frontend.Tools
|
||||
if (found == null || found.Count == 0)
|
||||
return [];
|
||||
|
||||
// Filter out any empty protections
|
||||
found.ClearEmptyKeys();
|
||||
|
||||
// Return the filtered set of protections
|
||||
return found;
|
||||
}
|
||||
@@ -109,7 +106,7 @@ namespace MPF.Frontend.Tools
|
||||
/// </summary>
|
||||
/// <param name="protections">Dictionary of file to list of protection mappings</param>
|
||||
/// <returns>Detected protections, if any</returns>
|
||||
public static string? FormatProtections(ProtectionDictionary? protections)
|
||||
public static string? FormatProtections(Dictionary<string, List<string>>? protections)
|
||||
{
|
||||
// If the filtered list is empty in some way, return
|
||||
if (protections == null)
|
||||
@@ -117,6 +114,9 @@ namespace MPF.Frontend.Tools
|
||||
else if (protections.Count == 0)
|
||||
return "None found [OMIT FROM SUBMISSION]";
|
||||
|
||||
// Sanitize context-sensitive protections
|
||||
protections = SanitizeContextSensitiveProtections(protections);
|
||||
|
||||
// Get a list of distinct found protections
|
||||
#if NET20
|
||||
var protectionValues = new List<string>();
|
||||
@@ -137,7 +137,7 @@ namespace MPF.Frontend.Tools
|
||||
.Distinct()
|
||||
.ToList();
|
||||
#endif
|
||||
|
||||
|
||||
// Sanitize and join protections for writing
|
||||
string protectionString = SanitizeFoundProtections(protectionValues);
|
||||
if (string.IsNullOrEmpty(protectionString))
|
||||
@@ -184,6 +184,66 @@ namespace MPF.Frontend.Tools
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sanitize unnecessary protections where context matters
|
||||
/// </summary>
|
||||
/// <param name="protections">Dictionary of file to list of protection mappings</param>
|
||||
/// <returns>Dictionary with all necessary items filtered out</returns>
|
||||
public static Dictionary<string, List<string>> SanitizeContextSensitiveProtections(Dictionary<string, List<string>> protections)
|
||||
{
|
||||
// Setup the output dictionary
|
||||
Dictionary<string, List<string>> filtered = [];
|
||||
|
||||
// Setup a list for keys that need additional processing
|
||||
List<string> foundKeys = [];
|
||||
|
||||
// Loop through the keys and add relevant ones
|
||||
string[] paths = [.. protections.Keys];
|
||||
foreach (var path in paths)
|
||||
{
|
||||
if (!protections.TryGetValue(path, out var values) || values == null || values.Count == 0)
|
||||
continue;
|
||||
|
||||
// Always copy the values if they're valid
|
||||
filtered[path] = values;
|
||||
|
||||
if (values.Exists(s => s.StartsWith("SecuROM Release Control -")))
|
||||
foundKeys.Add(path);
|
||||
}
|
||||
|
||||
// If there are no keys found
|
||||
if (foundKeys.Count == 0)
|
||||
return filtered;
|
||||
|
||||
// Process the keys as necessary
|
||||
foreach (var key in foundKeys)
|
||||
{
|
||||
// Get all matching paths
|
||||
var matchingPaths = Array.FindAll(paths, s => s != key && s.StartsWith(key));
|
||||
if (matchingPaths.Length == 0)
|
||||
continue;
|
||||
|
||||
// Loop through the matching paths
|
||||
foreach (var path in matchingPaths)
|
||||
{
|
||||
if (!filtered.TryGetValue(path, out var values) || values == null || values.Count == 0)
|
||||
continue;
|
||||
|
||||
if (values.Exists(s => !s.Contains("GitHub") &&
|
||||
(s.Contains("SecuROM 7")
|
||||
|| s.Contains("SecuROM 8")
|
||||
|| s.Contains("SecuROM Content Activation")
|
||||
|| s.Contains("SecuROM Data File Activation")
|
||||
|| s.Contains("Unlock"))))
|
||||
{
|
||||
filtered.Remove(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return filtered;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sanitize unnecessary protection duplication from output
|
||||
/// </summary>
|
||||
@@ -200,7 +260,12 @@ namespace MPF.Frontend.Tools
|
||||
// EXCEPTIONS
|
||||
if (foundProtections.Exists(p => p.StartsWith("[Exception opening file")))
|
||||
{
|
||||
foundProtections = foundProtections.FindAll(p => !p.StartsWith("[Exception opening file"));
|
||||
foundProtections = foundProtections.FindAll(p => !p.StartsWith("[Exception opening file") && !p.StartsWith("[Access issue when opening file"));
|
||||
foundProtections.Add("Exception occurred while scanning [RESCAN NEEDED]");
|
||||
}
|
||||
if (foundProtections.Exists(p => p.StartsWith("[Access issue when opening file")))
|
||||
{
|
||||
foundProtections = foundProtections.FindAll(p => !p.StartsWith("[Exception opening file") && !p.StartsWith("[Access issue when opening file"));
|
||||
foundProtections.Add("Exception occurred while scanning [RESCAN NEEDED]");
|
||||
}
|
||||
|
||||
@@ -429,7 +494,11 @@ namespace MPF.Frontend.Tools
|
||||
}
|
||||
|
||||
// SecuROM
|
||||
// TODO: Figure this one out
|
||||
if (foundProtections.Exists(p => p.StartsWith("SecuROM Release Control")))
|
||||
{
|
||||
foundProtections = foundProtections.FindAll(p => !p.StartsWith("SecuROM Release Control"));
|
||||
foundProtections.Add("SecuROM Release Control");
|
||||
}
|
||||
|
||||
// SolidShield
|
||||
// TODO: Figure this one out
|
||||
|
||||
@@ -51,16 +51,12 @@ namespace MPF.Frontend.Tools
|
||||
IProgress<ResultEventArgs>? resultProgress = null,
|
||||
IProgress<ProtectionProgress>? protectionProgress = null)
|
||||
{
|
||||
// Ensure the current disc combination should exist
|
||||
if (!system.MediaTypes().Contains(mediaType))
|
||||
return null;
|
||||
|
||||
// Split the output path for easier use
|
||||
var outputDirectory = Path.GetDirectoryName(outputPath);
|
||||
string outputFilename = Path.GetFileName(outputPath);
|
||||
|
||||
// Check that all of the relevant files are there
|
||||
List<string> missingFiles = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
List<string> missingFiles = processor.FoundAllFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (missingFiles.Count > 0)
|
||||
{
|
||||
resultProgress?.Report(ResultEventArgs.Failure($"There were files missing from the output:\n{string.Join("\n", [.. missingFiles])}"));
|
||||
@@ -77,9 +73,9 @@ namespace MPF.Frontend.Tools
|
||||
SubmissionInfo info = CreateDefaultSubmissionInfo(processor, system, mediaType, options.AddPlaceholders);
|
||||
|
||||
// Get specific tool output handling
|
||||
processor?.GenerateSubmissionInfo(info, basePath, options.EnableRedumpCompatibility);
|
||||
processor.GenerateSubmissionInfo(info, mediaType, basePath, options.EnableRedumpCompatibility);
|
||||
if (options.IncludeArtifacts)
|
||||
info.Artifacts = processor?.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
info.Artifacts = processor.GenerateArtifacts(mediaType, outputDirectory, outputFilename);
|
||||
|
||||
// Add a placeholder for the logs link
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.LogsLink] = "[Please provide a link to your logs here]";
|
||||
@@ -93,7 +89,7 @@ namespace MPF.Frontend.Tools
|
||||
info.TracksAndWriteOffsets.ClrMameProData = null;
|
||||
|
||||
// Add the volume label to comments, if possible or necessary
|
||||
string? volLabels = FormatVolumeLabels(drive?.VolumeLabel, processor?.VolumeLabels);
|
||||
string? volLabels = FormatVolumeLabels(drive?.VolumeLabel, processor.VolumeLabels);
|
||||
if (volLabels != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.VolumeLabel] = volLabels;
|
||||
|
||||
@@ -116,7 +112,7 @@ namespace MPF.Frontend.Tools
|
||||
{
|
||||
resultProgress?.Report(ResultEventArgs.Success("Running copy protection scan... this might take a while!"));
|
||||
|
||||
ProtectionDictionary? protections = null;
|
||||
Dictionary<string, List<string>>? protections = null;
|
||||
try
|
||||
{
|
||||
if (options.ScanForProtection && drive?.Name != null)
|
||||
@@ -459,6 +455,11 @@ namespace MPF.Frontend.Tools
|
||||
if (driveLabel != null && driveLabel.Length == 0)
|
||||
driveLabel = null;
|
||||
|
||||
// Treat "path" labels as null -- Indicates a mounted path
|
||||
// This can over-match if a label contains a directory separator somehow
|
||||
if (driveLabel != null && (driveLabel.Contains("/") || driveLabel.Contains("\\")))
|
||||
driveLabel = null;
|
||||
|
||||
// Must have at least one label to format
|
||||
if (driveLabel == null && (labels == null || labels.Count == 0))
|
||||
return null;
|
||||
@@ -997,7 +998,7 @@ namespace MPF.Frontend.Tools
|
||||
/// <summary>
|
||||
/// Set a comment field if it doesn't already have a value
|
||||
/// </summary>
|
||||
private static void SetCommentFieldIfNotExists(SubmissionInfo info, SiteCode key, Drive? drive, Func<Drive?, string?> valueFunc)
|
||||
private static void SetCommentFieldIfNotExists(SubmissionInfo info, SiteCode key, Drive? drive, System.Func<Drive?, string?> valueFunc)
|
||||
{
|
||||
// If the field has a valid value, skip
|
||||
if (CommentFieldExists(info, key, out _))
|
||||
@@ -1061,7 +1062,7 @@ namespace MPF.Frontend.Tools
|
||||
/// </summary>
|
||||
/// <param name="oldDict">ProtectionDictionary to format</param>
|
||||
/// <returns>Reformatted dictionary on success, empty on error</returns>
|
||||
private static Dictionary<string, List<string>?> ReformatProtectionDictionary(ProtectionDictionary? oldDict)
|
||||
private static Dictionary<string, List<string>?> ReformatProtectionDictionary(Dictionary<string, List<string>>? oldDict)
|
||||
{
|
||||
// Null or empty protections return empty
|
||||
if (oldDict == null || oldDict.Count == 0)
|
||||
|
||||
@@ -66,34 +66,6 @@ namespace MPF.Frontend.ViewModels
|
||||
}
|
||||
private bool _systemTypeComboBoxEnabled;
|
||||
|
||||
/// <summary>
|
||||
/// Currently selected media type value
|
||||
/// </summary>
|
||||
public MediaType? CurrentMediaType
|
||||
{
|
||||
get => _currentMediaType;
|
||||
set
|
||||
{
|
||||
_currentMediaType = value;
|
||||
TriggerPropertyChanged(nameof(CurrentMediaType));
|
||||
}
|
||||
}
|
||||
private MediaType? _currentMediaType;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates the status of the media type combo box
|
||||
/// </summary>
|
||||
public bool MediaTypeComboBoxEnabled
|
||||
{
|
||||
get => _mediaTypeComboBoxEnabled;
|
||||
set
|
||||
{
|
||||
_mediaTypeComboBoxEnabled = value;
|
||||
TriggerPropertyChanged(nameof(MediaTypeComboBoxEnabled));
|
||||
}
|
||||
}
|
||||
private bool _mediaTypeComboBoxEnabled;
|
||||
|
||||
/// <summary>
|
||||
/// Currently provided input path
|
||||
/// </summary>
|
||||
@@ -229,20 +201,6 @@ namespace MPF.Frontend.ViewModels
|
||||
|
||||
#region List Properties
|
||||
|
||||
/// <summary>
|
||||
/// Current list of supported media types
|
||||
/// </summary>
|
||||
public List<Element<MediaType>>? MediaTypes
|
||||
{
|
||||
get => _mediaTypes;
|
||||
set
|
||||
{
|
||||
_mediaTypes = value;
|
||||
TriggerPropertyChanged(nameof(MediaTypes));
|
||||
}
|
||||
}
|
||||
private List<Element<MediaType>>? _mediaTypes;
|
||||
|
||||
/// <summary>
|
||||
/// Current list of supported system profiles
|
||||
/// </summary>
|
||||
@@ -287,16 +245,13 @@ namespace MPF.Frontend.ViewModels
|
||||
SystemTypeComboBoxEnabled = true;
|
||||
InputPathTextBoxEnabled = true;
|
||||
InputPathBrowseButtonEnabled = true;
|
||||
MediaTypeComboBoxEnabled = true;
|
||||
DumpingProgramComboBoxEnabled = true;
|
||||
CheckDumpButtonEnabled = false;
|
||||
CancelButtonEnabled = true;
|
||||
|
||||
MediaTypes = [];
|
||||
Systems = RedumpSystemComboBoxItem.GenerateElements();
|
||||
InternalPrograms = [];
|
||||
|
||||
PopulateMediaType();
|
||||
PopulateInternalPrograms();
|
||||
EnableEventHandlers();
|
||||
}
|
||||
@@ -327,15 +282,6 @@ namespace MPF.Frontend.ViewModels
|
||||
/// Change the currently selected system
|
||||
/// </summary>
|
||||
public void ChangeSystem()
|
||||
{
|
||||
PopulateMediaType();
|
||||
CheckDumpButtonEnabled = ShouldEnableCheckDumpButton();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Change the currently selected media type
|
||||
/// </summary>
|
||||
public void ChangeMediaType()
|
||||
{
|
||||
CheckDumpButtonEnabled = ShouldEnableCheckDumpButton();
|
||||
}
|
||||
@@ -369,7 +315,6 @@ namespace MPF.Frontend.ViewModels
|
||||
InputPathTextBoxEnabled = true;
|
||||
InputPathBrowseButtonEnabled = true;
|
||||
DumpingProgramComboBoxEnabled = true;
|
||||
PopulateMediaType();
|
||||
CheckDumpButtonEnabled = ShouldEnableCheckDumpButton();
|
||||
CancelButtonEnabled = true;
|
||||
}
|
||||
@@ -382,7 +327,6 @@ namespace MPF.Frontend.ViewModels
|
||||
SystemTypeComboBoxEnabled = false;
|
||||
InputPathTextBoxEnabled = false;
|
||||
InputPathBrowseButtonEnabled = false;
|
||||
MediaTypeComboBoxEnabled = false;
|
||||
DumpingProgramComboBoxEnabled = false;
|
||||
CheckDumpButtonEnabled = false;
|
||||
CancelButtonEnabled = false;
|
||||
@@ -392,35 +336,6 @@ namespace MPF.Frontend.ViewModels
|
||||
|
||||
#region Population
|
||||
|
||||
/// <summary>
|
||||
/// Populate media type according to system type
|
||||
/// </summary>
|
||||
private void PopulateMediaType()
|
||||
{
|
||||
// Disable other UI updates
|
||||
bool cachedCanExecuteSelectionChanged = CanExecuteSelectionChanged;
|
||||
DisableEventHandlers();
|
||||
|
||||
if (CurrentSystem != null)
|
||||
{
|
||||
var mediaTypeValues = CurrentSystem.MediaTypes();
|
||||
int index = mediaTypeValues.FindIndex(m => m == CurrentMediaType);
|
||||
|
||||
MediaTypes = mediaTypeValues.ConvertAll(m => new Element<MediaType>(m ?? MediaType.NONE));
|
||||
MediaTypeComboBoxEnabled = MediaTypes.Count > 1;
|
||||
CurrentMediaType = (index > -1 ? MediaTypes[index] : MediaTypes[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
MediaTypeComboBoxEnabled = false;
|
||||
MediaTypes = null;
|
||||
CurrentMediaType = null;
|
||||
}
|
||||
|
||||
// Reenable event handlers, if necessary
|
||||
if (cachedCanExecuteSelectionChanged) EnableEventHandlers();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Populate media type according to system type
|
||||
/// </summary>
|
||||
@@ -451,7 +366,7 @@ namespace MPF.Frontend.ViewModels
|
||||
|
||||
private bool ShouldEnableCheckDumpButton()
|
||||
{
|
||||
return CurrentSystem != null && CurrentMediaType != null && !string.IsNullOrEmpty(InputPath);
|
||||
return CurrentSystem != null && !string.IsNullOrEmpty(InputPath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -502,9 +417,8 @@ namespace MPF.Frontend.ViewModels
|
||||
Path.GetFullPath(InputPath.Trim('"')),
|
||||
null,
|
||||
CurrentSystem,
|
||||
CurrentMediaType,
|
||||
CurrentProgram,
|
||||
parameters: null);
|
||||
CurrentProgram);
|
||||
env.SetProcessor();
|
||||
|
||||
// Finally, attempt to do the output dance
|
||||
var result = await env.VerifyAndSaveDumpOutput(
|
||||
|
||||
@@ -770,11 +770,11 @@ namespace MPF.Frontend.ViewModels
|
||||
public void ChangeDumpingProgram()
|
||||
{
|
||||
VerboseLogLn($"Changed dumping program to: {((InternalProgram?)CurrentProgram).LongName()}");
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
// New output name depends on new environment
|
||||
GetOutputNames(false);
|
||||
// New environment depends on new output name
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -787,7 +787,7 @@ namespace MPF.Frontend.ViewModels
|
||||
SetSupportedDriveSpeed();
|
||||
|
||||
GetOutputNames(false);
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -798,7 +798,7 @@ namespace MPF.Frontend.ViewModels
|
||||
VerboseLogLn($"Changed system to: {CurrentSystem.LongName()}");
|
||||
PopulateMediaType();
|
||||
GetOutputNames(false);
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1063,7 +1063,7 @@ namespace MPF.Frontend.ViewModels
|
||||
SetSupportedDriveSpeed();
|
||||
_environment = DetermineEnvironment();
|
||||
GetOutputNames(true);
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
|
||||
// Enable event handlers
|
||||
EnableEventHandlers();
|
||||
@@ -1100,7 +1100,7 @@ namespace MPF.Frontend.ViewModels
|
||||
// Set the initial environment and UI values
|
||||
_environment = DetermineEnvironment();
|
||||
GetOutputNames(true);
|
||||
EnsureDiscInformation();
|
||||
EnsureMediaInformation();
|
||||
|
||||
// Enable event handlers
|
||||
EnableEventHandlers();
|
||||
@@ -1253,14 +1253,15 @@ namespace MPF.Frontend.ViewModels
|
||||
/// <returns>Filled DumpEnvironment Parent</returns>
|
||||
private DumpEnvironment DetermineEnvironment()
|
||||
{
|
||||
return new DumpEnvironment(
|
||||
var env = new DumpEnvironment(
|
||||
Options,
|
||||
EvaluateOutputPath(OutputPath),
|
||||
CurrentDrive,
|
||||
CurrentSystem,
|
||||
CurrentMediaType,
|
||||
CurrentProgram,
|
||||
Parameters);
|
||||
CurrentProgram);
|
||||
env.SetExecutionContext(CurrentMediaType, Parameters);
|
||||
env.SetProcessor();
|
||||
return env;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1361,15 +1362,15 @@ namespace MPF.Frontend.ViewModels
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensure information is consistent with the currently selected disc type
|
||||
/// Ensure information is consistent with the currently selected media type
|
||||
/// </summary>
|
||||
public void EnsureDiscInformation()
|
||||
public void EnsureMediaInformation()
|
||||
{
|
||||
// Get the current environment information
|
||||
_environment = DetermineEnvironment();
|
||||
|
||||
// Get the status to write out
|
||||
ResultEventArgs result = _environment.GetSupportStatus();
|
||||
ResultEventArgs result = _environment.GetSupportStatus(CurrentMediaType);
|
||||
if (CurrentProgram == InternalProgram.NONE)
|
||||
Status = "No dumping program found";
|
||||
else
|
||||
@@ -1379,12 +1380,12 @@ namespace MPF.Frontend.ViewModels
|
||||
StartStopButtonEnabled = result && ShouldEnableDumpingButton();
|
||||
|
||||
// If we're in a type that doesn't support drive speeds
|
||||
DriveSpeedComboBoxEnabled = _environment.DoesSupportDriveSpeed();
|
||||
DriveSpeedComboBoxEnabled = _environment.DoesSupportDriveSpeed(CurrentMediaType);
|
||||
|
||||
// If input params are enabled, generate the full parameters from the environment
|
||||
if (ParametersCheckBoxEnabled)
|
||||
{
|
||||
var generated = _environment.GetFullParameters(DriveSpeed);
|
||||
var generated = _environment.GetFullParameters(CurrentMediaType, DriveSpeed);
|
||||
if (generated != null)
|
||||
Parameters = generated;
|
||||
}
|
||||
@@ -1638,7 +1639,7 @@ namespace MPF.Frontend.ViewModels
|
||||
if (!File.Exists(catalogjs))
|
||||
return RedumpSystem.MicrosoftXboxOne;
|
||||
|
||||
SabreTools.Models.Xbox.Catalog? catalog = SabreTools.Serialization.Deserializers.Catalog.DeserializeFile(catalogjs);
|
||||
SabreTools.Models.Xbox.Catalog? catalog = new SabreTools.Serialization.Deserializers.Catalog().Deserialize(catalogjs);
|
||||
if (catalog != null && catalog.Version != null && catalog.Packages != null)
|
||||
{
|
||||
if (!double.TryParse(catalog.Version, out double version))
|
||||
@@ -1664,6 +1665,12 @@ namespace MPF.Frontend.ViewModels
|
||||
}
|
||||
catch { }
|
||||
|
||||
// Playmaji Polymega
|
||||
if (File.Exists(Path.Combine(drive.Name, "Get Polymega App.url")))
|
||||
{
|
||||
return RedumpSystem.PlaymajiPolymega;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Sega Saturn / Sega Dreamcast / Sega Mega-CD / Sega-CD
|
||||
@@ -1882,7 +1889,7 @@ namespace MPF.Frontend.ViewModels
|
||||
public void ProcessCustomParameters()
|
||||
{
|
||||
// Set the execution context and processor
|
||||
if (_environment?.SetExecutionContext(Parameters) != true)
|
||||
if (_environment?.SetExecutionContext(CurrentMediaType, Parameters) != true)
|
||||
return;
|
||||
if (_environment?.SetProcessor() != true)
|
||||
return;
|
||||
@@ -2007,32 +2014,51 @@ namespace MPF.Frontend.ViewModels
|
||||
/// </summary>
|
||||
private static string? GetFormattedVolumeLabel(Drive? drive)
|
||||
{
|
||||
// If the drive is invalid
|
||||
if (drive == null)
|
||||
return null;
|
||||
|
||||
string? volumeLabel = DiscNotDetectedValue;
|
||||
// If the drive is marked as inactive
|
||||
if (!drive.MarkedActive)
|
||||
return volumeLabel;
|
||||
return DiscNotDetectedValue;
|
||||
|
||||
if (!string.IsNullOrEmpty(drive.VolumeLabel))
|
||||
// Use internal serials where appropriate
|
||||
string? volumeLabel = string.IsNullOrEmpty(drive.VolumeLabel) ? null : drive.VolumeLabel;
|
||||
switch (GetRedumpSystem(drive))
|
||||
{
|
||||
volumeLabel = drive.VolumeLabel;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No Volume Label found, fallback to something sensible
|
||||
switch (GetRedumpSystem(drive))
|
||||
{
|
||||
case RedumpSystem.SonyPlayStation:
|
||||
case RedumpSystem.SonyPlayStation2:
|
||||
string? serial = PhysicalTool.GetPlayStationSerial(drive);
|
||||
volumeLabel = serial ?? "track";
|
||||
break;
|
||||
case RedumpSystem.SonyPlayStation:
|
||||
case RedumpSystem.SonyPlayStation2:
|
||||
string? ps12Serial = PhysicalTool.GetPlayStationSerial(drive);
|
||||
volumeLabel ??= ps12Serial ?? "track";
|
||||
break;
|
||||
|
||||
default:
|
||||
volumeLabel = "track";
|
||||
break;
|
||||
}
|
||||
case RedumpSystem.SonyPlayStation3:
|
||||
string? ps3Serial = PhysicalTool.GetPlayStation3Serial(drive);
|
||||
if (volumeLabel == "PS3VOLUME")
|
||||
volumeLabel = ps3Serial ?? volumeLabel;
|
||||
else
|
||||
volumeLabel ??= ps3Serial ?? "track";
|
||||
break;
|
||||
|
||||
case RedumpSystem.SonyPlayStation4:
|
||||
string? ps4Serial = PhysicalTool.GetPlayStation4Serial(drive);
|
||||
if (volumeLabel == "PS4VOLUME")
|
||||
volumeLabel = ps4Serial ?? volumeLabel;
|
||||
else
|
||||
volumeLabel ??= ps4Serial ?? "track";
|
||||
break;
|
||||
|
||||
case RedumpSystem.SonyPlayStation5:
|
||||
string? ps5Serial = PhysicalTool.GetPlayStation5Serial(drive);
|
||||
if (volumeLabel == "PS5VOLUME")
|
||||
volumeLabel = ps5Serial ?? volumeLabel;
|
||||
else
|
||||
volumeLabel ??= ps5Serial ?? "track";
|
||||
break;
|
||||
|
||||
default:
|
||||
volumeLabel ??= "track";
|
||||
break;
|
||||
}
|
||||
|
||||
foreach (char c in Path.GetInvalidFileNameChars())
|
||||
@@ -2163,30 +2189,13 @@ namespace MPF.Frontend.ViewModels
|
||||
{
|
||||
// Ask user to confirm before exiting application during a dump
|
||||
AskBeforeQuit = true;
|
||||
|
||||
|
||||
// One last check to determine environment, just in case
|
||||
_environment = DetermineEnvironment();
|
||||
|
||||
// Force an internal drive refresh in case the user entered things manually
|
||||
_environment.RefreshDrive();
|
||||
|
||||
// If still in custom parameter mode, check that users meant to continue or not
|
||||
if (ParametersCheckBoxEnabled == false && _displayUserMessage != null)
|
||||
{
|
||||
bool? result = _displayUserMessage("Custom Changes", "It looks like you have custom parameters that have not been saved. Would you like to dump with these custom parameters?", 2, true);
|
||||
if (result == true)
|
||||
{
|
||||
ParametersCheckBoxEnabled = true;
|
||||
ProcessCustomParameters();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Re-allow quick exiting
|
||||
AskBeforeQuit = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Run pre-dumping validation checks
|
||||
@@ -2216,7 +2225,7 @@ namespace MPF.Frontend.ViewModels
|
||||
_environment.ReportStatus += ProgressUpdated;
|
||||
|
||||
// Run the program with the parameters
|
||||
ResultEventArgs result = await _environment.Run(resultProgress);
|
||||
ResultEventArgs result = await _environment.Run(CurrentMediaType, resultProgress);
|
||||
|
||||
// If we didn't execute a dumping command we cannot get submission output
|
||||
if (!_environment.IsDumpingCommand())
|
||||
@@ -2236,9 +2245,9 @@ namespace MPF.Frontend.ViewModels
|
||||
if (result)
|
||||
{
|
||||
result = await _environment.VerifyAndSaveDumpOutput(
|
||||
resultProgress,
|
||||
protectionProgress,
|
||||
_processUserInfo);
|
||||
resultProgress: resultProgress,
|
||||
protectionProgress: protectionProgress,
|
||||
processUserInfo: _processUserInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2283,6 +2292,7 @@ namespace MPF.Frontend.ViewModels
|
||||
MediaScanButtonEnabled = false;
|
||||
UpdateVolumeLabelEnabled = false;
|
||||
CopyProtectScanButtonEnabled = false;
|
||||
StartStopButtonEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2303,6 +2313,7 @@ namespace MPF.Frontend.ViewModels
|
||||
MediaScanButtonEnabled = true;
|
||||
UpdateVolumeLabelEnabled = true;
|
||||
CopyProtectScanButtonEnabled = true;
|
||||
StartStopButtonEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2344,7 +2355,7 @@ namespace MPF.Frontend.ViewModels
|
||||
string outputFilename = Path.GetFileName(_environment.OutputPath);
|
||||
|
||||
// If a complete or partial dump already exists
|
||||
bool foundAllFiles = _environment.FoundAllFiles(outputDirectory, outputFilename);
|
||||
bool foundAllFiles = _environment.FoundAllFiles(CurrentMediaType, outputDirectory, outputFilename);
|
||||
if (foundAllFiles && _displayUserMessage != null)
|
||||
{
|
||||
bool? mbresult = _displayUserMessage("Overwrite?", "A complete dump already exists! Are you sure you want to overwrite?", 2, true);
|
||||
@@ -2357,7 +2368,7 @@ namespace MPF.Frontend.ViewModels
|
||||
else
|
||||
{
|
||||
// If a partial dump exists
|
||||
bool foundAnyFiles = _environment.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
bool foundAnyFiles = _environment.FoundAnyFiles(CurrentMediaType, outputDirectory, outputFilename);
|
||||
if (foundAnyFiles && _displayUserMessage != null)
|
||||
{
|
||||
bool? mbresult = _displayUserMessage("Overwrite?", $"A partial dump already exists! Dumping here may cause issues. Are you sure you want to overwrite?", 2, true);
|
||||
@@ -2370,7 +2381,7 @@ namespace MPF.Frontend.ViewModels
|
||||
else
|
||||
{
|
||||
// If a complete dump exists from a different program
|
||||
InternalProgram? completeProgramFound = _environment.CheckForMatchingProgram(outputDirectory, outputFilename);
|
||||
InternalProgram? completeProgramFound = _environment.CheckForMatchingProgram(CurrentMediaType, outputDirectory, outputFilename);
|
||||
if (completeProgramFound != null && _displayUserMessage != null)
|
||||
{
|
||||
bool? mbresult = _displayUserMessage("Overwrite?", $"A complete dump from {completeProgramFound} already exists! Dumping here may cause issues. Are you sure you want to overwrite?", 2, true);
|
||||
@@ -2383,7 +2394,7 @@ namespace MPF.Frontend.ViewModels
|
||||
else
|
||||
{
|
||||
// If a partial dump exists from a different program
|
||||
InternalProgram? partialProgramFound = _environment.CheckForPartialProgram(outputDirectory, outputFilename);
|
||||
InternalProgram? partialProgramFound = _environment.CheckForPartialProgram(CurrentMediaType, outputDirectory, outputFilename);
|
||||
if (partialProgramFound != null && _displayUserMessage != null)
|
||||
{
|
||||
bool? mbresult = _displayUserMessage("Overwrite?", $"A partial dump from {partialProgramFound} already exists! Dumping here may cause issues. Are you sure you want to overwrite?", 2, true);
|
||||
|
||||
@@ -6,7 +6,7 @@ using SabreTools.RedumpLib.Data;
|
||||
|
||||
namespace MPF.Frontend.ViewModels
|
||||
{
|
||||
public class DiscInformationViewModel
|
||||
public class MediaInformationViewModel
|
||||
{
|
||||
#region Fields
|
||||
|
||||
@@ -194,7 +194,7 @@ namespace MPF.Frontend.ViewModels
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
public DiscInformationViewModel(Options options, SubmissionInfo? submissionInfo)
|
||||
public MediaInformationViewModel(Options options, SubmissionInfo? submissionInfo)
|
||||
{
|
||||
Options = options;
|
||||
SubmissionInfo = submissionInfo?.Clone() as SubmissionInfo ?? new SubmissionInfo();
|
||||
@@ -11,6 +11,41 @@ namespace MPF.Processors.Test
|
||||
// TODO: Add tests around remaining helper methods
|
||||
public class AaruTests
|
||||
{
|
||||
// TODO: Create minimal sidecars for all other supported types
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Empty_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_CD_Valid_CD()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.CDROM, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
@@ -18,9 +53,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, null);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -29,9 +64,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(8, actual.Count);
|
||||
}
|
||||
|
||||
@@ -40,9 +75,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.DVD);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -51,9 +86,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.HDDVD);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.HDDVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -62,9 +97,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.BluRay);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -73,9 +108,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.ApertureCard);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -88,8 +123,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -98,8 +133,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -112,8 +147,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -122,8 +157,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -132,8 +167,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM-zip");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -146,8 +181,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -156,8 +191,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -170,8 +205,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -180,8 +215,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -194,8 +229,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -204,8 +239,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Aaru", "CDROM");
|
||||
string outputFilename = "test.aaruf";
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Aaru(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
@@ -385,5 +420,149 @@ namespace MPF.Processors.Test
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetDiscTypeFromStrings
|
||||
|
||||
[Theory]
|
||||
[InlineData(null, "ANY", null)]
|
||||
[InlineData("", "ANY", null)]
|
||||
[InlineData("INVALID", "ANY", null)]
|
||||
[InlineData("3\" floppy", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("3.5\" floppy", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("3.5\" magneto-optical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("3.5\" SyQuest cartridge", "ANY", null)]
|
||||
[InlineData("3.9\" SyQuest cartridge", "ANY", null)]
|
||||
[InlineData("5.25\" floppy", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("5.25\" magneto-optical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("5.25\" SyQuest cartridge", "ANY", null)]
|
||||
[InlineData("8\" floppy", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("300mm magneto optical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("356mm magneto-optical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("Advanced Digital Recording", "ANY", null)]
|
||||
[InlineData("Advanced Intelligent Tape", "ANY", null)]
|
||||
[InlineData("Archival Disc", "ANY", null)]
|
||||
[InlineData("BeeCard", "ANY", null)]
|
||||
[InlineData("Blu-ray", "Wii U Optical Disc", MediaType.NintendoWiiUOpticalDisc)]
|
||||
[InlineData("Blu-ray", "ANY", MediaType.BluRay)]
|
||||
[InlineData("Borsu", "ANY", null)]
|
||||
[InlineData("Compact Cassette", "ANY", MediaType.Cassette)]
|
||||
[InlineData("Compact Disc", "ANY", MediaType.CDROM)]
|
||||
[InlineData("Compact Flash", "ANY", MediaType.CompactFlash)]
|
||||
[InlineData("CompacTape", "ANY", null)]
|
||||
[InlineData("CRVdisc", "ANY", null)]
|
||||
[InlineData("Data8", "ANY", null)]
|
||||
[InlineData("DataPlay", "ANY", null)]
|
||||
[InlineData("DataStore", "ANY", null)]
|
||||
[InlineData("DDCD", "ANY", MediaType.CDROM)]
|
||||
[InlineData("DECtape", "ANY", null)]
|
||||
[InlineData("DemiDiskette", "ANY", null)]
|
||||
[InlineData("Digital Audio Tape", "ANY", null)]
|
||||
[InlineData("Digital Data Storage", "ANY", MediaType.DataCartridge)]
|
||||
[InlineData("Digital Linear Tape", "ANY", null)]
|
||||
[InlineData("DIR", "ANY", null)]
|
||||
[InlineData("DST", "ANY", null)]
|
||||
[InlineData("DTF", "ANY", null)]
|
||||
[InlineData("DTF2", "ANY", null)]
|
||||
[InlineData("DV tape", "ANY", null)]
|
||||
[InlineData("DVD", "GameCube Game Disc", MediaType.NintendoGameCubeGameDisc)]
|
||||
[InlineData("DVD", "Wii Optical Disc", MediaType.NintendoWiiOpticalDisc)]
|
||||
[InlineData("DVD", "ANY", MediaType.DVD)]
|
||||
[InlineData("EVD", "ANY", null)]
|
||||
[InlineData("Exatape", "ANY", null)]
|
||||
[InlineData("Express Card", "ANY", null)]
|
||||
[InlineData("FDDVD", "ANY", null)]
|
||||
[InlineData("Flextra", "ANY", null)]
|
||||
[InlineData("Floptical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("FVD", "ANY", null)]
|
||||
[InlineData("GD", "ANY", MediaType.GDROM)]
|
||||
[InlineData("Hard Disk Drive", "ANY", MediaType.HardDisk)]
|
||||
[InlineData("HD DVD", "ANY", MediaType.HDDVD)]
|
||||
[InlineData("HD VMD", "ANY", null)]
|
||||
[InlineData("HiFD", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("HiTC", "ANY", null)]
|
||||
[InlineData("HuCard", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("HVD", "ANY", null)]
|
||||
[InlineData("HyperFlex", "ANY", null)]
|
||||
[InlineData("IBM 3470", "ANY", null)]
|
||||
[InlineData("IBM 3480", "ANY", null)]
|
||||
[InlineData("IBM 3490", "ANY", null)]
|
||||
[InlineData("IBM 3490E", "ANY", null)]
|
||||
[InlineData("IBM 3592", "ANY", null)]
|
||||
[InlineData("Iomega Bernoulli Box", "ANY", MediaType.IomegaBernoulliDisk)]
|
||||
[InlineData("Iomega Bernoulli Box II", "ANY", MediaType.IomegaBernoulliDisk)]
|
||||
[InlineData("Iomega Ditto", "ANY", null)]
|
||||
[InlineData("Iomega Jaz", "ANY", MediaType.IomegaJaz)]
|
||||
[InlineData("Iomega PocketZip", "ANY", MediaType.IomegaZip)]
|
||||
[InlineData("Iomega REV", "ANY", null)]
|
||||
[InlineData("Iomega ZIP", "ANY", MediaType.IomegaZip)]
|
||||
[InlineData("Kodak Verbatim", "ANY", null)]
|
||||
[InlineData("LaserDisc", "ANY", MediaType.LaserDisc)]
|
||||
[InlineData("Linear Tape-Open", "ANY", null)]
|
||||
[InlineData("LT1", "ANY", null)]
|
||||
[InlineData("Magneto-optical", "ANY", MediaType.Floptical)]
|
||||
[InlineData("Memory Stick", "ANY", MediaType.SDCard)]
|
||||
[InlineData("MiniCard", "ANY", null)]
|
||||
[InlineData("MiniDisc", "ANY", null)]
|
||||
[InlineData("MultiMediaCard", "ANY", MediaType.SDCard)]
|
||||
[InlineData("Nintendo 3DS Game Card", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo 64 Disk", "ANY", MediaType.Nintendo64DD)]
|
||||
[InlineData("Nintendo 64 Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Disk Card", "ANY", MediaType.NintendoFamicomDiskSystem)]
|
||||
[InlineData("Nintendo DS Game Card", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo DSi Game Card", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Entertainment System Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Famicom Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Game Boy Advance Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Game Boy Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Nintendo Switch Game Card", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Optical Disc Archive", "ANY", null)]
|
||||
[InlineData("Orb", "ANY", null)]
|
||||
[InlineData("PCMCIA Card", "ANY", null)]
|
||||
[InlineData("PD650", "ANY", null)]
|
||||
[InlineData("PlayStation Memory Card", "ANY", null)]
|
||||
[InlineData("Quarter-inch cartridge", "ANY", MediaType.DataCartridge)]
|
||||
[InlineData("Quarter-inch mini cartridge", "ANY", MediaType.DataCartridge)]
|
||||
[InlineData("QuickDisk", "ANY", null)]
|
||||
[InlineData("RDX", "ANY", null)]
|
||||
[InlineData("SACD", "ANY", MediaType.DVD)]
|
||||
[InlineData("Scalable Linear Recording", "ANY", null)]
|
||||
[InlineData("Secure Digital", "ANY", MediaType.SDCard)]
|
||||
[InlineData("SmartMedia", "ANY", MediaType.SDCard)]
|
||||
[InlineData("Sony Professional Disc", "ANY", null)]
|
||||
[InlineData("Sony Professional Disc for DATA", "ANY", null)]
|
||||
[InlineData("STK 4480", "ANY", null)]
|
||||
[InlineData("STK 4490", "ANY", null)]
|
||||
[InlineData("STK 9490", "ANY", null)]
|
||||
[InlineData("STK T-9840", "ANY", null)]
|
||||
[InlineData("STK T-9940", "ANY", null)]
|
||||
[InlineData("STK T-10000", "ANY", null)]
|
||||
[InlineData("Super Advanced Intelligent Tape", "ANY", null)]
|
||||
[InlineData("Super Digital Linear Tape", "ANY", null)]
|
||||
[InlineData("Super Nintendo Game Pak", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("Super Nintendo Game Pak (US)", "ANY", MediaType.Cartridge)]
|
||||
[InlineData("SuperDisk", "ANY", MediaType.FloppyDisk)]
|
||||
[InlineData("SVOD", "ANY", null)]
|
||||
[InlineData("Travan", "ANY", null)]
|
||||
[InlineData("UDO", "ANY", null)]
|
||||
[InlineData("UHD144", "ANY", null)]
|
||||
[InlineData("UMD", "ANY", MediaType.UMD)]
|
||||
[InlineData("Unknown", "ANY", null)]
|
||||
[InlineData("USB flash drive", "ANY", MediaType.FlashDrive)]
|
||||
[InlineData("VCDHD", "ANY", null)]
|
||||
[InlineData("VideoFloppy", "ANY", null)]
|
||||
[InlineData("VideoNow", "ANY", MediaType.CDROM)]
|
||||
[InlineData("VXA", "ANY", MediaType.FlashDrive)]
|
||||
[InlineData("Wafer", "ANY", null)]
|
||||
[InlineData("xD", "ANY", null)]
|
||||
[InlineData("XQD", "ANY", null)]
|
||||
[InlineData("Zoned Hard Disk Drive", "ANY", MediaType.HardDisk)]
|
||||
[InlineData("ZX Microdrive", "ANY", null)]
|
||||
public void GetDiscTypeFromStringsTest(string? discType, string? discSubType, MediaType? expected)
|
||||
{
|
||||
var actual = Aaru.GetDiscTypeFromStrings(discType, discSubType);
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using Xunit;
|
||||
|
||||
namespace MPF.Processors.Test
|
||||
@@ -85,6 +86,43 @@ namespace MPF.Processors.Test
|
||||
|
||||
#endregion
|
||||
|
||||
#region GenerateDatafile
|
||||
|
||||
[Fact]
|
||||
public void GenerateDatafile_Empty_Null()
|
||||
{
|
||||
string iso = string.Empty;
|
||||
Datafile? actual = BaseProcessor.GenerateDatafile(iso);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GenerateDatafile_Invalid_Null()
|
||||
{
|
||||
string iso = "INVALID";
|
||||
Datafile? actual = BaseProcessor.GenerateDatafile(iso);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GenerateDatafile_Valid_Filled()
|
||||
{
|
||||
string iso = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay", "test.iso");
|
||||
var actual = BaseProcessor.GenerateDatafile(iso);
|
||||
|
||||
Assert.NotNull(actual);
|
||||
Assert.NotNull(actual.Game);
|
||||
var game = Assert.Single(actual.Game);
|
||||
Assert.NotNull(game.Rom);
|
||||
var rom = Assert.Single(game.Rom);
|
||||
Assert.Equal("9", rom.Size);
|
||||
Assert.Equal("560b9f59", rom.CRC);
|
||||
Assert.Equal("edbb6676247e65c2245dd4883ed9fc24", rom.MD5);
|
||||
Assert.Equal("1b33ad54d78085be5ecb1cf1b3e9da821e708075", rom.SHA1);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetPIC
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -7,17 +7,111 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
public class CleanRipTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_GC_Empty_GC()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoGameCubeGameDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Wii_Null_Wii()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoWii);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoWiiOpticalDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Other_Null_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_GC_Invalid_GC()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoGameCubeGameDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Wii_Invalid_Wii()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoWii);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoWiiOpticalDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Other_Invalid_Invalid()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new CleanRip(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_GC_Valid_GC()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoGameCubeGameDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Wii_Valid_Wii()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoWii);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.NintendoWiiOpticalDisc, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Other_Valid_Valid()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Null_Empty()
|
||||
public void GetOutputFiles_Null_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, null);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -25,9 +119,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
@@ -36,9 +130,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.NintendoGameCubeGameDisc);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.NintendoGameCubeGameDisc, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
@@ -47,21 +141,21 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.NintendoWiiOpticalDisc);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoWii);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.NintendoWiiOpticalDisc, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Other_Empty()
|
||||
public void GetOutputFiles_Other_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.ApertureCard);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -73,8 +167,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.FoundAllFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
@@ -83,8 +177,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.FoundAllFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -97,8 +191,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.FoundAnyFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -107,8 +201,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.FoundAnyFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -117,8 +211,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD-zip");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.FoundAnyFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -131,8 +225,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GenerateArtifacts(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -141,8 +235,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GenerateArtifacts(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(2, actual.Count);
|
||||
}
|
||||
|
||||
@@ -155,8 +249,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -165,8 +259,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -179,8 +273,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -189,8 +283,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "CleanRip", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube, MediaType.DVD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new CleanRip(RedumpSystem.NintendoGameCube);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(2, actual.Count);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,70 @@ namespace MPF.Processors.Test
|
||||
// TODO: Add tests around remaining helper methods
|
||||
public class DiscImageCreatorTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Null_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_BD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "BluRay");
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_CD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.CDROM, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_DVD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.DVD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_HDDVD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "HDDVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.HDDVD, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
@@ -17,9 +81,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, null);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -28,9 +92,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(26, actual.Count);
|
||||
}
|
||||
|
||||
@@ -39,9 +103,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.GDROM);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.GDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(10, actual.Count);
|
||||
}
|
||||
|
||||
@@ -50,9 +114,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.DVD);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(16, actual.Count);
|
||||
}
|
||||
|
||||
@@ -61,9 +125,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.NintendoGameCubeGameDisc);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.NintendoGameCubeGameDisc, outputDirectory, outputFilename);
|
||||
Assert.Equal(16, actual.Count);
|
||||
}
|
||||
|
||||
@@ -72,9 +136,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.NintendoWiiOpticalDisc);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.NintendoWiiOpticalDisc, outputDirectory, outputFilename);
|
||||
Assert.Equal(16, actual.Count);
|
||||
}
|
||||
|
||||
@@ -83,9 +147,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.HDDVD);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.HDDVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(15, actual.Count);
|
||||
}
|
||||
|
||||
@@ -94,9 +158,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.BluRay);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(15, actual.Count);
|
||||
}
|
||||
|
||||
@@ -105,9 +169,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.FloppyDisk);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.FloppyDisk, outputDirectory, outputFilename);
|
||||
Assert.Equal(4, actual.Count);
|
||||
}
|
||||
|
||||
@@ -116,9 +180,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.HardDisk);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.HardDisk, outputDirectory, outputFilename);
|
||||
Assert.Equal(4, actual.Count);
|
||||
}
|
||||
|
||||
@@ -127,9 +191,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.ApertureCard);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -142,9 +206,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
Assert.Equal(17, actual.Count);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(15, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -152,8 +216,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -166,8 +230,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -176,8 +240,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -186,8 +250,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM-zip");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -200,8 +264,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -210,8 +274,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(21, actual.Count);
|
||||
}
|
||||
|
||||
@@ -224,8 +288,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -234,8 +298,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(2, actual.Count);
|
||||
}
|
||||
|
||||
@@ -248,8 +312,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -258,8 +322,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new DiscImageCreator(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(23, actual.Count);
|
||||
}
|
||||
|
||||
@@ -351,15 +415,45 @@ namespace MPF.Processors.Test
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_Valid_Filled()
|
||||
public void GetDiscType_BD_Filled()
|
||||
{
|
||||
string? expected = "CD-ROM, GD-ROM, DVD-ROM, BD-ROM";
|
||||
string? expected = "BDO";
|
||||
string disc = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "BluRay", "test_disc.txt");
|
||||
bool actual = DiscImageCreator.GetDiscType(disc, out string? discTypeOrBookType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discTypeOrBookType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_CD_Filled()
|
||||
{
|
||||
string? expected = "CD-ROM";
|
||||
string disc = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "CDROM", "test_disc.txt");
|
||||
bool actual = DiscImageCreator.GetDiscType(disc, out string? discTypeOrBookType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discTypeOrBookType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_DVD_Filled()
|
||||
{
|
||||
string? expected = "DVD-ROM";
|
||||
string disc = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "DVD", "test_disc.txt");
|
||||
bool actual = DiscImageCreator.GetDiscType(disc, out string? discTypeOrBookType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discTypeOrBookType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_HDDVD_Filled()
|
||||
{
|
||||
string? expected = "HD DVD-ROM";
|
||||
string disc = Path.Combine(Environment.CurrentDirectory, "TestData", "DiscImageCreator", "HDDVD", "test_disc.txt");
|
||||
bool actual = DiscImageCreator.GetDiscType(disc, out string? discTypeOrBookType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discTypeOrBookType);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetDVDProtection
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
|
||||
<CheckEolTargetFramework>false</CheckEolTargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
@@ -24,13 +24,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.13.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="Microsoft.CodeCoverage" Version="17.14.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.abstractions" Version="2.0.3" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.21.0" />
|
||||
<PackageReference Include="xunit.analyzers" Version="1.24.0" />
|
||||
<PackageReference Include="xunit.assert" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.core" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.extensibility.core" Version="2.9.3" />
|
||||
@@ -39,7 +39,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
using Xunit;
|
||||
|
||||
@@ -8,17 +7,51 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
public class PS3CFWTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Null_BluRay()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_BluRay()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Valid_BluRay()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Null_Empty()
|
||||
public void GetOutputFiles_Null_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, null);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Equal(4, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -26,21 +59,21 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(4, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Other_Empty()
|
||||
public void GetOutputFiles_Other_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.ApertureCard);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Equal(4, actual.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -52,8 +85,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.FoundAllFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(3, actual.Count);
|
||||
}
|
||||
|
||||
@@ -62,8 +95,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.FoundAllFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -76,8 +109,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.FoundAnyFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -86,8 +119,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.FoundAnyFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -96,8 +129,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay-zip");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.FoundAnyFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -110,8 +143,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GenerateArtifacts(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -120,8 +153,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GenerateArtifacts(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(2, actual.Count);
|
||||
}
|
||||
|
||||
@@ -134,8 +167,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -144,8 +177,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -158,8 +191,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -168,48 +201,11 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3, MediaType.BluRay);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new PS3CFW(RedumpSystem.SonyPlayStation3);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(2, actual.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GeneratePS3CFWDatafile
|
||||
|
||||
[Fact]
|
||||
public void GeneratePS3CFWDatafile_Empty_Null()
|
||||
{
|
||||
string iso = string.Empty;
|
||||
Datafile? actual = PS3CFW.GeneratePS3CFWDatafile(iso);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GeneratePS3CFWDatafile_Invalid_Null()
|
||||
{
|
||||
string iso = "INVALID";
|
||||
Datafile? actual = PS3CFW.GeneratePS3CFWDatafile(iso);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GeneratePS3CFWDatafile_Valid_Filled()
|
||||
{
|
||||
string iso = Path.Combine(Environment.CurrentDirectory, "TestData", "PS3CFW", "BluRay", "test.iso");
|
||||
var actual = PS3CFW.GeneratePS3CFWDatafile(iso);
|
||||
|
||||
Assert.NotNull(actual);
|
||||
Assert.NotNull(actual.Game);
|
||||
var game = Assert.Single(actual.Game);
|
||||
Assert.NotNull(game.Rom);
|
||||
var rom = Assert.Single(game.Rom);
|
||||
Assert.Equal("9", rom.Size);
|
||||
Assert.Equal("560b9f59", rom.CRC);
|
||||
Assert.Equal("edbb6676247e65c2245dd4883ed9fc24", rom.MD5);
|
||||
Assert.Equal("1b33ad54d78085be5ecb1cf1b3e9da821e708075", rom.SHA1);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -471,12 +471,9 @@ namespace MPF.Processors.Test
|
||||
[Theory]
|
||||
[InlineData(null, null)]
|
||||
[InlineData("", null)]
|
||||
[InlineData("GAME", DiscCategory.Games)]
|
||||
[InlineData("game", DiscCategory.Games)]
|
||||
[InlineData("VIDEO", DiscCategory.Video)]
|
||||
[InlineData("video", DiscCategory.Video)]
|
||||
[InlineData("AUDIO", DiscCategory.Audio)]
|
||||
[InlineData("audio", DiscCategory.Audio)]
|
||||
[InlineData("(GAME)", DiscCategory.Games)]
|
||||
[InlineData("(VIDEO)", DiscCategory.Video)]
|
||||
[InlineData("(AUDIO)", DiscCategory.Audio)]
|
||||
[InlineData("INVALID", null)]
|
||||
public void GetUMDCategoryTest(string? category, DiscCategory? expected)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,80 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
public class RedumperTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Null_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_Null()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_BD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "BluRay");
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_BDR_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "BDR");
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.BluRay, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_CD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.CDROM, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_DVD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.DVD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_HDDVD_Filled()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "HDDVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.HDDVD, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
@@ -15,9 +89,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, null);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -26,10 +100,10 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Equal(16, actual.Count);
|
||||
var actual = processor.GetOutputFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(17, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -37,10 +111,10 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.DVD);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Equal(17, actual.Count);
|
||||
var actual = processor.GetOutputFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(15, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -48,9 +122,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.HDDVD);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.HDDVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(10, actual.Count);
|
||||
}
|
||||
|
||||
@@ -59,9 +133,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.BluRay);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.BluRay, outputDirectory, outputFilename);
|
||||
Assert.Equal(10, actual.Count);
|
||||
}
|
||||
|
||||
@@ -70,9 +144,9 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.ApertureCard);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -85,8 +159,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(8, actual.Count);
|
||||
}
|
||||
|
||||
@@ -95,8 +169,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -105,8 +179,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM-zip");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAllFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -119,8 +193,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -129,8 +203,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.FoundAnyFiles(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -143,8 +217,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -153,8 +227,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GenerateArtifacts(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(10, actual.Count);
|
||||
}
|
||||
|
||||
@@ -167,8 +241,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -177,8 +251,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Single(actual);
|
||||
}
|
||||
|
||||
@@ -191,8 +265,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -201,8 +275,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM");
|
||||
string outputFilename = "test.cue";
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible, MediaType.CDROM);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new Redumper(RedumpSystem.IBMPCcompatible);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.CDROM, outputDirectory, outputFilename);
|
||||
Assert.Equal(10, actual.Count);
|
||||
}
|
||||
|
||||
@@ -266,32 +340,154 @@ namespace MPF.Processors.Test
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetDiscProfile
|
||||
|
||||
[Fact]
|
||||
public void GetDiscProfile_Empty_Null()
|
||||
{
|
||||
string log = string.Empty;
|
||||
bool actual = Redumper.GetDiscProfile(log, out string? discProfile);
|
||||
Assert.False(actual);
|
||||
Assert.Null(discProfile);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscProfile_Invalid_Null()
|
||||
{
|
||||
string log = "INVALID";
|
||||
bool actual = Redumper.GetDiscProfile(log, out string? discProfile);
|
||||
Assert.False(actual);
|
||||
Assert.Null(discProfile);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscProfile_Valid_Filled()
|
||||
{
|
||||
string? expected = "CD-ROM";
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM", "test.log");
|
||||
bool actual = Redumper.GetDiscProfile(log, out string? discProfile);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discProfile);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetDiscType
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_Empty_Null()
|
||||
{
|
||||
string log = string.Empty;
|
||||
bool actual = Redumper.GetDiscType(log, out string? discTypeOrBookType);
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.False(actual);
|
||||
Assert.Null(discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_Invalid_Null()
|
||||
{
|
||||
string log = "INVALID";
|
||||
bool actual = Redumper.GetDiscType(log, out string? discTypeOrBookType);
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.False(actual);
|
||||
Assert.Null(discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_Valid_Filled()
|
||||
public void GetDiscType_BD_Filled()
|
||||
{
|
||||
string? expected = "CD-ROM";
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out string? discTypeOrBookType);
|
||||
MediaType? expected = MediaType.BluRay;
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "BluRay", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discTypeOrBookType);
|
||||
Assert.Equal(expected, discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_BDR_Filled()
|
||||
{
|
||||
MediaType? expected = MediaType.BluRay;
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "BDR", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_CD_Filled()
|
||||
{
|
||||
MediaType? expected = MediaType.CDROM;
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "CDROM", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_DVD_Filled()
|
||||
{
|
||||
MediaType? expected = MediaType.DVD;
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "DVD", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetDiscType_HDDVD_Filled()
|
||||
{
|
||||
MediaType? expected = MediaType.HDDVD;
|
||||
string log = Path.Combine(Environment.CurrentDirectory, "TestData", "Redumper", "HDDVD", "test.log");
|
||||
bool actual = Redumper.GetDiscType(log, out MediaType? discType);
|
||||
Assert.True(actual);
|
||||
Assert.Equal(expected, discType);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetDiscTypeFromProfile
|
||||
|
||||
[Theory]
|
||||
[InlineData(null, null)]
|
||||
[InlineData("", null)]
|
||||
[InlineData("INVALID", null)]
|
||||
[InlineData("reserved", null)]
|
||||
[InlineData("non removable disk", null)]
|
||||
[InlineData("removable disk", null)]
|
||||
[InlineData("MO erasable", null)]
|
||||
[InlineData("MO write once", null)]
|
||||
[InlineData("AS MO", null)]
|
||||
[InlineData("CD-ROM", MediaType.CDROM)]
|
||||
[InlineData("CD-R", MediaType.CDROM)]
|
||||
[InlineData("CD-RW", MediaType.CDROM)]
|
||||
[InlineData("DVD-ROM", MediaType.DVD)]
|
||||
[InlineData("DVD-R", MediaType.DVD)]
|
||||
[InlineData("DVD-RAM", MediaType.DVD)]
|
||||
[InlineData("DVD-RW RO", MediaType.DVD)]
|
||||
[InlineData("DVD-RW", MediaType.DVD)]
|
||||
[InlineData("DVD-R DL", MediaType.DVD)]
|
||||
[InlineData("DVD-R DL LJR", MediaType.DVD)]
|
||||
[InlineData("DVD+RW", MediaType.DVD)]
|
||||
[InlineData("DVD+R", MediaType.DVD)]
|
||||
[InlineData("DDCD-ROM", MediaType.CDROM)]
|
||||
[InlineData("DDCD-R", MediaType.CDROM)]
|
||||
[InlineData("DDCD-RW", MediaType.CDROM)]
|
||||
[InlineData("DVD+RW DL", MediaType.DVD)]
|
||||
[InlineData("DVD+R DL", MediaType.DVD)]
|
||||
[InlineData("BD-ROM", MediaType.BluRay)]
|
||||
[InlineData("BD-R", MediaType.BluRay)]
|
||||
[InlineData("BD-R RRM", MediaType.BluRay)]
|
||||
[InlineData("BD-RW", MediaType.BluRay)]
|
||||
[InlineData("HD DVD-ROM", MediaType.HDDVD)]
|
||||
[InlineData("HD DVD-R", MediaType.HDDVD)]
|
||||
[InlineData("HD DVD-RAM", MediaType.HDDVD)]
|
||||
[InlineData("HD DVD-RW", MediaType.HDDVD)]
|
||||
[InlineData("HD DVD-R DL", MediaType.HDDVD)]
|
||||
[InlineData("HD DVD-RW DL", MediaType.HDDVD)]
|
||||
[InlineData("NON STANDARD", null)]
|
||||
public void GetDiscTypeFromProfileTest(string? profile, MediaType? expected)
|
||||
{
|
||||
var actual = Redumper.GetDiscTypeFromProfile(profile);
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1 +1,6 @@
|
||||
TEST DATA
|
||||
<CICMMetadata>
|
||||
<OpticalDisc>
|
||||
<DiscType>Compact Disc</DiscType>
|
||||
<DiscSubType>CD-ROM</DiscSubType>
|
||||
</OpticalDisc>
|
||||
</CICMMetadata>
|
||||
@@ -0,0 +1,2 @@
|
||||
<< GetDiscType >>
|
||||
DiscTypeIdentifier: BDO
|
||||
@@ -1,8 +1,5 @@
|
||||
<< GetDiscType >>
|
||||
DiscType: CD-ROM
|
||||
DiscTypeIdentifier: GD-ROM
|
||||
DiscTypeSpecific: DVD-ROM
|
||||
BookType: BD-ROM
|
||||
|
||||
<< GetDVDProtection >>
|
||||
========== CopyrightInformation ==========
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<< GetDiscType >>
|
||||
BookType: DVD-ROM
|
||||
@@ -0,0 +1,2 @@
|
||||
<< GetDiscType >>
|
||||
BookType: HD DVD-ROM
|
||||
3
MPF.Processors.Test/TestData/Redumper/BDR/test.log
Normal file
3
MPF.Processors.Test/TestData/Redumper/BDR/test.log
Normal file
@@ -0,0 +1,3 @@
|
||||
<< GetDiscType >>
|
||||
disc type: INVALID
|
||||
disc type: BLURAY-R
|
||||
3
MPF.Processors.Test/TestData/Redumper/BluRay/test.log
Normal file
3
MPF.Processors.Test/TestData/Redumper/BluRay/test.log
Normal file
@@ -0,0 +1,3 @@
|
||||
<< GetDiscType >>
|
||||
disc type: INVALID
|
||||
disc type: BLURAY
|
||||
@@ -13,9 +13,13 @@ CUE [
|
||||
dat:
|
||||
<rom name="INVALID" size="12345" crc="00000000" md5="d41d8cd98f00b204e9800998ecf8427e" sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709" />
|
||||
|
||||
<< GetDiscType >>
|
||||
<< GetDiscProfile >>
|
||||
current profile: CD-ROM
|
||||
|
||||
<< GetDiscType >>
|
||||
disc type: INVALID
|
||||
disc type: CD
|
||||
|
||||
<< GetDVDProtection >>
|
||||
copyright:
|
||||
protection system type: none
|
||||
|
||||
3
MPF.Processors.Test/TestData/Redumper/DVD/test.log
Normal file
3
MPF.Processors.Test/TestData/Redumper/DVD/test.log
Normal file
@@ -0,0 +1,3 @@
|
||||
<< GetDiscType >>
|
||||
disc type: INVALID
|
||||
disc type: DVD
|
||||
3
MPF.Processors.Test/TestData/Redumper/HDDVD/test.log
Normal file
3
MPF.Processors.Test/TestData/Redumper/HDDVD/test.log
Normal file
@@ -0,0 +1,3 @@
|
||||
<< GetDiscType >>
|
||||
disc type: INVALID
|
||||
disc type: HD-DVD
|
||||
Binary file not shown.
@@ -1,7 +1,21 @@
|
||||
<< GetUMDAuxInfo >>
|
||||
TITLE title
|
||||
DISC_ID serial
|
||||
DISC_VERSION version
|
||||
pspUmdTypes GAME
|
||||
L0 length 12345
|
||||
FileSize: 12345
|
||||
disc0:/PSP_GAME/PARAM.SFO
|
||||
magic: PSF
|
||||
version: 1.01
|
||||
BOOTABLE: 1
|
||||
CATEGORY: UG
|
||||
DISC_ID: ABCD12345
|
||||
DISC_NUMBER: 1
|
||||
DISC_TOTAL: 1
|
||||
DISC_VERSION: 1.01
|
||||
PARENTAL_LEVEL: 1
|
||||
PSP_SYSTEM_VER: 1.00
|
||||
REGION: 32768
|
||||
TITLE: title
|
||||
|
||||
pspUmdTypes: 0x10 (GAME)
|
||||
L0 length: 442560 (0x6c0c0)
|
||||
L1 length: 276096 (0x43680)
|
||||
---------------------------
|
||||
Total: 718656 (0xaf740)
|
||||
FileSize: 1471807488 (0x57ba0000)
|
||||
|
||||
@@ -8,17 +8,51 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
public class UmdImageCreatorTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Null_DVD()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.UMD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_DVD()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.UMD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Valid_DVD()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.UMD, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Null_Empty()
|
||||
public void GetOutputFiles_Null_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, null);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -26,21 +60,21 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Other_Empty()
|
||||
public void GetOutputFiles_Other_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.ApertureCard);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -52,8 +86,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.FoundAllFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Equal(5, actual.Count);
|
||||
}
|
||||
|
||||
@@ -62,8 +96,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.FoundAllFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -72,8 +106,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD-zip");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.FoundAllFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -86,8 +120,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.FoundAnyFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -96,8 +130,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.FoundAnyFiles(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -110,8 +144,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GenerateArtifacts(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -120,8 +154,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GenerateArtifacts(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Equal(6, actual.Count);
|
||||
}
|
||||
|
||||
@@ -134,8 +168,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -144,8 +178,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -158,8 +192,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -168,8 +202,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable, MediaType.UMD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new UmdImageCreator(RedumpSystem.SonyPlayStationPortable);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.UMD, outputDirectory, outputFilename);
|
||||
Assert.Equal(6, actual.Count);
|
||||
}
|
||||
|
||||
@@ -257,10 +291,10 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? expectedTitle = "title";
|
||||
DiscCategory? expectedCategory = DiscCategory.Games;
|
||||
string? expectedSerial = "seri-al";
|
||||
string? expectedVersion = "version";
|
||||
string? expectedLayer = "12345";
|
||||
long expectedSize = 12345;
|
||||
string? expectedSerial = "ABCD-12345";
|
||||
string? expectedVersion = "1.01";
|
||||
string? expectedLayer = "442560";
|
||||
long expectedSize = 1471807488;
|
||||
|
||||
string disc = Path.Combine(Environment.CurrentDirectory, "TestData", "UmdImageCreator", "UMD", "test_disc.txt");
|
||||
bool actual = UmdImageCreator.GetUMDAuxInfo(disc,
|
||||
@@ -289,7 +323,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string volDesc = string.Empty;
|
||||
bool actual = UmdImageCreator.GetVolumeLabels(volDesc, out Dictionary<string, List<string>> volLabels);
|
||||
|
||||
|
||||
Assert.False(actual);
|
||||
Assert.Empty(volLabels);
|
||||
}
|
||||
@@ -299,7 +333,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string volDesc = "INVALID";
|
||||
bool actual = UmdImageCreator.GetVolumeLabels(volDesc, out Dictionary<string, List<string>> volLabels);
|
||||
|
||||
|
||||
Assert.False(actual);
|
||||
Assert.Empty(volLabels);
|
||||
}
|
||||
|
||||
@@ -8,17 +8,51 @@ namespace MPF.Processors.Test
|
||||
// TODO: Add tests for RecreateSS
|
||||
public class XboxBackupCreatorTests
|
||||
{
|
||||
#region DetermineMediaType
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Empty_DVD()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.DVD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Invalid_DVD()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "INVALID";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.DVD, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetermineMediaType_Valid_DVD()
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.DetermineMediaType(outputDirectory, outputFilename);
|
||||
Assert.Equal(MediaType.DVD, actual);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetOutputFiles
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Null_Empty()
|
||||
public void GetOutputFiles_Null_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, null);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(null, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -26,21 +60,21 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
var actual = processor.GetOutputFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOutputFiles_Other_Empty()
|
||||
public void GetOutputFiles_Other_Populated()
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = "test";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.ApertureCard);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
|
||||
var actual = processor.GetOutputFiles(outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
var actual = processor.GetOutputFiles(MediaType.ApertureCard, outputDirectory, outputFilename);
|
||||
Assert.Equal(7, actual.Count);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -52,8 +86,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.FoundAllFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(5, actual.Count);
|
||||
}
|
||||
|
||||
@@ -62,8 +96,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.FoundAllFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -72,8 +106,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD-zip");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.FoundAllFiles(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.FoundAllFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -86,8 +120,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.FoundAnyFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.False(actual);
|
||||
}
|
||||
|
||||
@@ -96,8 +130,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.FoundAnyFiles(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.FoundAnyFiles(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.True(actual);
|
||||
}
|
||||
|
||||
@@ -110,8 +144,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GenerateArtifacts(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -120,8 +154,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GenerateArtifacts(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GenerateArtifacts(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(6, actual.Count);
|
||||
}
|
||||
|
||||
@@ -134,8 +168,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -144,8 +178,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GetDeleteableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -158,8 +192,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = null;
|
||||
string outputFilename = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Empty(actual);
|
||||
}
|
||||
|
||||
@@ -168,8 +202,8 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? outputDirectory = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD");
|
||||
string outputFilename = "test.iso";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var actual = processor.GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
var actual = processor.GetZippableFilePaths(MediaType.DVD, outputDirectory, outputFilename);
|
||||
Assert.Equal(6, actual.Count);
|
||||
}
|
||||
|
||||
@@ -340,7 +374,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
long expected = -1;
|
||||
string? log = null;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
bool actual = processor.GetReadErrors(log, out long readErrors);
|
||||
|
||||
Assert.False(actual);
|
||||
@@ -352,7 +386,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
long expected = -1;
|
||||
string? log = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
bool actual = processor.GetReadErrors(log, out long readErrors);
|
||||
|
||||
Assert.False(actual);
|
||||
@@ -364,7 +398,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
long expected = -1;
|
||||
string? log = "INVALID";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
bool actual = processor.GetReadErrors(log, out long readErrors);
|
||||
|
||||
Assert.False(actual);
|
||||
@@ -376,7 +410,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
long expected = 0;
|
||||
string? log = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD", "log.txt");
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox);
|
||||
bool actual = processor.GetReadErrors(log, out long readErrors);
|
||||
|
||||
Assert.True(actual);
|
||||
@@ -391,7 +425,7 @@ namespace MPF.Processors.Test
|
||||
public void GetMediaID_Null_Null()
|
||||
{
|
||||
string? log = null;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360);
|
||||
string? actual = processor.GetMediaID(log);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
@@ -400,7 +434,7 @@ namespace MPF.Processors.Test
|
||||
public void GetMediaID_Empty_Null()
|
||||
{
|
||||
string? log = string.Empty;
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360);
|
||||
string? actual = processor.GetMediaID(log);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
@@ -409,7 +443,7 @@ namespace MPF.Processors.Test
|
||||
public void GetMediaID_Invalid_Null()
|
||||
{
|
||||
string? log = "INVALID";
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360);
|
||||
string? actual = processor.GetMediaID(log);
|
||||
Assert.Null(actual);
|
||||
}
|
||||
@@ -419,7 +453,7 @@ namespace MPF.Processors.Test
|
||||
{
|
||||
string? expected = "8B62A812";
|
||||
string? log = Path.Combine(Environment.CurrentDirectory, "TestData", "XboxBackupCreator", "DVD", "log.txt");
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360, MediaType.DVD);
|
||||
var processor = new XboxBackupCreator(RedumpSystem.MicrosoftXbox360);
|
||||
string? actual = processor.GetMediaID(log);
|
||||
Assert.Equal(expected, actual);
|
||||
}
|
||||
|
||||
@@ -22,12 +22,35 @@ namespace MPF.Processors
|
||||
public sealed class Aaru : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Aaru(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public Aaru(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// If the filename is invalid
|
||||
if (string.IsNullOrEmpty(outputFilename))
|
||||
return null;
|
||||
|
||||
// Reassemble the base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
if (!string.IsNullOrEmpty(outputDirectory))
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
// Deserialize the sidecar, if possible
|
||||
var sidecar = GenerateSidecar($"{basePath}.cicm.xml");
|
||||
|
||||
// Extract the disc type strings, if possible
|
||||
if (GetDiscType(sidecar, out string? discType, out string? discSubType))
|
||||
return GetDiscTypeFromStrings(discType, discSubType);
|
||||
|
||||
// The type could not be determined
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// TODO: Fill in submission info specifics for Aaru
|
||||
var outputDirectory = Path.GetDirectoryName(basePath);
|
||||
@@ -36,10 +59,10 @@ namespace MPF.Processors
|
||||
info = Builder.EnsureAllSections(info);
|
||||
|
||||
// TODO: Determine if there's an Aaru version anywhere
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate(basePath + ".cicm.xml")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate($"{basePath}.cicm.xml")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// Deserialize the sidecar, if possible
|
||||
var sidecar = GenerateSidecar(basePath + ".cicm.xml");
|
||||
var sidecar = GenerateSidecar($"{basePath}.cicm.xml");
|
||||
|
||||
// Fill in the hardware data
|
||||
if (GetHardwareInfo(sidecar, out var manufacturer, out var model, out var firmware))
|
||||
@@ -63,31 +86,29 @@ namespace MPF.Processors
|
||||
info.DumpingInfo.ReportedDiscType = fullDiscType;
|
||||
}
|
||||
|
||||
// TODO: Re-enable once PVD generation / finding is fixed
|
||||
// Generate / obtain the PVD
|
||||
//info.Extras.PVD = GeneratePVD(sidecar) ?? "Disc has no PVD";
|
||||
|
||||
// Get the Datafile information
|
||||
var datafile = GenerateDatafile(sidecar, basePath);
|
||||
|
||||
// Fill in the hash data
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
switch (Type)
|
||||
// Get the error count
|
||||
long errorCount = GetErrorCount($"{basePath}.resume.xml");
|
||||
info.CommonDiscInfo!.ErrorsCount = (errorCount == -1 ? "Error retrieving error count" : errorCount.ToString());
|
||||
|
||||
// Get the write offset, if it exists
|
||||
string? writeOffset = GetWriteOffset(sidecar);
|
||||
info.CommonDiscInfo.RingWriteOffset = writeOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = writeOffset;
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (mediaType)
|
||||
{
|
||||
// TODO: Can this do GD-ROM?
|
||||
case MediaType.CDROM:
|
||||
// TODO: Re-enable once PVD generation / finding is fixed
|
||||
// Generate / obtain the PVD
|
||||
//info.Extras.PVD = GeneratePVD(sidecar) ?? "Disc has no PVD";
|
||||
|
||||
long errorCount = -1;
|
||||
if (File.Exists(basePath + ".resume.xml"))
|
||||
errorCount = GetErrorCount(basePath + ".resume.xml");
|
||||
|
||||
info.CommonDiscInfo!.ErrorsCount = (errorCount == -1 ? "Error retrieving error count" : errorCount.ToString());
|
||||
|
||||
info.TracksAndWriteOffsets.Cuesheet = GenerateCuesheet(sidecar, basePath) ?? string.Empty;
|
||||
|
||||
string cdWriteOffset = GetWriteOffset(sidecar) ?? string.Empty;
|
||||
info.CommonDiscInfo.RingWriteOffset = cdWriteOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = cdWriteOffset;
|
||||
break;
|
||||
|
||||
case MediaType.DVD:
|
||||
@@ -103,15 +124,12 @@ namespace MPF.Processors
|
||||
info.SizeAndChecksums.SHA1 = sha1;
|
||||
}
|
||||
|
||||
// TODO: Re-enable once PVD generation / finding is fixed
|
||||
// Generate / obtain the PVD
|
||||
//info.Extras.PVD = GeneratePVD(sidecar) ?? "Disc has no PVD";
|
||||
|
||||
// TODO: Sync layerbreak finding with other processors
|
||||
// Deal with the layerbreak
|
||||
string? layerbreak = null;
|
||||
if (Type == MediaType.DVD)
|
||||
if (mediaType == MediaType.DVD)
|
||||
layerbreak = GetLayerbreak(sidecar) ?? string.Empty;
|
||||
else if (Type == MediaType.BluRay)
|
||||
else if (mediaType == MediaType.BluRay)
|
||||
layerbreak = info.SizeAndChecksums!.Size > 25_025_314_816 ? "25025314816" : null;
|
||||
|
||||
// If we have a single-layer disc
|
||||
@@ -185,12 +203,12 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
return [
|
||||
@@ -391,7 +409,7 @@ namespace MPF.Processors
|
||||
cueSheet.Files = [.. cueFiles];
|
||||
if (cueSheet != null && cueSheet != default)
|
||||
{
|
||||
var ms = SabreTools.Serialization.Serializers.CueSheet.SerializeStream(cueSheet);
|
||||
var ms = new SabreTools.Serialization.Serializers.CueSheet().Serialize(cueSheet);
|
||||
if (ms == null)
|
||||
return null;
|
||||
|
||||
@@ -889,6 +907,156 @@ namespace MPF.Processors
|
||||
return !string.IsNullOrEmpty(discType) || !string.IsNullOrEmpty(discSubType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert the type and subtype to a media type, if possible
|
||||
/// </summary>
|
||||
/// <param name="discType">Disc type string to check</param>
|
||||
/// <param name="discSubType">Disc subtype string to check</param>
|
||||
/// <returns>Media type on success, null otherwise</returns>
|
||||
internal static MediaType? GetDiscTypeFromStrings(string? discType, string? discSubType)
|
||||
{
|
||||
return discType switch
|
||||
{
|
||||
"3\" floppy" => MediaType.FloppyDisk,
|
||||
"3.5\" floppy" => MediaType.FloppyDisk,
|
||||
"3.5\" magneto-optical" => MediaType.Floptical,
|
||||
"3.5\" SyQuest cartridge" => null,
|
||||
"3.9\" SyQuest cartridge" => null,
|
||||
"5.25\" floppy" => MediaType.FloppyDisk,
|
||||
"5.25\" magneto-optical" => MediaType.Floptical,
|
||||
"5.25\" SyQuest cartridge" => null,
|
||||
"8\" floppy" => MediaType.FloppyDisk,
|
||||
"300mm magneto optical" => MediaType.Floptical,
|
||||
"356mm magneto-optical" => MediaType.Floptical,
|
||||
"Advanced Digital Recording" => null,
|
||||
"Advanced Intelligent Tape" => null,
|
||||
"Archival Disc" => null,
|
||||
"BeeCard" => null,
|
||||
"Blu-ray" => discSubType switch
|
||||
{
|
||||
"Wii U Optical Disc" => MediaType.NintendoWiiUOpticalDisc,
|
||||
_ => MediaType.BluRay,
|
||||
},
|
||||
"Borsu" => null,
|
||||
"Compact Cassette" => MediaType.Cassette,
|
||||
"Compact Disc" => MediaType.CDROM,
|
||||
"Compact Flash" => MediaType.CompactFlash,
|
||||
"CompacTape" => null,
|
||||
"CRVdisc" => null,
|
||||
"Data8" => null,
|
||||
"DataPlay" => null,
|
||||
"DataStore" => null,
|
||||
"DDCD" => MediaType.CDROM,
|
||||
"DECtape" => null,
|
||||
"DemiDiskette" => null,
|
||||
"Digital Audio Tape" => null,
|
||||
"Digital Data Storage" => MediaType.DataCartridge,
|
||||
"Digital Linear Tape" => null,
|
||||
"DIR" => null,
|
||||
"DST" => null,
|
||||
"DTF" => null,
|
||||
"DTF2" => null,
|
||||
"DV tape" => null,
|
||||
"DVD" => discSubType switch
|
||||
{
|
||||
"GameCube Game Disc" => MediaType.NintendoGameCubeGameDisc,
|
||||
"Wii Optical Disc" => MediaType.NintendoWiiOpticalDisc,
|
||||
_ => MediaType.DVD,
|
||||
},
|
||||
"EVD" => null,
|
||||
"Exatape" => null,
|
||||
"Express Card" => null,
|
||||
"FDDVD" => null,
|
||||
"Flextra" => null,
|
||||
"Floptical" => MediaType.Floptical,
|
||||
"FVD" => null,
|
||||
"GD" => MediaType.GDROM,
|
||||
"Hard Disk Drive" => MediaType.HardDisk,
|
||||
"HD DVD" => MediaType.HDDVD,
|
||||
"HD VMD" => null,
|
||||
"HiFD" => MediaType.FloppyDisk,
|
||||
"HiTC" => null,
|
||||
"HuCard" => MediaType.Cartridge,
|
||||
"HVD" => null,
|
||||
"HyperFlex" => null,
|
||||
"IBM 3470" => null,
|
||||
"IBM 3480" => null,
|
||||
"IBM 3490" => null,
|
||||
"IBM 3490E" => null,
|
||||
"IBM 3592" => null,
|
||||
"Iomega Bernoulli Box" => MediaType.IomegaBernoulliDisk,
|
||||
"Iomega Bernoulli Box II" => MediaType.IomegaBernoulliDisk,
|
||||
"Iomega Ditto" => null,
|
||||
"Iomega Jaz" => MediaType.IomegaJaz,
|
||||
"Iomega PocketZip" => MediaType.IomegaZip,
|
||||
"Iomega REV" => null,
|
||||
"Iomega ZIP" => MediaType.IomegaZip,
|
||||
"Kodak Verbatim" => null,
|
||||
"LaserDisc" => MediaType.LaserDisc,
|
||||
"Linear Tape-Open" => null,
|
||||
"LT1" => null,
|
||||
"Magneto-optical" => MediaType.Floptical,
|
||||
"Memory Stick" => MediaType.SDCard,
|
||||
"MiniCard" => null,
|
||||
"MiniDisc" => null,
|
||||
"MultiMediaCard" => MediaType.SDCard,
|
||||
"Nintendo 3DS Game Card" => MediaType.Cartridge,
|
||||
"Nintendo 64 Disk" => MediaType.Nintendo64DD,
|
||||
"Nintendo 64 Game Pak" => MediaType.Cartridge,
|
||||
"Nintendo Disk Card" => MediaType.NintendoFamicomDiskSystem,
|
||||
"Nintendo DS Game Card" => MediaType.Cartridge,
|
||||
"Nintendo DSi Game Card" => MediaType.Cartridge,
|
||||
"Nintendo Entertainment System Game Pak" => MediaType.Cartridge,
|
||||
"Nintendo Famicom Game Pak" => MediaType.Cartridge,
|
||||
"Nintendo Game Boy Advance Game Pak" => MediaType.Cartridge,
|
||||
"Nintendo Game Boy Game Pak" => MediaType.Cartridge,
|
||||
"Nintendo Switch Game Card" => MediaType.Cartridge,
|
||||
"Optical Disc Archive" => null,
|
||||
"Orb" => null,
|
||||
"PCMCIA Card" => null,
|
||||
"PD650" => null,
|
||||
"PlayStation Memory Card" => null,
|
||||
"Quarter-inch cartridge" => MediaType.DataCartridge,
|
||||
"Quarter-inch mini cartridge" => MediaType.DataCartridge,
|
||||
"QuickDisk" => null,
|
||||
"RDX" => null,
|
||||
"SACD" => MediaType.DVD,
|
||||
"Scalable Linear Recording" => null,
|
||||
"Secure Digital" => MediaType.SDCard,
|
||||
"SmartMedia" => MediaType.SDCard,
|
||||
"Sony Professional Disc" => null,
|
||||
"Sony Professional Disc for DATA" => null,
|
||||
"STK 4480" => null,
|
||||
"STK 4490" => null,
|
||||
"STK 9490" => null,
|
||||
"STK T-9840" => null,
|
||||
"STK T-9940" => null,
|
||||
"STK T-10000" => null,
|
||||
"Super Advanced Intelligent Tape" => null,
|
||||
"Super Digital Linear Tape" => null,
|
||||
"Super Nintendo Game Pak" => MediaType.Cartridge,
|
||||
"Super Nintendo Game Pak (US)" => MediaType.Cartridge,
|
||||
"SuperDisk" => MediaType.FloppyDisk,
|
||||
"SVOD" => null,
|
||||
"Travan" => null,
|
||||
"UDO" => null,
|
||||
"UHD144" => null,
|
||||
"UMD" => MediaType.UMD,
|
||||
"Unknown" => null,
|
||||
"USB flash drive" => MediaType.FlashDrive,
|
||||
"VCDHD" => null,
|
||||
"VideoFloppy" => null,
|
||||
"VideoNow" => MediaType.CDROM,
|
||||
"VXA" => MediaType.FlashDrive,
|
||||
"Wafer" => null,
|
||||
"xD" => null,
|
||||
"XQD" => null,
|
||||
"Zoned Hard Disk Drive" => MediaType.HardDisk,
|
||||
"ZX Microdrive" => null,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the DVD protection information, if possible
|
||||
/// </summary>
|
||||
|
||||
@@ -5,6 +5,8 @@ using System.IO;
|
||||
using System.IO.Compression;
|
||||
#endif
|
||||
using System.Text;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
|
||||
namespace MPF.Processors
|
||||
@@ -23,42 +25,45 @@ namespace MPF.Processors
|
||||
/// </summary>
|
||||
public RedumpSystem? System { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Currently represented media type
|
||||
/// </summary>
|
||||
public MediaType? Type { get; private set; }
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Generate processor for a system and media type combination
|
||||
/// </summary>
|
||||
/// <param name="system">RedumpSystem value to use</param>
|
||||
/// <param name="type">MediaType value to use</param>
|
||||
public BaseProcessor(RedumpSystem? system, MediaType? type)
|
||||
public BaseProcessor(RedumpSystem? system)
|
||||
{
|
||||
System = system;
|
||||
Type = type;
|
||||
}
|
||||
|
||||
#region Abstract Methods
|
||||
|
||||
/// <summary>
|
||||
/// Determine the media type based on the provided files
|
||||
/// </summary>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>MediaType that was determined, if possible</returns>
|
||||
public abstract MediaType? DetermineMediaType(string? outputDirectory, string outputFilename);
|
||||
|
||||
/// <summary>
|
||||
/// Generate a SubmissionInfo for the output files
|
||||
/// </summary>
|
||||
/// <param name="submissionInfo">Base submission info to fill in specifics for</param>
|
||||
/// <param name="mediaType">Media type for specific information gathering</param>
|
||||
/// <param name="basePath">Base filename and path to use for checking</param>
|
||||
/// <param name="redumpCompat">Determines if outputs are processed according to Redump specifications</param>
|
||||
public abstract void GenerateSubmissionInfo(SubmissionInfo submissionInfo, string basePath, bool redumpCompat);
|
||||
public abstract void GenerateSubmissionInfo(SubmissionInfo submissionInfo, MediaType? mediaType, string basePath, bool redumpCompat);
|
||||
|
||||
// <summary>
|
||||
/// Generate a list of all output files generated
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>List of all output files, empty otherwise</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
internal abstract List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename);
|
||||
internal abstract List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename);
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -67,13 +72,18 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Compress log files to save space
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <param name="filenameSuffix">Output filename to use as the base path</param>
|
||||
/// <param name="processor">Processor object representing how to process the outputs</param>
|
||||
/// <returns>True if the process succeeded, false otherwise</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
public bool CompressLogFiles(string? outputDirectory, string outputFilename, string? filenameSuffix, out string status)
|
||||
public bool CompressLogFiles(MediaType? mediaType,
|
||||
string? outputDirectory,
|
||||
string outputFilename,
|
||||
string? filenameSuffix,
|
||||
out string status)
|
||||
{
|
||||
#if NET20 || NET35 || NET40
|
||||
status = "Log compression is not available for this framework version";
|
||||
@@ -88,7 +98,7 @@ namespace MPF.Processors
|
||||
string archiveName = $"{basePath}_logs.zip";
|
||||
|
||||
// Get the lists of zippable files
|
||||
var zippableFiles = GetZippableFilePaths(outputDirectory, outputFilename);
|
||||
var zippableFiles = GetZippableFilePaths(mediaType, outputDirectory, outputFilename);
|
||||
var generatedFiles = GetGeneratedFilePaths(outputDirectory, filenameSuffix);
|
||||
|
||||
// Don't create an archive if there are no paths
|
||||
@@ -137,15 +147,19 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Compress log files to save space
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <param name="processor">Processor object representing how to process the outputs</param>
|
||||
/// <returns>True if the process succeeded, false otherwise</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
public bool DeleteUnnecessaryFiles(string? outputDirectory, string outputFilename, out string status)
|
||||
public bool DeleteUnnecessaryFiles(MediaType? mediaType,
|
||||
string? outputDirectory,
|
||||
string outputFilename,
|
||||
out string status)
|
||||
{
|
||||
// Get the list of deleteable files from the parameters object
|
||||
var files = GetDeleteableFilePaths(outputDirectory, outputFilename);
|
||||
var files = GetDeleteableFilePaths(mediaType, outputDirectory, outputFilename);
|
||||
|
||||
if (files.Count == 0)
|
||||
{
|
||||
@@ -170,11 +184,12 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Ensures that all required output files have been created
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>A list representing missing files, empty if none</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
public List<string> FoundAllFiles(string? outputDirectory, string outputFilename)
|
||||
public List<string> FoundAllFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Assemble a base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
@@ -182,7 +197,7 @@ namespace MPF.Processors
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
// Get the list of output files
|
||||
var outputFiles = GetOutputFiles(outputDirectory, outputFilename);
|
||||
var outputFiles = GetOutputFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (outputFiles.Count == 0)
|
||||
return ["Media and system combination not supported"];
|
||||
|
||||
@@ -250,11 +265,12 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Ensures that no potential output files have been created
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>True if any dumping files exist, False if none</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
public bool FoundAnyFiles(string? outputDirectory, string outputFilename)
|
||||
public bool FoundAnyFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Assemble a base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
@@ -262,7 +278,7 @@ namespace MPF.Processors
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
// Get the list of output files
|
||||
var outputFiles = GetOutputFiles(outputDirectory, outputFilename);
|
||||
var outputFiles = GetOutputFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (outputFiles.Count == 0)
|
||||
return false;
|
||||
|
||||
@@ -284,53 +300,62 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Generate artifacts and return them as a dictionary
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>Dictiionary of artifact keys to Base64-encoded values, if possible</param>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
public Dictionary<string, string> GenerateArtifacts(string? outputDirectory, string outputFilename)
|
||||
public Dictionary<string, string> GenerateArtifacts(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Get the list of output files
|
||||
var outputFiles = GetOutputFiles(outputDirectory, outputFilename);
|
||||
var outputFiles = GetOutputFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (outputFiles.Count == 0)
|
||||
return [];
|
||||
|
||||
// Create the artifacts dictionary
|
||||
var artifacts = new Dictionary<string, string>();
|
||||
|
||||
// Only try to create artifacts for files that exist
|
||||
foreach (var outputFile in outputFiles)
|
||||
try
|
||||
{
|
||||
// Skip non-artifact files
|
||||
if (!outputFile.IsArtifact || outputFile.ArtifactKey == null)
|
||||
continue;
|
||||
// Create the artifacts dictionary
|
||||
var artifacts = new Dictionary<string, string>();
|
||||
|
||||
// Skip non-existent files
|
||||
if (!outputFile.Exists(outputDirectory ?? string.Empty))
|
||||
continue;
|
||||
|
||||
// Skip non-existent files
|
||||
foreach (var filePath in outputFile.GetPaths(outputDirectory ?? string.Empty))
|
||||
// Only try to create artifacts for files that exist
|
||||
foreach (var outputFile in outputFiles)
|
||||
{
|
||||
// Get binary artifacts as a byte array
|
||||
if (outputFile.IsBinaryArtifact)
|
||||
{
|
||||
byte[] data = File.ReadAllBytes(filePath);
|
||||
string str = Convert.ToBase64String(data);
|
||||
artifacts[outputFile.ArtifactKey] = str;
|
||||
}
|
||||
else
|
||||
{
|
||||
string? data = ProcessingTool.GetFullFile(filePath);
|
||||
string str = ProcessingTool.GetBase64(data) ?? string.Empty;
|
||||
artifacts[outputFile.ArtifactKey] = str;
|
||||
}
|
||||
// Skip non-artifact files
|
||||
if (!outputFile.IsArtifact || outputFile.ArtifactKey == null)
|
||||
continue;
|
||||
|
||||
break;
|
||||
// Skip non-existent files
|
||||
if (!outputFile.Exists(outputDirectory ?? string.Empty))
|
||||
continue;
|
||||
|
||||
// Skip non-existent files
|
||||
foreach (var filePath in outputFile.GetPaths(outputDirectory ?? string.Empty))
|
||||
{
|
||||
// Get binary artifacts as a byte array
|
||||
if (outputFile.IsBinaryArtifact)
|
||||
{
|
||||
byte[] data = File.ReadAllBytes(filePath);
|
||||
string str = Convert.ToBase64String(data);
|
||||
artifacts[outputFile.ArtifactKey] = str;
|
||||
}
|
||||
else
|
||||
{
|
||||
string? data = ProcessingTool.GetFullFile(filePath);
|
||||
string str = ProcessingTool.GetBase64(data) ?? string.Empty;
|
||||
artifacts[outputFile.ArtifactKey] = str;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return artifacts;
|
||||
return artifacts;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Any issues shouldn't stop processing
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
#if NET452_OR_GREATER || NETCOREAPP
|
||||
@@ -407,14 +432,15 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Generate a list of all deleteable file paths
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>List of all deleteable file paths, empty otherwise</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
internal List<string> GetDeleteableFilePaths(string? outputDirectory, string outputFilename)
|
||||
internal List<string> GetDeleteableFilePaths(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Get the list of output files
|
||||
var outputFiles = GetOutputFiles(outputDirectory, outputFilename);
|
||||
var outputFiles = GetOutputFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (outputFiles.Count == 0)
|
||||
return [];
|
||||
|
||||
@@ -490,14 +516,15 @@ namespace MPF.Processors
|
||||
/// <summary>
|
||||
/// Generate a list of all zippable file paths
|
||||
/// </summary>
|
||||
/// <param name="mediaType">Media type for controlling expected file sets</param>
|
||||
/// <param name="outputDirectory">Output folder to use as the base path</param>
|
||||
/// <param name="outputFilename">Output filename to use as the base path</param>
|
||||
/// <returns>List of all zippable file paths, empty otherwise</returns>
|
||||
/// <remarks>Assumes filename has an extension</remarks>
|
||||
internal List<string> GetZippableFilePaths(string? outputDirectory, string outputFilename)
|
||||
internal List<string> GetZippableFilePaths(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Get the list of output files
|
||||
var outputFiles = GetOutputFiles(outputDirectory, outputFilename);
|
||||
var outputFiles = GetOutputFiles(mediaType, outputDirectory, outputFilename);
|
||||
if (outputFiles.Count == 0)
|
||||
return [];
|
||||
|
||||
@@ -520,6 +547,38 @@ namespace MPF.Processors
|
||||
|
||||
#region Shared Methods
|
||||
|
||||
/// <summary>
|
||||
/// Generate a CMP XML datfile string based on a single input file
|
||||
/// </summary>
|
||||
/// <param name="file">File to generate a datfile for</param>
|
||||
/// <returns>Datafile containing the hash information, null on error</returns>
|
||||
internal static Datafile? GenerateDatafile(string file)
|
||||
{
|
||||
// If the file is invalid
|
||||
if (string.IsNullOrEmpty(file))
|
||||
return null;
|
||||
if (!File.Exists(file))
|
||||
return null;
|
||||
|
||||
// Attempt to get the hashes
|
||||
if (!HashTool.GetStandardHashes(file, out long size, out var crc32, out var md5, out var sha1))
|
||||
return null;
|
||||
|
||||
// Generate and return the Datafile
|
||||
var rom = new Rom
|
||||
{
|
||||
Name = string.Empty,
|
||||
Size = size.ToString(),
|
||||
CRC = crc32,
|
||||
MD5 = md5,
|
||||
SHA1 = sha1,
|
||||
};
|
||||
var game = new Game { Rom = [rom] };
|
||||
var datafile = new Datafile { Game = [game] };
|
||||
|
||||
return datafile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the hex contents of the PIC file
|
||||
/// </summary>
|
||||
@@ -527,8 +586,12 @@ namespace MPF.Processors
|
||||
/// <param name="trimLength">Number of characters to trim the PIC to, if -1, ignored</param>
|
||||
/// <returns>PIC data as a hex string if possible, null on error</returns>
|
||||
/// <remarks>https://stackoverflow.com/questions/9932096/add-separator-to-string-at-every-n-characters</remarks>
|
||||
internal static string? GetPIC(string picPath, int trimLength = -1)
|
||||
internal static string? GetPIC(string? picPath, int trimLength = -1)
|
||||
{
|
||||
// If the file is invalid
|
||||
if (picPath == null)
|
||||
return null;
|
||||
|
||||
// If the file doesn't exist, we can't get the info
|
||||
if (!File.Exists(picPath))
|
||||
return null;
|
||||
|
||||
@@ -14,21 +14,32 @@ namespace MPF.Processors
|
||||
public sealed class CleanRip : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public CleanRip(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public CleanRip(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
{
|
||||
return System switch
|
||||
{
|
||||
RedumpSystem.NintendoGameCube => MediaType.NintendoGameCubeGameDisc,
|
||||
RedumpSystem.NintendoWii => MediaType.NintendoWiiOpticalDisc,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
|
||||
// TODO: Determine if there's a CleanRip version anywhere
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate(basePath + "-dumpinfo.txt")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate($"{basePath}-dumpinfo.txt")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// Get the Datafile information
|
||||
var datafile = GenerateCleanripDatafile(basePath + ".iso", basePath + "-dumpinfo.txt");
|
||||
var datafile = GenerateCleanripDatafile($"{basePath}.iso", $"{basePath}-dumpinfo.txt");
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
// Get the individual hash data, as per internal
|
||||
@@ -44,56 +55,40 @@ namespace MPF.Processors
|
||||
info.SizeAndChecksums.Layerbreak = 2084960;
|
||||
}
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (Type)
|
||||
// Get BCA information, if available
|
||||
info.Extras!.BCA = GetBCA(basePath + $"{basePath}.bca");
|
||||
|
||||
// Get internal information
|
||||
if (GetGameCubeWiiInformation(basePath + $"{basePath}-dumpinfo.txt", out Region? region, out var version, out var internalName, out var serial))
|
||||
{
|
||||
case MediaType.DVD: // Only added here to help users; not strictly correct
|
||||
case MediaType.NintendoGameCubeGameDisc:
|
||||
case MediaType.NintendoWiiOpticalDisc:
|
||||
if (File.Exists(basePath + ".bca"))
|
||||
info.Extras!.BCA = GetBCA(basePath + ".bca");
|
||||
|
||||
if (GetGameCubeWiiInformation(basePath + "-dumpinfo.txt", out Region? gcRegion, out var gcVersion, out var gcName, out var gcSerial))
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalName] = gcName ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = gcSerial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
info.VersionAndEditions!.Version = gcVersion ?? info.VersionAndEditions.Version;
|
||||
info.CommonDiscInfo.Region = gcRegion ?? info.CommonDiscInfo.Region;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalName] = internalName ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
info.VersionAndEditions!.Version = version ?? info.VersionAndEditions.Version;
|
||||
info.CommonDiscInfo.Region = region ?? info.CommonDiscInfo.Region;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case MediaType.DVD: // Only added here to help users; not strictly correct
|
||||
case MediaType.NintendoGameCubeGameDisc:
|
||||
case MediaType.NintendoWiiOpticalDisc:
|
||||
return [
|
||||
new($"{outputFilename}.bca", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"bca"),
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
return [
|
||||
new($"{outputFilename}.bca", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"bca"),
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
|
||||
new($"{outputFilename}-dumpinfo.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"dumpinfo"),
|
||||
];
|
||||
}
|
||||
|
||||
return [];
|
||||
new($"{outputFilename}-dumpinfo.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"dumpinfo"),
|
||||
];
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -63,15 +63,92 @@ namespace MPF.Processors
|
||||
public sealed class DiscImageCreator : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public DiscImageCreator(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public DiscImageCreator(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
{
|
||||
var outputDirectory = Path.GetDirectoryName(basePath);
|
||||
// If the filename is invalid
|
||||
if (string.IsNullOrEmpty(outputFilename))
|
||||
return null;
|
||||
|
||||
// Reassemble the base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
if (!string.IsNullOrEmpty(outputDirectory))
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
// Get the comma-separated list of values
|
||||
if (GetDiscType($"{basePath}_disc.txt", out var discType) && discType != null)
|
||||
{
|
||||
// CD-ROM
|
||||
if (discType.Contains("CD-DA or CD-ROM Disc"))
|
||||
return MediaType.CDROM;
|
||||
else if (discType.Contains("CD-I Disc"))
|
||||
return MediaType.CDROM;
|
||||
else if (discType.Contains("CD-ROM XA Disc"))
|
||||
return MediaType.CDROM;
|
||||
|
||||
// HD-DVD
|
||||
if (discType.Contains("HD DVD-ROM"))
|
||||
return MediaType.HDDVD;
|
||||
else if (discType.Contains("HD DVD-RAM"))
|
||||
return MediaType.HDDVD;
|
||||
else if (discType.Contains("HD DVD-R"))
|
||||
return MediaType.HDDVD;
|
||||
|
||||
// DVD
|
||||
if (discType.Contains("DVD-ROM"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD-RAM"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD-R"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD-RW"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("Reserved1"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("Reserved2"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD+RW"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD+R"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("Reserved3"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("Reserved4"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD+RW DL"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("DVD+R DL"))
|
||||
return MediaType.DVD;
|
||||
else if (discType.Contains("Reserved5"))
|
||||
return MediaType.NintendoWiiOpticalDisc;
|
||||
|
||||
// Blu-ray
|
||||
if (discType.Contains("BDO"))
|
||||
return MediaType.BluRay;
|
||||
else if (discType.Contains("BDU"))
|
||||
return MediaType.BluRay;
|
||||
else if (discType.Contains("BDW"))
|
||||
return MediaType.BluRay;
|
||||
else if (discType.Contains("BDR"))
|
||||
return MediaType.BluRay;
|
||||
else if (discType.Contains("XG4"))
|
||||
return MediaType.BluRay;
|
||||
|
||||
// Assume CD-ROM for everything else
|
||||
return MediaType.CDROM;
|
||||
}
|
||||
|
||||
// The type could not be determined
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
|
||||
@@ -94,25 +171,36 @@ namespace MPF.Processors
|
||||
if (GetDiscType($"{basePath}_disc.txt", out var discTypeOrBookType))
|
||||
info.DumpingInfo.ReportedDiscType = discTypeOrBookType;
|
||||
|
||||
// Get the PVD, if it exists
|
||||
info.Extras!.PVD = GetPVD($"{basePath}_mainInfo.txt") ?? "Disc has no PVD";
|
||||
|
||||
// Get the Datafile information
|
||||
var datafile = ProcessingTool.GetDatafile($"{basePath}.dat");
|
||||
|
||||
// Fill in the hash data
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
// Get the write offset, if it exists
|
||||
string? writeOffset = GetWriteOffset($"{basePath}_disc.txt");
|
||||
info.CommonDiscInfo!.RingWriteOffset = writeOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = writeOffset;
|
||||
|
||||
// Attempt to get multisession data
|
||||
string? multiSessionInfo = GetMultisessionInformation($"{basePath}_disc.txt");
|
||||
if (!string.IsNullOrEmpty(multiSessionInfo))
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = multiSessionInfo!;
|
||||
|
||||
// Fill in the volume labels
|
||||
if (GetVolumeLabels($"{basePath}_volDesc.txt", out var volLabels))
|
||||
VolumeLabels = volLabels;
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (Type)
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
case MediaType.GDROM: // TODO: Verify GD-ROM outputs this
|
||||
info.Extras!.PVD = GetPVD($"{basePath}_mainInfo.txt") ?? "Disc has no PVD";
|
||||
info.TracksAndWriteOffsets.Cuesheet = ProcessingTool.GetFullFile($"{basePath}.cue") ?? string.Empty;
|
||||
|
||||
// Audio-only discs will fail if there are any C2 errors, so they would never get here
|
||||
if (System.IsAudio())
|
||||
if (IsAudio(info.TracksAndWriteOffsets.Cuesheet))
|
||||
{
|
||||
info.CommonDiscInfo!.ErrorsCount = "0";
|
||||
}
|
||||
@@ -127,19 +215,6 @@ namespace MPF.Processors
|
||||
info.CommonDiscInfo!.ErrorsCount = (errorCount == -1 ? "Error retrieving error count" : errorCount.ToString());
|
||||
}
|
||||
|
||||
info.TracksAndWriteOffsets.Cuesheet = ProcessingTool.GetFullFile($"{basePath}.cue") ?? string.Empty;
|
||||
//var cueSheet = new CueSheet($"{basePath}.cue"); // TODO: Do something with this
|
||||
|
||||
// Attempt to get the write offset
|
||||
string cdWriteOffset = GetWriteOffset($"{basePath}_disc.txt") ?? string.Empty;
|
||||
info.CommonDiscInfo.RingWriteOffset = cdWriteOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = cdWriteOffset;
|
||||
|
||||
// Attempt to get multisession data
|
||||
string cdMultiSessionInfo = GetMultisessionInformation($"{basePath}_disc.txt") ?? string.Empty;
|
||||
if (!string.IsNullOrEmpty(cdMultiSessionInfo))
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = cdMultiSessionInfo;
|
||||
|
||||
break;
|
||||
|
||||
case MediaType.DVD:
|
||||
@@ -156,12 +231,12 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
// Deal with the layerbreaks
|
||||
if (Type == MediaType.DVD)
|
||||
if (mediaType == MediaType.DVD)
|
||||
{
|
||||
string layerbreak = GetLayerbreak($"{basePath}_disc.txt", System.IsXGD()) ?? string.Empty;
|
||||
info.SizeAndChecksums!.Layerbreak = !string.IsNullOrEmpty(layerbreak) ? long.Parse(layerbreak) : default;
|
||||
}
|
||||
else if (Type == MediaType.BluRay)
|
||||
else if (mediaType == MediaType.BluRay)
|
||||
{
|
||||
var di = ProcessingTool.GetDiscInformation($"{basePath}_PIC.bin");
|
||||
info.SizeAndChecksums!.PICIdentifier = ProcessingTool.GetPICIdentifier(di);
|
||||
@@ -178,11 +253,8 @@ namespace MPF.Processors
|
||||
}
|
||||
}
|
||||
|
||||
// Read the PVD
|
||||
info.Extras!.PVD = GetPVD($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
// Bluray-specific options
|
||||
if (Type == MediaType.BluRay)
|
||||
if (mediaType == MediaType.BluRay)
|
||||
{
|
||||
int trimLength = -1;
|
||||
switch (System)
|
||||
@@ -217,7 +289,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyElectronicBook:
|
||||
info.CopyProtection!.SecuROMData = GetSecuROMData($"{basePath}_subIntention.txt", out SecuROMScheme secuROMScheme) ?? string.Empty;
|
||||
if (secuROMScheme == SecuROMScheme.Unknown)
|
||||
info.CommonDiscInfo!.Comments = "Warning: Incorrect SecuROM sector count" + Environment.NewLine;
|
||||
info.CommonDiscInfo!.Comments = $"Warning: Incorrect SecuROM sector count{Environment.NewLine}";
|
||||
|
||||
// Needed for some odd copy protections
|
||||
info.CopyProtection!.Protection = GetDVDProtection($"{basePath}_CSSKey.txt", $"{basePath}_disc.txt", false) ?? string.Empty;
|
||||
@@ -322,7 +394,7 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.NamcoSegaNintendoTriforce:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetSegaHeader($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
@@ -361,7 +433,7 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaChihiro:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetSegaHeader($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
@@ -384,7 +456,7 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaDreamcast:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetSegaHeader($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
@@ -407,7 +479,7 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaNaomi:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetSegaHeader($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
@@ -430,7 +502,7 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaNaomi2:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetSegaHeader($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
@@ -497,12 +569,12 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
return [
|
||||
@@ -518,13 +590,10 @@ namespace MPF.Processors
|
||||
| OutputFileFlags.Zippable),
|
||||
new($"{outputFilename}.img", OutputFileFlags.Required
|
||||
| OutputFileFlags.Deleteable),
|
||||
new([$"{outputFilename}.img_EdcEcc.txt", $"{outputFilename}.img_EccEdc.txt"], System.IsAudio()
|
||||
? OutputFileFlags.Artifact | OutputFileFlags.Zippable
|
||||
: OutputFileFlags.Required | OutputFileFlags.Artifact | OutputFileFlags.Zippable,
|
||||
new([$"{outputFilename}.img_EdcEcc.txt", $"{outputFilename}.img_EccEdc.txt"], OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"img_edcecc"),
|
||||
new([$"{outputFilename}.scm", $"{outputFilename}.scmtmp"], System.IsAudio()
|
||||
? OutputFileFlags.Deleteable
|
||||
: OutputFileFlags.Required | OutputFileFlags.Deleteable),
|
||||
new([$"{outputFilename}.scm", $"{outputFilename}.scmtmp"], OutputFileFlags.Deleteable),
|
||||
new([$"{outputFilename}.sub", $"{outputFilename}.subtmp"], OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
@@ -2107,7 +2176,7 @@ namespace MPF.Processors
|
||||
#endif
|
||||
|
||||
// Now that we're at the offsets, attempt to get the sample offset
|
||||
return string.Join("; ", [.. offsets]);
|
||||
return offsets.Count == 0 ? null : string.Join("; ", [.. offsets]);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -14,12 +14,18 @@ namespace MPF.Processors
|
||||
public sealed class Generic : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Generic(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public Generic(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
@@ -34,7 +40,7 @@ namespace MPF.Processors
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (Type)
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
case MediaType.GDROM:
|
||||
@@ -62,7 +68,7 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
<WarningsNotAsErrors>NU5104</WarningsNotAsErrors>
|
||||
|
||||
<!-- Package Properties -->
|
||||
@@ -33,13 +33,14 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.Hashing" Version="1.4.2" />
|
||||
<PackageReference Include="SabreTools.Models" Version="1.5.8" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="SabreTools.Serialization" Version="1.8.6" />
|
||||
<PackageReference Include="SabreTools.Hashing" Version="1.5.0" />
|
||||
<PackageReference Include="SabreTools.IO" Version="1.7.5" />
|
||||
<PackageReference Include="SabreTools.Models" Version="1.7.2" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
<PackageReference Include="SabreTools.Serialization" Version="1.9.6" />
|
||||
<PackageReference Include="System.IO.Compression" Version="4.3.0" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`))" />
|
||||
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.4" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.9" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.RedumpLib;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
@@ -13,12 +12,16 @@ namespace MPF.Processors
|
||||
public sealed class PS3CFW : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public PS3CFW(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public PS3CFW(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
=> MediaType.BluRay;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
@@ -34,9 +37,7 @@ namespace MPF.Processors
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate(isoPath)?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// Get the Datafile information
|
||||
Datafile? datafile = GeneratePS3CFWDatafile(isoPath);
|
||||
|
||||
// Fill in the hash data
|
||||
Datafile? datafile = GenerateDatafile(isoPath);
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
// Get the individual hash data, as per internal
|
||||
@@ -76,22 +77,50 @@ namespace MPF.Processors
|
||||
if (!string.IsNullOrEmpty(getKeyPath))
|
||||
info.DumpingInfo.DumpingDate = ProcessingTool.GetFileModifiedDate(getKeyPath)?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// TODO: Put info about abnormal PIC info beyond 132 bytes in comments?
|
||||
// Try to determine the name of the PIC
|
||||
string? picPath = null;
|
||||
if (File.Exists($"{basePath}.disc.pic"))
|
||||
{
|
||||
info.Extras!.PIC = GetPIC($"{basePath}.disc.pic", 264);
|
||||
picPath = $"{basePath}.disc.pic";
|
||||
}
|
||||
else if (File.Exists(Path.Combine(baseDir, "disc.pic")))
|
||||
{
|
||||
info.Extras!.PIC = GetPIC(Path.Combine(baseDir, "disc.pic"), 264);
|
||||
picPath = Path.Combine(baseDir, "disc.pic");
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] discPicFiles = Directory.GetFiles(baseDir, "*.disc.pic");
|
||||
if (discPicFiles.Length > 0)
|
||||
info.Extras!.PIC = GetPIC(discPicFiles[0], 264);
|
||||
picPath = discPicFiles[0];
|
||||
}
|
||||
|
||||
// Get the layerbreak information from the PIC
|
||||
var di = ProcessingTool.GetDiscInformation(picPath);
|
||||
info.SizeAndChecksums!.PICIdentifier = ProcessingTool.GetPICIdentifier(di);
|
||||
if (ProcessingTool.GetLayerbreaks(di, out long? layerbreak1, out long? layerbreak2, out long? layerbreak3))
|
||||
{
|
||||
if (layerbreak1 != null && layerbreak1 * 2048 < info.SizeAndChecksums.Size)
|
||||
info.SizeAndChecksums.Layerbreak = layerbreak1.Value;
|
||||
|
||||
if (layerbreak2 != null && layerbreak2 * 2048 < info.SizeAndChecksums.Size)
|
||||
info.SizeAndChecksums.Layerbreak2 = layerbreak2.Value;
|
||||
|
||||
if (layerbreak3 != null && layerbreak3 * 2048 < info.SizeAndChecksums.Size)
|
||||
info.SizeAndChecksums.Layerbreak3 = layerbreak3.Value;
|
||||
}
|
||||
|
||||
// Set the trim length based on the layer count
|
||||
int trimLength;
|
||||
if (info.SizeAndChecksums!.Layerbreak3 != default)
|
||||
trimLength = 520;
|
||||
else if (info.SizeAndChecksums!.Layerbreak2 != default)
|
||||
trimLength = 392;
|
||||
else
|
||||
trimLength = 264;
|
||||
|
||||
// TODO: Put info about abnormal PIC info beyond 132 bytes in comments?
|
||||
info.Extras!.PIC = GetPIC(picPath, trimLength);
|
||||
|
||||
// Parse Disc Key, Disc ID, and PIC from the getkey.log file
|
||||
if (ProcessingTool.ParseGetKeyLog(getKeyPath, out string? key, out string? id, out string? pic))
|
||||
{
|
||||
@@ -105,64 +134,23 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case MediaType.BluRay:
|
||||
return [
|
||||
new([$"{outputFilename}.iso", $"{outputFilename}.ISO"], OutputFileFlags.Required),
|
||||
new([$"{outputFilename}.cue", $"{outputFilename}.CUE"], OutputFileFlags.Zippable),
|
||||
new RegexOutputFile($"getkey\\.log$", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"getkey_log"),
|
||||
new RegexOutputFile($"disc\\.pic$", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"disc_pic"),
|
||||
];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Information Extraction Methods
|
||||
|
||||
/// <summary>
|
||||
/// Get a formatted datfile from the PS3 CFW output, if possible
|
||||
/// </summary>
|
||||
/// <param name="iso">Path to ISO file</param>
|
||||
/// <returns></returns>
|
||||
internal static Datafile? GeneratePS3CFWDatafile(string iso)
|
||||
{
|
||||
// If the ISO file doesn't exist
|
||||
if (string.IsNullOrEmpty(iso))
|
||||
return null;
|
||||
if (!File.Exists(iso))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
if (HashTool.GetStandardHashes(iso, out long size, out string? crc, out string? md5, out string? sha1))
|
||||
{
|
||||
return new Datafile
|
||||
{
|
||||
Game = [new Game { Rom = [new Rom { Name = Path.GetFileName(iso), Size = size.ToString(), CRC = crc, MD5 = md5, SHA1 = sha1 }] }]
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// We don't care what the exception is right now
|
||||
return null;
|
||||
}
|
||||
return [
|
||||
new([$"{outputFilename}.iso", $"{outputFilename}.ISO"], OutputFileFlags.Required),
|
||||
new([$"{outputFilename}.cue", $"{outputFilename}.CUE"], OutputFileFlags.Zippable),
|
||||
new RegexOutputFile($"getkey\\.log$", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"getkey_log"),
|
||||
new RegexOutputFile($"disc\\.pic$", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"disc_pic"),
|
||||
];
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -10,7 +10,6 @@ using System.Xml.Schema;
|
||||
using System.Xml.Serialization;
|
||||
using SabreTools.Hashing;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Matching;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.Models.PIC;
|
||||
using SabreTools.RedumpLib.Data;
|
||||
@@ -129,11 +128,11 @@ namespace MPF.Processors
|
||||
/// <param name="pic">Path to a PIC.bin file</param>
|
||||
/// <returns>Filled DiscInformation on success, null on error</returns>
|
||||
/// <remarks>This omits the emergency brake information, if it exists</remarks>
|
||||
public static DiscInformation? GetDiscInformation(string pic)
|
||||
public static DiscInformation? GetDiscInformation(string? pic)
|
||||
{
|
||||
try
|
||||
{
|
||||
return SabreTools.Serialization.Deserializers.PIC.DeserializeFile(pic);
|
||||
return new SabreTools.Serialization.Deserializers.PIC().Deserialize(pic);
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -375,9 +374,9 @@ namespace MPF.Processors
|
||||
{
|
||||
return category?.ToLowerInvariant() switch
|
||||
{
|
||||
"game" => DiscCategory.Games,
|
||||
"video" => DiscCategory.Video,
|
||||
"audio" => DiscCategory.Audio,
|
||||
"(game)" => DiscCategory.Games,
|
||||
"(video)" => DiscCategory.Video,
|
||||
"(audio)" => DiscCategory.Audio,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
@@ -1074,7 +1073,7 @@ namespace MPF.Processors
|
||||
// Only continue to check SSv2 for XGD3
|
||||
if (xgdType != 3)
|
||||
return true;
|
||||
|
||||
|
||||
// Determine if XGD3 SS.bin is SSv1 (Original Kreon) or SSv2 (0800 / Repaired Kreon)
|
||||
#if NET20
|
||||
var checkArr = new byte[72];
|
||||
@@ -1085,6 +1084,67 @@ namespace MPF.Processors
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determine if a given SS.bin is valid but contains zeroed challenge responses
|
||||
/// </summary>
|
||||
/// <param name="ssPath">Path to the SS file to check</param>
|
||||
/// <returns>True if valid but partial SS.bin, false otherwise</returns>
|
||||
public static bool IsValidPartialSS(string ssPath)
|
||||
{
|
||||
if (!File.Exists(ssPath))
|
||||
return false;
|
||||
|
||||
byte[] ss = File.ReadAllBytes(ssPath);
|
||||
if (ss.Length != 2048)
|
||||
return false;
|
||||
|
||||
return IsValidPartialSS(ss);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determine if a given SS is valid but contains zeroed challenge responses
|
||||
/// </summary>
|
||||
/// <param name="ss">Byte array of SS sector</param>
|
||||
/// <returns>True if SS is a valid but partial SS, false otherwise</returns>
|
||||
public static bool IsValidPartialSS(byte[] ss)
|
||||
{
|
||||
// Check 1 sector long
|
||||
if (ss.Length != 2048)
|
||||
return false;
|
||||
|
||||
// Must be a valid XGD type
|
||||
if (!GetXGDType(ss, out int xgdType))
|
||||
return false;
|
||||
|
||||
// Determine challenge table offset, XGD1 is never partial
|
||||
int ccrt_offset = 0;
|
||||
if (xgdType == 1)
|
||||
return false;
|
||||
else if (xgdType == 2)
|
||||
ccrt_offset = 0x200;
|
||||
else if (xgdType == 3)
|
||||
ccrt_offset = 0x20;
|
||||
|
||||
int[] entry_offsets = { 0, 9, 18, 27, 36, 45, 54, 63 };
|
||||
int[] entry_lengths = { 8, 8, 8, 8, 4, 4, 4, 4 };
|
||||
for (int i = 0; i < entry_offsets.Length; i++)
|
||||
{
|
||||
bool emptyResponse = true;
|
||||
for (int b = 0; b < entry_lengths[i]; b++)
|
||||
{
|
||||
if (ss[ccrt_offset + entry_offsets[i] + b] != 0x00)
|
||||
{
|
||||
emptyResponse = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (emptyResponse)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determine if a given SS has already been cleaned
|
||||
/// </summary>
|
||||
@@ -1228,7 +1288,7 @@ namespace MPF.Processors
|
||||
// Determine XGD type
|
||||
if (!GetXGDType(ss, out int xgdType))
|
||||
return false;
|
||||
|
||||
|
||||
// Determine if XGD3 SS.bin is SSv1 (Original Kreon) or SSv2 (0800 / Repaired Kreon)
|
||||
#if NET20
|
||||
var checkArr = new byte[72];
|
||||
@@ -1239,7 +1299,7 @@ namespace MPF.Processors
|
||||
#endif
|
||||
|
||||
// Do not produce an SS hash for bad SS (SSv1 XGD3 / Unrepaired Kreon SS)
|
||||
if(xgdType == 3 && !ssv2)
|
||||
if (xgdType == 3 && !ssv2)
|
||||
return false;
|
||||
|
||||
switch (xgdType)
|
||||
|
||||
@@ -18,15 +18,40 @@ namespace MPF.Processors
|
||||
public sealed class Redumper : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Redumper(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public Redumper(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// If the filename is invalid
|
||||
if (string.IsNullOrEmpty(outputFilename))
|
||||
return null;
|
||||
|
||||
// Reassemble the base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
if (!string.IsNullOrEmpty(outputDirectory))
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
// Use the log first, if it exists
|
||||
if (GetDiscType($"{basePath}.log", out MediaType? mediaType))
|
||||
return mediaType;
|
||||
|
||||
// Use the profile for older Redumper versions
|
||||
if (GetDiscProfile($"{basePath}.log", out string? discProfile))
|
||||
return GetDiscTypeFromProfile(discProfile);
|
||||
|
||||
// The type could not be determined
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
info.CommonDiscInfo!.Comments = string.Empty;
|
||||
|
||||
// Get the dumping program and version
|
||||
info.DumpingInfo!.DumpingProgram ??= string.Empty;
|
||||
@@ -43,25 +68,41 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
// Fill in the disc type data
|
||||
if (GetDiscType($"{basePath}.log", out var discTypeOrBookType))
|
||||
if (GetDiscProfile($"{basePath}.log", out var discTypeOrBookType))
|
||||
info.DumpingInfo.ReportedDiscType = discTypeOrBookType;
|
||||
|
||||
// Fill in the volume labels
|
||||
if (GetVolumeLabels($"{basePath}.log", out var volLabels))
|
||||
VolumeLabels = volLabels;
|
||||
// Get the PVD, if it exists
|
||||
info.Extras!.PVD = GetPVD($"{basePath}.log") ?? "Disc has no PVD";
|
||||
string? sfsvd = GetSFSVD($"{basePath}.log");
|
||||
if (!string.IsNullOrEmpty(sfsvd))
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.HighSierraVolumeDescriptor] = sfsvd!;
|
||||
|
||||
switch (Type)
|
||||
// Get the Datafile information
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = GetDatfile($"{basePath}.log");
|
||||
|
||||
// Get the write offset, if it exists
|
||||
string? writeOffset = GetWriteOffset($"{basePath}.log");
|
||||
info.CommonDiscInfo.RingWriteOffset = writeOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = writeOffset;
|
||||
|
||||
// Attempt to get multisession data
|
||||
string? multiSessionInfo = GetMultisessionInformation($"{basePath}.log");
|
||||
if (!string.IsNullOrEmpty(multiSessionInfo))
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = multiSessionInfo!;
|
||||
|
||||
// Fill in the volume labels (ignore for Xbox/Xbox360)
|
||||
if (System != RedumpSystem.MicrosoftXbox && System != RedumpSystem.MicrosoftXbox360)
|
||||
{
|
||||
if (GetVolumeLabels($"{basePath}.log", out var volLabels))
|
||||
VolumeLabels = volLabels;
|
||||
}
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
info.Extras!.PVD = GetPVD($"{basePath}.log") ?? "Disc has no PVD";
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = GetDatfile($"{basePath}.log");
|
||||
info.TracksAndWriteOffsets.Cuesheet = ProcessingTool.GetFullFile($"{basePath}.cue") ?? string.Empty;
|
||||
|
||||
// Attempt to get the write offset
|
||||
string cdWriteOffset = GetWriteOffset($"{basePath}.log") ?? string.Empty;
|
||||
info.CommonDiscInfo!.RingWriteOffset = cdWriteOffset;
|
||||
info.TracksAndWriteOffsets.OtherWriteOffsets = cdWriteOffset;
|
||||
|
||||
// Attempt to get the error count
|
||||
if (GetErrorCount($"{basePath}.log", out long redumpErrors, out long c2Errors))
|
||||
{
|
||||
@@ -69,11 +110,6 @@ namespace MPF.Processors
|
||||
info.DumpingInfo.C2ErrorsCount = (c2Errors == -1 ? "Error retrieving error count" : c2Errors.ToString());
|
||||
}
|
||||
|
||||
// Attempt to get multisession data
|
||||
string? cdMultiSessionInfo = GetMultisessionInformation($"{basePath}.log");
|
||||
if (!string.IsNullOrEmpty(cdMultiSessionInfo))
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Multisession] = cdMultiSessionInfo!;
|
||||
|
||||
// Attempt to get extra metadata if it's an audio disc
|
||||
if (IsAudio(info.TracksAndWriteOffsets.Cuesheet))
|
||||
{
|
||||
@@ -95,9 +131,6 @@ namespace MPF.Processors
|
||||
case MediaType.NintendoGameCubeGameDisc:
|
||||
case MediaType.NintendoWiiOpticalDisc:
|
||||
case MediaType.NintendoWiiUOpticalDisc:
|
||||
info.Extras!.PVD = GetPVD($"{basePath}.log") ?? "Disc has no PVD";
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = GetDatfile($"{basePath}.log");
|
||||
|
||||
// Get the individual hash data, as per internal
|
||||
if (ProcessingTool.GetISOHashValues(info.TracksAndWriteOffsets.ClrMameProData, out long size, out var crc32, out var md5, out var sha1))
|
||||
{
|
||||
@@ -117,10 +150,10 @@ namespace MPF.Processors
|
||||
|
||||
// Attempt to get the error count
|
||||
long scsiErrors = GetSCSIErrorCount($"{basePath}.log");
|
||||
info.CommonDiscInfo!.ErrorsCount = (scsiErrors == -1 ? "Error retrieving error count" : scsiErrors.ToString());
|
||||
info.CommonDiscInfo.ErrorsCount = (scsiErrors == -1 ? "Error retrieving error count" : scsiErrors.ToString());
|
||||
|
||||
// Bluray-specific options
|
||||
if (Type == MediaType.BluRay || Type == MediaType.NintendoWiiUOpticalDisc)
|
||||
if (mediaType == MediaType.BluRay || mediaType == MediaType.NintendoWiiUOpticalDisc)
|
||||
{
|
||||
int trimLength = -1;
|
||||
switch (System)
|
||||
@@ -163,7 +196,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyElectronicBook:
|
||||
info.CopyProtection!.SecuROMData = GetSecuROMData($"{basePath}.log", out SecuROMScheme secuROMScheme) ?? string.Empty;
|
||||
if (secuROMScheme == SecuROMScheme.Unknown)
|
||||
info.CommonDiscInfo!.Comments = "Warning: Incorrect SecuROM sector count" + Environment.NewLine;
|
||||
info.CommonDiscInfo.Comments += $"Warning: Incorrect SecuROM sector count{Environment.NewLine}";
|
||||
|
||||
// Needed for some odd copy protections
|
||||
info.CopyProtection!.Protection += GetDVDProtection($"{basePath}.log", false) ?? string.Empty;
|
||||
@@ -177,7 +210,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.KonamiPython2:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out string? kp2EXEDate, out string? kp2Serial, out string? kp2Version))
|
||||
{
|
||||
info.CommonDiscInfo!.EXEDateBuildDate = kp2EXEDate;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = kp2EXEDate;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = kp2Serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = kp2Version ?? string.Empty;
|
||||
}
|
||||
@@ -185,46 +218,6 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.MicrosoftXbox:
|
||||
// If .dmi / .pfi / .ss don't already exist, create them
|
||||
if (!File.Exists($"{basePath}.dmi"))
|
||||
RemoveHeaderAndTrim($"{basePath}.manufacturer", $"{basePath}.dmi");
|
||||
if (!File.Exists($"{basePath}.pfi"))
|
||||
RemoveHeaderAndTrim($"{basePath}.physical", $"{basePath}.pfi");
|
||||
if (!File.Exists($"{basePath}.ss"))
|
||||
ProcessingTool.CleanSS($"{basePath}.security", $"{basePath}.ss");
|
||||
|
||||
string xmidString = ProcessingTool.GetXMID($"{basePath}.dmi");
|
||||
var xmid = SabreTools.Serialization.Wrappers.XMID.Create(xmidString);
|
||||
if (xmid != null)
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XMID] = xmidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xmid.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
info.VersionAndEditions!.Version = xmid.Version ?? string.Empty;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xmid.Model.RegionIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
string? dmi1Crc = HashTool.GetFileHash($"{basePath}.dmi", HashType.CRC32);
|
||||
if (dmi1Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.DMIHash] = dmi1Crc.ToUpperInvariant();
|
||||
string? pfi1Crc = HashTool.GetFileHash($"{basePath}.pfi", HashType.CRC32);
|
||||
if (pfi1Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.PFIHash] = pfi1Crc.ToUpperInvariant();
|
||||
if (ProcessingTool.IsValidSS($"{basePath}.ss"))
|
||||
{
|
||||
string? ss1Crc = HashTool.GetFileHash($"{basePath}.ss", HashType.CRC32);
|
||||
if (ss1Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.SSHash] = ss1Crc.ToUpperInvariant();
|
||||
}
|
||||
|
||||
string? ranges1 = ProcessingTool.GetSSRanges($"{basePath}.ss");
|
||||
if (!string.IsNullOrEmpty(ranges1))
|
||||
info.Extras!.SecuritySectorRanges = ranges1;
|
||||
|
||||
break;
|
||||
|
||||
case RedumpSystem.MicrosoftXbox360:
|
||||
// If .dmi / .pfi / .ss don't already exist, create them
|
||||
if (!File.Exists($"{basePath}.dmi"))
|
||||
@@ -234,46 +227,60 @@ namespace MPF.Processors
|
||||
if (!File.Exists($"{basePath}.ss"))
|
||||
ProcessingTool.CleanSS($"{basePath}.security", $"{basePath}.ss");
|
||||
|
||||
string xemidString = ProcessingTool.GetXeMID($"{basePath}.dmi");
|
||||
var xemid = SabreTools.Serialization.Wrappers.XeMID.Create(xemidString);
|
||||
if (xemid != null)
|
||||
string xmidString = ProcessingTool.GetXMID($"{basePath}.dmi").Trim('\0');
|
||||
if (!string.IsNullOrEmpty(xmidString))
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XeMID] = xemidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xemid.Serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.XMID] = xmidString;
|
||||
var xmid = SabreTools.Serialization.Wrappers.XMID.Create(xmidString);
|
||||
info.CommonDiscInfo.Serial = xmid?.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
info.VersionAndEditions!.Version = xemid.Version ?? string.Empty;
|
||||
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xemid.Model.RegionIdentifier);
|
||||
{
|
||||
info.VersionAndEditions!.Version = xmid?.Version ?? string.Empty;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xmid?.Model.RegionIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
string? dmi23Crc = HashTool.GetFileHash($"{basePath}.dmi", HashType.CRC32);
|
||||
if (dmi23Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.DMIHash] = dmi23Crc.ToUpperInvariant();
|
||||
string? pfi23Crc = HashTool.GetFileHash($"{basePath}.pfi", HashType.CRC32);
|
||||
if (pfi23Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.PFIHash] = pfi23Crc.ToUpperInvariant();
|
||||
if (ProcessingTool.IsValidSS($"{basePath}.ss"))
|
||||
string xemidString = ProcessingTool.GetXeMID($"{basePath}.dmi").Trim('\0');
|
||||
if (!string.IsNullOrEmpty(xemidString))
|
||||
{
|
||||
string? ss23Crc = HashTool.GetFileHash($"{basePath}.ss", HashType.CRC32);
|
||||
if (ss23Crc != null)
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.SSHash] = ss23Crc.ToUpperInvariant();
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.XeMID] = xemidString;
|
||||
var xemid = SabreTools.Serialization.Wrappers.XeMID.Create(xemidString);
|
||||
info.CommonDiscInfo.Serial = xemid?.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
info.VersionAndEditions!.Version = xemid?.Version ?? string.Empty;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xemid?.Model.RegionIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
string? ranges23 = ProcessingTool.GetSSRanges($"{basePath}.ss");
|
||||
if (!string.IsNullOrEmpty(ranges23))
|
||||
info.Extras!.SecuritySectorRanges = ranges23;
|
||||
string? dmiCrc = HashTool.GetFileHash($"{basePath}.dmi", HashType.CRC32);
|
||||
if (dmiCrc != null)
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.DMIHash] = dmiCrc.ToUpperInvariant();
|
||||
string? pfiCrc = HashTool.GetFileHash($"{basePath}.pfi", HashType.CRC32);
|
||||
if (pfiCrc != null)
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.PFIHash] = pfiCrc.ToUpperInvariant();
|
||||
if (ProcessingTool.IsValidSS($"{basePath}.ss") && !ProcessingTool.IsValidPartialSS($"{basePath}.ss"))
|
||||
{
|
||||
string? ssCrc = HashTool.GetFileHash($"{basePath}.ss", HashType.CRC32);
|
||||
if (ssCrc != null)
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.SSHash] = ssCrc.ToUpperInvariant();
|
||||
}
|
||||
|
||||
string? ssRanges = ProcessingTool.GetSSRanges($"{basePath}.ss");
|
||||
if (!string.IsNullOrEmpty(ssRanges))
|
||||
info.Extras!.SecuritySectorRanges = ssRanges;
|
||||
|
||||
break;
|
||||
|
||||
case RedumpSystem.NamcoSegaNintendoTriforce:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetGDROMHeader($"{basePath}.log",
|
||||
out string? buildDate,
|
||||
out string? serial,
|
||||
out _,
|
||||
out string? version) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = buildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
@@ -282,20 +289,20 @@ namespace MPF.Processors
|
||||
|
||||
case RedumpSystem.SegaMegaCDSegaCD:
|
||||
info.Extras!.Header = GetSegaCDHeader($"{basePath}.log", out var scdBuildDate, out var scdSerial, out _) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = scdSerial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = scdSerial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = scdBuildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaChihiro:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetGDROMHeader($"{basePath}.log",
|
||||
out string? buildDate,
|
||||
out string? serial,
|
||||
out _,
|
||||
out string? version) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = buildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
@@ -303,14 +310,14 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaDreamcast:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetGDROMHeader($"{basePath}.log",
|
||||
out string? buildDate,
|
||||
out string? serial,
|
||||
out _,
|
||||
out string? version) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = buildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
@@ -318,14 +325,14 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaNaomi:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetGDROMHeader($"{basePath}.log",
|
||||
out string? buildDate,
|
||||
out string? serial,
|
||||
out _,
|
||||
out string? version) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = buildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
@@ -333,14 +340,14 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
case RedumpSystem.SegaNaomi2:
|
||||
if (Type == MediaType.CDROM)
|
||||
if (mediaType == MediaType.CDROM)
|
||||
{
|
||||
info.Extras!.Header = GetGDROMHeader($"{basePath}.log",
|
||||
out string? buildDate,
|
||||
out string? serial,
|
||||
out _,
|
||||
out string? version) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = buildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
@@ -353,7 +360,7 @@ namespace MPF.Processors
|
||||
out string? saturnSerial,
|
||||
out _,
|
||||
out string? saturnVersion) ?? string.Empty;
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = saturnSerial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = saturnSerial ?? string.Empty;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = saturnBuildDate ?? string.Empty;
|
||||
// TODO: Support region setting from parsed value
|
||||
info.VersionAndEditions!.Version = saturnVersion ?? string.Empty;
|
||||
@@ -362,7 +369,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyPlayStation:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out string? psxEXEDate, out string? psxSerial, out var _))
|
||||
{
|
||||
info.CommonDiscInfo!.EXEDateBuildDate = psxEXEDate;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = psxEXEDate;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = psxSerial ?? string.Empty;
|
||||
}
|
||||
|
||||
@@ -375,21 +382,21 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyPlayStation2:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out string? ps2EXEDate, out string? ps2Serial, out var ps2Version))
|
||||
{
|
||||
info.CommonDiscInfo!.EXEDateBuildDate = ps2EXEDate;
|
||||
info.CommonDiscInfo.EXEDateBuildDate = ps2EXEDate;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = ps2Serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = ps2Version ?? string.Empty;
|
||||
}
|
||||
|
||||
string? ps2Protection = GetPlayStation2Protection($"{basePath}.log");
|
||||
if (ps2Protection != null)
|
||||
info.CommonDiscInfo!.Comments = $"<b>Protection</b>: {ps2Protection}" + Environment.NewLine;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.Protection] = ps2Protection;
|
||||
|
||||
break;
|
||||
|
||||
case RedumpSystem.SonyPlayStation3:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps3Serial, out var ps3Version))
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps3Serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = ps3Serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = ps3Version ?? string.Empty;
|
||||
}
|
||||
|
||||
@@ -398,7 +405,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyPlayStation4:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps4Serial, out var ps4Version))
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps4Serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = ps4Serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = ps4Version ?? string.Empty;
|
||||
}
|
||||
|
||||
@@ -407,7 +414,7 @@ namespace MPF.Processors
|
||||
case RedumpSystem.SonyPlayStation5:
|
||||
if (GetPlayStationInfo($"{basePath}.log", out var _, out string? ps5Serial, out var ps5Version))
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.InternalSerialName] = ps5Serial ?? string.Empty;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = ps5Serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = ps5Version ?? string.Empty;
|
||||
}
|
||||
|
||||
@@ -416,19 +423,17 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
// Get the base path
|
||||
string basePath;
|
||||
if (string.IsNullOrEmpty(outputDirectory))
|
||||
basePath = outputFilename;
|
||||
else
|
||||
basePath = Path.Combine(outputDirectory, outputFilename);
|
||||
// Assemble the base path
|
||||
string basePath = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
if (!string.IsNullOrEmpty(outputDirectory))
|
||||
basePath = Path.Combine(outputDirectory, basePath);
|
||||
|
||||
switch (Type)
|
||||
switch (mediaType)
|
||||
{
|
||||
case MediaType.CDROM:
|
||||
case MediaType.GDROM:
|
||||
@@ -440,9 +445,12 @@ namespace MPF.Processors
|
||||
new($"{outputFilename}.atip", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"atip"),
|
||||
new($"{outputFilename}.cache", OutputFileFlags.Binary
|
||||
new([$"{outputFilename}.cache", $"{outputFilename}.1.cache"], OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"cache"),
|
||||
new($"{outputFilename}.2.cache", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"cache_2"),
|
||||
new($"{outputFilename}.cdtext", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"cdtext"),
|
||||
@@ -526,13 +534,6 @@ namespace MPF.Processors
|
||||
case MediaType.NintendoGameCubeGameDisc:
|
||||
case MediaType.NintendoWiiOpticalDisc:
|
||||
return [
|
||||
// .asus is obsolete: newer redumper produces .cache instead
|
||||
new($"{outputFilename}.asus", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"asus"),
|
||||
new($"{outputFilename}.cache", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"cache"),
|
||||
new($"{outputFilename}.dmi", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"dmi"),
|
||||
@@ -572,6 +573,7 @@ namespace MPF.Processors
|
||||
new($"{outputFilename}.ss", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"ss"),
|
||||
// ssv1 and ssv2 extensions are obsolete
|
||||
new($"{outputFilename}.ssv1", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"ssv1"),
|
||||
@@ -865,14 +867,14 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get reported disc type information, if possible
|
||||
/// Get reported disc profile information, if possible
|
||||
/// </summary>
|
||||
/// <param name="log">Log file location</param>
|
||||
/// <returns>True if disc type info was set, false otherwise</returns>
|
||||
internal static bool GetDiscType(string log, out string? discTypeOrBookType)
|
||||
/// <returns>True if disc profile information was set, false otherwise</returns>
|
||||
internal static bool GetDiscProfile(string log, out string? discProfile)
|
||||
{
|
||||
// Set the default values
|
||||
discTypeOrBookType = null;
|
||||
discProfile = null;
|
||||
|
||||
// If the file doesn't exist, we can't get the info
|
||||
if (string.IsNullOrEmpty(log))
|
||||
@@ -893,7 +895,7 @@ namespace MPF.Processors
|
||||
if (line.StartsWith("current profile:"))
|
||||
{
|
||||
// current profile: <discType>
|
||||
discTypeOrBookType = line.Substring("current profile: ".Length);
|
||||
discProfile = line.Substring("current profile: ".Length);
|
||||
}
|
||||
|
||||
line = sr.ReadLine();
|
||||
@@ -904,11 +906,121 @@ namespace MPF.Processors
|
||||
catch
|
||||
{
|
||||
// We don't care what the exception is right now
|
||||
discTypeOrBookType = null;
|
||||
discProfile = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get reported disc type, if possible
|
||||
/// </summary>
|
||||
/// <param name="log">Log file location</param>
|
||||
/// <returns>True if disc type was set, false otherwise</returns>
|
||||
internal static bool GetDiscType(string log, out MediaType? discType)
|
||||
{
|
||||
// Set the default values
|
||||
discType = null;
|
||||
|
||||
// If the file doesn't exist, we can't get the info
|
||||
if (string.IsNullOrEmpty(log))
|
||||
return false;
|
||||
if (!File.Exists(log))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
using var sr = File.OpenText(log);
|
||||
var line = sr.ReadLine()?.TrimEnd();
|
||||
while (line != null)
|
||||
{
|
||||
// If the line isn't the non-embedded disc type, skip
|
||||
if (!line.StartsWith("disc type:"))
|
||||
{
|
||||
line = sr.ReadLine()?.TrimEnd();
|
||||
continue;
|
||||
}
|
||||
|
||||
// disc type: <discType>
|
||||
string discTypeStr = line.Substring("disc type: ".Length);
|
||||
|
||||
// Set the media type based on the string
|
||||
discType = discTypeStr switch
|
||||
{
|
||||
"CD" => MediaType.CDROM,
|
||||
"DVD" => MediaType.DVD,
|
||||
"BLURAY" => MediaType.BluRay,
|
||||
"BLURAY-R" => MediaType.BluRay,
|
||||
"HD-DVD" => MediaType.HDDVD,
|
||||
_ => null,
|
||||
};
|
||||
return discType != null;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// We don't care what the exception is right now
|
||||
discType = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert the profile to a media type, if possible
|
||||
/// </summary>
|
||||
/// <param name="profile">Profile string to check</param>
|
||||
/// <returns>Media type on success, null otherwise</returns>
|
||||
internal static MediaType? GetDiscTypeFromProfile(string? profile)
|
||||
{
|
||||
return profile switch
|
||||
{
|
||||
"reserved" => null,
|
||||
"non removable disk" => null,
|
||||
"removable disk" => null,
|
||||
"MO erasable" => null,
|
||||
"MO write once" => null,
|
||||
"AS MO" => null,
|
||||
|
||||
"CD-ROM" => MediaType.CDROM,
|
||||
"CD-R" => MediaType.CDROM,
|
||||
"CD-RW" => MediaType.CDROM,
|
||||
|
||||
"DVD-ROM" => MediaType.DVD,
|
||||
"DVD-R" => MediaType.DVD,
|
||||
"DVD-RAM" => MediaType.DVD,
|
||||
"DVD-RW RO" => MediaType.DVD,
|
||||
"DVD-RW" => MediaType.DVD,
|
||||
"DVD-R DL" => MediaType.DVD,
|
||||
"DVD-R DL LJR" => MediaType.DVD,
|
||||
"DVD+RW" => MediaType.DVD,
|
||||
"DVD+R" => MediaType.DVD,
|
||||
|
||||
"DDCD-ROM" => MediaType.CDROM,
|
||||
"DDCD-R" => MediaType.CDROM,
|
||||
"DDCD-RW" => MediaType.CDROM,
|
||||
|
||||
"DVD+RW DL" => MediaType.DVD,
|
||||
"DVD+R DL" => MediaType.DVD,
|
||||
|
||||
"BD-ROM" => MediaType.BluRay,
|
||||
"BD-R" => MediaType.BluRay,
|
||||
"BD-R RRM" => MediaType.BluRay,
|
||||
"BD-RW" => MediaType.BluRay,
|
||||
|
||||
"HD DVD-ROM" => MediaType.HDDVD,
|
||||
"HD DVD-R" => MediaType.HDDVD,
|
||||
"HD DVD-RAM" => MediaType.HDDVD,
|
||||
"HD DVD-RW" => MediaType.HDDVD,
|
||||
"HD DVD-R DL" => MediaType.HDDVD,
|
||||
"HD DVD-RW DL" => MediaType.HDDVD,
|
||||
|
||||
"NON STANDARD" => null,
|
||||
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the DVD protection information, if possible
|
||||
/// </summary>
|
||||
@@ -1093,7 +1205,7 @@ namespace MPF.Processors
|
||||
}
|
||||
|
||||
// Reset C2 errors when a media errors section is found
|
||||
else if (line.StartsWith("media errors:"))
|
||||
else if (line.StartsWith("media errors:") || line.StartsWith("initial dump media errors:"))
|
||||
{
|
||||
c2Errors = 0;
|
||||
}
|
||||
@@ -1689,6 +1801,44 @@ namespace MPF.Processors
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the SFSVD from the input file, if possible
|
||||
/// </summary>
|
||||
/// <param name="log">Log file location</param>
|
||||
/// <returns>Newline-delimited SFSVD if possible, null on error</returns>
|
||||
internal static string? GetSFSVD(string log)
|
||||
{
|
||||
// If the file doesn't exist, we can't get info from it
|
||||
if (string.IsNullOrEmpty(log))
|
||||
return null;
|
||||
if (!File.Exists(log))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
// Fast forward to the SFSVD line
|
||||
using var sr = File.OpenText(log);
|
||||
while (!sr.EndOfStream && sr.ReadLine()?.TrimStart()?.StartsWith("SFSVD:") == false) ;
|
||||
if (sr.EndOfStream)
|
||||
return null;
|
||||
|
||||
// Now that we're at the relevant entries, read each line in and concatenate
|
||||
string? sfsvdString = string.Empty, line = sr.ReadLine();
|
||||
while (line?.StartsWith("03") == true)
|
||||
{
|
||||
sfsvdString += line + "\n";
|
||||
line = sr.ReadLine();
|
||||
}
|
||||
|
||||
return sfsvdString.TrimEnd('\n');
|
||||
}
|
||||
catch
|
||||
{
|
||||
// We don't care what the exception is right now
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the non-zero data start from the input file, if possible
|
||||
/// </summary>
|
||||
@@ -2143,6 +2293,7 @@ namespace MPF.Processors
|
||||
// redumper v2022.10.28 [Oct 28 2022, 05:41:43] (print usage: --help,-h)
|
||||
// redumper v2022.12.22 build_87 [Dec 22 2022, 01:56:26]
|
||||
// redumper v2025.03.29 build_481
|
||||
// redumper (build: b652)
|
||||
|
||||
try
|
||||
{
|
||||
@@ -2156,10 +2307,7 @@ namespace MPF.Processors
|
||||
nextLine = sr.ReadLine()?.Trim() ?? string.Empty;
|
||||
|
||||
// Generate regex
|
||||
// Permissive
|
||||
var regex = new Regex(@"^redumper (v.+)", RegexOptions.Compiled);
|
||||
// Strict
|
||||
//var regex = new Regex(@"^redumper (v\d{4}\.\d{2}\.\d{2}(| build_\d+)) \[.+\]", RegexOptions.Compiled);
|
||||
var regex = new Regex(@"^redumper (.+)", RegexOptions.Compiled);
|
||||
|
||||
// Extract the version string
|
||||
var match = regex.Match(nextLine);
|
||||
|
||||
@@ -14,106 +14,100 @@ namespace MPF.Processors
|
||||
public sealed class UmdImageCreator : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public UmdImageCreator(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public UmdImageCreator(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
=> MediaType.UMD;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
|
||||
// TODO: Determine if there's a UMDImageCreator version anywhere
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate(basePath + "_disc.txt")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
info.DumpingInfo!.DumpingDate = ProcessingTool.GetFileModifiedDate($"{basePath}_disc.txt")?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
// Get the PVD, if it exists
|
||||
info.Extras!.PVD = GetPVD($"{basePath}_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
// Get the Datafile information
|
||||
if (HashTool.GetStandardHashes($"{basePath}.iso", out long filesize, out var crc32, out var md5, out var sha1))
|
||||
{
|
||||
// Create a Datafile from the hashes
|
||||
var datafile = new Datafile
|
||||
{
|
||||
Game = [new Game { Rom = [new Rom { Name = string.Empty, Size = filesize.ToString(), CRC = crc32, MD5 = md5, SHA1 = sha1 }] }]
|
||||
};
|
||||
|
||||
// Fill in the hash data
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
info.SizeAndChecksums!.Size = filesize;
|
||||
info.SizeAndChecksums.CRC32 = crc32;
|
||||
info.SizeAndChecksums.MD5 = md5;
|
||||
info.SizeAndChecksums.SHA1 = sha1;
|
||||
}
|
||||
|
||||
// Get internal information
|
||||
if (GetUMDAuxInfo($"{basePath}_disc.txt",
|
||||
out var title,
|
||||
out DiscCategory? category,
|
||||
out string? serial,
|
||||
out var version,
|
||||
out var layer,
|
||||
out long size))
|
||||
{
|
||||
info.CommonDiscInfo!.Title = title ?? string.Empty;
|
||||
info.CommonDiscInfo.Category = category ?? DiscCategory.Games;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
info.SizeAndChecksums!.Size = size;
|
||||
|
||||
if (!string.IsNullOrEmpty(layer))
|
||||
info.SizeAndChecksums.Layerbreak = long.Parse(layer ?? "-1");
|
||||
}
|
||||
|
||||
// Fill in the volume labels
|
||||
if (GetVolumeLabels($"{basePath}_volDesc.txt", out var volLabels))
|
||||
VolumeLabels = volLabels;
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (Type)
|
||||
{
|
||||
case MediaType.UMD:
|
||||
info.Extras!.PVD = GetPVD(basePath + "_mainInfo.txt") ?? string.Empty;
|
||||
|
||||
if (HashTool.GetStandardHashes(basePath + ".iso", out long filesize, out var crc32, out var md5, out var sha1))
|
||||
{
|
||||
// Get the Datafile information
|
||||
var datafile = new Datafile
|
||||
{
|
||||
Game = [new Game { Rom = [new Rom { Name = string.Empty, Size = filesize.ToString(), CRC = crc32, MD5 = md5, SHA1 = sha1 }] }]
|
||||
};
|
||||
|
||||
// Fill in the hash data
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
info.SizeAndChecksums!.Size = filesize;
|
||||
info.SizeAndChecksums.CRC32 = crc32;
|
||||
info.SizeAndChecksums.MD5 = md5;
|
||||
info.SizeAndChecksums.SHA1 = sha1;
|
||||
}
|
||||
|
||||
if (GetUMDAuxInfo(basePath + "_disc.txt",
|
||||
out var title,
|
||||
out DiscCategory? category,
|
||||
out string? serial,
|
||||
out var version,
|
||||
out var layer,
|
||||
out long size))
|
||||
{
|
||||
info.CommonDiscInfo!.Title = title ?? string.Empty;
|
||||
info.CommonDiscInfo.Category = category ?? DiscCategory.Games;
|
||||
info.CommonDiscInfo.CommentsSpecialFields![SiteCode.InternalSerialName] = serial ?? string.Empty;
|
||||
info.VersionAndEditions!.Version = version ?? string.Empty;
|
||||
info.SizeAndChecksums!.Size = size;
|
||||
|
||||
if (!string.IsNullOrEmpty(layer))
|
||||
info.SizeAndChecksums.Layerbreak = long.Parse(layer ?? "-1");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case MediaType.UMD:
|
||||
return [
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
return [
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
|
||||
new($"{outputFilename}_disc.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"disc"),
|
||||
new($"{outputFilename}_drive.txt", OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"drive"),
|
||||
new($"{outputFilename}_mainError.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"main_error"),
|
||||
new($"{outputFilename}_mainInfo.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"main_info"),
|
||||
new($"{outputFilename}_PFI.bin", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"pfi"),
|
||||
new($"{outputFilename}_volDesc.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"vol_desc"),
|
||||
];
|
||||
}
|
||||
|
||||
return [];
|
||||
new($"{outputFilename}_disc.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"disc"),
|
||||
new($"{outputFilename}_drive.txt", OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"drive"),
|
||||
new($"{outputFilename}_mainError.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"main_error"),
|
||||
new($"{outputFilename}_mainInfo.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"main_info"),
|
||||
new($"{outputFilename}_PFI.bin", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"pfi"),
|
||||
new($"{outputFilename}_volDesc.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"vol_desc"),
|
||||
];
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -190,13 +184,13 @@ namespace MPF.Processors
|
||||
break;
|
||||
|
||||
if (line.StartsWith("TITLE") && title == null)
|
||||
title = line.Split(' ')[1];
|
||||
title = line.Substring("TITLE: ".Length);
|
||||
else if (line.StartsWith("DISC_ID") && version == null)
|
||||
serial = line.Split(' ')[1];
|
||||
else if (line.StartsWith("DISC_VERSION") && version == null)
|
||||
version = line.Split(' ')[1];
|
||||
else if (line.StartsWith("pspUmdTypes"))
|
||||
category = ProcessingTool.GetUMDCategory(line.Split(' ')[1]);
|
||||
category = ProcessingTool.GetUMDCategory(line.Split(' ')[2]);
|
||||
else if (line.StartsWith("L0 length"))
|
||||
layer = line.Split(' ')[2];
|
||||
else if (line.StartsWith("FileSize:"))
|
||||
|
||||
@@ -14,12 +14,16 @@ namespace MPF.Processors
|
||||
public sealed class XboxBackupCreator : BaseProcessor
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public XboxBackupCreator(RedumpSystem? system, MediaType? type) : base(system, type) { }
|
||||
public XboxBackupCreator(RedumpSystem? system) : base(system) { }
|
||||
|
||||
#region BaseProcessor Implementations
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, string basePath, bool redumpCompat)
|
||||
public override MediaType? DetermineMediaType(string? outputDirectory, string outputFilename)
|
||||
=> MediaType.DVD;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void GenerateSubmissionInfo(SubmissionInfo info, MediaType? mediaType, string basePath, bool redumpCompat)
|
||||
{
|
||||
// Ensure that required sections exist
|
||||
info = Builder.EnsureAllSections(info);
|
||||
@@ -38,152 +42,131 @@ namespace MPF.Processors
|
||||
info.DumpingInfo.DumpingDate = ProcessingTool.GetFileModifiedDate(logPath)?.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
info.DumpingInfo.Model = GetDrive(logPath) ?? "Unknown Drive";
|
||||
|
||||
// Get the Datafile information
|
||||
Datafile? datafile = GenerateDatafile($"{basePath}.iso");
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
// Get the individual hash data, as per internal
|
||||
if (ProcessingTool.GetISOHashValues(datafile, out long size, out var crc32, out var md5, out var sha1))
|
||||
{
|
||||
info.SizeAndChecksums!.Size = size;
|
||||
info.SizeAndChecksums.CRC32 = crc32;
|
||||
info.SizeAndChecksums.MD5 = md5;
|
||||
info.SizeAndChecksums.SHA1 = sha1;
|
||||
}
|
||||
|
||||
// Get Layerbreak from .dvd file if possible
|
||||
if (GetLayerbreak($"{basePath}.dvd", out long layerbreak))
|
||||
info.SizeAndChecksums!.Layerbreak = layerbreak;
|
||||
|
||||
// Look for read errors
|
||||
if (GetReadErrors(logPath, out long readErrors))
|
||||
info.CommonDiscInfo!.ErrorsCount = readErrors == -1 ? "Error retrieving error count" : readErrors.ToString();
|
||||
|
||||
// Extract info based generically on MediaType
|
||||
switch (Type)
|
||||
switch (System)
|
||||
{
|
||||
case MediaType.DVD:
|
||||
|
||||
// Get Layerbreak from .dvd file if possible
|
||||
if (GetLayerbreak($"{basePath}.dvd", out long layerbreak))
|
||||
info.SizeAndChecksums!.Layerbreak = layerbreak;
|
||||
|
||||
// Hash data
|
||||
if (HashTool.GetStandardHashes(basePath + ".iso", out long filesize, out var crc32, out var md5, out var sha1))
|
||||
case RedumpSystem.MicrosoftXbox:
|
||||
string xmidString = ProcessingTool.GetXMID(Path.Combine(outputDirectory, "DMI.bin"));
|
||||
var xmid = SabreTools.Serialization.Wrappers.XMID.Create(xmidString);
|
||||
if (xmid != null)
|
||||
{
|
||||
// Get the Datafile information
|
||||
var datafile = new Datafile
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XMID] = xmidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xmid.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
Game = [new Game { Rom = [new Rom { Name = string.Empty, Size = filesize.ToString(), CRC = crc32, MD5 = md5, SHA1 = sha1 }] }]
|
||||
};
|
||||
|
||||
// Fill in the hash data
|
||||
info.TracksAndWriteOffsets!.ClrMameProData = ProcessingTool.GenerateDatfile(datafile);
|
||||
|
||||
info.SizeAndChecksums!.Size = filesize;
|
||||
info.SizeAndChecksums.CRC32 = crc32;
|
||||
info.SizeAndChecksums.MD5 = md5;
|
||||
info.SizeAndChecksums.SHA1 = sha1;
|
||||
info.VersionAndEditions!.Version = xmid.Version ?? string.Empty;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xmid.Model.RegionIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
switch (System)
|
||||
break;
|
||||
|
||||
case RedumpSystem.MicrosoftXbox360:
|
||||
|
||||
// Get PVD from ISO
|
||||
if (GetPVD($"{basePath}.iso", out string? pvd))
|
||||
info.Extras!.PVD = pvd;
|
||||
|
||||
// Parse Media ID
|
||||
//string? mediaID = GetMediaID(logPath);
|
||||
|
||||
// Parse DMI.bin
|
||||
string xemidString = ProcessingTool.GetXeMID(Path.Combine(outputDirectory, "DMI.bin"));
|
||||
var xemid = SabreTools.Serialization.Wrappers.XeMID.Create(xemidString);
|
||||
if (xemid != null)
|
||||
{
|
||||
case RedumpSystem.MicrosoftXbox:
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XeMID] = xemidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xemid.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
info.VersionAndEditions!.Version = xemid.Version ?? string.Empty;
|
||||
|
||||
// Parse DMI.bin
|
||||
string xmidString = ProcessingTool.GetXMID(Path.Combine(outputDirectory, "DMI.bin"));
|
||||
var xmid = SabreTools.Serialization.Wrappers.XMID.Create(xmidString);
|
||||
if (xmid != null)
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XMID] = xmidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xmid.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
{
|
||||
info.VersionAndEditions!.Version = xmid.Version ?? string.Empty;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xmid.Model.RegionIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RedumpSystem.MicrosoftXbox360:
|
||||
|
||||
// Get PVD from ISO
|
||||
if (GetPVD(basePath + ".iso", out string? pvd))
|
||||
info.Extras!.PVD = pvd;
|
||||
|
||||
// Parse Media ID
|
||||
//string? mediaID = GetMediaID(logPath);
|
||||
|
||||
// Parse DMI.bin
|
||||
string xemidString = ProcessingTool.GetXeMID(Path.Combine(outputDirectory, "DMI.bin"));
|
||||
var xemid = SabreTools.Serialization.Wrappers.XeMID.Create(xemidString);
|
||||
if (xemid != null)
|
||||
{
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.XeMID] = xemidString?.TrimEnd('\0') ?? string.Empty;
|
||||
info.CommonDiscInfo.Serial = xemid.Serial ?? string.Empty;
|
||||
if (!redumpCompat)
|
||||
info.VersionAndEditions!.Version = xemid.Version ?? string.Empty;
|
||||
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xemid.Model.RegionIdentifier);
|
||||
}
|
||||
|
||||
break;
|
||||
info.CommonDiscInfo.Region = ProcessingTool.GetXGDRegion(xemid.Model.RegionIdentifier);
|
||||
}
|
||||
|
||||
// Get the output file paths
|
||||
string dmiPath = Path.Combine(outputDirectory, "DMI.bin");
|
||||
string pfiPath = Path.Combine(outputDirectory, "PFI.bin");
|
||||
string ssPath = Path.Combine(outputDirectory, "SS.bin");
|
||||
|
||||
// Deal with SS.bin
|
||||
if (File.Exists(ssPath))
|
||||
{
|
||||
// Save security sector ranges
|
||||
string? ranges = ProcessingTool.GetSSRanges(ssPath);
|
||||
if (!string.IsNullOrEmpty(ranges))
|
||||
info.Extras!.SecuritySectorRanges = ranges;
|
||||
|
||||
// Recreate RawSS.bin
|
||||
RecreateSS(logPath!, ssPath, Path.Combine(outputDirectory, "RawSS.bin"));
|
||||
|
||||
// Run ss_sector_range to get repeatable SS hash
|
||||
ProcessingTool.CleanSS(ssPath, ssPath);
|
||||
}
|
||||
|
||||
// DMI/PFI/SS CRC32 hashes
|
||||
if (File.Exists(dmiPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.DMIHash] = HashTool.GetFileHash(dmiPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
if (File.Exists(pfiPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.PFIHash] = HashTool.GetFileHash(pfiPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
if (File.Exists(ssPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.SSHash] = HashTool.GetFileHash(ssPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Get the output file paths
|
||||
string dmiPath = Path.Combine(outputDirectory, "DMI.bin");
|
||||
string pfiPath = Path.Combine(outputDirectory, "PFI.bin");
|
||||
string ssPath = Path.Combine(outputDirectory, "SS.bin");
|
||||
|
||||
// Deal with SS.bin
|
||||
if (File.Exists(ssPath))
|
||||
{
|
||||
// Save security sector ranges
|
||||
string? ranges = ProcessingTool.GetSSRanges(ssPath);
|
||||
if (!string.IsNullOrEmpty(ranges))
|
||||
info.Extras!.SecuritySectorRanges = ranges;
|
||||
|
||||
// Recreate RawSS.bin
|
||||
RecreateSS(logPath!, ssPath, Path.Combine(outputDirectory, "RawSS.bin"));
|
||||
|
||||
// Run ss_sector_range to get repeatable SS hash
|
||||
ProcessingTool.CleanSS(ssPath, ssPath);
|
||||
}
|
||||
|
||||
// DMI/PFI/SS CRC32 hashes
|
||||
if (File.Exists(dmiPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.DMIHash] = HashTool.GetFileHash(dmiPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
if (File.Exists(pfiPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.PFIHash] = HashTool.GetFileHash(pfiPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
if (File.Exists(ssPath))
|
||||
info.CommonDiscInfo!.CommentsSpecialFields![SiteCode.SSHash] = HashTool.GetFileHash(ssPath, HashType.CRC32)?.ToUpperInvariant() ?? string.Empty;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal override List<OutputFile> GetOutputFiles(string? outputDirectory, string outputFilename)
|
||||
internal override List<OutputFile> GetOutputFiles(MediaType? mediaType, string? outputDirectory, string outputFilename)
|
||||
{
|
||||
// Remove the extension by default
|
||||
outputFilename = Path.GetFileNameWithoutExtension(outputFilename);
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
case MediaType.DVD:
|
||||
return [
|
||||
new($"{outputFilename}.dvd", OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"dvd"),
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
|
||||
new("DMI.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"dmi"),
|
||||
new RegexOutputFile("[lL]og\\.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"log"),
|
||||
new("PFI.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"pfi"),
|
||||
new("RawSS.bin", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"raw_ss"),
|
||||
new("SS.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"ss"),
|
||||
];
|
||||
}
|
||||
return [
|
||||
new($"{outputFilename}.dvd", OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"dvd"),
|
||||
new($"{outputFilename}.iso", OutputFileFlags.Required),
|
||||
|
||||
return [];
|
||||
new("DMI.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"dmi"),
|
||||
new RegexOutputFile("[lL]og\\.txt", OutputFileFlags.Required
|
||||
| OutputFileFlags.Artifact
|
||||
| OutputFileFlags.Zippable,
|
||||
"log"),
|
||||
new("PFI.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"pfi"),
|
||||
new("RawSS.bin", OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"raw_ss"),
|
||||
new("SS.bin", OutputFileFlags.Required
|
||||
| OutputFileFlags.Binary
|
||||
| OutputFileFlags.Zippable,
|
||||
"ss"),
|
||||
];
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<UseWPF>true</UseWPF>
|
||||
<VersionPrefix>3.3.2</VersionPrefix>
|
||||
<VersionPrefix>3.4.0</VersionPrefix>
|
||||
|
||||
<!-- Package Properties -->
|
||||
<AssemblyName>MPF</AssemblyName>
|
||||
@@ -70,14 +70,14 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.6.7" />
|
||||
<PackageReference Include="SabreTools.RedumpLib" Version="1.7.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Page Update="UserControls\UserInput.xaml">
|
||||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
|
||||
</Page>
|
||||
<Page Update="Windows\DiscInformationWindow.xaml">
|
||||
<Page Update="Windows\MediaInformationWindow.xaml">
|
||||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
|
||||
</Page>
|
||||
<Page Update="Windows\RingCodeGuideWindow.xaml">
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
<Button x:Name="InputPathBrowseButton" Grid.Row="0" Grid.Column="1" Height="22" Width="50" HorizontalAlignment="Right" Content="Browse"
|
||||
IsEnabled="{Binding InputPathBrowseButtonEnabled}" Style="{DynamicResource CustomButtonStyle}"/>
|
||||
|
||||
<Label x:Name="SystemMediaTypeLabel" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Content="System/Media Type" />
|
||||
<Label x:Name="SystemTypeLabel" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Content="System Type" />
|
||||
<ComboBox x:Name="SystemTypeComboBox" Grid.Row="1" Grid.Column="1" Height="22" Width="250" HorizontalAlignment="Left"
|
||||
ItemsSource="{Binding Systems}" SelectedItem="{Binding Path=CurrentSystem, Converter={StaticResource ElementConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
IsEnabled="{Binding SystemTypeComboBoxEnabled}" Style="{DynamicResource CustomComboBoxStyle}">
|
||||
@@ -99,9 +99,6 @@
|
||||
</Style>
|
||||
</ComboBox.ItemContainerStyle>
|
||||
</ComboBox>
|
||||
<ComboBox x:Name="MediaTypeComboBox" Grid.Row="1" Grid.Column="1" Height="22" Width="140" HorizontalAlignment="Right"
|
||||
ItemsSource="{Binding MediaTypes}" SelectedItem="{Binding Path=CurrentMediaType, Converter={StaticResource ElementConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
IsEnabled="{Binding MediaTypeComboBoxEnabled}" Style="{DynamicResource CustomComboBoxStyle}" />
|
||||
|
||||
<Label x:Name="DumpingProgramLabel" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Content="Dumping Program"/>
|
||||
<ComboBox x:Name="DumpingProgramComboBox" Grid.Row="2" Grid.Column="1" Height="22" Width="250" HorizontalAlignment="Left"
|
||||
|
||||
@@ -29,7 +29,6 @@ namespace MPF.UI.Windows
|
||||
private ComboBox? DumpingProgramComboBox => ItemHelper.FindChild<ComboBox>(this, "DumpingProgramComboBox");
|
||||
private Button? InputPathBrowseButton => ItemHelper.FindChild<Button>(this, "InputPathBrowseButton");
|
||||
private TextBox? InputPathTextBox => ItemHelper.FindChild<TextBox>(this, "InputPathTextBox");
|
||||
private ComboBox? MediaTypeComboBox => ItemHelper.FindChild<ComboBox>(this, "MediaTypeComboBox");
|
||||
private ComboBox? SystemTypeComboBox => ItemHelper.FindChild<ComboBox>(this, "SystemTypeComboBox");
|
||||
|
||||
#endregion
|
||||
@@ -89,7 +88,6 @@ namespace MPF.UI.Windows
|
||||
|
||||
// User Area SelectionChanged
|
||||
SystemTypeComboBox!.SelectionChanged += SystemTypeComboBoxSelectionChanged;
|
||||
MediaTypeComboBox!.SelectionChanged += MediaTypeComboBoxSelectionChanged;
|
||||
DumpingProgramComboBox!.SelectionChanged += DumpingProgramComboBoxSelectionChanged;
|
||||
|
||||
// User Area TextChanged
|
||||
@@ -125,14 +123,14 @@ namespace MPF.UI.Windows
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show the disc information window
|
||||
/// Show the media information window
|
||||
/// </summary>
|
||||
/// <param name="options">Options set to pass to the information window</param>
|
||||
/// <param name="submissionInfo">SubmissionInfo object to display and possibly change</param>
|
||||
/// <returns>Dialog open result</returns>
|
||||
public bool? ShowDiscInformationWindow(Options? options, ref SubmissionInfo? submissionInfo)
|
||||
public bool? ShowMediaInformationWindow(Options? options, ref SubmissionInfo? submissionInfo)
|
||||
{
|
||||
var discInformationWindow = new DiscInformationWindow(options ?? new Options(), submissionInfo)
|
||||
var mediaInformationWindow = new MediaInformationWindow(options ?? new Options(), submissionInfo)
|
||||
{
|
||||
Focusable = true,
|
||||
Owner = this,
|
||||
@@ -141,12 +139,12 @@ namespace MPF.UI.Windows
|
||||
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
||||
};
|
||||
|
||||
discInformationWindow.Closed += delegate { Activate(); };
|
||||
bool? result = discInformationWindow.ShowDialog();
|
||||
mediaInformationWindow.Closed += delegate { Activate(); };
|
||||
bool? result = mediaInformationWindow.ShowDialog();
|
||||
|
||||
// Copy back the submission info changes, if necessary
|
||||
if (result == true)
|
||||
submissionInfo = (discInformationWindow.DiscInformationViewModel.SubmissionInfo.Clone() as SubmissionInfo)!;
|
||||
submissionInfo = (mediaInformationWindow.MediaInformationViewModel.SubmissionInfo.Clone() as SubmissionInfo)!;
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -160,7 +158,7 @@ namespace MPF.UI.Windows
|
||||
/// </summary>
|
||||
private async void OnCheckDumpClick(object sender, EventArgs e)
|
||||
{
|
||||
string? errorMessage = await CheckDumpViewModel.CheckDump(ShowDiscInformationWindow);
|
||||
string? errorMessage = await CheckDumpViewModel.CheckDump(ShowMediaInformationWindow);
|
||||
if (string.IsNullOrEmpty(errorMessage))
|
||||
{
|
||||
bool? checkAgain = DisplayUserMessage("Check Complete", "The dump has been processed successfully! Would you like to check another dump?", 2, false);
|
||||
@@ -211,15 +209,6 @@ namespace MPF.UI.Windows
|
||||
CheckDumpViewModel.ChangeInputPath();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handler for MediaTypeComboBox SelectionChanged event
|
||||
/// </summary>
|
||||
public void MediaTypeComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (CheckDumpViewModel.CanExecuteSelectionChanged)
|
||||
CheckDumpViewModel.ChangeMediaType();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handler for SystemTypeComboBox SelectionChanged event
|
||||
/// </summary>
|
||||
|
||||
@@ -108,7 +108,7 @@ namespace MPF.UI.Windows
|
||||
if (MainViewModel.Options.ShowDebugViewMenuItem)
|
||||
DebugViewMenuItem!.Visibility = Visibility.Visible;
|
||||
|
||||
MainViewModel.Init(LogOutput!.EnqueueLog, DisplayUserMessage, ShowDiscInformationWindow);
|
||||
MainViewModel.Init(LogOutput!.EnqueueLog, DisplayUserMessage, ShowMediaInformationWindow);
|
||||
|
||||
// Set the UI color scheme according to the options
|
||||
ApplyTheme();
|
||||
@@ -205,8 +205,14 @@ namespace MPF.UI.Windows
|
||||
MainViewModel.CheckForUpdates(out bool different, out string message, out var url);
|
||||
|
||||
// If we have a new version, put it in the clipboard
|
||||
if (different && !string.IsNullOrEmpty(url))
|
||||
Clipboard.SetText(url);
|
||||
if (MainViewModel.Options.CopyUpdateUrlToClipboard && different && !string.IsNullOrEmpty(url))
|
||||
{
|
||||
try
|
||||
{
|
||||
Clipboard.SetText(url);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
if (showIfSame || different)
|
||||
CustomMessageBox.Show(this, message, "Version Update Check", MessageBoxButton.OK, different ? MessageBoxImage.Exclamation : MessageBoxImage.Information);
|
||||
@@ -231,22 +237,22 @@ namespace MPF.UI.Windows
|
||||
public void ShowDebugDiscInfoWindow()
|
||||
{
|
||||
var submissionInfo = MainViewModel.CreateDebugSubmissionInfo();
|
||||
_ = ShowDiscInformationWindow(MainViewModel.Options, ref submissionInfo);
|
||||
_ = ShowMediaInformationWindow(MainViewModel.Options, ref submissionInfo);
|
||||
Formatter.ProcessSpecialFields(submissionInfo!);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show the disc information window
|
||||
/// Show the media information window
|
||||
/// </summary>
|
||||
/// <param name="options">Options set to pass to the information window</param>
|
||||
/// <param name="submissionInfo">SubmissionInfo object to display and possibly change</param>
|
||||
/// <returns>Dialog open result</returns>
|
||||
public bool? ShowDiscInformationWindow(Options? options, ref SubmissionInfo? submissionInfo)
|
||||
public bool? ShowMediaInformationWindow(Options? options, ref SubmissionInfo? submissionInfo)
|
||||
{
|
||||
if (options?.ShowDiscEjectReminder == true)
|
||||
CustomMessageBox.Show(this, "It is now safe to eject the disc", "Eject", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
|
||||
var discInformationWindow = new DiscInformationWindow(options ?? new Options(), submissionInfo)
|
||||
var mediaInformationWindow = new MediaInformationWindow(options ?? new Options(), submissionInfo)
|
||||
{
|
||||
Focusable = true,
|
||||
Owner = this,
|
||||
@@ -255,12 +261,12 @@ namespace MPF.UI.Windows
|
||||
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
||||
};
|
||||
|
||||
discInformationWindow.Closed += delegate { Activate(); };
|
||||
bool? result = discInformationWindow.ShowDialog();
|
||||
mediaInformationWindow.Closed += delegate { Activate(); };
|
||||
bool? result = mediaInformationWindow.ShowDialog();
|
||||
|
||||
// Copy back the submission info changes, if necessary
|
||||
if (result == true)
|
||||
submissionInfo = (discInformationWindow.DiscInformationViewModel.SubmissionInfo.Clone() as SubmissionInfo)!;
|
||||
submissionInfo = (mediaInformationWindow.MediaInformationViewModel.SubmissionInfo.Clone() as SubmissionInfo)!;
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -515,7 +521,7 @@ namespace MPF.UI.Windows
|
||||
public void DriveSpeedComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (MainViewModel.CanExecuteSelectionChanged)
|
||||
MainViewModel.EnsureDiscInformation();
|
||||
MainViewModel.EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -557,7 +563,7 @@ namespace MPF.UI.Windows
|
||||
public void OutputPathBrowseButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
BrowseFile();
|
||||
MainViewModel.EnsureDiscInformation();
|
||||
MainViewModel.EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -566,7 +572,7 @@ namespace MPF.UI.Windows
|
||||
public void OutputPathTextBoxTextChanged(object sender, TextChangedEventArgs e)
|
||||
{
|
||||
if (MainViewModel.CanExecuteSelectionChanged)
|
||||
MainViewModel.EnsureDiscInformation();
|
||||
MainViewModel.EnsureMediaInformation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<coreWindows:WindowBase x:Class="MPF.UI.Windows.DiscInformationWindow"
|
||||
<coreWindows:WindowBase x:Class="MPF.UI.Windows.MediaInformationWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
@@ -8,7 +8,7 @@
|
||||
xmlns:redump="clr-namespace:SabreTools.RedumpLib.Data;assembly=SabreTools.RedumpLib"
|
||||
xmlns:coreWindows="clr-namespace:MPF.UI.Windows"
|
||||
mc:Ignorable="d"
|
||||
Title="Disc Information" Width="600" WindowStyle="None"
|
||||
Title="Media Information" Width="600" WindowStyle="None"
|
||||
WindowStartupLocation="CenterOwner" ResizeMode="CanMinimize" SizeToContent="Height"
|
||||
AllowsTransparency="True" Background="Transparent">
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<Image Grid.Column="0" Source="/Images/Icon.ico" Height="20" Width="20" Margin="1" MouseDown="TitleMouseDown" />
|
||||
<Label Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" MouseDown="TitleMouseDown">
|
||||
<Label.Content>
|
||||
<Run FontWeight="Bold" Text="Disc Information" />
|
||||
<Run FontWeight="Bold" Text="Media Information" />
|
||||
</Label.Content>
|
||||
<Label.ContextMenu>
|
||||
<ContextMenu Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
|
||||
@@ -72,7 +72,7 @@
|
||||
<TabItem x:Name="CommonInfo" Header="Common Info" Style="{DynamicResource CustomTabItemStyle}">
|
||||
<ScrollViewer CanContentScroll="False" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MaxHeight="500">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<GroupBox Header="Common Disc Information" Margin="5" Padding="5" BorderThickness="1" BorderBrush="LightGray"
|
||||
<GroupBox Header="Common Media Information" Margin="5" Padding="5" BorderThickness="1" BorderBrush="LightGray"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<controls:UserInput Label="Title"
|
||||
@@ -174,6 +174,16 @@
|
||||
<GroupBox Header="Extras" Margin="5" Padding="5" BorderThickness="1" BorderBrush="LightGray"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<Grid x:Name="PCMacHybridGrid" Visibility="Collapsed">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.75*" />
|
||||
<ColumnDefinition Width="1.75*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label/>
|
||||
<CheckBox Grid.Column="1" x:Name="PCMacHybridCheckBox" Content="PC/Mac Hybrid" Margin="0,4"
|
||||
IsChecked="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)PCMacHybrid], Mode=TwoWay}"/>
|
||||
</Grid>
|
||||
<controls:UserInput x:Name="CommentsTextBox" Label="Comments"
|
||||
Text="{Binding SubmissionInfo.CommonDiscInfo.Comments, Mode=TwoWay}" TextHeight="50"
|
||||
Enter="True" TextWrapping="Wrap" VerticalContentAlignmentValue="Top" />
|
||||
@@ -183,33 +193,9 @@
|
||||
Text="{Binding Path=SubmissionInfo.Extras.DiscKey, Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="DiscIDTextBox" Label="Disc ID" Visibility="Collapsed"
|
||||
Text="{Binding Path=SubmissionInfo.Extras.DiscID, Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="GenreTextBox" Label="Genre"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)Genre], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="ProtectionTextBox" Label="Protection" ToolTip="CAUTION: Only edit if you know what you are doing!"
|
||||
Text="{Binding SubmissionInfo.CopyProtection.Protection, Mode=TwoWay}" TextHeight="75" TextWrapping="Wrap"
|
||||
VerticalContentAlignmentValue="Top" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"/>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.75*" />
|
||||
<ColumnDefinition Width="1.75*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label/>
|
||||
<CheckBox Grid.Column="1" x:Name="PostgapTypeCheckBox" Content="Postgap type (Form 2)" Margin="0,4"
|
||||
IsChecked="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)PostgapType], Mode=TwoWay}"/>
|
||||
</Grid>
|
||||
<controls:UserInput x:Name="SeriesTextBox" Label="Series"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)Series], Mode=TwoWay}"/>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.75*" />
|
||||
<ColumnDefinition Width="1.75*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label/>
|
||||
<CheckBox Grid.Column="1" x:Name="VCDCheckBox" Content="V-CD" Margin="0,4"
|
||||
IsChecked="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)VCD], Mode=TwoWay}"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
@@ -254,6 +240,8 @@
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)FoxInteractiveID], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="GTInteractiveIDTextBox" Label="GT Interactive ID"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)GTInteractiveID], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="InterplayIDTextBox" Label="Interplay ID"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)InterplayID], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="JASRACIDTextBox" Label="JASRAC ID"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.CommentsSpecialFields[(redump:SiteCode)JASRACID], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="KingRecordsIDTextBox" Label="King Records ID"
|
||||
@@ -320,7 +308,7 @@
|
||||
<controls:UserInput x:Name="GamesTextBox" Label="Games" TextHeight="50"
|
||||
Enter="True" TextWrapping="Wrap" VerticalContentAlignmentValue="Top"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.ContentsSpecialFields[(redump:SiteCode)Games], Mode=TwoWay}"/>
|
||||
<controls:UserInput x:Name="NetYarozeGamesTextBox" Label="Net Yaroze Games" TextHeight="50"
|
||||
<controls:UserInput x:Name="NetYarozeGamesTextBox" Label="Net Yaroze Games" Visibility="Collapsed" TextHeight="50"
|
||||
Enter="True" TextWrapping="Wrap" VerticalContentAlignmentValue="Top"
|
||||
Text="{Binding Path=SubmissionInfo.CommonDiscInfo.ContentsSpecialFields[(redump:SiteCode)NetYarozeGames], Mode=TwoWay}"/>
|
||||
|
||||
@@ -6,9 +6,9 @@ using SabreTools.RedumpLib.Data;
|
||||
namespace MPF.UI.Windows
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for DiscInformationWindow.xaml
|
||||
/// Interaction logic for MediaInformationWindow.xaml
|
||||
/// </summary>
|
||||
public partial class DiscInformationWindow : WindowBase
|
||||
public partial class MediaInformationWindow : WindowBase
|
||||
{
|
||||
#if NET35
|
||||
|
||||
@@ -20,11 +20,18 @@ namespace MPF.UI.Windows
|
||||
|
||||
#region Additional Info
|
||||
|
||||
private Grid? PCMacHybridGrid => ItemHelper.FindChild<Grid>(this, "PCMacHybridGrid");
|
||||
private UserInput? DiscIDTextBox => ItemHelper.FindChild<UserInput>(this, "DiscIDTextBox");
|
||||
private UserInput? DiscKeyTextBox => ItemHelper.FindChild<UserInput>(this, "DiscKeyTextBox");
|
||||
|
||||
#endregion
|
||||
|
||||
#region Contents
|
||||
|
||||
private UserInput? NetYarozeGamesTextBox => ItemHelper.FindChild<UserInput>(this, "NetYarozeGamesTextBox");
|
||||
|
||||
#endregion
|
||||
|
||||
#region Ringcodes
|
||||
|
||||
private GroupBox? L0Info => ItemHelper.FindChild<GroupBox>(this, "L0Info");
|
||||
@@ -102,14 +109,14 @@ namespace MPF.UI.Windows
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Read-only access to the current disc information view model
|
||||
/// Read-only access to the current media information view model
|
||||
/// </summary>
|
||||
public DiscInformationViewModel DiscInformationViewModel => DataContext as DiscInformationViewModel ?? new DiscInformationViewModel(new Options(), new SubmissionInfo());
|
||||
public MediaInformationViewModel MediaInformationViewModel => DataContext as MediaInformationViewModel ?? new MediaInformationViewModel(new Options(), new SubmissionInfo());
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
public DiscInformationWindow(Options options, SubmissionInfo? submissionInfo)
|
||||
public MediaInformationWindow(Options options, SubmissionInfo? submissionInfo)
|
||||
{
|
||||
#if NET40_OR_GREATER || NETCOREAPP
|
||||
InitializeComponent();
|
||||
@@ -124,14 +131,14 @@ namespace MPF.UI.Windows
|
||||
System.Windows.Shell.WindowChrome.SetWindowChrome(this, chrome);
|
||||
#endif
|
||||
|
||||
DataContext = new DiscInformationViewModel(options, submissionInfo);
|
||||
DiscInformationViewModel.Load();
|
||||
DataContext = new MediaInformationViewModel(options, submissionInfo);
|
||||
MediaInformationViewModel.Load();
|
||||
|
||||
// Limit lists, if necessary
|
||||
if (options.EnableRedumpCompatibility)
|
||||
{
|
||||
DiscInformationViewModel.SetRedumpRegions();
|
||||
DiscInformationViewModel.SetRedumpLanguages();
|
||||
MediaInformationViewModel.SetRedumpRegions();
|
||||
MediaInformationViewModel.SetRedumpLanguages();
|
||||
}
|
||||
|
||||
// Add handlers
|
||||
@@ -325,8 +332,6 @@ namespace MPF.UI.Windows
|
||||
case DiscType.NintendoWiiOpticalDiscSL:
|
||||
case DiscType.NintendoWiiOpticalDiscDL:
|
||||
case DiscType.NintendoWiiUOpticalDiscSL:
|
||||
case DiscType.UMDSL:
|
||||
case DiscType.UMDDL:
|
||||
// Quad-layer discs
|
||||
if (submissionInfo?.SizeAndChecksums?.Layerbreak3 != default(long))
|
||||
{
|
||||
@@ -421,6 +426,23 @@ namespace MPF.UI.Windows
|
||||
|
||||
break;
|
||||
|
||||
case DiscType.UMDSL:
|
||||
case DiscType.UMDDL:
|
||||
L0Info!.Header = reverseOrder ? "Layer 0 (Outer)" : "Layer 0 (Inner)";
|
||||
L0MasteringRing!.Label = "Mastering Ring";
|
||||
L0MasteringSID!.Label = "Mastering SID";
|
||||
L0Toolstamp!.Label = "Toolstamp/Mastering Code";
|
||||
L0MouldSID!.Label = "Data Side Mould SID";
|
||||
L0AdditionalMould!.Label = "Data Side Additional Mould";
|
||||
|
||||
L1Info!.Header = reverseOrder ? "Layer 1 (Inner)" : "Layer 1 (Outer)";
|
||||
L1MasteringRing!.Label = "Mastering Ring";
|
||||
L1MasteringSID!.Label = "Mastering SID";
|
||||
L1Toolstamp!.Label = "Toolstamp/Mastering Code";
|
||||
L1MouldSID!.Label = "Label Side Mould SID";
|
||||
L1AdditionalMould!.Label = "Label Side Additional Mould";
|
||||
break;
|
||||
|
||||
// All other media we assume to have no rings
|
||||
default:
|
||||
L0Info!.Visibility = Visibility.Collapsed;
|
||||
@@ -440,10 +462,22 @@ namespace MPF.UI.Windows
|
||||
var system = submissionInfo?.CommonDiscInfo?.System;
|
||||
switch (system)
|
||||
{
|
||||
case RedumpSystem.AppleMacintosh:
|
||||
PCMacHybridGrid!.Visibility = Visibility.Visible;
|
||||
break;
|
||||
|
||||
case RedumpSystem.IBMPCcompatible:
|
||||
PCMacHybridGrid!.Visibility = Visibility.Visible;
|
||||
break;
|
||||
|
||||
case RedumpSystem.NintendoWiiU:
|
||||
DiscKeyTextBox!.Visibility = Visibility.Visible;
|
||||
break;
|
||||
|
||||
case RedumpSystem.SonyPlayStation:
|
||||
NetYarozeGamesTextBox!.Visibility = Visibility.Visible;
|
||||
break;
|
||||
|
||||
case RedumpSystem.SonyPlayStation2:
|
||||
LanguageSelectionGrid!.Visibility = Visibility.Visible;
|
||||
break;
|
||||
@@ -481,7 +515,7 @@ namespace MPF.UI.Windows
|
||||
/// </summary>
|
||||
private void OnAcceptClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
DiscInformationViewModel.Save();
|
||||
MediaInformationViewModel.Save();
|
||||
DialogResult = true;
|
||||
Close();
|
||||
}
|
||||
@@ -82,6 +82,11 @@
|
||||
ToolTip="Check for updates when the application starts" Margin="0,4"
|
||||
/>
|
||||
|
||||
<CheckBox VerticalAlignment="Center" Content="Copy Update URL to Clipboard"
|
||||
IsChecked="{Binding Options.CopyUpdateUrlToClipboard}"
|
||||
ToolTip="If an update is found, try to copy the update URL to the clipboard" Margin="0,4"
|
||||
/>
|
||||
|
||||
<CheckBox VerticalAlignment="Center" Content="Fast Update Label"
|
||||
IsChecked="{Binding Options.FastUpdateLabel}"
|
||||
ToolTip="Bypasses disc checks to quickly update the output path. Use with caution!" Margin="0,4"
|
||||
@@ -195,7 +200,7 @@
|
||||
<UniformGrid Columns="2" Rows="6">
|
||||
<CheckBox VerticalAlignment="Center" Content="Show Disc Info"
|
||||
IsChecked="{Binding Options.PromptForDiscInformation}"
|
||||
ToolTip="Enable showing the disc information output after dumping" Margin="0,4"
|
||||
ToolTip="Enable showing the media information output after dumping" Margin="0,4"
|
||||
/>
|
||||
|
||||
<CheckBox VerticalAlignment="Center" Content="Pull All Information"
|
||||
@@ -403,7 +408,7 @@
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox Margin="5,5,5,5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Header="Redumper">
|
||||
<UniformGrid Columns="2" Rows="7">
|
||||
<UniformGrid Columns="2" Rows="8">
|
||||
<CheckBox VerticalAlignment="Center" Content="Enable Verbose Output"
|
||||
IsChecked="{Binding Options.RedumperEnableVerbose}"
|
||||
ToolTip="Enable verbose output in logs" Margin="0,4"
|
||||
@@ -423,6 +428,12 @@
|
||||
ToolTipService.ShowOnDisabled="True"
|
||||
/>
|
||||
|
||||
<CheckBox VerticalAlignment="Center" Content="Enable Refine Sector Mode Flag"
|
||||
IsChecked="{Binding Options.RedumperRefineSectorMode}"
|
||||
ToolTip="Enable the refine sector mode flag by default" Margin="0,4"
|
||||
/>
|
||||
<Label/> <!-- Empty label for padding -->
|
||||
|
||||
<CheckBox VerticalAlignment="Center" Content="Non-Redump Options" Click="NonRedumpModeClicked"
|
||||
IsChecked="{Binding Options.RedumperNonRedumpMode}"
|
||||
ToolTip="Enable non-redump options" Margin="0,4"
|
||||
|
||||
@@ -81,31 +81,31 @@ function download_programs() {
|
||||
declare -A DL_MAP
|
||||
|
||||
# Aaru
|
||||
DL_MAP["Aaru_linux-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_linux_arm64.tar.gz"
|
||||
DL_MAP["Aaru_linux-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_linux_amd64.tar.gz"
|
||||
DL_MAP["Aaru_osx-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_macos.zip"
|
||||
DL_MAP["Aaru_osx-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_macos.zip"
|
||||
DL_MAP["Aaru_win-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_aarch64.zip"
|
||||
DL_MAP["Aaru_win-x86"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_x86.zip"
|
||||
DL_MAP["Aaru_win-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_x64.zip"
|
||||
DL_MAP["Aaru_linux-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_linux_arm64.tar.gz"
|
||||
DL_MAP["Aaru_linux-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_linux_amd64.tar.gz"
|
||||
DL_MAP["Aaru_osx-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_macos-aarch64.zip"
|
||||
DL_MAP["Aaru_osx-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_macos.zip"
|
||||
DL_MAP["Aaru_win-arm64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_aarch64.zip"
|
||||
DL_MAP["Aaru_win-x86"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_x64.zip"
|
||||
DL_MAP["Aaru_win-x64"]="https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_x64.zip"
|
||||
|
||||
# DiscImageCreator
|
||||
DL_MAP["Creator_linux-arm64"]=""
|
||||
DL_MAP["Creator_linux-x64"]="https://github.com/user-attachments/files/20000183/DiscImageCreator_20250501.tar.gz"
|
||||
DL_MAP["Creator_linux-x64"]="https://github.com/user-attachments/files/22080484/DiscImageCreator_20250901.tar.gz"
|
||||
DL_MAP["Creator_osx-arm64"]="https://github.com/user-attachments/files/20000184/DiscImageCreator_20250501.zip"
|
||||
DL_MAP["Creator_osx-x64"]="https://github.com/user-attachments/files/20000184/DiscImageCreator_20250501.zip"
|
||||
DL_MAP["Creator_win-arm64"]=""
|
||||
DL_MAP["Creator_win-x86"]="https://github.com/user-attachments/files/20000181/DiscImageCreator_20250501.zip"
|
||||
DL_MAP["Creator_win-x64"]="https://github.com/user-attachments/files/20000181/DiscImageCreator_20250501.zip"
|
||||
DL_MAP["Creator_win-x86"]="https://github.com/user-attachments/files/22080480/DiscImageCreator_20250901.zip"
|
||||
DL_MAP["Creator_win-x64"]="https://github.com/user-attachments/files/22080480/DiscImageCreator_20250901.zip"
|
||||
|
||||
# Redumper
|
||||
DL_MAP["Redumper_linux-arm64"]=""
|
||||
DL_MAP["Redumper_linux-x64"]="https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Linux64.zip"
|
||||
DL_MAP["Redumper_osx-arm64"]="https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Darwin64.zip"
|
||||
DL_MAP["Redumper_osx-x64"]="https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Darwin64.zip"
|
||||
DL_MAP["Redumper_win-arm64"]=""
|
||||
DL_MAP["Redumper_win-x86"]="https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Windows32.zip"
|
||||
DL_MAP["Redumper_win-x64"]="https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Windows64.zip"
|
||||
DL_MAP["Redumper_linux-arm64"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-linux-arm64.zip"
|
||||
DL_MAP["Redumper_linux-x64"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-linux-x64.zip"
|
||||
DL_MAP["Redumper_osx-arm64"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-macos-arm64.zip"
|
||||
DL_MAP["Redumper_osx-x64"]=""
|
||||
DL_MAP["Redumper_win-arm64"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-arm64.zip"
|
||||
DL_MAP["Redumper_win-x86"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-x86.zip"
|
||||
DL_MAP["Redumper_win-x64"]="https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-x64.zip"
|
||||
|
||||
# Download and extract files
|
||||
echo "===== Downloading Required Programs ====="
|
||||
|
||||
@@ -70,31 +70,31 @@ function Download-Programs {
|
||||
$DL_PREFIXES = ("Aaru", "Creator", "Redumper")
|
||||
$DL_MAP = @{
|
||||
# Aaru
|
||||
"Aaru_linux-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_linux_arm64.tar.gz"
|
||||
"Aaru_linux-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_linux_amd64.tar.gz"
|
||||
"Aaru_osx-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_macos.zip"
|
||||
"Aaru_osx-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_macos.zip"
|
||||
"Aaru_win-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_aarch64.zip"
|
||||
"Aaru_win-x86" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_x86.zip"
|
||||
"Aaru_win-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.3.2/aaru-5.3.2_windows_x64.zip"
|
||||
"Aaru_linux-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_linux_arm64.tar.gz"
|
||||
"Aaru_linux-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_linux_amd64.tar.gz"
|
||||
"Aaru_osx-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_macos-aarch64.zip"
|
||||
"Aaru_osx-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_macos.zip"
|
||||
"Aaru_win-arm64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_aarch64.zip"
|
||||
"Aaru_win-x86" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_x64.zip"
|
||||
"Aaru_win-x64" = "https://github.com/aaru-dps/Aaru/releases/download/v5.4.1/aaru-5.4.1_windows_x64.zip"
|
||||
|
||||
# DiscImageCreator
|
||||
"Creator_linux-arm64" = ""
|
||||
"Creator_linux-x64" = "https://github.com/user-attachments/files/20000183/DiscImageCreator_20250501.tar.gz"
|
||||
"Creator_linux-x64" = "https://github.com/user-attachments/files/22080484/DiscImageCreator_20250901.tar.gz"
|
||||
"Creator_osx-arm64" = "https://github.com/user-attachments/files/20000184/DiscImageCreator_20250501.zip"
|
||||
"Creator_osx-x64" = "https://github.com/user-attachments/files/20000184/DiscImageCreator_20250501.zip"
|
||||
"Creator_win-arm64" = ""
|
||||
"Creator_win-x86" = "https://github.com/user-attachments/files/20000181/DiscImageCreator_20250501.zip"
|
||||
"Creator_win-x64" = "https://github.com/user-attachments/files/20000181/DiscImageCreator_20250501.zip"
|
||||
"Creator_win-x86" = "https://github.com/user-attachments/files/22080480/DiscImageCreator_20250901.zip"
|
||||
"Creator_win-x64" = "https://github.com/user-attachments/files/22080480/DiscImageCreator_20250901.zip"
|
||||
|
||||
# Redumper
|
||||
"Redumper_linux-arm64" = ""
|
||||
"Redumper_linux-x64" = "https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Linux64.zip"
|
||||
"Redumper_osx-arm64" = "https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Darwin64.zip"
|
||||
"Redumper_osx-x64" = "https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Darwin64.zip"
|
||||
"Redumper_win-arm64" = ""
|
||||
"Redumper_win-x86" = "https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Windows32.zip"
|
||||
"Redumper_win-x64" = "https://github.com/superg/redumper/releases/download/build_610/redumper-2025.06.12_build610-Windows64.zip"
|
||||
"Redumper_linux-arm64" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-linux-arm64.zip"
|
||||
"Redumper_linux-x64" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-linux-x64.zip"
|
||||
"Redumper_osx-arm64" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-macos-arm64.zip"
|
||||
"Redumper_osx-x64" = ""
|
||||
"Redumper_win-arm64" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-arm64.zip"
|
||||
"Redumper_win-x86" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-x86.zip"
|
||||
"Redumper_win-x64" = "https://github.com/superg/redumper/releases/download/b655/redumper-b655-windows-x64.zip"
|
||||
}
|
||||
|
||||
# Download and extract files
|
||||
|
||||
Reference in New Issue
Block a user