using System; using RedumpTool.Features; using SabreTools.CommandLine; using SabreTools.CommandLine.Features; namespace RedumpTool { public class Program { public static void Main(string[] args) { // Create the command set var commandSet = CreateCommands(); // Show help if nothing is input if (args.Length == 0) { Console.WriteLine("At least one argument is required"); ShowHelp(); return; } // Cache the first argument and starting index string featureName = args[0]; // Try processing the standalone arguments var topLevel = commandSet.GetTopLevel(featureName); switch (topLevel) { case Help help: help.ProcessArgs(args, 0, commandSet); return; case SiteFeature sf: sf.ProcessArgs(args, 1); sf.Execute(); return; case WIPFeature wf: wf.ProcessArgs(args, 1); wf.Execute(); return; case PacksFeature pf: pf.ProcessArgs(args, 1); pf.Execute(); return; case UserFeature uf: uf.ProcessArgs(args, 1); uf.Execute(); return; case QueryFeature qf: qf.ProcessArgs(args, 1); qf.Execute(); return; case BuildUrlFeature buf: buf.ProcessArgs(args, 1); buf.Execute(); return; // This is entirely broken on the site side //case StatsFeature sf: sf.ProcessArgs(args, 1); sf.Execute(); return; default: Console.WriteLine($"{featureName} is not a known feature"); ShowHelp(); return; } } /// /// Create the command set for the program /// private static CommandSet CreateCommands() { var commandSet = new CommandSet(); commandSet.Add(new Help(["-?", "-h", "--help"])); commandSet.Add(new SiteFeature()); commandSet.Add(new WIPFeature()); commandSet.Add(new PacksFeature()); commandSet.Add(new UserFeature()); commandSet.Add(new QueryFeature()); commandSet.Add(new BuildUrlFeature()); commandSet.Add(new StatsFeature()); return commandSet; } /// /// Show the commandline help for the program /// private static void ShowHelp() { Console.WriteLine("RedumpTool - A Redump.org recovery tool"); Console.WriteLine(); Console.WriteLine("Usage: RedumpTool [options]"); Console.WriteLine(); Console.WriteLine("Common Options"); Console.WriteLine(" -d, --debug - Enable debug mode"); Console.WriteLine(" -o , --output - Set the base output directory"); Console.WriteLine(" -u , --username - Redump username"); Console.WriteLine(" -p , --password - Redump password"); Console.WriteLine(" -a , --attempts - Number of attempts for web requests (default 3)"); Console.WriteLine(" -t , --timeout - Request timeout in whole seconds (default 30)"); Console.WriteLine(" -f, --force - Force downloading contents even if they already exist"); Console.WriteLine(" -c, --continue - Force continuing downloads through errors"); Console.WriteLine(); Console.WriteLine("site - Download pages and related files from the main site"); Console.WriteLine(" -min , --minimum - Lower bound for page numbers (incompatible with --onlynew)"); Console.WriteLine(" -max , --maximum - Upper bound for page numbers (incompatible with --onlynew)"); Console.WriteLine(" -n, --onlynew - Use the last modified view (incompatible with min and max)"); Console.WriteLine(" Internally this sets '--sort modified -sort-dir desc'"); Console.WriteLine(" --limit - Limit number of retrieved result pages"); Console.WriteLine(" --only-pages - Only download disc subpages (incompatible with --only-files)"); Console.WriteLine(" --only-files - Only download disc file attachments (incompatible with --only-pages)"); Console.WriteLine(); Console.WriteLine(" In addition to the above options, there are advanced options that allow users to finely tune their"); Console.WriteLine(" site queries. All flags below are incompatible with --minimum, --maximum, and --onlynew."); Console.WriteLine(" --anti-modchip - Filter by anti-modchip status [true, false, null]"); Console.WriteLine(" --barcode - Filter by missing barcodes"); Console.WriteLine(" --category - Filter by disc category"); // TODO: Create list Console.WriteLine(" --comments - Filter by comments only, incompatible with --contents and --protection"); Console.WriteLine(" --contents - Filter by contents only, incompatible with --comments and --protection"); Console.WriteLine(" --disc-type - Filter by disc type, requires --system [cd, dvd]"); Console.WriteLine(" --dumper - Filter by dumper"); Console.WriteLine(" --edc - Filter by EDC status [true, false, null]"); Console.WriteLine(" --edition - Filter by edition"); Console.WriteLine(" --errors - Filter by errors"); Console.WriteLine(" --language - Filter by language"); // TODO: Create list Console.WriteLine(" --letter - Filter by first letter"); Console.WriteLine(" --libcrypt - Filter by LibCrypt status [true, false, null]"); Console.WriteLine(" --media - Filter by media type"); // TODO: Create list Console.WriteLine(" --offset - Filter by disc offset"); Console.WriteLine(" --page - Retrieve specific result page"); Console.WriteLine(" --protection - Filter by protection only, incompatible with --comments and --contents"); Console.WriteLine(" --quicksearch - Filter by quicksearch"); Console.WriteLine(" --region - Filter by region"); // TODO: Create list Console.WriteLine(" --ringcode - Filter by ringcode"); Console.WriteLine(" --sort - Sort results by criteria [added, region, system, version, edition, languages, serial, status, modified]"); Console.WriteLine(" --sort-dir - Set sorting direction [asc, desc]"); Console.WriteLine(" --status - Filter by status [grey, red, yellow, blue, green]"); Console.WriteLine(" --system - Filter by system"); // TODO: Create list Console.WriteLine(" --tracks - Filter by track count [1-99]"); Console.WriteLine(); Console.WriteLine("wip - Download pages and related files from the WIP list"); Console.WriteLine(" -min , --minimum - Lower bound for page numbers (incompatible with --onlynew)"); Console.WriteLine(" -max , --maximum - Upper bound for page numbers (incompatible with --onlynew)"); Console.WriteLine(" -n, --onlynew - Use the last modified view (incompatible with min and max)"); Console.WriteLine(); Console.WriteLine("packs - Download available packs"); Console.WriteLine(" -s, --subfolders - Download packs to named subfolders"); Console.WriteLine(); Console.WriteLine("user - Download pages and related files for a particular user"); Console.WriteLine(" -n, --onlynew - Use the last modified view instead of sequential parsing"); Console.WriteLine(" -l, --list - Only list the page IDs for that user"); Console.WriteLine(" --limit - Limit number of retrieved result pages"); Console.WriteLine(" --only-pages - Only download disc subpages (incompatible with --only-files)"); Console.WriteLine(" --only-files - Only download disc file attachments (incompatible with --only-pages)"); Console.WriteLine(); Console.WriteLine("query - Download pages and related files from a Redump-compatible quicksearch query"); Console.WriteLine(" -q, --query - Redump-compatible query to run"); Console.WriteLine(" -l, --list - Only list the page IDs for that query"); Console.WriteLine(" --limit - Limit number of retrieved result pages"); Console.WriteLine(" --only-pages - Only download disc subpages (incompatible with --only-files)"); Console.WriteLine(" --only-files - Only download disc file attachments (incompatible with --only-pages)"); Console.WriteLine(); Console.WriteLine("build-url - Build a Redump URL"); Console.WriteLine(" -b, --base-path - Indicate base path for building URL, see below for options"); Console.WriteLine(); Console.WriteLine(" disc - Individual disc pages"); Console.WriteLine(" -i, --disc-id - Disc ID (required)"); Console.WriteLine(" -s, --subpath - Disc page subpath [changes, cue, edit, gdi, key, lsd, md5, sbi, sfv, sha1]"); Console.WriteLine(); Console.WriteLine(" discs - Individual disc pages"); Console.WriteLine(" --anti-modchip - Filter by anti-modchip status [true, false, null]"); Console.WriteLine(" --barcode - Filter by missing barcodes"); Console.WriteLine(" --category - Filter by disc category"); // TODO: Create list Console.WriteLine(" --comments - Filter by comments only, incompatible with --contents and --protection"); Console.WriteLine(" --contents - Filter by contents only, incompatible with --comments and --protection"); Console.WriteLine(" --disc-type - Filter by disc type, requires --system [cd, dvd]"); Console.WriteLine(" --dumper - Filter by dumper"); Console.WriteLine(" --edc - Filter by EDC status [true, false, null]"); Console.WriteLine(" --edition - Filter by edition"); Console.WriteLine(" --errors - Filter by errors"); Console.WriteLine(" --language - Filter by language"); // TODO: Create list Console.WriteLine(" --letter - Filter by first letter"); Console.WriteLine(" --libcrypt - Filter by LibCrypt status [true, false, null]"); Console.WriteLine(" --media - Filter by media type"); // TODO: Create list Console.WriteLine(" --offset - Filter by disc offset"); Console.WriteLine(" --page - Retrieve specific result page"); Console.WriteLine(" --protection - Filter by protection only, incompatible with --comments and --contents"); Console.WriteLine(" --quicksearch - Filter by quicksearch"); Console.WriteLine(" --region - Filter by region"); // TODO: Create list Console.WriteLine(" --ringcode - Filter by ringcode"); Console.WriteLine(" --sort - Sort results by criteria [added, region, system, version, edition, languages, serial, status, modified]"); Console.WriteLine(" --sort-dir - Set sorting direction [asc, desc]"); Console.WriteLine(" --status - Filter by status [grey, red, yellow, blue, green]"); Console.WriteLine(" --system - Filter by system"); // TODO: Create list Console.WriteLine(" --tracks - Filter by track count [1-99]"); Console.WriteLine(); Console.WriteLine(" discs-wip - WIP discs queue"); Console.WriteLine(); Console.WriteLine(" downloads - Downloads landing page"); Console.WriteLine(); Console.WriteLine(" list - Plaintext have/miss lists"); Console.WriteLine(" -g, --have - Have [true] or miss [false] filter"); Console.WriteLine(" --dumper - Dumper name, requires logged-in user (required)"); Console.WriteLine(" --system - System to filter list by, otherwise returns for all systems combined"); // TODO: Create list Console.WriteLine(); Console.WriteLine(" newdisc - Individual WIP disc pages"); Console.WriteLine(" -w, --newdisc-id - WIP Disc ID (required)"); Console.WriteLine(); Console.WriteLine(" pack - Download packs"); Console.WriteLine(" -k, --pack - Download pack ID (required) [cues, datfile, dkeys, gdi, keys, lsd, sbi]"); Console.WriteLine(" --system - System to download pack for (required)"); // TODO: Create list Console.WriteLine(); Console.WriteLine(" statistics - Redump statistics page"); Console.WriteLine(); Console.WriteLine("If using an ID range, both minimum and maximum are required"); Console.WriteLine(); } } }