コード例 #1
0
 static void Main(string[] args)
 {
     DatParser.ProcessLibretroDb(@"e:\Devel\libretro-database", @"d:\Downloads\dats", true, true);
     Console.WriteLine("Done");
     Console.ReadLine();
 }
コード例 #2
0
ファイル: DatParser.cs プロジェクト: wuhan890809/Playnite
        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);
                    }
                }
            });
        }