static void Main(string[] args) { DatParser.ProcessLibretroDb(@"e:\Devel\libretro-database", @"d:\Downloads\dats", true, true); Console.WriteLine("Done"); Console.ReadLine(); }
public static void ProcessLibretroDb(string libretroDir, string outputDir, bool generateSql, bool generateYaml) { FileSystem.CreateDirectory(outputDir); Func <DatGame, string> libretroDbDefaultGroupSelectors = (g) => g.RomCrc; var libretroDbGroupSelectors = new Dictionary <string, Func <DatGame, string> >(StringComparer.OrdinalIgnoreCase) { { "Sony - PlayStation", (g) => g.Serial }, { "Sony - PlayStation 3", (g) => g.Serial }, { "Nintendo - GameCube", (g) => g.Serial }, { "Nintendo - Wii", (g) => g.Serial }, { "Sega - Dreamcast", (g) => g.Serial }, { "Sega - Mega-CD - Sega CD", (g) => g.Serial }, { "Sega - Saturn", (g) => g.Serial }, { "Sony - PlayStation 2", (g) => g.Serial }, { "Sony - PlayStation Portable", (g) => g.Serial }, { "Sony - PlayStation Vita", (g) => g.Serial }, { "Nintendo - Wii U", (g) => g.Serial } }; var datDirs = new List <string> { Path.Combine(libretroDir, @"dat"), Path.Combine(libretroDir, @"metadat\no-intro"), Path.Combine(libretroDir, @"metadat\redump"), Path.Combine(libretroDir, @"metadat\libretro-dats"), Path.Combine(libretroDir, @"metadat\fbneo-split"), Path.Combine(libretroDir, @"metadat\mame"), Path.Combine(libretroDir, @"metadat\mame-member"), Path.Combine(libretroDir, @"metadat\mame-split"), Path.Combine(libretroDir, @"metadat\mame-nonmerged"), Path.Combine(libretroDir, @"metadat\homebrew"), Path.Combine(libretroDir, @"metadat\hacks"), Path.Combine(libretroDir, @"metadat\headered"), Path.Combine(libretroDir, @"metadat\serial"), Path.Combine(libretroDir, @"metadat\releaseyear"), Path.Combine(libretroDir, @"metadat\origin") }; var ignoreList = new List <string> { "MAME 2000 XML.dat", "MAME BIOS.dat", "FBNeo_romcenter.dat", "System.dat", "MAME 2000 BIOS.dat", "Cannonball.dat", "Cave Story.dat", "Dinothawr.dat", "DOOM.dat", "Flashback.dat", "ChaiLove.dat", "LeapFrog - LeapPad.dat", "Lutro.dat", "Microsoft - Xbox One.dat", "Mobile - J2ME.dat", "Mobile - Palm OS.dat", "Mobile - Symbian.dat", "Mobile - Zeebo.dat", "MrBoom.dat", "Quake.dat", "Quake II.dat", "Quake III.dat", "Rick Dangerous.dat", "RPG Maker.dat", "Sony - PlayStation 4.dat", "Sony - PlayStation Portable (UMD Music).dat", "Sony - PlayStation Portable (UMD Video).dat", "Tiger - Game.com.dat", "Tiger - Gizmondo.dat", "Tomb Raider.dat", "Wolfenstein 3D.dat", "Microsoft - XBOX 360 (Title Updates).dat", "HBMAME.dat", "MAME 2000.dat", "MAME 2003.dat", "MAME 2003-Plus.dat", "MAME 2010.dat", "MAME 2015.dat", "MAME 2016.dat", "MAME.dat", "ScummVM.dat", "Atomiswave.dat", "Sony - PlayStation Minis.dat", "Thomson - MOTO.dat" }; var datFiles = new List <FileInfo>(); datDirs.ForEach(d => datFiles.AddRange( Directory.GetFiles(d, "*.dat", SearchOption.AllDirectories).Where(f => !ignoreList.Contains(Path.GetFileName(f), StringComparer.OrdinalIgnoreCase)). Select(f => new FileInfo(f)))); var databases = datFiles.GroupBy(a => a.Name, StringComparer.OrdinalIgnoreCase); Parallel.ForEach( databases, (db, _, __) => { var dbName = Path.GetFileNameWithoutExtension(db.Key); var selector = libretroDbDefaultGroupSelectors; if (libretroDbGroupSelectors.TryGetValue(dbName, out var sel)) { selector = sel; } var cons = DatParser.ConsolidateDatFiles(db.Select(a => a.FullName), selector); if (dbName == "Sony - PlayStation 3") { string ps3ResgionCharToRegion(char regionKey) { switch (regionKey) { case 'A': return("Asia"); case 'C': return("China"); case 'E': return("Europe"); case 'H': return("Hong Kong"); case 'J': return("Japan"); case 'K': return("Korea"); case 'P': return("Japan"); case 'U': return("USA"); default: return(null); } } foreach (var game in cons) { if (game.Region.IsNullOrEmpty() && !game.Serial.IsNullOrEmpty()) { game.Region = ps3ResgionCharToRegion(game.Serial[2]); } } } if (generateYaml) { var yamlPath = Path.Combine(outputDir, $"{dbName}.yaml"); FileSystem.DeleteFile(yamlPath); File.WriteAllText( yamlPath, Serialization.ToYaml(cons), Encoding.UTF8); } if (generateSql) { var dbPath = Path.Combine(outputDir, $"{dbName}.db"); FileSystem.DeleteFile(dbPath); using (var sqlDb = new SQLiteDatabase(dbPath)) { sqlDb.ExecuteNonQuery("PRAGMA journal_mode = OFF;"); sqlDb.Save(cons); } } }); }