Regenerate manifest strictly from caches
This commit is contained in:
parent
59520891a8
commit
78cd9df811
9 changed files with 457 additions and 2233 deletions
|
@ -19,19 +19,9 @@ There are some lower-level commands for finer control or full imports:
|
|||
|
||||
* Add new games to wiki-game-cache.yaml (required in order to add them to the manifest):
|
||||
* `npm run cache`
|
||||
* Update the manifest with games from the cache (`--limit 25` is default at a time):
|
||||
* All games in cache: `npm run manifest -- --all`
|
||||
* Games already in the manifest: `npm run manifest -- --existing`
|
||||
* Games missing from manifest: `npm run manifest -- --missing`
|
||||
* Games not yet checked on the wiki: `npm run manifest -- --unchecked`
|
||||
* Games that had an unknown OS: `npm run manifest -- --unsuportedOs`
|
||||
* Games that had an unusable path: `npm run manifest -- --unsupportedPath`
|
||||
* Games with paths that are too broad and are tagged as such in the wiki cache: `npm run manifest -- --tooBroad`
|
||||
* Games with paths that are too broad and aren't already tagged as such in the wiki cache: `npm run manifest -- --tooBroadUntagged`
|
||||
* Games with paths that look invalid and are tagged as such in the wiki cache: `npm run manifest -- --irregularPath`
|
||||
* Games with paths that look invalid and aren't already tagged as such in the wiki cache: `npm run manifest -- --irregularPathUntagged`
|
||||
* A specific game: `npm run manifest -- "Game 1" "Game 2"`
|
||||
* In any above command, skip games alphabetically prior to a particular one: `--skipUntil 'Game 3'`
|
||||
* Update the manifest with games from the cache:
|
||||
* All games in cache: `npm run manifest`
|
||||
* Specific games: `npm run manifest -- "Game 1" "Game 2"`
|
||||
|
||||
## API etiquette
|
||||
When running or modifying the importer script, please be mindful not to
|
||||
|
|
1506
data/manifest.yaml
1506
data/manifest.yaml
File diff suppressed because it is too large
Load diff
|
@ -311,6 +311,7 @@
|
|||
* [8bit Arena](https://www.pcgamingwiki.com/wiki/?curid=135504)
|
||||
* [8Bit Fiesta](https://www.pcgamingwiki.com/wiki/?curid=37513)
|
||||
* [8bit Invasion](https://www.pcgamingwiki.com/wiki/?curid=89318)
|
||||
* [8Bit Killer](https://www.pcgamingwiki.com/wiki/?curid=131280)
|
||||
* [8bit Pigeon Hunter](https://www.pcgamingwiki.com/wiki/?curid=140898)
|
||||
* [8BitMMO](https://www.pcgamingwiki.com/wiki/?curid=48885)
|
||||
* [8i - Make VR Human](https://www.pcgamingwiki.com/wiki/?curid=43388)
|
||||
|
@ -1886,6 +1887,7 @@
|
|||
* [AQUARYOUNS World](https://www.pcgamingwiki.com/wiki/?curid=144329)
|
||||
* [Aquatica](https://www.pcgamingwiki.com/wiki/?curid=128491)
|
||||
* [Aquila Bird Flight Simulator](https://www.pcgamingwiki.com/wiki/?curid=56768)
|
||||
* [Ar nosurge: Ode to an Unborn Star Deluxe](https://www.pcgamingwiki.com/wiki/?curid=167379)
|
||||
* [AR-K: End Game](https://www.pcgamingwiki.com/wiki/?curid=122654)
|
||||
* [AR-K: The Great Escape](https://www.pcgamingwiki.com/wiki/?curid=37219)
|
||||
* [Ar:piel](https://www.pcgamingwiki.com/wiki/?curid=152240)
|
||||
|
@ -2065,6 +2067,7 @@
|
|||
* [Armed and Gelatinous](https://www.pcgamingwiki.com/wiki/?curid=51022)
|
||||
* [Armed Seven](https://www.pcgamingwiki.com/wiki/?curid=15695)
|
||||
* [Armed Warrior VR](https://www.pcgamingwiki.com/wiki/?curid=73875)
|
||||
* [Armed with Wings: Rearmed](https://www.pcgamingwiki.com/wiki/?curid=37309)
|
||||
* [Armies of Riddle CCG Fantasy Battle Card Game](https://www.pcgamingwiki.com/wiki/?curid=50745)
|
||||
* [Armies of Riddle E.X. (Extreme)](https://www.pcgamingwiki.com/wiki/?curid=157369)
|
||||
* [Armor Clash](https://www.pcgamingwiki.com/wiki/?curid=51033)
|
||||
|
@ -2266,6 +2269,7 @@
|
|||
* [Asterion](https://www.pcgamingwiki.com/wiki/?curid=122896)
|
||||
* [Asterism](https://www.pcgamingwiki.com/wiki/?curid=142259)
|
||||
* [Asterix & Obelix XXL 2: Mission: Las Vegum](https://www.pcgamingwiki.com/wiki/?curid=175914)
|
||||
* [Asterix & Obelix XXL: Romastered](https://www.pcgamingwiki.com/wiki/?curid=162927)
|
||||
* [Astérix & Obélix: Take on Caesar](https://www.pcgamingwiki.com/wiki/?curid=178386)
|
||||
* [Astérix: Caesar's Challenge](https://www.pcgamingwiki.com/wiki/?curid=173305)
|
||||
* [Asterix: Mega Madness](https://www.pcgamingwiki.com/wiki/?curid=174308)
|
||||
|
@ -2683,6 +2687,7 @@
|
|||
* [Back to Life 2](https://www.pcgamingwiki.com/wiki/?curid=50312)
|
||||
* [Back to Life 3](https://www.pcgamingwiki.com/wiki/?curid=49109)
|
||||
* [Back to the Egg!](https://www.pcgamingwiki.com/wiki/?curid=69591)
|
||||
* [Back to the Future: The Game](https://www.pcgamingwiki.com/wiki/?curid=7384)
|
||||
* [Backfire](https://www.pcgamingwiki.com/wiki/?curid=62483)
|
||||
* [Backgammon](https://www.pcgamingwiki.com/wiki/?curid=68382)
|
||||
* [Backgammon Blitz](https://www.pcgamingwiki.com/wiki/?curid=45659)
|
||||
|
@ -2904,6 +2909,7 @@
|
|||
* [Bare Metal](https://www.pcgamingwiki.com/wiki/?curid=77616)
|
||||
* [Bargain Hunter](https://www.pcgamingwiki.com/wiki/?curid=114536)
|
||||
* [Bargon Attack](https://www.pcgamingwiki.com/wiki/?curid=146991)
|
||||
* [Barkley, Shut Up and Jam: Gaiden](https://www.pcgamingwiki.com/wiki/?curid=163670)
|
||||
* [Barney's Dream Cruise](https://www.pcgamingwiki.com/wiki/?curid=141332)
|
||||
* [Barnyard Mahjong 3](https://www.pcgamingwiki.com/wiki/?curid=41988)
|
||||
* [Baron Wittard: Nemesis of Ragnarok](https://www.pcgamingwiki.com/wiki/?curid=50377)
|
||||
|
@ -3176,6 +3182,7 @@
|
|||
* [Bead](https://www.pcgamingwiki.com/wiki/?curid=65023)
|
||||
* [Beak Squadron](https://www.pcgamingwiki.com/wiki/?curid=124044)
|
||||
* [Beam](https://www.pcgamingwiki.com/wiki/?curid=135145)
|
||||
* [BeamNG.drive](https://www.pcgamingwiki.com/wiki/?curid=9256)
|
||||
* [Bean Battles](https://www.pcgamingwiki.com/wiki/?curid=104837)
|
||||
* [Beans: The Coffee Shop Simulator](https://www.pcgamingwiki.com/wiki/?curid=62485)
|
||||
* [BeanVR](https://www.pcgamingwiki.com/wiki/?curid=62937)
|
||||
|
@ -3723,6 +3730,7 @@
|
|||
* [Blake and Mortimer: The Tables of Babylon](https://www.pcgamingwiki.com/wiki/?curid=131505)
|
||||
* [BlamBox](https://www.pcgamingwiki.com/wiki/?curid=113562)
|
||||
* [Blamdown: Udder Fury](https://www.pcgamingwiki.com/wiki/?curid=36628)
|
||||
* [Blame Him](https://www.pcgamingwiki.com/wiki/?curid=122556)
|
||||
* [Blanco](https://www.pcgamingwiki.com/wiki/?curid=40185)
|
||||
* [Blanket Heavy With Nightmares](https://www.pcgamingwiki.com/wiki/?curid=130197)
|
||||
* [BLARP!](https://www.pcgamingwiki.com/wiki/?curid=37405)
|
||||
|
@ -5845,6 +5853,7 @@
|
|||
* [CivilContract](https://www.pcgamingwiki.com/wiki/?curid=126016)
|
||||
* [Civilization](https://www.pcgamingwiki.com/wiki/?curid=4915)
|
||||
* [Civilization II](https://www.pcgamingwiki.com/wiki/?curid=422)
|
||||
* [Civilization III](https://www.pcgamingwiki.com/wiki/?curid=3168)
|
||||
* [Civilization: Call to Power](https://www.pcgamingwiki.com/wiki/?curid=148114)
|
||||
* [Civitas Nova](https://www.pcgamingwiki.com/wiki/?curid=144250)
|
||||
* [Civitatem](https://www.pcgamingwiki.com/wiki/?curid=78782)
|
||||
|
@ -7046,6 +7055,7 @@
|
|||
* [Cubotrox](https://www.pcgamingwiki.com/wiki/?curid=52930)
|
||||
* [Cubrick](https://www.pcgamingwiki.com/wiki/?curid=61108)
|
||||
* [Cubway](https://www.pcgamingwiki.com/wiki/?curid=41655)
|
||||
* [Cuckold Simulator](https://www.pcgamingwiki.com/wiki/?curid=156077)
|
||||
* [Cuco](https://www.pcgamingwiki.com/wiki/?curid=88410)
|
||||
* [Cucumber Blues](https://www.pcgamingwiki.com/wiki/?curid=60910)
|
||||
* [Cucumber Defense VR](https://www.pcgamingwiki.com/wiki/?curid=148435)
|
||||
|
@ -8100,7 +8110,6 @@
|
|||
* [Demon Pit](https://www.pcgamingwiki.com/wiki/?curid=145079)
|
||||
* [Demon Queen Melissa](https://www.pcgamingwiki.com/wiki/?curid=130672)
|
||||
* [Demon Robot Runner](https://www.pcgamingwiki.com/wiki/?curid=88150)
|
||||
* [Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles](https://www.pcgamingwiki.com/wiki/?curid=166446)
|
||||
* [Demon Truck](https://www.pcgamingwiki.com/wiki/?curid=41495)
|
||||
* [Demon Turf](https://www.pcgamingwiki.com/wiki/?curid=161608)
|
||||
* [Demon Turf: Neon Splash](https://www.pcgamingwiki.com/wiki/?curid=177760)
|
||||
|
@ -8536,7 +8545,6 @@
|
|||
* [Discovering Colors - Animals](https://www.pcgamingwiki.com/wiki/?curid=43624)
|
||||
* [Discovering Space 2](https://www.pcgamingwiki.com/wiki/?curid=58906)
|
||||
* [Discovery Tour: Ancient Egypt](https://www.pcgamingwiki.com/wiki/?curid=87656)
|
||||
* [Discovery Tour: Ancient Greece](https://www.pcgamingwiki.com/wiki/?curid=146671)
|
||||
* [Discovery Tour: Viking Age](https://www.pcgamingwiki.com/wiki/?curid=172338)
|
||||
* [Discovery! A Seek and Find Adventure](https://www.pcgamingwiki.com/wiki/?curid=41352)
|
||||
* [Discovr Egypt: King Tut's Tomb](https://www.pcgamingwiki.com/wiki/?curid=43642)
|
||||
|
@ -9043,7 +9051,6 @@
|
|||
* [Dragon Sinker](https://www.pcgamingwiki.com/wiki/?curid=77255)
|
||||
* [Dragon Skies VR](https://www.pcgamingwiki.com/wiki/?curid=52622)
|
||||
* [Dragon Slayer](https://www.pcgamingwiki.com/wiki/?curid=149592)
|
||||
* [Dragon Slayer: The Legend of Heroes II](https://www.pcgamingwiki.com/wiki/?curid=174909)
|
||||
* [Dragon Souls](https://www.pcgamingwiki.com/wiki/?curid=53491)
|
||||
* [Dragon Spear](https://www.pcgamingwiki.com/wiki/?curid=108568)
|
||||
* [Dragon Spirits](https://www.pcgamingwiki.com/wiki/?curid=154322)
|
||||
|
@ -9336,6 +9343,7 @@
|
|||
* [DUCK CASINO: BULLET](https://www.pcgamingwiki.com/wiki/?curid=113694)
|
||||
* [Duck Dynasty](https://www.pcgamingwiki.com/wiki/?curid=49514)
|
||||
* [Duck Force](https://www.pcgamingwiki.com/wiki/?curid=41549)
|
||||
* [Duck Game](https://www.pcgamingwiki.com/wiki/?curid=27815)
|
||||
* [Duck Hunt Challenge](https://www.pcgamingwiki.com/wiki/?curid=122340)
|
||||
* [Duck Hunting](https://www.pcgamingwiki.com/wiki/?curid=60738)
|
||||
* [Duck in Town - A Rising Knight](https://www.pcgamingwiki.com/wiki/?curid=144985)
|
||||
|
@ -10699,6 +10707,7 @@
|
|||
* [Face It - A game to fight inner demons](https://www.pcgamingwiki.com/wiki/?curid=47335)
|
||||
* [Face Your Demons](https://www.pcgamingwiki.com/wiki/?curid=144232)
|
||||
* [Faceless](https://www.pcgamingwiki.com/wiki/?curid=70852)
|
||||
* [Faces of War](https://www.pcgamingwiki.com/wiki/?curid=34370)
|
||||
* [Faceted Flight](https://www.pcgamingwiki.com/wiki/?curid=51147)
|
||||
* [Factions: Origins of Malu](https://www.pcgamingwiki.com/wiki/?curid=48413)
|
||||
* [Factory Balls](https://www.pcgamingwiki.com/wiki/?curid=132694)
|
||||
|
@ -10795,6 +10804,7 @@
|
|||
* [Fallen Haven](https://www.pcgamingwiki.com/wiki/?curid=131805)
|
||||
* [Fallen Haven: Liberation Day](https://www.pcgamingwiki.com/wiki/?curid=131807)
|
||||
* [Fallen Hearts](https://www.pcgamingwiki.com/wiki/?curid=156400)
|
||||
* [Fallen Hero: Rebirth](https://www.pcgamingwiki.com/wiki/?curid=87173)
|
||||
* [Fallen Kingdom](https://www.pcgamingwiki.com/wiki/?curid=74932)
|
||||
* [Fallen Knight](https://www.pcgamingwiki.com/wiki/?curid=152330)
|
||||
* [Fallen Legion: Rise to Glory](https://www.pcgamingwiki.com/wiki/?curid=77321)
|
||||
|
@ -11256,7 +11266,6 @@
|
|||
* [Final Directive](https://www.pcgamingwiki.com/wiki/?curid=80966)
|
||||
* [Final Dusk](https://www.pcgamingwiki.com/wiki/?curid=49125)
|
||||
* [Final Fantasy Awakening](https://www.pcgamingwiki.com/wiki/?curid=26745)
|
||||
* [Final Fantasy III](https://www.pcgamingwiki.com/wiki/?curid=169624)
|
||||
* [Final Fantasy XI](https://www.pcgamingwiki.com/wiki/?curid=788)
|
||||
* [Final Fleet](https://www.pcgamingwiki.com/wiki/?curid=38791)
|
||||
* [Final Hope](https://www.pcgamingwiki.com/wiki/?curid=110158)
|
||||
|
@ -11391,6 +11400,7 @@
|
|||
* [Fishy Dungeon Delving](https://www.pcgamingwiki.com/wiki/?curid=134411)
|
||||
* [Fishy2](https://www.pcgamingwiki.com/wiki/?curid=156292)
|
||||
* [Fisk](https://www.pcgamingwiki.com/wiki/?curid=79058)
|
||||
* [Fission Superstar X](https://www.pcgamingwiki.com/wiki/?curid=89702)
|
||||
* [Fist of Brave](https://www.pcgamingwiki.com/wiki/?curid=82117)
|
||||
* [Fist Of Heaven & Hell](https://www.pcgamingwiki.com/wiki/?curid=141182)
|
||||
* [Fist of love](https://www.pcgamingwiki.com/wiki/?curid=114336)
|
||||
|
@ -11954,6 +11964,7 @@
|
|||
* [Freedom Defender](https://www.pcgamingwiki.com/wiki/?curid=68156)
|
||||
* [Freedom Fall](https://www.pcgamingwiki.com/wiki/?curid=37576)
|
||||
* [Freedom Fighter](https://www.pcgamingwiki.com/wiki/?curid=62906)
|
||||
* [Freedom Fighters (2020)](https://www.pcgamingwiki.com/wiki/?curid=163712)
|
||||
* [Freedom Finger](https://www.pcgamingwiki.com/wiki/?curid=130650)
|
||||
* [Freedom Locomotion VR](https://www.pcgamingwiki.com/wiki/?curid=59035)
|
||||
* [Freedom March: Rebel Leader](https://www.pcgamingwiki.com/wiki/?curid=92205)
|
||||
|
@ -12538,7 +12549,6 @@
|
|||
* [Gene](https://www.pcgamingwiki.com/wiki/?curid=48845)
|
||||
* [Gene Rain](https://www.pcgamingwiki.com/wiki/?curid=100434)
|
||||
* [Gene Rain: Wind Tower](https://www.pcgamingwiki.com/wiki/?curid=149099)
|
||||
* [Geneforge](https://www.pcgamingwiki.com/wiki/?curid=10284)
|
||||
* [General Coco](https://www.pcgamingwiki.com/wiki/?curid=149368)
|
||||
* [General Horse and the Package of Doom](https://www.pcgamingwiki.com/wiki/?curid=113264)
|
||||
* [General Practitioner](https://www.pcgamingwiki.com/wiki/?curid=114154)
|
||||
|
@ -12605,7 +12615,6 @@
|
|||
* [Get the Gems](https://www.pcgamingwiki.com/wiki/?curid=52838)
|
||||
* [Get to a Gun](https://www.pcgamingwiki.com/wiki/?curid=112536)
|
||||
* [Get to Amkonius](https://www.pcgamingwiki.com/wiki/?curid=73523)
|
||||
* [Get to Work, Succubus-Chan!](https://www.pcgamingwiki.com/wiki/?curid=173507)
|
||||
* [Get Wrecked](https://www.pcgamingwiki.com/wiki/?curid=88896)
|
||||
* [Get'em Gary](https://www.pcgamingwiki.com/wiki/?curid=59181)
|
||||
* [Getaway Island](https://www.pcgamingwiki.com/wiki/?curid=60458)
|
||||
|
@ -12773,6 +12782,7 @@
|
|||
* [Gleamlight](https://www.pcgamingwiki.com/wiki/?curid=156905)
|
||||
* [Glick's Cat Simulator](https://www.pcgamingwiki.com/wiki/?curid=77391)
|
||||
* [Glider](https://www.pcgamingwiki.com/wiki/?curid=163191)
|
||||
* [Glider 4.0](https://www.pcgamingwiki.com/wiki/?curid=162586)
|
||||
* [Glider Classic](https://www.pcgamingwiki.com/wiki/?curid=162532)
|
||||
* [Glider Island](https://www.pcgamingwiki.com/wiki/?curid=38635)
|
||||
* [Glider Pro](https://www.pcgamingwiki.com/wiki/?curid=162748)
|
||||
|
@ -13038,6 +13048,7 @@
|
|||
* [Good Mourning](https://www.pcgamingwiki.com/wiki/?curid=164717)
|
||||
* [Good Night, Knight](https://www.pcgamingwiki.com/wiki/?curid=145600)
|
||||
* [Good Pizza, Great Pizza](https://www.pcgamingwiki.com/wiki/?curid=94340)
|
||||
* [Good Robot](https://www.pcgamingwiki.com/wiki/?curid=37401)
|
||||
* [Goodbye 2019 (Interactive Movie)](https://www.pcgamingwiki.com/wiki/?curid=155312)
|
||||
* [Goodbye My King](https://www.pcgamingwiki.com/wiki/?curid=63448)
|
||||
* [Goodnight](https://www.pcgamingwiki.com/wiki/?curid=69104)
|
||||
|
@ -13122,6 +13133,7 @@
|
|||
* [Grand Tactician: The Civil War (1861-1865)](https://www.pcgamingwiki.com/wiki/?curid=105701)
|
||||
* [Grand Theft Auto: Chinatown Wars](https://www.pcgamingwiki.com/wiki/?curid=168124)
|
||||
* [Grand Theft Auto: iFruit](https://www.pcgamingwiki.com/wiki/?curid=169308)
|
||||
* [Grand Theft Auto: The Trilogy – The Definitive Edition](https://www.pcgamingwiki.com/wiki/?curid=172128)
|
||||
* [Grandmaster Chess](https://www.pcgamingwiki.com/wiki/?curid=171214)
|
||||
* [GrandNarr!](https://www.pcgamingwiki.com/wiki/?curid=145457)
|
||||
* [Grandpa](https://www.pcgamingwiki.com/wiki/?curid=91815)
|
||||
|
@ -13605,6 +13617,7 @@
|
|||
* [Half Dead](https://www.pcgamingwiki.com/wiki/?curid=34024)
|
||||
* [Half Past Disaster](https://www.pcgamingwiki.com/wiki/?curid=72869)
|
||||
* [Half Past Impossible](https://www.pcgamingwiki.com/wiki/?curid=77269)
|
||||
* [Half-Life (SteamPipe)](https://www.pcgamingwiki.com/wiki/?curid=176027)
|
||||
* [Half-Life 2: Genry's Great Escape from City 13](https://www.pcgamingwiki.com/wiki/?curid=175041)
|
||||
* [Half-Life: Absolute Zero](https://www.pcgamingwiki.com/wiki/?curid=160590)
|
||||
* [Half-Life: Before](https://www.pcgamingwiki.com/wiki/?curid=176536)
|
||||
|
@ -13996,6 +14009,7 @@
|
|||
* [Hell Dimension VR](https://www.pcgamingwiki.com/wiki/?curid=70080)
|
||||
* [Hell Empire: Sinners Flow](https://www.pcgamingwiki.com/wiki/?curid=130599)
|
||||
* [Hell Hole](https://www.pcgamingwiki.com/wiki/?curid=130074)
|
||||
* [Hell Hunt](https://www.pcgamingwiki.com/wiki/?curid=161472)
|
||||
* [Hell in Paradise](https://www.pcgamingwiki.com/wiki/?curid=93204)
|
||||
* [Hell Knights](https://www.pcgamingwiki.com/wiki/?curid=103015)
|
||||
* [Hell of Men : Blood Brothers](https://www.pcgamingwiki.com/wiki/?curid=144949)
|
||||
|
@ -14952,6 +14966,7 @@
|
|||
* [Hungry Planet](https://www.pcgamingwiki.com/wiki/?curid=108044)
|
||||
* [Hungry Shadows](https://www.pcgamingwiki.com/wiki/?curid=104379)
|
||||
* [Hunt 'n Sneak](https://www.pcgamingwiki.com/wiki/?curid=122692)
|
||||
* [Hunt Down The Freeman](https://www.pcgamingwiki.com/wiki/?curid=79920)
|
||||
* [Hunt For Gods](https://www.pcgamingwiki.com/wiki/?curid=69417)
|
||||
* [Hunt the Thailand Hidden](https://www.pcgamingwiki.com/wiki/?curid=138764)
|
||||
* [Hunt With Friends](https://www.pcgamingwiki.com/wiki/?curid=93824)
|
||||
|
@ -15648,6 +15663,7 @@
|
|||
* [Instinct: Survival](https://www.pcgamingwiki.com/wiki/?curid=135271)
|
||||
* [Insurgence - Chains of Renegade](https://www.pcgamingwiki.com/wiki/?curid=109684)
|
||||
* [Insurgence - Second Assault](https://www.pcgamingwiki.com/wiki/?curid=137014)
|
||||
* [Insurmountable](https://www.pcgamingwiki.com/wiki/?curid=175695)
|
||||
* [Integrity](https://www.pcgamingwiki.com/wiki/?curid=75616)
|
||||
* [Intelligence](https://www.pcgamingwiki.com/wiki/?curid=91959)
|
||||
* [Intelligence Trader](https://www.pcgamingwiki.com/wiki/?curid=100370)
|
||||
|
@ -15703,6 +15719,7 @@
|
|||
* [Into the Ice: Nazis of Neuschwabenland](https://www.pcgamingwiki.com/wiki/?curid=62841)
|
||||
* [Into The Maze](https://www.pcgamingwiki.com/wiki/?curid=157189)
|
||||
* [Into the Pit](https://www.pcgamingwiki.com/wiki/?curid=170942)
|
||||
* [Into the Radius VR](https://www.pcgamingwiki.com/wiki/?curid=128621)
|
||||
* [Into the Rhythm VR](https://www.pcgamingwiki.com/wiki/?curid=69695)
|
||||
* [Into The Soup](https://www.pcgamingwiki.com/wiki/?curid=151635)
|
||||
* [Into the Stars](https://www.pcgamingwiki.com/wiki/?curid=26277)
|
||||
|
@ -15886,7 +15903,6 @@
|
|||
* [IStorm](https://www.pcgamingwiki.com/wiki/?curid=60281)
|
||||
* [Istrolid](https://www.pcgamingwiki.com/wiki/?curid=38179)
|
||||
* [Isyium](https://www.pcgamingwiki.com/wiki/?curid=54806)
|
||||
* [It Came from Space and Ate Our Brains](https://www.pcgamingwiki.com/wiki/?curid=38329)
|
||||
* [It Comes Around - A Kinetic Novel](https://www.pcgamingwiki.com/wiki/?curid=50737)
|
||||
* [It comes from hell](https://www.pcgamingwiki.com/wiki/?curid=132678)
|
||||
* [It Could Have Been Me](https://www.pcgamingwiki.com/wiki/?curid=135399)
|
||||
|
@ -18232,6 +18248,7 @@
|
|||
* [Lurk](https://www.pcgamingwiki.com/wiki/?curid=87934)
|
||||
* [Lurk in the Dark : Prologue](https://www.pcgamingwiki.com/wiki/?curid=150452)
|
||||
* [Lust Academy - Season 1](https://www.pcgamingwiki.com/wiki/?curid=174788)
|
||||
* [Lust from Beyond: Prologue](https://www.pcgamingwiki.com/wiki/?curid=153344)
|
||||
* [Lust Theory - Season 1](https://www.pcgamingwiki.com/wiki/?curid=172942)
|
||||
* [Lustful Survival](https://www.pcgamingwiki.com/wiki/?curid=149961)
|
||||
* [Luvocious](https://www.pcgamingwiki.com/wiki/?curid=75693)
|
||||
|
@ -18951,6 +18968,7 @@
|
|||
* [Mecha Knights: Nightmare](https://www.pcgamingwiki.com/wiki/?curid=151448)
|
||||
* [Mecha-Tokyo Rush](https://www.pcgamingwiki.com/wiki/?curid=97331)
|
||||
* [MechaGore](https://www.pcgamingwiki.com/wiki/?curid=33785)
|
||||
* [Mechajammer](https://www.pcgamingwiki.com/wiki/?curid=173149)
|
||||
* [Mechanic Miner](https://www.pcgamingwiki.com/wiki/?curid=78824)
|
||||
* [MechanicalFuture](https://www.pcgamingwiki.com/wiki/?curid=155897)
|
||||
* [Mechanik EN57](https://www.pcgamingwiki.com/wiki/?curid=86900)
|
||||
|
@ -21039,6 +21057,7 @@
|
|||
* [Ninja Stealth 3](https://www.pcgamingwiki.com/wiki/?curid=77216)
|
||||
* [Ninja Striker!](https://www.pcgamingwiki.com/wiki/?curid=91937)
|
||||
* [Ninja Turdle](https://www.pcgamingwiki.com/wiki/?curid=156863)
|
||||
* [Ninja Tycoon](https://www.pcgamingwiki.com/wiki/?curid=81633)
|
||||
* [Ninja Village War 2](https://www.pcgamingwiki.com/wiki/?curid=78260)
|
||||
* [Ninja Way](https://www.pcgamingwiki.com/wiki/?curid=74229)
|
||||
* [Ninja?](https://www.pcgamingwiki.com/wiki/?curid=125835)
|
||||
|
@ -21203,7 +21222,7 @@
|
|||
* [Nostradamus - The Four Horsemen of the Apocalypse](https://www.pcgamingwiki.com/wiki/?curid=80418)
|
||||
* [Not a Prank](https://www.pcgamingwiki.com/wiki/?curid=139203)
|
||||
* [Not Dying Today](https://www.pcgamingwiki.com/wiki/?curid=55764)
|
||||
* [Not for Broadcast](https://www.pcgamingwiki.com/wiki/?curid=150852)
|
||||
* [Not For Broadcast: Prologue](https://www.pcgamingwiki.com/wiki/?curid=153489)
|
||||
* [Not Heaven](https://www.pcgamingwiki.com/wiki/?curid=121145)
|
||||
* [Not in Heaven](https://www.pcgamingwiki.com/wiki/?curid=121041)
|
||||
* [Not My Day!](https://www.pcgamingwiki.com/wiki/?curid=120965)
|
||||
|
@ -21398,6 +21417,7 @@
|
|||
* [Oddmar](https://www.pcgamingwiki.com/wiki/?curid=172740)
|
||||
* [OddPlanet](https://www.pcgamingwiki.com/wiki/?curid=34448)
|
||||
* [Oddventure](https://www.pcgamingwiki.com/wiki/?curid=168818)
|
||||
* [Oddworld: Soulstorm](https://www.pcgamingwiki.com/wiki/?curid=131251)
|
||||
* [Ode to a Moon](https://www.pcgamingwiki.com/wiki/?curid=142093)
|
||||
* [Odium to the Core](https://www.pcgamingwiki.com/wiki/?curid=93108)
|
||||
* [Odyssee](https://www.pcgamingwiki.com/wiki/?curid=93353)
|
||||
|
@ -22210,7 +22230,6 @@
|
|||
* [Paparazzi Simulator](https://www.pcgamingwiki.com/wiki/?curid=154404)
|
||||
* [Paparazzi!: Tales of Tinseltown](https://www.pcgamingwiki.com/wiki/?curid=177406)
|
||||
* [Paper - A Game of Folding](https://www.pcgamingwiki.com/wiki/?curid=149093)
|
||||
* [Paper Beast](https://www.pcgamingwiki.com/wiki/?curid=165279)
|
||||
* [Paper Dungeons](https://www.pcgamingwiki.com/wiki/?curid=48170)
|
||||
* [Paper Dungeons Crawler](https://www.pcgamingwiki.com/wiki/?curid=91188)
|
||||
* [Paper Fire Rookie](https://www.pcgamingwiki.com/wiki/?curid=73302)
|
||||
|
@ -22249,7 +22268,6 @@
|
|||
* [Paradise City VR](https://www.pcgamingwiki.com/wiki/?curid=124016)
|
||||
* [Paradise Cleaning!](https://www.pcgamingwiki.com/wiki/?curid=146078)
|
||||
* [Paradise Cracked](https://www.pcgamingwiki.com/wiki/?curid=57943)
|
||||
* [Paradise Lost](https://www.pcgamingwiki.com/wiki/?curid=161803)
|
||||
* [Paradise Lost (PolyAmorous)](https://www.pcgamingwiki.com/wiki/?curid=137402)
|
||||
* [Paradise Lost: FPS Cosmic Horror Game](https://www.pcgamingwiki.com/wiki/?curid=76601)
|
||||
* [Paradox Escape Route](https://www.pcgamingwiki.com/wiki/?curid=148613)
|
||||
|
@ -22273,7 +22291,6 @@
|
|||
* [PARANOIHELL](https://www.pcgamingwiki.com/wiki/?curid=150723)
|
||||
* [Paranormal Detective: Escape from the 80's](https://www.pcgamingwiki.com/wiki/?curid=142066)
|
||||
* [Paranormal Files: Hook Man's Legend](https://www.pcgamingwiki.com/wiki/?curid=149382)
|
||||
* [Paranormal HK](https://www.pcgamingwiki.com/wiki/?curid=153800)
|
||||
* [Paranormal Psychosis](https://www.pcgamingwiki.com/wiki/?curid=34527)
|
||||
* [Paranormal Pursuit: The Gifted One](https://www.pcgamingwiki.com/wiki/?curid=55289)
|
||||
* [Paranormal Teens](https://www.pcgamingwiki.com/wiki/?curid=55690)
|
||||
|
@ -22769,6 +22786,7 @@
|
|||
* [Pirates vs Corsairs: Davy Jones's Gold](https://www.pcgamingwiki.com/wiki/?curid=48455)
|
||||
* [Pirates, Vikings, and Knights II](https://www.pcgamingwiki.com/wiki/?curid=38173)
|
||||
* [Pirouette](https://www.pcgamingwiki.com/wiki/?curid=141544)
|
||||
* [Pistol Whip](https://www.pcgamingwiki.com/wiki/?curid=150391)
|
||||
* [Pit Blocks 3D](https://www.pcgamingwiki.com/wiki/?curid=108856)
|
||||
* [Pit of Evil](https://www.pcgamingwiki.com/wiki/?curid=93847)
|
||||
* [Pitch Perfect Ear Training](https://www.pcgamingwiki.com/wiki/?curid=99660)
|
||||
|
@ -23433,7 +23451,6 @@
|
|||
* [Princess Lili](https://www.pcgamingwiki.com/wiki/?curid=104765)
|
||||
* [Princess Maker](https://www.pcgamingwiki.com/wiki/?curid=175227)
|
||||
* [Princess Maker ~Faery Tales Come True~ (HD Remake)](https://www.pcgamingwiki.com/wiki/?curid=156108)
|
||||
* [Princess Maker 2](https://www.pcgamingwiki.com/wiki/?curid=175171)
|
||||
* [Princess Maker 2 Refine](https://www.pcgamingwiki.com/wiki/?curid=50781)
|
||||
* [Princess Maker 3: Fairy Tales Come True](https://www.pcgamingwiki.com/wiki/?curid=64464)
|
||||
* [Princess Maker 5](https://www.pcgamingwiki.com/wiki/?curid=92971)
|
||||
|
@ -25813,6 +25830,7 @@
|
|||
* [Runes: The Forgotten Path](https://www.pcgamingwiki.com/wiki/?curid=62096)
|
||||
* [RuneSage](https://www.pcgamingwiki.com/wiki/?curid=52173)
|
||||
* [RuneScape: Idle Adventures](https://www.pcgamingwiki.com/wiki/?curid=37050)
|
||||
* [Runespell: Overture](https://www.pcgamingwiki.com/wiki/?curid=40946)
|
||||
* [RuneTech](https://www.pcgamingwiki.com/wiki/?curid=94601)
|
||||
* [Runewards: Strategy Card Game](https://www.pcgamingwiki.com/wiki/?curid=82316)
|
||||
* [Runeyana](https://www.pcgamingwiki.com/wiki/?curid=51619)
|
||||
|
@ -26024,6 +26042,8 @@
|
|||
* [Salvation in Corruption](https://www.pcgamingwiki.com/wiki/?curid=75469)
|
||||
* [Salvator](https://www.pcgamingwiki.com/wiki/?curid=82292)
|
||||
* [Sam & Dan: Floaty Flatmates](https://www.pcgamingwiki.com/wiki/?curid=123878)
|
||||
* [Sam & Max Save the World](https://www.pcgamingwiki.com/wiki/?curid=10590)
|
||||
* [Sam & Max: Beyond Time and Space](https://www.pcgamingwiki.com/wiki/?curid=10632)
|
||||
* [Sam & Max: Beyond Time and Space (2021)](https://www.pcgamingwiki.com/wiki/?curid=173114)
|
||||
* [Sam & Max: This Time It's Virtual!](https://www.pcgamingwiki.com/wiki/?curid=165186)
|
||||
* [Sam Glyph: Private Eye!](https://www.pcgamingwiki.com/wiki/?curid=49534)
|
||||
|
@ -27025,6 +27045,7 @@
|
|||
* [SILENT DOOM](https://www.pcgamingwiki.com/wiki/?curid=128419)
|
||||
* [Silent Footsteps](https://www.pcgamingwiki.com/wiki/?curid=103003)
|
||||
* [Silent Gentleman](https://www.pcgamingwiki.com/wiki/?curid=89332)
|
||||
* [Silent Heroes: Elite Troops of WWII](https://www.pcgamingwiki.com/wiki/?curid=126542)
|
||||
* [Silent Hunter 4: Wolves of the Pacific](https://www.pcgamingwiki.com/wiki/?curid=41362)
|
||||
* [Silent Hunter 5: Battle of the Atlantic](https://www.pcgamingwiki.com/wiki/?curid=41163)
|
||||
* [Silent Night](https://www.pcgamingwiki.com/wiki/?curid=113526)
|
||||
|
@ -27254,6 +27275,8 @@
|
|||
* [Sky Dodge](https://www.pcgamingwiki.com/wiki/?curid=93196)
|
||||
* [Sky Fleet](https://www.pcgamingwiki.com/wiki/?curid=173698)
|
||||
* [Sky Flight](https://www.pcgamingwiki.com/wiki/?curid=121323)
|
||||
* [Sky Force Anniversary](https://www.pcgamingwiki.com/wiki/?curid=37680)
|
||||
* [Sky Gamblers: Storm Raiders](https://www.pcgamingwiki.com/wiki/?curid=49015)
|
||||
* [Sky Haven](https://www.pcgamingwiki.com/wiki/?curid=81167)
|
||||
* [Sky Hawk](https://www.pcgamingwiki.com/wiki/?curid=90074)
|
||||
* [Sky Hunter](https://www.pcgamingwiki.com/wiki/?curid=75095)
|
||||
|
@ -27729,6 +27752,7 @@
|
|||
* [Soldiers of Freedom](https://www.pcgamingwiki.com/wiki/?curid=68128)
|
||||
* [Soldiers of Heaven VR](https://www.pcgamingwiki.com/wiki/?curid=40124)
|
||||
* [Soldiers of the Universe](https://www.pcgamingwiki.com/wiki/?curid=63610)
|
||||
* [Soldiers: Heroes of World War II](https://www.pcgamingwiki.com/wiki/?curid=3707)
|
||||
* [Sole](https://www.pcgamingwiki.com/wiki/?curid=69082)
|
||||
* [Solenars Edge Heroes](https://www.pcgamingwiki.com/wiki/?curid=92931)
|
||||
* [Solenars Edge Rebirth](https://www.pcgamingwiki.com/wiki/?curid=65730)
|
||||
|
@ -28431,7 +28455,6 @@
|
|||
* [Split Bullet](https://www.pcgamingwiki.com/wiki/?curid=51863)
|
||||
* [Split or Steal](https://www.pcgamingwiki.com/wiki/?curid=150576)
|
||||
* [Split Signal](https://www.pcgamingwiki.com/wiki/?curid=157323)
|
||||
* [Splitgate](https://www.pcgamingwiki.com/wiki/?curid=130533)
|
||||
* [Splitmind](https://www.pcgamingwiki.com/wiki/?curid=55610)
|
||||
* [Splitter Critters](https://www.pcgamingwiki.com/wiki/?curid=81749)
|
||||
* [Splody](https://www.pcgamingwiki.com/wiki/?curid=40169)
|
||||
|
@ -29931,7 +29954,6 @@
|
|||
* [Synthesis Universe -Episode 00-](https://www.pcgamingwiki.com/wiki/?curid=150505)
|
||||
* [Synthetic Dreams](https://www.pcgamingwiki.com/wiki/?curid=66444)
|
||||
* [Synthetic Love](https://www.pcgamingwiki.com/wiki/?curid=146136)
|
||||
* [Synthetik: Legion Rising](https://www.pcgamingwiki.com/wiki/?curid=81934)
|
||||
* [Synthrally](https://www.pcgamingwiki.com/wiki/?curid=91224)
|
||||
* [Synthrun](https://www.pcgamingwiki.com/wiki/?curid=127359)
|
||||
* [Synthwave Dream '85](https://www.pcgamingwiki.com/wiki/?curid=107712)
|
||||
|
@ -30654,6 +30676,7 @@
|
|||
* [The Basilisk](https://www.pcgamingwiki.com/wiki/?curid=100294)
|
||||
* [The Battle for Sector 219](https://www.pcgamingwiki.com/wiki/?curid=42740)
|
||||
* [The Battle for the Hut](https://www.pcgamingwiki.com/wiki/?curid=92726)
|
||||
* [The Battle for Wesnoth](https://www.pcgamingwiki.com/wiki/?curid=17699)
|
||||
* [The Battle Of Ages](https://www.pcgamingwiki.com/wiki/?curid=109208)
|
||||
* [The Battle Of Bellum](https://www.pcgamingwiki.com/wiki/?curid=112348)
|
||||
* [The Battle of Mahjong](https://www.pcgamingwiki.com/wiki/?curid=71851)
|
||||
|
@ -31365,6 +31388,7 @@
|
|||
* [The Journey to Fairytales](https://www.pcgamingwiki.com/wiki/?curid=98652)
|
||||
* [The Journey: Bob's Story](https://www.pcgamingwiki.com/wiki/?curid=39370)
|
||||
* [The Journeyman Project](https://www.pcgamingwiki.com/wiki/?curid=19860)
|
||||
* [The Journeyman Project 2: Buried in Time](https://www.pcgamingwiki.com/wiki/?curid=131674)
|
||||
* [The jungle](https://www.pcgamingwiki.com/wiki/?curid=70601)
|
||||
* [The Jungle Book](https://www.pcgamingwiki.com/wiki/?curid=79093)
|
||||
* [The Jungle Book: Groove Party](https://www.pcgamingwiki.com/wiki/?curid=172557)
|
||||
|
@ -32357,6 +32381,7 @@
|
|||
* [Theme Park Simulator](https://www.pcgamingwiki.com/wiki/?curid=157013)
|
||||
* [Theme Park Studio](https://www.pcgamingwiki.com/wiki/?curid=50614)
|
||||
* [Theme Park Worker](https://www.pcgamingwiki.com/wiki/?curid=127775)
|
||||
* [Theme Park World](https://www.pcgamingwiki.com/wiki/?curid=322)
|
||||
* [TheMemory](https://www.pcgamingwiki.com/wiki/?curid=114682)
|
||||
* [TheMovingMaze](https://www.pcgamingwiki.com/wiki/?curid=143811)
|
||||
* [TheNightfall](https://www.pcgamingwiki.com/wiki/?curid=78631)
|
||||
|
@ -33449,6 +33474,7 @@
|
|||
* [Tropical Fish Shop 2](https://www.pcgamingwiki.com/wiki/?curid=44215)
|
||||
* [Tropical Fish Shop: Annabel's Adventure](https://www.pcgamingwiki.com/wiki/?curid=174090)
|
||||
* [Tropical Girls VR](https://www.pcgamingwiki.com/wiki/?curid=51135)
|
||||
* [Tropical Liquor](https://www.pcgamingwiki.com/wiki/?curid=87369)
|
||||
* [Tross](https://www.pcgamingwiki.com/wiki/?curid=44447)
|
||||
* [Trouble In The Manor](https://www.pcgamingwiki.com/wiki/?curid=45607)
|
||||
* [Trouble Travel TT](https://www.pcgamingwiki.com/wiki/?curid=127673)
|
||||
|
@ -33784,6 +33810,7 @@
|
|||
* [Ultreïa](https://www.pcgamingwiki.com/wiki/?curid=174102)
|
||||
* [Ulxrd](https://www.pcgamingwiki.com/wiki/?curid=102287)
|
||||
* [Ulysses and the Golden Fleece](https://www.pcgamingwiki.com/wiki/?curid=147157)
|
||||
* [Uma Musume Pretty Derby](https://www.pcgamingwiki.com/wiki/?curid=167870)
|
||||
* [UMA-War VR](https://www.pcgamingwiki.com/wiki/?curid=56050)
|
||||
* [Umbra: Shadow of Death](https://www.pcgamingwiki.com/wiki/?curid=45204)
|
||||
* [Umbraseal](https://www.pcgamingwiki.com/wiki/?curid=140771)
|
||||
|
@ -35250,6 +35277,7 @@
|
|||
* [WEJAM](https://www.pcgamingwiki.com/wiki/?curid=138977)
|
||||
* [WELCOME](https://www.pcgamingwiki.com/wiki/?curid=145254)
|
||||
* [Welcome Above](https://www.pcgamingwiki.com/wiki/?curid=122458)
|
||||
* [Welcome Back Daddy](https://www.pcgamingwiki.com/wiki/?curid=93156)
|
||||
* [Welcome Back to 2007](https://www.pcgamingwiki.com/wiki/?curid=78798)
|
||||
* [Welcome Back to 2007 2](https://www.pcgamingwiki.com/wiki/?curid=109024)
|
||||
* [Welcome Home, Love](https://www.pcgamingwiki.com/wiki/?curid=59464)
|
||||
|
@ -36611,6 +36639,8 @@
|
|||
* [Zzzzz](https://www.pcgamingwiki.com/wiki/?curid=149069)
|
||||
* [Бухой Батя / Drunk Dad](https://www.pcgamingwiki.com/wiki/?curid=121753)
|
||||
* [В поисках Атлантиды](https://www.pcgamingwiki.com/wiki/?curid=121077)
|
||||
* [В тылу врага: Диверсанты 2](https://www.pcgamingwiki.com/wiki/?curid=147346)
|
||||
* [В тылу врага: Диверсанты 3](https://www.pcgamingwiki.com/wiki/?curid=147347)
|
||||
* [ВЗЛОМ ЖОПЫ](https://www.pcgamingwiki.com/wiki/?curid=156519)
|
||||
* [Воин Хинора](https://www.pcgamingwiki.com/wiki/?curid=129623)
|
||||
* [ДОКА 2! - КРОВЬ, КИШКИ, ГОЛЫЕ СИСЬКИ](https://www.pcgamingwiki.com/wiki/?curid=125181)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5,9 +5,9 @@
|
|||
"author": "Matthew T. Kennerly <mtkennerly@gmail.com>",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"cache": "ts-node ./src/bin.ts --cache",
|
||||
"wiki": "ts-node ./src/bin.ts --wiki",
|
||||
"manifest": "ts-node ./src/bin.ts --manifest",
|
||||
"recent": "ts-node ./src/bin.ts --limit 0 --cache --manifest --recent",
|
||||
"recent": "ts-node ./src/bin.ts --limit 0 --wiki --manifest --recent",
|
||||
"schema": "npm run schema:normal && npm run schema:strict",
|
||||
"schema:normal": "ajv validate -s ./data/schema.yaml -d ./data/manifest.yaml",
|
||||
"schema:strict": "ajv validate -s ./data/schema.strict.yaml -d ./data/manifest.yaml",
|
||||
|
|
55
src/bin.ts
55
src/bin.ts
|
@ -1,4 +1,4 @@
|
|||
import * as minimist from "minimist";
|
||||
import minimist from "minimist";
|
||||
|
||||
import { DEFAULT_GAME_LIMIT } from ".";
|
||||
import { ManifestFile } from "./manifest";
|
||||
|
@ -7,20 +7,11 @@ import { WikiGameCacheFile, WikiMetaCacheFile } from "./wiki";
|
|||
import { saveMissingGames } from "./missing";
|
||||
|
||||
interface Cli {
|
||||
cache?: boolean,
|
||||
wiki?: boolean,
|
||||
manifest?: boolean,
|
||||
stats?: boolean,
|
||||
all?: boolean,
|
||||
existing?: boolean,
|
||||
missing?: boolean,
|
||||
unchecked?: boolean,
|
||||
unsupportedOs?: boolean,
|
||||
unsupportedPath?: boolean,
|
||||
irregularPath?: boolean,
|
||||
irregularPathUntagged?: boolean,
|
||||
tooBroad?: boolean,
|
||||
tooBroadUntagged?: boolean,
|
||||
pathContains?: string,
|
||||
skipUntil?: string,
|
||||
recent?: boolean,
|
||||
limit?: number,
|
||||
|
@ -30,21 +21,12 @@ interface Cli {
|
|||
async function main() {
|
||||
const args = minimist<Cli>(process.argv.slice(2), {
|
||||
boolean: [
|
||||
"cache",
|
||||
"wiki",
|
||||
"manifest",
|
||||
"stats",
|
||||
"all",
|
||||
"existing",
|
||||
"missing",
|
||||
"unchecked",
|
||||
"unsupportedOs",
|
||||
"unsupportedPath",
|
||||
"irregularPath",
|
||||
"irregularPathUntagged",
|
||||
"tooBroad",
|
||||
"tooBroadUntagged",
|
||||
"steam",
|
||||
"local",
|
||||
],
|
||||
string: [
|
||||
"skipUntil",
|
||||
|
@ -69,16 +51,18 @@ async function main() {
|
|||
}
|
||||
|
||||
try {
|
||||
if (args.cache) {
|
||||
if (args.wiki) {
|
||||
if (args.recent) {
|
||||
await wikiCache.flagRecentChanges(wikiMetaCache);
|
||||
} else {
|
||||
await wikiCache.addNewGames();
|
||||
await wikiCache.refresh(
|
||||
args.skipUntil,
|
||||
args.limit ?? DEFAULT_GAME_LIMIT,
|
||||
);
|
||||
}
|
||||
|
||||
await wikiCache.refresh(
|
||||
args.skipUntil,
|
||||
args.limit ?? DEFAULT_GAME_LIMIT,
|
||||
args.all ?? false,
|
||||
);
|
||||
}
|
||||
|
||||
if (args.steam) {
|
||||
|
@ -92,25 +76,8 @@ async function main() {
|
|||
if (args.manifest) {
|
||||
await manifest.updateGames(
|
||||
wikiCache.data,
|
||||
{
|
||||
all: args.all ?? false,
|
||||
existing: args.existing ?? false,
|
||||
missing: args.missing ?? false,
|
||||
unchecked: args.unchecked ?? false,
|
||||
unsupportedOs: args.unsupportedOs ?? false,
|
||||
unsupportedPath: args.unsupportedPath ?? false,
|
||||
tooBroad: args.tooBroad ?? false,
|
||||
tooBroadUntagged: args.tooBroadUntagged ?? false,
|
||||
irregularPath: args.irregularPath ?? false,
|
||||
irregularPathUntagged: args.irregularPathUntagged ?? false,
|
||||
pathContains: args.pathContains,
|
||||
skipUntil: args.skipUntil,
|
||||
games: args._,
|
||||
recent: args.recent,
|
||||
},
|
||||
args.limit ?? DEFAULT_GAME_LIMIT,
|
||||
args._,
|
||||
steamCache,
|
||||
args.local,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
133
src/manifest.ts
133
src/manifest.ts
|
@ -1,6 +1,6 @@
|
|||
import { DELAY_BETWEEN_GAMES_MS, REPO, YamlFile } from ".";
|
||||
import { REPO, YamlFile } from ".";
|
||||
import { SteamGameCache, SteamGameCacheFile } from "./steam";
|
||||
import { WikiGameCache, getGame, pathIsTooBroad } from "./wiki";
|
||||
import { WikiGameCache, parseTemplates } from "./wiki";
|
||||
|
||||
export type Os = "dos" | "linux" | "mac" | "windows";
|
||||
|
||||
|
@ -73,7 +73,16 @@ function doLaunchPathsMatch(fromSteam: string | undefined, fromManifest: string
|
|||
}
|
||||
}
|
||||
|
||||
function integrateSteamData(game: Game, appInfo: SteamGameCache[""]) {
|
||||
function integrateWikiData(game: Game, cache: WikiGameCache[""]): void {
|
||||
if (cache.steam !== undefined) {
|
||||
game.steam = { id: cache.steam };
|
||||
}
|
||||
const info = parseTemplates(cache.templates ?? []);
|
||||
game.files = info.files;
|
||||
game.registry = info.registry;
|
||||
}
|
||||
|
||||
function integrateSteamData(game: Game, appInfo: SteamGameCache[""]): void {
|
||||
if (appInfo.installDir !== undefined) {
|
||||
game.installDir = { [appInfo.installDir]: {} };
|
||||
}
|
||||
|
@ -158,137 +167,33 @@ function integrateSteamData(game: Game, appInfo: SteamGameCache[""]) {
|
|||
}
|
||||
}
|
||||
|
||||
function isPathRegular(path: string): boolean {
|
||||
const irregular = ["{{", "</", "/>", "<br>", "//"];
|
||||
return !irregular.some(x => path.includes(x))
|
||||
}
|
||||
|
||||
export class ManifestFile extends YamlFile<Manifest> {
|
||||
path = `${REPO}/data/manifest.yaml`;
|
||||
defaultData = {};
|
||||
|
||||
async updateGames(
|
||||
wikiCache: WikiGameCache,
|
||||
filter: {
|
||||
all: boolean,
|
||||
existing: boolean,
|
||||
missing: boolean,
|
||||
unchecked: boolean,
|
||||
unsupportedOs: boolean,
|
||||
unsupportedPath: boolean,
|
||||
irregularPath: boolean,
|
||||
irregularPathUntagged: boolean,
|
||||
tooBroad: boolean,
|
||||
tooBroadUntagged: boolean,
|
||||
pathContains: string | undefined,
|
||||
skipUntil: string | undefined,
|
||||
games: Array<string> | undefined,
|
||||
recent: boolean | undefined,
|
||||
},
|
||||
limit: number | undefined,
|
||||
games: Array<string> | undefined,
|
||||
steamCache: SteamGameCacheFile,
|
||||
local: boolean,
|
||||
): Promise<void> {
|
||||
let i = 0;
|
||||
let foundSkipUntil = false;
|
||||
for (const [title, info] of Object.entries(wikiCache).sort()) {
|
||||
if (filter.skipUntil && !foundSkipUntil) {
|
||||
if (title === filter.skipUntil) {
|
||||
foundSkipUntil = true;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
this.data = {};
|
||||
|
||||
let check = false;
|
||||
if (filter.pathContains && Object.keys(this.data[title]?.files ?? {}).some(x => x.includes(filter.pathContains))) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.all) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.existing && this.data.hasOwnProperty(title)) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.missing && !this.data.hasOwnProperty(title)) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.unchecked && wikiCache[title].revId === null) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.unsupportedOs && info.unsupportedOs) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.unsupportedPath && info.unsupportedPath) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.irregularPath && wikiCache[title].irregularPath) {
|
||||
check = true;
|
||||
}
|
||||
if (
|
||||
filter.irregularPathUntagged &&
|
||||
!wikiCache[title].irregularPath &&
|
||||
(
|
||||
Object.keys(this.data[title]?.files ?? []).some(x => !isPathRegular(x)) ||
|
||||
Object.keys(this.data[title]?.registry ?? []).some(x => !isPathRegular(x))
|
||||
)
|
||||
) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.games && filter.games.includes(title)) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.tooBroad && info.tooBroad) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.tooBroadUntagged && !info.tooBroad && Object.keys(this.data[title]?.files ?? []).some(x => pathIsTooBroad(x))) {
|
||||
check = true;
|
||||
}
|
||||
if (filter.recent && wikiCache[title].recentlyChanged) {
|
||||
check = true;
|
||||
}
|
||||
if (!check) {
|
||||
for (const [title, info] of Object.entries(wikiCache).sort()) {
|
||||
if (games !== undefined && games?.length > 0 && !games.includes(title)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (info.renamedFrom) {
|
||||
for (const oldName of info.renamedFrom) {
|
||||
delete this.data[oldName];
|
||||
}
|
||||
}
|
||||
|
||||
let verifiedTitle: string;
|
||||
let game: Game;
|
||||
if (local) {
|
||||
[verifiedTitle, game] = [title, this.data[title] ?? {}];
|
||||
} else {
|
||||
[verifiedTitle, game] = await getGame(title, wikiCache);
|
||||
}
|
||||
|
||||
delete wikiCache[verifiedTitle].recentlyChanged;
|
||||
|
||||
if (verifiedTitle !== title) {
|
||||
delete this.data[title];
|
||||
}
|
||||
const game: Game = {};
|
||||
integrateWikiData(game, info);
|
||||
|
||||
if (game.files === undefined && game.registry === undefined && game.steam?.id === undefined) {
|
||||
delete this.data[verifiedTitle];
|
||||
continue;
|
||||
}
|
||||
if (game.steam?.id !== undefined) {
|
||||
const appInfo = await steamCache.getAppInfo(game.steam.id);
|
||||
integrateSteamData(game, appInfo);
|
||||
}
|
||||
this.data[verifiedTitle] = game;
|
||||
|
||||
if (!local) {
|
||||
await new Promise(resolve => setTimeout(resolve, DELAY_BETWEEN_GAMES_MS));
|
||||
}
|
||||
|
||||
i++;
|
||||
if (limit > 0 && i > limit) {
|
||||
break;
|
||||
}
|
||||
this.data[title] = game;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
347
src/wiki.ts
347
src/wiki.ts
|
@ -1,30 +1,41 @@
|
|||
import { DELAY_BETWEEN_GAMES_MS, REPO, PathType, UnsupportedOsError, UnsupportedPathError, YamlFile } from ".";
|
||||
import { Constraint, Game, Store, Tag, Os } from "./manifest";
|
||||
import * as moment from "moment";
|
||||
import moment from "moment";
|
||||
import * as NodeMw from "nodemw";
|
||||
import * as Wikiapi from "wikiapi";
|
||||
import { parse as parseWiki } from 'wikiparse';
|
||||
|
||||
type Template = {
|
||||
interface Template {
|
||||
type: "template",
|
||||
name: string,
|
||||
parameters: {},
|
||||
positionalParameters: Array<Template | string>,
|
||||
positionalParameters: Array<Array<WikiNode>>,
|
||||
};
|
||||
|
||||
type WikiNode = string | Template | {
|
||||
type: "code" | "pre",
|
||||
content: Array<WikiNode>,
|
||||
attributes: { [key: string]: string },
|
||||
} | {
|
||||
type: "comment",
|
||||
content: Array<WikiNode>,
|
||||
} | {
|
||||
type: "link",
|
||||
to: string,
|
||||
content: Array<WikiNode>,
|
||||
} | {
|
||||
type: "tag",
|
||||
content: Array<WikiNode>,
|
||||
attributes: { [key: string]: string },
|
||||
name: string,
|
||||
};
|
||||
|
||||
export type WikiGameCache = {
|
||||
[title: string]: {
|
||||
pageId: number,
|
||||
revId: number | null,
|
||||
/** Whether an entry on the page failed because of an unsupported OS. */
|
||||
unsupportedOs?: boolean,
|
||||
/** Whether an entry on the page failed because of an unsupported Path template argument. */
|
||||
unsupportedPath?: boolean,
|
||||
/** Whether an entry has a path that is too broad (e.g., the entirety of %WINDIR%). */
|
||||
tooBroad?: boolean,
|
||||
recentlyChanged?: boolean,
|
||||
renamedFrom?: Array<string>,
|
||||
irregularPath?: boolean,
|
||||
templates?: Array<string>,
|
||||
steam?: number,
|
||||
};
|
||||
|
@ -67,7 +78,7 @@ export class WikiGameCacheFile extends YamlFile<WikiGameCache> {
|
|||
};
|
||||
}
|
||||
|
||||
async refresh(skipUntil: string | undefined, limit: number): Promise<void> {
|
||||
async refresh(skipUntil: string | undefined, limit: number, all: boolean | undefined): Promise<void> {
|
||||
let i = 0;
|
||||
let foundSkipUntil = false;
|
||||
const client = makeApiClient();
|
||||
|
@ -79,6 +90,9 @@ export class WikiGameCacheFile extends YamlFile<WikiGameCache> {
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if (!all && (this.data[pageTitle].revId !== null || !this.data[pageTitle].recentlyChanged)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// console.log(`Refreshing wiki page ${pageTitle}`);
|
||||
await getGame(pageTitle, this.data, client);
|
||||
|
@ -274,82 +288,6 @@ function makePathArgRegex(arg: string): RegExp {
|
|||
return new RegExp(escaped, "gi");
|
||||
}
|
||||
|
||||
interface PathCell {
|
||||
[index: number]: string | PathCell;
|
||||
type: "comment" | "transclusion" | "page_title" | "plain" | "tag";
|
||||
parameters: { [key: string]: any }; // keys are numbers as strings
|
||||
tag?: string, // when type=tag
|
||||
toString(): string;
|
||||
}
|
||||
|
||||
function stringifyTransclusionCell(cell: PathCell): [string, boolean] {
|
||||
const templateName = cell[0] as string;
|
||||
switch (templateName.toLowerCase()) {
|
||||
case "p":
|
||||
case "path":
|
||||
return [`{{${templateName}|${cell[1]}}}`, true];
|
||||
case "code":
|
||||
case "file":
|
||||
return ["*", false];
|
||||
case "localizedpath":
|
||||
return [cell[1] as string, false];
|
||||
default:
|
||||
return ["", false];
|
||||
}
|
||||
}
|
||||
|
||||
function stringifyTagCell(cell: PathCell): [string, boolean] {
|
||||
if (cell.tag === undefined) {
|
||||
return ["", false];
|
||||
}
|
||||
switch (cell.tag.toLowerCase()) {
|
||||
case "code":
|
||||
return ["*", false];
|
||||
default:
|
||||
return ["", false];
|
||||
}
|
||||
}
|
||||
|
||||
function getRawPathFromCell(cell: string | PathCell): [string, boolean] {
|
||||
let composite = "";
|
||||
let regular = true;
|
||||
|
||||
if (typeof cell === "string") {
|
||||
if (/<br\s*\/?>/.test(cell)) {
|
||||
regular = false;
|
||||
}
|
||||
composite += cell;
|
||||
} else if (cell.type === "transclusion") {
|
||||
const [stringified, segmentRegular] = stringifyTransclusionCell(cell);
|
||||
if (!segmentRegular) {
|
||||
regular = false;
|
||||
}
|
||||
composite += stringified;
|
||||
} else if (cell.type === "tag") {
|
||||
const [stringified, segmentRegular] = stringifyTagCell(cell);
|
||||
if (!segmentRegular) {
|
||||
regular = false;
|
||||
}
|
||||
composite += stringified;
|
||||
} else if (cell.type === "plain") {
|
||||
for (let i = 0; i < 50; i++) {
|
||||
const segment = cell[i];
|
||||
if (segment === undefined) {
|
||||
break;
|
||||
}
|
||||
const [stringified, segmentRegular] = getRawPathFromCell(segment);
|
||||
if (!segmentRegular) {
|
||||
regular = false;
|
||||
}
|
||||
composite += stringified;
|
||||
}
|
||||
} else if (cell.type !== "comment" && cell.type !== "page_title") {
|
||||
regular = false;
|
||||
}
|
||||
|
||||
return [composite.trim(), regular];
|
||||
}
|
||||
|
||||
/**
|
||||
* https://www.pcgamingwiki.com/wiki/Template:Path
|
||||
*/
|
||||
|
@ -468,7 +406,9 @@ function getConstraintFromSystem(system: string, path: string): Constraint {
|
|||
} else if (system.match(/origin/i)) {
|
||||
constraint.store = "origin";
|
||||
} else {
|
||||
constraint.os = parseOs(system);
|
||||
try {
|
||||
constraint.os = parseOs(system);
|
||||
} catch {}
|
||||
}
|
||||
|
||||
const storeFromPath = getStoreConstraintFromPath(path);
|
||||
|
@ -480,10 +420,10 @@ function getConstraintFromSystem(system: string, path: string): Constraint {
|
|||
}
|
||||
|
||||
function getTagFromTemplate(template: string): Tag | undefined {
|
||||
switch (template) {
|
||||
case "Game data/saves":
|
||||
switch (template.toLowerCase()) {
|
||||
case "game data/saves":
|
||||
return "save";
|
||||
case "Game data/config":
|
||||
case "game data/config":
|
||||
return "config";
|
||||
default:
|
||||
return undefined;
|
||||
|
@ -491,6 +431,7 @@ function getTagFromTemplate(template: string): Tag | undefined {
|
|||
}
|
||||
|
||||
function parseOs(os: string): Os {
|
||||
// Others seen: "Mac OS", "PC booter", "Amazon Games", "Ubisoft Connect"
|
||||
switch (os) {
|
||||
case "Windows":
|
||||
return "windows";
|
||||
|
@ -626,19 +567,16 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
|
|||
files: {},
|
||||
registry: {},
|
||||
};
|
||||
let unsupportedOs = 0;
|
||||
let unsupportedPath = 0;
|
||||
let tooBroad = 0;
|
||||
let irregularPath = 0;
|
||||
delete cache[pageTitle].templates;
|
||||
page.parse().each("template", template => {
|
||||
if (template.name === "Infobox game") {
|
||||
const templateName = template.name.toLowerCase();
|
||||
if (templateName === "Infobox game") {
|
||||
const steamId = Number(template.parameters["steam appid"]);
|
||||
if (!isNaN(steamId) && steamId > 0) {
|
||||
game.steam = { id: steamId };
|
||||
cache[pageTitle].steam = steamId;
|
||||
}
|
||||
} else if (template.name === "Game data/saves" || template.name === "Game data/config") {
|
||||
} else if (templateName === "game data/saves" || templateName === "game data/config") {
|
||||
const reparsed = parseWiki(template.toString());
|
||||
if (reparsed[0].positionalParameters[1]?.length > 0 ?? false) {
|
||||
if (cache[pageTitle].templates === undefined) {
|
||||
|
@ -646,93 +584,131 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
|
|||
}
|
||||
cache[pageTitle].templates.push(template.toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// console.log("\n\n\n\n\n\n--------------------------------------------------------------------------")
|
||||
// console.log(template);
|
||||
for (const cellKey of Object.getOwnPropertyNames(template.parameters)) {
|
||||
if (cellKey === "0" || cellKey === "1") {
|
||||
continue;
|
||||
cache[pageTitle].revId = page.revisions?.[0]?.revid ?? 0;
|
||||
delete cache[pageTitle].recentlyChanged;
|
||||
return [pageTitle, game];
|
||||
}
|
||||
|
||||
function flattenParameter(nodes: Array<WikiNode>): [string, boolean] {
|
||||
let composite = "";
|
||||
let regular = true;
|
||||
|
||||
for (const node of nodes) {
|
||||
if (typeof node === "string") {
|
||||
composite += node;
|
||||
} else switch (node.type) {
|
||||
case "code":
|
||||
case "pre":
|
||||
composite += "*";
|
||||
break;
|
||||
case "template":
|
||||
switch (node.name.toLowerCase()) {
|
||||
case "p":
|
||||
case "path":
|
||||
const [flatP, regularP] = flattenParameter(node.positionalParameters[0]);
|
||||
if (!regularP) {
|
||||
regular = false;
|
||||
}
|
||||
composite += `{{${node.name}|${flatP}}}`;
|
||||
break;
|
||||
case "code":
|
||||
case "file":
|
||||
composite += "*";
|
||||
break;
|
||||
case "localizedpath":
|
||||
const [flatC, regularC] = flattenParameter(node.positionalParameters[0]);
|
||||
if (!regularC) {
|
||||
regular = false;
|
||||
}
|
||||
composite += flatC;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const cell = template.parameters[cellKey];
|
||||
// console.log("======================================")
|
||||
// console.log(cell)
|
||||
const [rawPath, regular] = getRawPathFromCell(cell);
|
||||
// console.log("-----------------");
|
||||
// console.log(`${regular} : ${rawPath}`);
|
||||
break;
|
||||
case "comment":
|
||||
break;
|
||||
default:
|
||||
regular = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!regular) {
|
||||
irregularPath += 1;
|
||||
return [composite.trim(), regular];
|
||||
}
|
||||
|
||||
export function parseTemplates(templates: Array<string>): Pick<Game, "files" | "registry"> {
|
||||
const game: Pick<Game, "files" | "registry"> = { files: {}, registry: {} };
|
||||
|
||||
for (const template of templates.flatMap(parseWiki) as Array<Template>) {
|
||||
if (template.type !== "template") {
|
||||
console.log(`WARNING: unknown template type '${template.type}' from: '${JSON.stringify(template)}'`);
|
||||
continue;
|
||||
}
|
||||
if (template.positionalParameters.length < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const [system, _] = flattenParameter(template.positionalParameters[0]);
|
||||
|
||||
for (const [rawPath, regular] of template.positionalParameters.slice(1).map(flattenParameter)) {
|
||||
if (rawPath.length === 0 || !regular) {
|
||||
// console.log(`IRREGULAR: ${rawPath}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const [path, pathType] = parsePath(rawPath);
|
||||
if (pathIsTooBroad(path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pathType === PathType.FileSystem) {
|
||||
const constraint = getConstraintFromSystem(system, rawPath);
|
||||
|
||||
if (!game.files.hasOwnProperty(path)) {
|
||||
game.files[path] = {
|
||||
when: [],
|
||||
tags: [],
|
||||
};
|
||||
}
|
||||
|
||||
if (rawPath.length === 0) {
|
||||
continue;
|
||||
if (!game.files[path].when.some(x => x.os === constraint.os && x.store === constraint.store)) {
|
||||
if (constraint.os !== undefined && constraint.store !== undefined) {
|
||||
game.files[path].when.push(constraint);
|
||||
} else if (constraint.os !== undefined) {
|
||||
game.files[path].when.push({ os: constraint.os });
|
||||
} else if (constraint.store !== undefined) {
|
||||
game.files[path].when.push({ store: constraint.store });
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const [path, pathType] = parsePath(rawPath);
|
||||
if (pathIsTooBroad(path)) {
|
||||
tooBroad += 1;
|
||||
continue;
|
||||
}
|
||||
if (pathType === PathType.FileSystem) {
|
||||
const constraint = getConstraintFromSystem(template.parameters[1], rawPath);
|
||||
const tag = getTagFromTemplate(template.name);
|
||||
if (tag !== undefined && !game.files[path].tags.includes(tag)) {
|
||||
game.files[path].tags.push(tag);
|
||||
}
|
||||
} else if (pathType === PathType.Registry) {
|
||||
if (!game.registry.hasOwnProperty(path)) {
|
||||
game.registry[path] = {
|
||||
when: [],
|
||||
tags: [],
|
||||
};
|
||||
}
|
||||
|
||||
if (!game.files.hasOwnProperty(path)) {
|
||||
game.files[path] = {
|
||||
when: [],
|
||||
tags: [],
|
||||
};
|
||||
}
|
||||
const store = getStoreConstraintFromPath(rawPath);
|
||||
if (store !== undefined && !game.registry[path].when.some(x => x.store === store)) {
|
||||
game.registry[path].when.push({ store });
|
||||
}
|
||||
|
||||
if (!game.files[path].when.some(x => x.os === constraint.os && x.store === constraint.store)) {
|
||||
if (constraint.os !== undefined && constraint.store !== undefined) {
|
||||
game.files[path].when.push(constraint);
|
||||
} else if (constraint.os !== undefined) {
|
||||
game.files[path].when.push({ os: constraint.os });
|
||||
} else if (constraint.store !== undefined) {
|
||||
game.files[path].when.push({ store: constraint.store });
|
||||
}
|
||||
}
|
||||
|
||||
const tag = getTagFromTemplate(template.name);
|
||||
if (tag !== undefined && !game.files[path].tags.includes(tag)) {
|
||||
game.files[path].tags.push(tag);
|
||||
}
|
||||
} else if (pathType === PathType.Registry) {
|
||||
if (!game.registry.hasOwnProperty(path)) {
|
||||
game.registry[path] = {
|
||||
when: [],
|
||||
tags: [],
|
||||
};
|
||||
}
|
||||
|
||||
const store = getStoreConstraintFromPath(rawPath);
|
||||
if (store !== undefined && !game.registry[path].when.some(x => x.store === store)) {
|
||||
game.registry[path].when.push({ store });
|
||||
}
|
||||
|
||||
const tag = getTagFromTemplate(template.name);
|
||||
if (tag !== undefined && !game.registry[path].tags.includes(tag)) {
|
||||
game.registry[path].tags.push(tag);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(` ${template.toString()}`);
|
||||
console.log(` ${e}`);
|
||||
|
||||
if (e instanceof UnsupportedOsError) {
|
||||
unsupportedOs += 1;
|
||||
continue;
|
||||
} else if (e instanceof UnsupportedPathError) {
|
||||
unsupportedPath += 1;
|
||||
continue;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
const tag = getTagFromTemplate(template.name);
|
||||
if (tag !== undefined && !game.registry[path].tags.includes(tag)) {
|
||||
game.registry[path].tags.push(tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (Object.keys(game.files).length === 0) {
|
||||
delete game.files;
|
||||
|
@ -760,30 +736,5 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
|
|||
}
|
||||
}
|
||||
|
||||
if (unsupportedOs > 0) {
|
||||
cache[pageTitle].unsupportedOs = true;
|
||||
} else {
|
||||
delete cache[pageTitle].unsupportedOs;
|
||||
}
|
||||
|
||||
if (unsupportedPath > 0) {
|
||||
cache[pageTitle].unsupportedPath = true;
|
||||
} else {
|
||||
delete cache[pageTitle].unsupportedPath;
|
||||
}
|
||||
|
||||
if (tooBroad > 0) {
|
||||
cache[pageTitle].tooBroad = true;
|
||||
} else {
|
||||
delete cache[pageTitle].tooBroad;
|
||||
}
|
||||
|
||||
if (irregularPath > 0) {
|
||||
cache[pageTitle].irregularPath = true;
|
||||
} else {
|
||||
delete cache[pageTitle].irregularPath;
|
||||
}
|
||||
|
||||
cache[pageTitle].revId = page.revisions?.[0]?.revid ?? 0;
|
||||
return [pageTitle, game];
|
||||
return game;
|
||||
}
|
||||
|
|
16
tsconfig.json
Normal file
16
tsconfig.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es5",
|
||||
"lib": [
|
||||
"es2019"
|
||||
],
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": [
|
||||
"src/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue