From 59f4b8c43cabd7bd9b1f579cfea0a54b4a4fe38c Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Wed, 5 Aug 2026 18:50:17 -0400 Subject: [PATCH] The real-data era: token live, stubs retired, editions on demand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BGG application approved. The migration the stub markers guarded for weeks: both synthetic caches deleted; tests/fixtures/bgg_cache re-recorded from the live API (recording list extended to every scenario the suite exercises — Civilization truncation, the Sorcerer SPI tiebreak, StarForce, Flat Top's thematic year, Alice Is Missing's rpgitem fallback); resolve --force re-matched all 133 titles for real (109 auto, 6 ambiguous, 18 unmatched, 30 edition ballots); data/STUB_DATA.marker deleted with its exit condition met — the guard mechanism stays armed should stubs ever regenerate. Reality fixed one bug and taught one lesson. The bug: a multi-type search lists an expansion twice (once per matched type) and the parser kept the generic boardgame entry — parse_search now dedupes by id preferring the specific type, which is what keeps expansion tagging (the base-vs-expansion review guard) alive on real data. The lesson: hand-built ambiguity is tidier than the real thing — Wingspan has 46 versions with three plausible English Stonemaier printings, so the suite's synthetic version ids and version_auto expectations became real ballots (assertions updated to recorded reality; the cue-plumbing test keeps its crafted two-version scenario via an injected transport). New: pick edition. A cue-less matched row is version_unknown by design (never guess) — but the owner knows which printing the box is. open_version_ballot() fetches the game's complete version list, cue-scores it when cues exist, and marks the row version_ambiguous so the normal Review edition pass presents it; the Titles page grows the button (Eric's three Wiz-Wars: two cue-less copies can now each claim their edition). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g --- CLAUDE.md | 4 +- README.md | 2 +- data/STUB_DATA.marker | 1 - data/matches.csv | 133 +- data/title_edits.json | 5 + data/title_removals.json | 12 + data/titles.json | 85 +- src/bggpipe/models.py | 25 +- src/bggpipe/review.py | 36 + src/bggpipe/templates/pages/help.html | 1 + src/bggpipe/templates/pages/titles.html | 17 + src/bggpipe/webreview.py | 17 +- tests/data/titles.json | 146 +- tests/fixtures/bgg_cache/STUB_FIXTURES.marker | 1 - ...rdgame-2Cboardgameexpansion_8996b7d5fe.xml | 1 - ...MINUTE-DUNGEON-type=rpgitem_58faea4564.xml | 1 - ...oic-Age---Featuring-New-Civ_7c5116c957.xml | 1 - ...oic-Age---Featuring-New-Civ_8486af3c6d.xml | 2 +- ...oic-Age-type=boardgame-2Cbo_1f14c01996.xml | 2 +- ...the-Heroic-Age-type=rpgitem_8704f88656.xml | 1 - ...rdgame-2Cboardgameexpansion_aca1fe8ceb.xml | 10 +- ...D-CIVILIZATION-type=rpgitem_436f8cfac3.xml | 1 - ...type=boardgame-2Cboardgamee_a7e88a81de.xml | 2 +- ...E-PLAYING-GAME-type=rpgitem_8efe1bd6f0.xml | 2 +- ...boardgame-2Cboardgameexpans_18e95963dd.xml | 2 +- ...T-ROLE-PLAYING-type=rpgitem_daff8eceef.xml | 1 - ...=boardgame-2Cboardgameexpan_348fc9c865.xml | 1 - ...ALLS-EXPANSION-type=rpgitem_82261134d9.xml | 1 - ...rdgame-2Cboardgameexpansion_7f29a69be5.xml | 2 +- ...ICE-IS-MISSING-type=rpgitem_088ab34fc2.xml | 10 +- ...rdgame-2Cboardgameexpansion_6b1ff7dc27.xml | 2 +- ...query=ALICE-IS-type=rpgitem_f2de3eea31.xml | 1 - ...rdgame-2Cboardgameexpansion_877bb1bc86.xml | 1 - ...of-Renaissance-type=rpgitem_83ec5d7426.xml | 1 - ...rdgame-2Cboardgameexpansion_22856aa961.xml | 2 +- ...t-of-the-Zzyzx-type=rpgitem_288971e44c.xml | 2 +- ...rdgame-2Cboardgameexpansion_48feb4349d.xml | 2 +- ...query=Blorvath-type=rpgitem_ad250413dc.xml | 2 +- ...rdgame-2Cboardgameexpansion_b1f230622c.xml | 1 - ...uery=Britannia-type=rpgitem_78177b4e85.xml | 1 - ...rdgame-2Cboardgameexpansion_782f1326dc.xml | 1 - ...ery=CAT-CRIMES-type=rpgitem_3d56b6309b.xml | 1 - ...of-History-8000-BC-to-250-B_4292e34c30.xml | 1 - ...of-History-8000-BC-to-250-B_6dfe500fb4.xml | 2 +- ...rdgame-2Cboardgameexpansion_481c867f49.xml | 2 +- ...the-Heroic-Age-type=rpgitem_05fdc9d88b.xml | 1 - ...rdgame-2Cboardgameexpansion_dbefe5359a.xml | 563 +- ...y=CIVILIZATION-type=rpgitem_5e9e2b0726.xml | 1 - ...rdgame-2Cboardgameexpansion_848554ec74.xml | 1 - ...SMIC-ENCOUNTER-type=rpgitem_14e74aa71f.xml | 1 - ...rdgame-2Cboardgameexpansion_d875abc790.xml | 14 +- ...-International-type=rpgitem_957f2522ae.xml | 1 - ...rdgame-2Cboardgameexpansion_154ea686d4.xml | 1 - ...ainst-Humanity-type=rpgitem_04b2bcdf24.xml | 1 - ...rdgame-2Cboardgameexpansion_5be385814d.xml | 1179 +++- ...ch_query=Catan-type=rpgitem_63fb6e5035.xml | 1 - ...rdgame-2Cboardgameexpansion_9f48c481c4.xml | 34 +- ...query=Citadels-type=rpgitem_22dea38263.xml | 1 - ...rdgame-2Cboardgameexpansion_c8073100d5.xml | 1 - ...-Time-26-Space-type=rpgitem_48015c5934.xml | 1 - ...rdgame-2Cboardgameexpansion_f71cb1cc0c.xml | 1 - ...ery=DUNGEON-21-type=rpgitem_95d15d03fd.xml | 1 - ...rdgame-2Cboardgameexpansion_e688e8fb3c.xml | 1 - ...uery=Diplomacy-type=rpgitem_0747a2387d.xml | 1 - ...rdgame-2Cboardgameexpansion_9c49c5766f.xml | 1 - ...ery=Dungeon-21-type=rpgitem_3bf546910a.xml | 1 - ...rdgame-2Cboardgameexpansion_d7b66e2720.xml | 1 - ...LODING-KITTENS-type=rpgitem_49ed26a640.xml | 1 - ...rdgame-2Cboardgameexpansion_f29706aacf.xml | 26 +- ...query=FLAT-TOP-type=rpgitem_c1e66fb254.xml | 1 - ...rdgame-2Cboardgameexpansion_b1b7b72de1.xml | 1 - ...uery=Hebarceos-type=rpgitem_07740d9a32.xml | 1 - ...rdgame-2Cboardgameexpansion_668671d8a7.xml | 1 - ...ery=Herbaceous-type=rpgitem_d78832e3ed.xml | 1 - ...rdgame-2Cboardgameexpansion_fcff3e9f9a.xml | 1 - ...y-of-the-World-type=rpgitem_7928f17f52.xml | 1 - ...rdgame-2Cboardgameexpansion_7ce024e973.xml | 1 - ...=Joking-Hazard-type=rpgitem_3550758066.xml | 1 - ...rdgame-2Cboardgameexpansion_398fbd77a5.xml | 1 - ...ery=PATCH-WORK-type=rpgitem_afb691fd45.xml | 1 - ...rdgame-2Cboardgameexpansion_1113df3dae.xml | 1 - ...h_query=ROYALS-type=rpgitem_740855ed66.xml | 1 - ...rdgame-2Cboardgameexpansion_7c9b71b031.xml | 1 - ...uery=SANTORINI-type=rpgitem_b3713fc18f.xml | 1 - ...rdgame-2Cboardgameexpansion_9de3a82a7b.xml | 1 - ...h_query=SCRAWL-type=rpgitem_28917ca749.xml | 1 - ...rdgame-2Cboardgameexpansion_e8b9feea5d.xml | 1 - ...-OF-NOTTINGHAM-type=rpgitem_77cf1f8445.xml | 1 - ...rdgame-2Cboardgameexpansion_2403c9a3c0.xml | 1 - ..._query=SKIP-BO-type=rpgitem_3f9e6315a6.xml | 1 - ...rdgame-2Cboardgameexpansion_0be5b731c6.xml | 6 +- ...gical-Conflict-type=rpgitem_2ba94ce51c.xml | 1 - ...rdgame-2Cboardgameexpansion_1548147928.xml | 1 - ...query=SORCERER-type=rpgitem_0a90b76555.xml | 1 - ...in-the-25th-Century-type=bo_d1ea14fbd7.xml | 6 +- ...in-the-25th-Century-type=rp_d8afe77786.xml | 1 - ...rdgame-2Cboardgameexpansion_e4d139c3af.xml | 1 - ...TARFORCE-ALPHA-type=rpgitem_5fc9118ed9.xml | 1 - ...rdgame-2Cboardgameexpansion_d3e090d859.xml | 1 - ...er-Nonsense-21-type=rpgitem_f01cc4ca29.xml | 1 - ...rdgame-2Cboardgameexpansion_85d6b5d538.xml | 10 +- ...pean-Expansion-type=rpgitem_38f0ad0fff.xml | 1 - ...rdgame-2Cboardgameexpansion_f5cb460ffe.xml | 18 +- ...ingspan-Europe-type=rpgitem_4387722048.xml | 2 +- ...rdgame-2Cboardgameexpansion_0316afc400.xml | 118 +- ...query=Wingspan-type=rpgitem_f93bee11fc.xml | 1 - ...rdgame-2Cboardgameexpansion_5e60175c58.xml | 1 - ..._query=Wiz-War-type=rpgitem_3adf0a77c6.xml | 1 - ...rdgame-2Cboardgameexpansion_2c8b74ea84.xml | 1 - ...=a-Gentle-Rain-type=rpgitem_a3470f199b.xml | 1 - ...ng_id=1218-2C104710-stats=1_9ac6609f5e.xml | 1 - ...thing_id=13-2C66056-stats=1_42106f768e.xml | 3328 ++++++++++++ .../thing_id=1339-versions=1_76fffe61e6.xml | 1 - .../thing_id=177-versions=1_a50b6534c2.xml | 474 +- .../thing_id=193621-versions=1_b0b8e177ce.xml | 1 - .../thing_id=224-versions=1_0965f5986e.xml | 1 - .../thing_id=235096-versions=1_6971fd8efc.xml | 1 - .../thing_id=240-versions=1_720245041a.xml | 1 - .../thing_id=2524-versions=1_a36c20def8.xml | 551 +- .../thing_id=2529-versions=1_ae4f4b0f0f.xml | 538 +- .../thing_id=26-versions=1_3d488157bf.xml | 1 - .../thing_id=266192-versions=1_4904563f7f.xml | 4814 ++++++++++++++++- .../thing_id=268163-versions=1_73358308e2.xml | 1 - .../thing_id=3090-versions=1_c1e6ddabda.xml | 1 - ...ng_id=3585-2C244115-stats=1_f1c50911dc.xml | 1 - .../thing_id=3585-versions=1_48ead3ba60.xml | 708 ++- ...thing_id=39-2C40529-stats=1_7fb40b9d38.xml | 1 - .../thing_id=400001-versions=1_6c87ca2e4a.xml | 1 - .../thing_id=400002-versions=1_a82fe6afff.xml | 1 - ...ing_id=478-2C205398-stats=1_9bd49e518b.xml | 1556 +++++- .../thing_id=483-versions=1_795d325a85.xml | 1 - .../thing_id=71-versions=1_19169a34ed.xml | 1402 ++++- tests/test_resolve.py | 45 +- tests/test_review.py | 71 +- tests/test_webreview.py | 39 + 135 files changed, 15851 insertions(+), 266 deletions(-) delete mode 100644 data/STUB_DATA.marker delete mode 100644 tests/fixtures/bgg_cache/STUB_FIXTURES.marker delete mode 100644 tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=rpgitem_58faea4564.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_7c5116c957.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=rpgitem_8704f88656.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=rpgitem_436f8cfac3.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=rpgitem_daff8eceef.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=boardgame-2Cboardgameexpan_348fc9c865.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=rpgitem_82261134d9.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ALICE-IS-type=rpgitem_f2de3eea31.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=rpgitem_83ec5d7426.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Britannia-type=rpgitem_78177b4e85.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=rpgitem_3d56b6309b.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_4292e34c30.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=rpgitem_05fdc9d88b.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=rpgitem_5e9e2b0726.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=rpgitem_14e74aa71f.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=rpgitem_957f2522ae.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=rpgitem_04b2bcdf24.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Catan-type=rpgitem_63fb6e5035.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Citadels-type=rpgitem_22dea38263.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=rpgitem_48015c5934.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=boardgame-2Cboardgameexpansion_f71cb1cc0c.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=rpgitem_95d15d03fd.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Diplomacy-type=rpgitem_0747a2387d.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Dungeon-21-type=rpgitem_3bf546910a.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=rpgitem_49ed26a640.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=rpgitem_c1e66fb254.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Hebarceos-type=boardgame-2Cboardgameexpansion_b1b7b72de1.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Hebarceos-type=rpgitem_07740d9a32.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Herbaceous-type=rpgitem_d78832e3ed.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=History-of-the-World-type=rpgitem_7928f17f52.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=rpgitem_3550758066.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=rpgitem_afb691fd45.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=ROYALS-type=rpgitem_740855ed66.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SANTORINI-type=rpgitem_b3713fc18f.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SCRAWL-type=rpgitem_28917ca749.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=rpgitem_77cf1f8445.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SKIP-BO-type=rpgitem_3f9e6315a6.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=rpgitem_2ba94ce51c.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=SORCERER-type=rpgitem_0a90b76555.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=rp_d8afe77786.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=rpgitem_5fc9118ed9.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=rpgitem_f01cc4ca29.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=rpgitem_38f0ad0fff.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Wingspan-type=rpgitem_f93bee11fc.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=Wiz-War-type=rpgitem_3adf0a77c6.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml delete mode 100644 tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=rpgitem_a3470f199b.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml create mode 100644 tests/fixtures/bgg_cache/thing_id=13-2C66056-stats=1_42106f768e.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=400001-versions=1_6c87ca2e4a.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=400002-versions=1_a82fe6afff.xml delete mode 100644 tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml diff --git a/CLAUDE.md b/CLAUDE.md index a2b18ca..2ad1a11 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co | # | Command | What it does | Status | |---|---------|--------------|--------| | 1 | `bggpipe extract` | Claude vision reads titles + edition cues from `photos/` | working | -| 2 | `bggpipe resolve` | match titles to BGG IDs and versions via XML API2 | working (stub data — see hard rules) | +| 2 | `bggpipe resolve` | match titles to BGG IDs and versions via XML API2 | working (real API data since 2026-08-05) | | 3 | `bggpipe review` | human review of ambiguous/unmatched items; `--web` serves a FastAPI UI on port 8377 | working | | 4 | `bggpipe diff` | diff approved matches against the existing BGG collection | working | | 5 | `bggpipe upload` | add games via a logged-in Playwright session | built; browser flows unverified until real data exists (`--dry-run` works now) | @@ -40,7 +40,7 @@ Full design lives in `bgg-shelf-pipeline-spec.md` (read it before changing pipel - **Every stage is idempotent and resumable** — killing mid-run and restarting must lose no work; re-runs skip already-processed items. - Use only the XML API2 and the public website — no undocumented BGG endpoints (BGG tightened access policies in 2025). - BGG has **no write API**: writes drive the real website with a logged-in Playwright session. -- **Stub-resolved data is never upload-ready.** All version_ids (and some game data) in `matches.csv`, `to_add.csv`, and `to_update.csv` currently come from SYNTHETIC stub fixtures — placeholders until real fixtures exist. When `BGG_API_TOKEN` arrives: delete both cache dirs, re-record fixtures, `resolve --force`, re-review. Two provenance markers guard this (both written by the fixture generators): `data/bgg_cache/STUB_FIXTURES.marker` (gitignored, travels with the stub XML) and `data/STUB_DATA.marker` (**committed**, so a fresh clone stays guarded). The upload stage MUST refuse to run while either exists; delete `data/STUB_DATA.marker` only after re-resolving from real fixtures. +- **Synthetic data must never reach upload.** The stub era ended 2026-08-05: `matches.csv` and `tests/fixtures/bgg_cache/` now hold real API data. The guard mechanism stays armed: the stub-fixture generators write `data/bgg_cache/STUB_FIXTURES.marker` (gitignored) and `data/STUB_DATA.marker` (committed), and the upload stage MUST refuse to run while either exists — regenerating stubs re-locks upload automatically. ## Domain gotchas diff --git a/README.md b/README.md index 0af376c..c2b40fe 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ rm -rf data/bgg_cache data/extract_raw Two of those files deserve a word: -- **`data/STUB_DATA.marker`** — the committed CSVs were resolved from *hand-written stub fixtures* (the author's BGG application is still awaiting approval), so every version id in them is a synthetic placeholder. The upload stage refuses to run while this marker exists, precisely so nobody (including a fresh clone) can push placeholder data to a real BGG account. Starting fresh with your own token, you'll never see it again. +- **`data/STUB_DATA.marker`** — normally absent. It appears only if the synthetic stub fixtures (from `scripts/write_stub_fixtures.py`) regenerate the CSVs, and the upload stage refuses to run while it exists — so placeholder data can never reach a real BGG account. The committed CSVs are real API data. - **`data/collection_snapshot_*.xml`** — with `BGG_API_TOKEN` set, `diff` fetches your collection live and you don't need these. Without a token (still waiting on approval?), you can use the logged-in-browser exemption: while signed in to BGG, save these two URLs as `data/collection_snapshot_base.xml` and `data/collection_snapshot_expansions.xml` (if you get a "queued" message, refresh after a few seconds): - `https://boardgamegeek.com/xmlapi2/collection?username=YOU&own=1&version=1` - `https://boardgamegeek.com/xmlapi2/collection?username=YOU&own=1&version=1&subtype=boardgameexpansion` diff --git a/data/STUB_DATA.marker b/data/STUB_DATA.marker deleted file mode 100644 index ed284bc..0000000 --- a/data/STUB_DATA.marker +++ /dev/null @@ -1 +0,0 @@ -The CSVs in this directory were resolved from hand-written stub fixtures, not real BGG data — version_ids are SYNTHETIC. The upload stage refuses to run while this file exists. Delete it only after re-resolving against real recorded fixtures (BGG_API_TOKEN + scripts/record_fixtures.py + resolve --force). diff --git a/data/matches.csv b/data/matches.csv index 46adf59..ea60167 100644 --- a/data/matches.csv +++ b/data/matches.csv @@ -1,18 +1,133 @@ title_raw,bgg_id,bgg_name,year,type,match_status,version_id,version_name,version_status,candidates_json,version_candidates_json,source_photos,merged_into,dedupe_veto -ROYALS,165986,Royals,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 165986, ""name"": ""Royals"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg,, -CAT CRIMES,235096,Cat Crimes,2017,boardgame,auto,360982,English edition,version_auto,"[{""bgg_id"": 235096, ""name"": ""Cat Crimes"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 360982, ""name"": ""English edition"", ""year"": 2017, ""publishers"": [""ThinkFun""], ""languages"": [""English""], ""score"": 3}]",IMG_4499.jpeg;IMG_4505.jpeg,, -COSMIC ENCOUNTER,40529,Cosmic Encounter,2008,boardgame,auto,,,version_unknown,"[{""bgg_id"": 39, ""name"": ""Cosmic Encounter"", ""year"": 1977, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 7000, ""rank"": 800}, {""bgg_id"": 40529, ""name"": ""Cosmic Encounter"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 75000, ""rank"": 150}]",[],IMG_4499.jpeg,, +ROYALS,165986,Royals,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 154495, ""name"": ""Royals"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 72, ""rank"": null}, {""bgg_id"": 165986, ""name"": ""Royals"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 4114, ""rank"": 1534}]",[],IMG_4499.jpeg,, +CAT CRIMES,,,,,unmatched,,,,[],[],IMG_4499.jpeg;IMG_4505.jpeg;shelf-20260803-215723.jpg,, +COSMIC ENCOUNTER,40529,Cosmic Encounter,1991,boardgame,approved,,,version_unknown,"[{""bgg_id"": 15, ""name"": ""Cosmic Encounter"", ""year"": 1977, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 4593, ""rank"": 1749}, {""bgg_id"": 39463, ""name"": ""Cosmic Encounter"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 43809, ""rank"": 232}, {""bgg_id"": 40529, ""name"": ""Cosmic Encounter"", ""year"": 1991, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1728, ""rank"": 3075}, {""bgg_id"": 40531, ""name"": ""Cosmic Encounter"", ""year"": 2000, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 2609, ""rank"": 4543}]",[],IMG_4499.jpeg,, SHERIFF OF NOTTINGHAM,157969,Sheriff of Nottingham,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 157969, ""name"": ""Sheriff of Nottingham"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg,, -a Gentle Rain,268163,A Gentle Rain,2019,boardgame,auto,268164,Bloom Edition,version_auto,"[{""bgg_id"": 268163, ""name"": ""A Gentle Rain"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 268164, ""name"": ""Bloom Edition"", ""year"": 2021, ""publishers"": [""Mondo Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4501.jpeg;IMG_4507.jpeg,, -SANTORINI,194655,Santorini,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 194655, ""name"": ""Santorini"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4502.jpeg;IMG_4506.jpeg;IMG_4507.jpeg;IMG_4556.jpeg,, +5 MINUTE DUNGEON,207830,5-Minute Dungeon,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 207830, ""name"": ""5-Minute Dungeon"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg,, +Britannia - Game of the Birth of Britain,240,Britannia,1986,boardgame,auto,24621,Avalon Hill second edition,version_auto,"[{""bgg_id"": 240, ""name"": ""Britannia"", ""year"": 1986, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 41.9, ""owned"": null, ""rank"": null}]","[{""version_id"": 24621, ""name"": ""Avalon Hill second edition"", ""year"": 1987, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg,, +Civilization - Game of the Heroic Age - The Dawn of History 8000 BC to 250 BC,71,Civilization,1980,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 71, ""name"": ""Civilization"", ""year"": 1980, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 31.2, ""owned"": null, ""rank"": null}]","[{""version_id"": 24006, ""name"": ""Avalon Hill first edition 1981"", ""year"": 1981, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 24003, ""name"": ""Avalon Hill second edition 1982"", ""year"": 1982, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg,, +Advanced Civilization - Game Expansion of the Heroic Age,177,Advanced Civilization,1991,boardgame,auto,24972,English edition,version_auto,"[{""bgg_id"": 177, ""name"": ""Advanced Civilization"", ""year"": 1991, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 59.2, ""owned"": null, ""rank"": null}]","[{""version_id"": 24972, ""name"": ""English edition"", ""year"": 1991, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg,, +Doctor Who - The Game of Time & Space,3090,Doctor Who: The Game of Time & Space,1980,boardgame,auto,25782,English edition,version_auto,"[{""bgg_id"": 3090, ""name"": ""Doctor Who: The Game of Time & Space"", ""year"": 1980, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 25782, ""name"": ""English edition"", ""year"": 1980, ""publishers"": [""Games Workshop Ltd.""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg,, +Sorcerer - The Game of Magical Conflict,3585,Sorcerer: The Game of Magical Conflict,1975,boardgame,auto,211154,SPI Designer's Edition,version_auto,"[{""bgg_id"": 3585, ""name"": ""Sorcerer: The Game of Magical Conflict"", ""year"": 1975, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 211154, ""name"": ""SPI Designer's Edition"", ""year"": 1975, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 158145, ""name"": ""SPI boxed edition"", ""year"": 1975, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 249246, ""name"": ""SPI flat-pack edition"", ""year"": 1975, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 33889, ""name"": ""UK flat box edition"", ""year"": 1975, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 158147, ""name"": ""SPI French/Dutch edition"", ""year"": 1975, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""Dutch"", ""French""], ""score"": 2}]",IMG_4500.jpeg,, +StarForce - Alpha Centauri - Interstellar Conflict in the 25th Century,2524,StarForce 'Alpha Centauri': Interstellar Conflict in the 25th Century,1974,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 2524, ""name"": ""StarForce 'Alpha Centauri': Interstellar Conflict in the 25th Century"", ""year"": 1974, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 219137, ""name"": ""SPI boxed designer's edition"", ""year"": 1974, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 108034, ""name"": ""SPI Designer's Edition"", ""year"": 1974, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 28154, ""name"": ""SPI flat pack designer's edition"", ""year"": 1974, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 28238, ""name"": ""SPI boxed edition"", ""year"": 1974, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 249134, ""name"": ""SPI Flat Tray Standard Edition"", ""year"": 1974, ""publishers"": [""SPI (Simulations Publications, Inc.)""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg,, +a Gentle Rain,334011,A Gentle Rain,2021,boardgame,auto,701315,English Bloom edition,version_auto,"[{""bgg_id"": 334011, ""name"": ""A Gentle Rain"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 701315, ""name"": ""English Bloom edition"", ""year"": 2024, ""publishers"": [""Incredible Dream Studios""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 798833, ""name"": ""Polish Bloom edition"", ""year"": 2026, ""publishers"": [""MeepleMood""], ""languages"": [""Polish""], ""score"": 2}]",IMG_4501.jpeg;IMG_4507.jpeg,, +SANTORINI,194655,Santorini,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 9963, ""name"": ""Santorini"", ""year"": 2004, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 387, ""rank"": 5834}, {""bgg_id"": 146645, ""name"": ""Santorini"", ""year"": null, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 84, ""rank"": null}, {""bgg_id"": 194655, ""name"": ""Santorini"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 66422, ""rank"": 315}]",[],IMG_4501.jpeg;IMG_4502.jpeg;IMG_4506.jpeg;IMG_4507.jpeg;IMG_4556.jpeg,, +Utter Nonsense!,161928,Utter Nonsense,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 161928, ""name"": ""Utter Nonsense"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4507.jpeg;IMG_4556.jpeg,, Cards Against Humanity,50381,Cards Against Humanity,2009,boardgame,auto,,,version_unknown,"[{""bgg_id"": 50381, ""name"": ""Cards Against Humanity"", ""year"": 2009, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4556.jpeg,, Joking Hazard,193621,Joking Hazard,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 193621, ""name"": ""Joking Hazard"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4502.jpeg,, -SKIP-BO,1078,Skip-Bo,1967,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1078, ""name"": ""Skip-Bo"", ""year"": 1967, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4542.jpeg,, +SKIP-BO,1269,Skip-Bo,1967,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1269, ""name"": ""Skip-Bo"", ""year"": 1967, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4542.jpeg,, EXPLODING KITTENS,172225,Exploding Kittens,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 172225, ""name"": ""Exploding Kittens"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4505.jpeg,, -SCRAWL,218866,Scrawl,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 218866, ""name"": ""Scrawl"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, +Wiz-War,589,Wiz-War,1983,boardgame,auto,,,version_unknown,"[{""bgg_id"": 589, ""name"": ""Wiz-War"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, +SCRAWL,202982,Scrawl,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 202982, ""name"": ""Scrawl"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, FLAT TOP,2529,Flat Top,1977,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2529, ""name"": ""Flat Top"", ""year"": 1977, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, Diplomacy,483,Diplomacy,1959,boardgame,auto,,,version_unknown,"[{""bgg_id"": 483, ""name"": ""Diplomacy"", ""year"": 1959, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, Age of Renaissance,26,Age of Renaissance,1996,boardgame,auto,,,version_unknown,"[{""bgg_id"": 26, ""name"": ""Age of Renaissance"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, -History of the World,224,History of the World,1991,boardgame,auto,,,version_unknown,"[{""bgg_id"": 224, ""name"": ""History of the World"", ""year"": 1991, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, -Dungeon!,1339,Dungeon!,1975,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1339, ""name"": ""Dungeon!"", ""year"": 1975, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, +History of the World,224,History of the World,1991,boardgame,auto,20727,Avalon Hill/Hasbro edition,version_auto,"[{""bgg_id"": 224, ""name"": ""History of the World"", ""year"": 1991, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 5948, ""rank"": 1274}, {""bgg_id"": 235591, ""name"": ""History of the World"", ""year"": 2018, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1960, ""rank"": 3203}, {""bgg_id"": 426957, ""name"": ""History of the World"", ""year"": 2025, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 175, ""rank"": 19811}]","[{""version_id"": 20727, ""name"": ""Avalon Hill/Hasbro edition"", ""year"": 2001, ""publishers"": [""Avalon Hill""], ""languages"": [""English""], ""score"": 3}]",IMG_4502.jpeg,, +Dungeon!,345770,.dungeon,2021,rpgitem,auto,,,version_unknown,"[{""bgg_id"": 345770, ""name"": "".dungeon"", ""year"": 2021, ""type"": ""rpgitem"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg,, +WIZ-WAR,589,Wiz-War,1983,boardgame,auto,,,version_unknown,"[{""bgg_id"": 589, ""name"": ""Wiz-War"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4504.jpeg,, +TICKET TO RIDE,9209,Ticket to Ride,2004,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 9209, ""name"": ""Ticket to Ride"", ""year"": 2004, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 468280, ""name"": ""15th anniversary special edition"", ""year"": 2019, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 469076, ""name"": ""Afrikaans/English edition"", ""year"": 2019, ""publishers"": [""Days of Wonder""], ""languages"": [""Afrikaans"", ""English""], ""score"": 3}, {""version_id"": 410646, ""name"": ""English edition 2007 with \""Over 1.1 million games sold\"""", ""year"": 2007, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 191794, ""name"": ""English edition 2007 with \""Over 2 million games sold\"""", ""year"": 2007, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 228833, ""name"": ""English edition 2012 with \""Over 3 million games sold\"""", ""year"": 2012, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 294188, ""name"": ""English edition 2012 with Spiel des Jahres logo"", ""year"": 2012, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 236459, ""name"": ""English edition 2013"", ""year"": 2013, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 447075, ""name"": ""English edition 2015"", ""year"": 2015, ""publishers"": [""Days of Wonder""], ""languages"": [""English""], ""score"": 3}]",IMG_4504.jpeg,, +CATAN,13,Catan,1995,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 13, ""name"": ""Catan"", ""year"": 1995, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 243104, ""rank"": 626}, {""bgg_id"": 66056, ""name"": ""Catan Двубоят"", ""year"": 2010, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 21829, ""rank"": 1187}]","[{""version_id"": 347121, ""name"": ""English edition 2016"", ""year"": 2016, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 495726, ""name"": ""English edition 2019"", ""year"": 2019, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 568647, ""name"": ""English edition 2020"", ""year"": 2020, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 733924, ""name"": ""English edition 2023"", ""year"": 2023, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 416798, ""name"": ""Afrikaans edition"", ""year"": 0, ""publishers"": [""Catan Studio""], ""languages"": [""Afrikaans""], ""score"": 2}]",IMG_4504.jpeg;IMG_4542.jpeg,, +RAMPAGE,97903,Rampage,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 97903, ""name"": ""Rampage"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4504.jpeg,, +Onitama,160477,Onitama,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 160477, ""name"": ""Onitama"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4505.jpeg,, +MANTIS FALLS (a game of trust),,,,,unmatched,,,,[],[],IMG_4505.jpeg,, Herbaceous,195314,Herbaceous,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 195314, ""name"": ""Herbaceous"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4507.jpeg,, +LABYRINTH,1219,Labyrinth,1986,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 1219, ""name"": ""Labyrinth"", ""year"": 1986, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 35117, ""rank"": 2116}, {""bgg_id"": 6546, ""name"": ""Labyrinth"", ""year"": 1940, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1078, ""rank"": 31020}, {""bgg_id"": 23074, ""name"": ""Labyrinth"", ""year"": 2000, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 63, ""rank"": null}, {""bgg_id"": 24422, ""name"": ""Labyrinth"", ""year"": 2001, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 121, ""rank"": null}, {""bgg_id"": 65696, ""name"": ""Labyrinth"", ""year"": null, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 46, ""rank"": null}]","[{""version_id"": 488621, ""name"": ""English edition 2017"", ""year"": 2017, ""publishers"": [""Ravensburger AG""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 591493, ""name"": ""English/German edition"", ""year"": 2018, ""publishers"": [""Ravensburger AG""], ""languages"": [""English"", ""German""], ""score"": 3}, {""version_id"": 361899, ""name"": ""Multilingual 30th anniversary edition"", ""year"": 2016, ""publishers"": [""Ravensburger AG""], ""languages"": [""English"", ""French"", ""German"", ""Italian""], ""score"": 3}, {""version_id"": 338520, ""name"": ""Multilingual edition"", ""year"": 2017, ""publishers"": [""Ravensburger AG""], ""languages"": [""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 440013, ""name"": ""Multilingual edition"", ""year"": 2019, ""publishers"": [""Ravensburger AG""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian""], ""score"": 3}, {""version_id"": 487001, ""name"": ""Multilingual edition"", ""year"": 2019, ""publishers"": [""Ravensburger AG""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Spanish""], ""score"": 3}, {""version_id"": 571233, ""name"": ""Multilingual edition"", ""year"": 2021, ""publishers"": [""Ravensburger AG""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 630855, ""name"": ""Multilingual edition"", ""year"": 2022, ""publishers"": [""Ravensburger AG""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}]",IMG_4507.jpeg;IMG_4508.jpeg,, +Super Mario Checkers Collector's Edition,,,,,unmatched,,,,[],[],IMG_4508.jpeg,, +Dragon Land,320202,Dragon Land,2020,boardgame,auto,,,version_unknown,"[{""bgg_id"": 320202, ""name"": ""Dragon Land"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4508.jpeg;IMG_4542.jpeg,, +Bugs in the Kitchen,137909,Bugs in the Kitchen,2013,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 137909, ""name"": ""Bugs in the Kitchen"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 280025, ""name"": ""Chinese/English edition"", ""year"": 2014, ""publishers"": [""Ravensburger AG""], ""languages"": [""Chinese"", ""English""], ""score"": 3}, {""version_id"": 751514, ""name"": ""English edition 2024"", ""year"": 2024, ""publishers"": [""Ravensburger AG""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 216474, ""name"": ""English first edition"", ""year"": 2013, ""publishers"": [""Ravensburger AG""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 435117, ""name"": ""English second edition"", ""year"": 2018, ""publishers"": [""Ravensburger AG""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 212273, ""name"": ""Multilingual EN/FR/DE/IT/NE/SP"", ""year"": 2013, ""publishers"": [""Ravensburger AG""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Spanish""], ""score"": 3}, {""version_id"": 260936, ""name"": ""French first edition"", ""year"": 2013, ""publishers"": [""Ravensburger AG""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 726152, ""name"": ""German edition 2024"", ""year"": 2024, ""publishers"": [""Ravensburger AG""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 199002, ""name"": ""German first edition"", ""year"": 2013, ""publishers"": [""Ravensburger AG""], ""languages"": [""German""], ""score"": 2}]",IMG_4508.jpeg;IMG_4545.jpeg,, +CATAN DICE GAME,27710,Catan Dice Game,2007,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 27710, ""name"": ""Catan Dice Game"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 606657, ""name"": ""English edition 2018"", ""year"": 2018, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 565571, ""name"": ""English edition 2020"", ""year"": 2020, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}]",IMG_4509.jpeg,, +Castle Panic THE DARK TITAN,169784,Castle Panic: The Dark Titan,2015,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 169784, ""name"": ""Castle Panic: The Dark Titan"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 260454, ""name"": ""English first edition"", ""year"": 2015, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 624505, ""name"": ""English second edition"", ""year"": 2023, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4509.jpeg,, +Jenga,2452,Jenga,1983,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2452, ""name"": ""Jenga"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4509.jpeg,, +"NO THANK YOU, EVIL!",208428,"No Thank You, Evil!",2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 208428, ""name"": ""No Thank You, Evil!"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,, +CODE MASTER,42063,Code Master,1997,boardgame,auto,,,version_unknown,"[{""bgg_id"": 42063, ""name"": ""Code Master"", ""year"": 1997, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,, +GRAVITY MAZE,,,,,unmatched,,,,[],[],IMG_4510.jpeg,, +ROBOT TURTLES,147370,Robot Turtles,2013,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 147370, ""name"": ""Robot Turtles"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 231664, ""name"": ""English second edition"", ""year"": 2014, ""publishers"": [""ThinkFun""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 571231, ""name"": ""Multilingual edition"", ""year"": 2021, ""publishers"": [""ThinkFun""], ""languages"": [""Dutch"", ""English"", ""French"", ""German"", ""Italian"", ""Portuguese"", ""Spanish""], ""score"": 3}, {""version_id"": 498079, ""name"": ""Korean edition"", ""year"": 2017, ""publishers"": [""Korea Boardgames"", ""ThinkFun""], ""languages"": [""Korean""], ""score"": 2}]",IMG_4510.jpeg,, +GOOGLY EYES,57215,Googly Eyes,2008,boardgame,auto,,,version_unknown,"[{""bgg_id"": 57215, ""name"": ""Googly Eyes"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4510.jpeg,, +THROW THROW AVOCADO,340420,Throw Throw Avocado,2021,boardgame,auto,,,version_unknown,"[{""bgg_id"": 340420, ""name"": ""Throw Throw Avocado"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4511.jpeg,, +SUPERFIGHT,139443,Superfight,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 139443, ""name"": ""Superfight"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4511.jpeg,, +ROOK,1260,Rook,1906,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1260, ""name"": ""Rook"", ""year"": 1906, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4511.jpeg,, +Kensington,2197,Kensington,1979,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2197, ""name"": ""Kensington"", ""year"": 1979, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1207, ""rank"": 29937}, {""bgg_id"": 276459, ""name"": ""Kensington"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 99, ""rank"": 20091}]",[],IMG_4512.jpeg,, +Guillotine,116,Guillotine,1998,boardgame,auto,,,version_unknown,"[{""bgg_id"": 116, ""name"": ""Guillotine"", ""year"": 1998, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 34783, ""rank"": 1630}, {""bgg_id"": 11629, ""name"": ""Guillotine"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 87, ""rank"": 18073}, {""bgg_id"": 27373, ""name"": ""Guillotine"", ""year"": 1987, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 163, ""rank"": 19576}]",[],IMG_4512.jpeg,, +THE DOOM THAT CAME TO ATLANTIC CITY,124548,The Doom That Came to Atlantic City,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 124548, ""name"": ""The Doom That Came to Atlantic City"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4513.jpeg,, +SMALLWORLD,,,,,unmatched,,,,[],[],IMG_4513.jpeg,, +Flick'em UP!,169124,Flick 'em Up!,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 169124, ""name"": ""Flick 'em Up!"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4513.jpeg,, +Castle Panic,43443,Castle Panic,2009,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 43443, ""name"": ""Castle Panic"", ""year"": 2009, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 468123, ""name"": ""English edition, eighteenth printing"", ""year"": 2018, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 222131, ""name"": ""English edition, eighth printing"", ""year"": 2013, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 265959, ""name"": ""English edition, eleventh printing"", ""year"": 2014, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 343185, ""name"": ""English edition, fifteenth printing"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 169933, ""name"": ""English edition, fifth printing"", ""year"": 2012, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 24624, ""name"": ""English edition, first printing"", ""year"": 2009, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 337551, ""name"": ""English edition, fourteenth printing"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 103068, ""name"": ""English edition, fourth printing"", ""year"": 2010, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4513.jpeg,, +The Red Dragon Inn,24310,The Red Dragon Inn,2007,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 24310, ""name"": ""The Red Dragon Inn"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 16870, ""rank"": 2164}, {""bgg_id"": 33451, ""name"": ""The Red Dragon Inn 2"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 8355, ""rank"": 2056}, {""bgg_id"": 66510, ""name"": ""The Red Dragon Inn 3"", ""year"": 2011, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 6246, ""rank"": 2363}, {""bgg_id"": 142402, ""name"": ""The Red Dragon Inn 4"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 4107, ""rank"": 3367}, {""bgg_id"": 455834, ""name"": ""The Red Dragon Inn 10"", ""year"": 2026, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 90.3, ""owned"": 162, ""rank"": null}]","[{""version_id"": 400341, ""name"": ""English eighth edition"", ""year"": 2017, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 620786, ""name"": ""English eleventh edition"", ""year"": 2021, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 762888, ""name"": ""English fifteenth edition"", ""year"": 2024, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 374258, ""name"": ""English fifth edition"", ""year"": 2012, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 33932, ""name"": ""English first edition"", ""year"": 2007, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 728027, ""name"": ""English fourteenth edition"", ""year"": 2023, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 312374, ""name"": ""English seventh edition"", ""year"": 2015, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 389768, ""name"": ""English sixth edition"", ""year"": 2014, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4514.jpeg,, +Dixit,39856,Dixit,2008,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 39856, ""name"": ""Dixit"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 482308, ""name"": ""Afrikaans/English edition"", ""year"": 2019, ""publishers"": [""Libellud""], ""languages"": [""Afrikaans"", ""English""], ""score"": 3}, {""version_id"": 488774, ""name"": ""Arabic/English edition"", ""year"": 2019, ""publishers"": [""Boardgame Space"", ""Libellud""], ""languages"": [""Arabic"", ""English""], ""score"": 3}, {""version_id"": 296529, ""name"": ""Asmodee/Libellud English edition 2015"", ""year"": 2015, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 160064, ""name"": ""English edition 2011"", ""year"": 2011, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 193872, ""name"": ""English edition 2012"", ""year"": 2012, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 241272, ""name"": ""English edition 2013"", ""year"": 2013, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 256721, ""name"": ""English edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 273210, ""name"": ""English edition 2014"", ""year"": 2014, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}]",IMG_4514.jpeg,, +Huggermugger,2387,Huggermugger,1989,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2387, ""name"": ""Huggermugger"", ""year"": 1989, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4514.jpeg,, +The Rocky Horror Trivia Game,20866,The Rocky Horror Trivia Game,2005,boardgame,auto,,,version_unknown,"[{""bgg_id"": 20866, ""name"": ""The Rocky Horror Trivia Game"", ""year"": 2005, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4514.jpeg,, +ART NOUVEAU ARTISTRY,,,,,unmatched,,,,[],[],IMG_4515.jpeg,, +SPEECHLESS,196105,Speechless,2016,boardgame,approved,,,version_unknown,"[{""bgg_id"": 14370, ""name"": ""Speechless"", ""year"": 1985, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 94, ""rank"": null}, {""bgg_id"": 196105, ""name"": ""Speechless"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 493, ""rank"": 10370}]",[],IMG_4516.jpeg,, +CATAN JUNIOR,125921,Catan: Junior,2012,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 184842, ""name"": ""Catan Junior"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 3961, ""rank"": 4440}, {""bgg_id"": 5824, ""name"": ""Catan Junior"", ""year"": 2003, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1225, ""rank"": 30649}, {""bgg_id"": 125921, ""name"": ""Catan: Junior"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 9917, ""rank"": 2616}]","[{""version_id"": 791740, ""name"": ""English edition 2025"", ""year"": 2025, ""publishers"": [""Catan GmbH"", ""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 558911, ""name"": ""English fourth edition"", ""year"": 2018, ""publishers"": [""Catan GmbH"", ""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 414618, ""name"": ""English second edition"", ""year"": 2016, ""publishers"": [""Catan GmbH"", ""Catan Studio""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 476263, ""name"": ""English third edition"", ""year"": 2016, ""publishers"": [""Catan Studio""], ""languages"": [""English""], ""score"": 3}]",IMG_4516.jpeg,, +SKYLANDERS PORTAL MASTER,156994,Skylanders Portal Master,2013,boardgame,auto,,,version_unknown,"[{""bgg_id"": 156994, ""name"": ""Skylanders Portal Master"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4516.jpeg,, +LASER MAZE BEAM-BENDING LOGIC GAME,,,,,unmatched,,,,[],[],IMG_4516.jpeg,, +CAPTAIN MARVEL SECRET SKRULLS,269564,Captain Marvel: Secret Skrulls,2019,boardgame,auto,,,version_unknown,"[{""bgg_id"": 269564, ""name"": ""Captain Marvel: Secret Skrulls"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4516.jpeg,, +Pie Face!,18755,Pie Face!,1964,boardgame,approved,,,version_unknown,"[{""bgg_id"": 16562, ""name"": ""Pie Face"", ""year"": 1993, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 274, ""rank"": 29603}, {""bgg_id"": 18755, ""name"": ""Pie Face!"", ""year"": 1964, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1404, ""rank"": 30933}]",[],IMG_4517.jpeg,, +Walk the Plank!,35505,Walk the Plank!,2013,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 21834, ""name"": ""Walk the Plank"", ""year"": 2002, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 18, ""rank"": null}, {""bgg_id"": 29010, ""name"": ""Walk the Plank"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 179, ""rank"": 28080}, {""bgg_id"": 152950, ""name"": ""Walk the Plank"", ""year"": null, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 5, ""rank"": null}, {""bgg_id"": 35505, ""name"": ""Walk the Plank!"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 3127, ""rank"": 3700}]","[{""version_id"": 781669, ""name"": ""English MDG-4311 edition"", ""year"": 2013, ""publishers"": [""Mayday Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 189968, ""name"": ""English MYY4311 edition"", ""year"": 2013, ""publishers"": [""Mayday Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 483159, ""name"": ""Russian edition"", ""year"": 2013, ""publishers"": [""Cosmodrome Games"", ""Mayday Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4517.jpeg;IMG_4549.jpeg,, +AGRICOLA,31260,Agricola,2007,boardgame,auto,297589,Z-Man Games English fifth edition,version_auto,"[{""bgg_id"": 31260, ""name"": ""Agricola"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 297589, ""name"": ""Z-Man Games English fifth edition"", ""year"": 2013, ""publishers"": [""Filosofia Éditions"", ""Lookout Games"", ""Z-Man Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 165308, ""name"": ""999 Games Dutch second edition 2011"", ""year"": 2011, ""publishers"": [""999 Games"", ""Lookout Games""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 266028, ""name"": ""Hobby World Russian first edition"", ""year"": 2013, ""publishers"": [""Hobby World"", ""Lookout Games""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 22673, ""name"": ""Lookout Games German first edition"", ""year"": 2007, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 64715, ""name"": ""Lookout Games German second edition 2008 with animeeples"", ""year"": 2008, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 219203, ""name"": ""Lookout Games German seventh edition 2012 with DSP and SdJ"", ""year"": 2012, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 64718, ""name"": ""Lookout Games German third edition 2009 with DSP and SdJ"", ""year"": 2009, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 113858, ""name"": ""Lookout Games Russian first edition 2011"", ""year"": 2011, ""publishers"": [""Lookout Games"", ""Smart Ltd""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4518.jpeg,, +METEOR,166109,Meteor,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 25172, ""name"": ""Meteor"", ""year"": 1975, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 56, ""rank"": null}, {""bgg_id"": 166109, ""name"": ""Meteor"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1396, ""rank"": 10371}, {""bgg_id"": 246740, ""name"": ""Meteors"", ""year"": 2018, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 92.3, ""owned"": 71, ""rank"": 25541}]",[],IMG_4518.jpeg,, +MAGE WARS ACADEMY CORE SET,,,,,unmatched,,,,[],[],IMG_4518.jpeg,, +DOCTOR WHO THE card GAME,125675,Doctor Who: The Card Game,2012,boardgame,auto,,,version_unknown,"[{""bgg_id"": 125675, ""name"": ""Doctor Who: The Card Game"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4518.jpeg,, +DUNGEONS & DRAGONS,140509,Dungeons & Dragons,1985,boardgame,auto,,,version_unknown,"[{""bgg_id"": 140509, ""name"": ""Dungeons & Dragons"", ""year"": 1985, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4519.jpeg,, +DUNGEONS & DRAGONS FANTASY GAME RULES,,,,,unmatched,,,,[],[],IMG_4519.jpeg,, +"Before I Kill You, Mister Bond...",164,"Before I Kill You, Mister Bond",1996,boardgame,auto,28465,"Cheapass black and white ""Better Edition"" edition",version_auto,"[{""bgg_id"": 164, ""name"": ""Before I Kill You, Mister Bond"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 28465, ""name"": ""Cheapass black and white \""Better Edition\"" edition"", ""year"": 2001, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 291316, ""name"": ""English edition 2016"", ""year"": 2016, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 520361, ""name"": ""English second edition"", ""year"": 1997, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 28459, ""name"": ""First \""Renamed\"" edition, First color edition"", ""year"": 2004, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 180392, ""name"": ""First black and white envelope edition"", ""year"": 1996, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 28462, ""name"": ""Third black and white edition"", ""year"": 1998, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4519.jpeg;IMG_4554.jpeg,, +MYSTERIUM,181304,Mysterium,2015,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 181304, ""name"": ""Mysterium"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 85034, ""rank"": 454}, {""bgg_id"": 113997, ""name"": ""Mysterium"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 5494, ""rank"": 1143}]","[{""version_id"": 781306, ""name"": ""English 2025 Refresh Edition"", ""year"": 2025, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 280251, ""name"": ""English edition 2015-1"", ""year"": 2015, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 493543, ""name"": ""English edition 2015-2"", ""year"": 2015, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 475162, ""name"": ""English edition 2016-1"", ""year"": 2016, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 351093, ""name"": ""English edition 2017-1"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 467608, ""name"": ""English edition 2017-2"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 404443, ""name"": ""English edition 2017-3"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 536289, ""name"": ""English edition 2018-2"", ""year"": 2018, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}]",IMG_4520.jpeg,, +Völuspá,128554,Völuspá,2012,boardgame,auto,,,version_unknown,"[{""bgg_id"": 128554, ""name"": ""Völuspá"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4520.jpeg,, +Carcassonne,822,Carcassonne,2000,boardgame,auto,,,version_unknown,"[{""bgg_id"": 822, ""name"": ""Carcassonne"", ""year"": 2000, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4520.jpeg,, +evolution The Beginning,201248,Evolution: The Beginning,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 201248, ""name"": ""Evolution: The Beginning"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4520.jpeg,, +Sleeping Gods PRIMEVAL PERIL,362205,Sleeping Gods: Primeval Peril,2023,boardgame,approved,,,version_error,"[{""bgg_id"": 319223, ""name"": ""Sleeping Gods: Primeval Peril"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 646, ""rank"": 10087}, {""bgg_id"": 362205, ""name"": ""Sleeping Gods: Primeval Peril"", ""year"": 2023, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 6067, ""rank"": 2680}]",[],IMG_4521.jpeg,, +Snappy Dressers,220199,Snappy Dressers,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 220199, ""name"": ""Snappy Dressers"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4522.jpeg,, +Murder at the Manor,453845,Murder at the Manor,2021,boardgame,auto,,,version_unknown,"[{""bgg_id"": 453845, ""name"": ""Murder at the Manor"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4522.jpeg,, +Bluffaneer,329230,Bluffaneer,2021,boardgame,auto,,,version_unknown,"[{""bgg_id"": 329230, ""name"": ""Bluffaneer"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4522.jpeg,, +Sleeping Gods DISTANT SKIES,358320,Sleeping Gods: Distant Skies,2023,boardgame,auto,,,version_unknown,"[{""bgg_id"": 358320, ""name"": ""Sleeping Gods: Distant Skies"", ""year"": 2023, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4523.jpeg,, +THE RIVALS FOR CATAN CARD GAME,389113,Rivals,2025,boardgame,auto,,,version_unknown,"[{""bgg_id"": 389113, ""name"": ""Rivals"", ""year"": 2025, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 37.5, ""owned"": null, ""rank"": null}]",[],IMG_4523.jpeg,, +FORBIDDEN ISLAND,65244,Forbidden Island,2010,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 65244, ""name"": ""Forbidden Island"", ""year"": 2010, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 368139, ""name"": ""English edition 110516"", ""year"": 2016, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 485840, ""name"": ""English edition 030214"", ""year"": 2014, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 489524, ""name"": ""English edition 030215"", ""year"": 2015, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 338430, ""name"": ""English edition 042016"", ""year"": 2016, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 31208, ""name"": ""English edition 051210"", ""year"": 2010, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 347124, ""name"": ""English edition 052011"", ""year"": 2011, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 577612, ""name"": ""English edition 070413"", ""year"": 2013, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 315520, ""name"": ""English edition 070415"", ""year"": 2015, ""publishers"": [""Gamewright""], ""languages"": [""English""], ""score"": 3}]",IMG_4523.jpeg,, +TEMPURRA,95386,Tempurra,2011,boardgame,auto,290572,English edition,version_auto,"[{""bgg_id"": 95386, ""name"": ""Tempurra"", ""year"": 2011, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 290572, ""name"": ""English edition"", ""year"": 2016, ""publishers"": [""IELLO""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 287427, ""name"": ""French edition"", ""year"": 2016, ""publishers"": [""IELLO""], ""languages"": [""French""], ""score"": 2}]",IMG_4524.jpeg,, +FLUXX,258,Fluxx,1997,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 258, ""name"": ""Fluxx"", ""year"": 1997, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 33357, ""rank"": 12263}, {""bgg_id"": 314413, ""name"": ""Fluxx"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 2152, ""rank"": 15720}]","[{""version_id"": 20841, ""name"": ""Looney Labs edition v3.0"", ""year"": 2002, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 20843, ""name"": ""Looney Labs edition v3.1"", ""year"": 2005, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 20844, ""name"": ""Looney Labs edition v4.0"", ""year"": 2008, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 263858, ""name"": ""Looney Labs edition v5.0"", ""year"": 2014, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 20838, ""name"": ""Looney Labs English 1.0 edition"", ""year"": 1996, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 20840, ""name"": ""Looney Labs Version v2.1"", ""year"": 2000, ""publishers"": [""Looney Labs""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 488647, ""name"": ""Hobby World Russian 5.0 edition"", ""year"": 2017, ""publishers"": [""Hobby World"", ""Looney Labs""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 290805, ""name"": ""Polish edition"", ""year"": 2015, ""publishers"": [""Black Monk"", ""Looney Labs""], ""languages"": [""Polish""], ""score"": 2}]",IMG_4525.jpeg,, +Poetry for Neanderthals,312786,Poetry for Neanderthals,2020,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 312786, ""name"": ""Poetry for Neanderthals"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 514050, ""name"": ""English edition 2020"", ""year"": 2020, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 655388, ""name"": ""English edition 2022"", ""year"": 2022, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 782169, ""name"": ""English edition 2024"", ""year"": 2024, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 746180, ""name"": ""English Grab & Game edition 2023"", ""year"": 2023, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 786184, ""name"": ""English Grab & Game edition 2025"", ""year"": 2025, ""publishers"": [""Exploding Kittens""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 735751, ""name"": ""Dutch edition"", ""year"": 2024, ""publishers"": [""Exploding Kittens""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 783801, ""name"": ""French edition"", ""year"": 2023, ""publishers"": [""Exploding Kittens""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 632084, ""name"": ""German edition"", ""year"": 2022, ""publishers"": [""Exploding Kittens""], ""languages"": [""German""], ""score"": 2}]",IMG_4526.jpeg,, +Elite Sportz Equipment Table Top Curling,,,,,unmatched,,,,[],[],IMG_4526.jpeg,, +Simon's Cat Card Game,188614,Simon's Cat Card Game,2016,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 188614, ""name"": ""Simon's Cat Card Game"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1429, ""rank"": 12119}, {""bgg_id"": 330317, ""name"": ""NOM: Simon's Cat Card Game"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 91.3, ""owned"": 70, ""rank"": null}]","[{""version_id"": 292307, ""name"": ""English edition, first printing"", ""year"": 2016, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 779792, ""name"": ""English edition, second printing"", ""year"": 2016, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4526.jpeg,, +The Red Dragon Inn: Smorgasbox,273240,The Red Dragon Inn Smorgasbox,2019,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 273240, ""name"": ""The Red Dragon Inn Smorgasbox"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 446786, ""name"": ""Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446788, ""name"": ""Eco-Collector's edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446787, ""name"": ""Eco-Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 446069, ""name"": ""Kickstarter edition"", ""year"": 2019, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4527.jpeg,, +WIZ-WAR,589,Wiz-War,1983,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 589, ""name"": ""Wiz-War"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 26114, ""name"": ""Fifth edition"", ""year"": 1991, ""publishers"": [""Chessex""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 29214, ""name"": ""Fourth edition"", ""year"": 1987, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 360420, ""name"": ""Third edition"", ""year"": 1986, ""publishers"": [""Jolly Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4528.jpeg,, +RISK THE LORD OF THE RINGS: The Middle-earth Conquest Game,4324,Risk: The Lord of the Rings,2002,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 4324, ""name"": ""Risk: The Lord of the Rings"", ""year"": 2002, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 57.1, ""owned"": null, ""rank"": null}]","[{""version_id"": 33264, ""name"": ""English (UK) edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 26859, ""name"": ""English edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 26863, ""name"": ""English/French edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 26865, ""name"": ""Danish edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Danish""], ""score"": 2}, {""version_id"": 26861, ""name"": ""Dutch edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 77144, ""name"": ""French edition 2002"", ""year"": 2002, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 26862, ""name"": ""German edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 75135, ""name"": ""Norwegian edition"", ""year"": 2002, ""publishers"": [""Parker Brothers""], ""languages"": [""Norwegian""], ""score"": 2}]",IMG_4529.jpeg,, +Ouija,,,,,unmatched,,,,[],[],IMG_4529.jpeg,, +Munchkin Big Box,419687,Munchkin Big Box,2025,boardgame,auto,711400,English edition,version_auto,"[{""bgg_id"": 419687, ""name"": ""Munchkin Big Box"", ""year"": 2025, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 711400, ""name"": ""English edition"", ""year"": 2025, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 777457, ""name"": ""Russian edition"", ""year"": 2025, ""publishers"": [""Hobby World"", ""Steve Jackson Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4530.jpeg,, +FROSTHAVEN,295770,Frosthaven,2022,boardgame,auto,,,version_unknown,"[{""bgg_id"": 295770, ""name"": ""Frosthaven"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4531.jpeg,, +GLOOMHAVEN,174430,Gloomhaven,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 174430, ""name"": ""Gloomhaven"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4532.jpeg,, +DEADLY DOODLES,442312,Deadly Doodles,2025,boardgame,approved,,,version_unknown,"[{""bgg_id"": 272599, ""name"": ""Deadly Doodles"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 860, ""rank"": 8766}, {""bgg_id"": 442312, ""name"": ""Deadly Doodles"", ""year"": 2025, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 10, ""rank"": null}, {""bgg_id"": 288816, ""name"": ""Deadly Doodles 2"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 93.3, ""owned"": 347, ""rank"": null}]",[],IMG_4533.jpeg,, +Tang Garden,252153,Tang Garden,2019,boardgame,auto,404702,English edition,version_auto,"[{""bgg_id"": 252153, ""name"": ""Tang Garden"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 404702, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""ThunderGryph Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 546464, ""name"": ""BGNations Chinese edition"", ""year"": 2021, ""publishers"": [""BGNations"", ""CMON Global Limited"", ""ThunderGryph Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 435411, ""name"": ""French edition"", ""year"": 2020, ""publishers"": [""ThunderGryph Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 520357, ""name"": ""Korean edition"", ""year"": 2021, ""publishers"": [""CMON Global Limited"", ""Lotus Frog Games"", ""ThunderGryph Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 533751, ""name"": ""Skellig German edition"", ""year"": 2021, ""publishers"": [""Skellig Games"", ""ThunderGryph Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 430518, ""name"": ""Spanish edition"", ""year"": 2020, ""publishers"": [""TCG Factory"", ""ThunderGryph Games""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 415326, ""name"": ""ThunderGryph German edition"", ""year"": 2020, ""publishers"": [""ThunderGryph Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 547401, ""name"": ""YOKA Chinese edition"", ""year"": 2021, ""publishers"": [""YOKA Games"", ""ThunderGryph Games""], ""languages"": [""Chinese""], ""score"": 2}]",IMG_4533.jpeg,, +Everdell The Complete Collection,332398,Everdell: The Complete Collection,2022,boardgame,auto,,,version_unknown,"[{""bgg_id"": 332398, ""name"": ""Everdell: The Complete Collection"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4533.jpeg,, +Verdant,334065,Verdant,2022,boardgame,auto,,,version_unknown,"[{""bgg_id"": 334065, ""name"": ""Verdant"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4534.jpeg,, +Calico,283155,Calico,2020,boardgame,auto,,,version_unknown,"[{""bgg_id"": 283155, ""name"": ""Calico"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4534.jpeg,, +Sleeping Gods,255984,Sleeping Gods,2021,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 255984, ""name"": ""Sleeping Gods"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 701034, ""name"": ""English Gamefound edition"", ""year"": 2023, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 411331, ""name"": ""English retail edition"", ""year"": 2021, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 579776, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Banana Games"", ""Red Raven Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 602021, ""name"": ""Czech edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""Rexhry""], ""languages"": [""Czech""], ""score"": 2}, {""version_id"": 621916, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Lucky Duck Games"", ""Red Raven Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 668142, ""name"": ""Japanese edition"", ""year"": 2023, ""publishers"": [""Red Raven Games"", ""リゴレ (rigoler)""], ""languages"": [""Japanese""], ""score"": 2}, {""version_id"": 543400, ""name"": ""Korean edition"", ""year"": 2022, ""publishers"": [""Lotus Frog Games"", ""Red Raven Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 588954, ""name"": ""Russian edition"", ""year"": 2023, ""publishers"": [""Lavka Games"", ""Red Raven Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4534.jpeg,, +Sleeping Gods: Tides of Ruin,283766,Sleeping Gods: Tides of Ruin,2021,boardgame,auto,463140,English edition,version_auto,"[{""bgg_id"": 283766, ""name"": ""Sleeping Gods: Tides of Ruin"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 463140, ""name"": ""English edition"", ""year"": 2021, ""publishers"": [""Red Raven Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 643180, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Banana Games"", ""Red Raven Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 621921, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Lucky Duck Games"", ""Red Raven Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 594739, ""name"": ""Korean edition"", ""year"": 2022, ""publishers"": [""Lotus Frog Games"", ""Red Raven Games""], ""languages"": [""Korean""], ""score"": 2}, {""version_id"": 696922, ""name"": ""Portuguese edition"", ""year"": 2023, ""publishers"": [""Conclave Editora"", ""Red Raven Games""], ""languages"": [""Portuguese""], ""score"": 2}, {""version_id"": 590839, ""name"": ""Russian edition"", ""year"": 2023, ""publishers"": [""Lavka Games"", ""Red Raven Games""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 641576, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Maldito Games"", ""Red Raven Games""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 590426, ""name"": ""Ukrainian edition"", ""year"": 2023, ""publishers"": [""Games7Days"", ""Red Raven Games""], ""languages"": [""Ukrainian""], ""score"": 2}]",IMG_4534.jpeg,, +ETHERFIELDS,280794,Etherfields,2020,boardgame,auto,458300,English edition,version_auto,"[{""bgg_id"": 280794, ""name"": ""Etherfields"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 458300, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 518823, ""name"": ""French edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 511032, ""name"": ""German edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 518825, ""name"": ""Italian edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 518826, ""name"": ""Polish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 518824, ""name"": ""Spanish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}]",IMG_4535.jpeg,, +BOTANY,380837,Botany,2024,boardgame,auto,650545,English edition,version_auto,"[{""bgg_id"": 380837, ""name"": ""Botany"", ""year"": 2024, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 650545, ""name"": ""English edition"", ""year"": 2024, ""publishers"": [""Dux Somnium Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4536.jpeg,, +GLOOMHAVEN Buttons & Bugs,393672,Gloomhaven: Buttons & Bugs,2024,boardgame,auto,669782,English edition,version_auto,"[{""bgg_id"": 393672, ""name"": ""Gloomhaven: Buttons & Bugs"", ""year"": 2024, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 669782, ""name"": ""English edition"", ""year"": 2024, ""publishers"": [""Cephalofair Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 778725, ""name"": ""French edition"", ""year"": 2025, ""publishers"": [""Cephalofair Games""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 777580, ""name"": ""Italian edition"", ""year"": 2025, ""publishers"": [""Cephalofair Games""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 775346, ""name"": ""Japanese edition"", ""year"": 2025, ""publishers"": [""Cephalofair Games"", ""CMON Global Limited""], ""languages"": [""Japanese""], ""score"": 2}, {""version_id"": 753852, ""name"": ""Spanish edition"", ""year"": 2025, ""publishers"": [""Cephalofair Games""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 765914, ""name"": ""Ukrainian edition"", ""year"": 2025, ""publishers"": [""Cephalofair Games"", ""Lord of Boards""], ""languages"": [""Ukrainian""], ""score"": 2}]",IMG_4537.jpeg,, +MUNCHKIN,1927,Munchkin,2001,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 1927, ""name"": ""Munchkin"", ""year"": 2001, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 25420, ""name"": ""English Bobblehead edition 2008"", ""year"": 2008, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 170523, ""name"": ""English Deluxe edition 2011 with Munchkin 2: Unnatural Axe"", ""year"": 2011, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 227208, ""name"": ""English deluxe edition 2013, third printing"", ""year"": 2013, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 245507, ""name"": ""English deluxe edition 2014, 4th printing"", ""year"": 2014, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 271919, ""name"": ""English deluxe edition 2014, 5th printing"", ""year"": 2014, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 336452, ""name"": ""English deluxe edition 2014, 6th printing"", ""year"": 2014, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 284365, ""name"": ""English deluxe edition 2015, 7th printing"", ""year"": 2015, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 325785, ""name"": ""English deluxe edition 2015, 8th printing"", ""year"": 2015, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4537.jpeg,, +SPANC Space Pirate Amazon Ninja Catgirls,14535,SPANC: Space Pirate Amazon Ninja Catgirls,2005,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 14535, ""name"": ""SPANC: Space Pirate Amazon Ninja Catgirls"", ""year"": 2005, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 29075, ""name"": ""English first edition"", ""year"": 2005, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 429099, ""name"": ""English second edition"", ""year"": 2018, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4537.jpeg,, +Greed Quest,9666,Greed Quest,2004,boardgame,auto,215137,English edition,version_auto,"[{""bgg_id"": 9666, ""name"": ""Greed Quest"", ""year"": 2004, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 215137, ""name"": ""English edition"", ""year"": 2004, ""publishers"": [""Steve Jackson Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4537.jpeg,, +GLOOMHAVEN - Jaws of the Lion,291457,Gloomhaven: Jaws of the Lion,2020,boardgame,auto,,,version_unknown,"[{""bgg_id"": 291457, ""name"": ""Gloomhaven: Jaws of the Lion"", ""year"": 2020, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4538.jpeg,, +SCRABBLE SLAM!,40508,Scrabble Slam!,2008,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 40508, ""name"": ""Scrabble Slam!"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 39335, ""name"": ""English edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 644326, ""name"": ""English edition with Hasbro logo"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 25061, ""name"": ""English edition with Parker Brothers logo"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 294332, ""name"": ""English/French edition"", ""year"": 2008, ""publishers"": [""Hasbro"", ""Parker Brothers""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 480950, ""name"": ""English/French edition"", ""year"": 2014, ""publishers"": [""Hasbro""], ""languages"": [""English"", ""French""], ""score"": 3}, {""version_id"": 116530, ""name"": ""Dutch edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 345823, ""name"": ""French edition"", ""year"": 2009, ""publishers"": [""Hasbro""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 111167, ""name"": ""German edition"", ""year"": 2010, ""publishers"": [""Hasbro""], ""languages"": [""German""], ""score"": 2}]",IMG_4543.jpeg,, +CAT STAX,,,,,unmatched,,,,[],[],IMG_4544.jpeg,, +POCKET FARKEL,,,,,unmatched,,,,[],[],IMG_4545.jpeg,, +Go Fish Yourself,173057,Go Fish Yourself,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 173057, ""name"": ""Go Fish Yourself"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4546.jpeg,, +Hold your Breath!,150925,Hold Your Breath!,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 150925, ""name"": ""Hold Your Breath!"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4547.jpeg,, +Dastardly Dirigibles,193485,Dastardly Dirigibles,2016,boardgame,auto,300446,English edition,version_auto,"[{""bgg_id"": 193485, ""name"": ""Dastardly Dirigibles"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 300446, ""name"": ""English edition"", ""year"": 2016, ""publishers"": [""Fireside Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4548.jpeg,, +SHERIFF OF NOTTINGHAM MERRY MEN,226065,Sheriff of Nottingham: Merry Men,2017,boardgame,auto,353389,English edition,version_auto,"[{""bgg_id"": 226065, ""name"": ""Sheriff of Nottingham: Merry Men"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 353389, ""name"": ""English edition"", ""year"": 2017, ""publishers"": [""Arcane Wonders"", ""CMON Global Limited""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 495597, ""name"": ""Russian edition"", ""year"": 2020, ""publishers"": [""Arcane Wonders"", ""Lavka Games""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4550.jpeg,, +MACHI KORO,143884,Machi Koro,2012,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 143884, ""name"": ""Machi Koro"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 60236, ""rank"": 1392}, {""bgg_id"": 340364, ""name"": ""Machi Koro 2"", ""year"": 2021, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 90.9, ""owned"": 6754, ""rank"": 1873}]","[{""version_id"": 453051, ""name"": ""English fifth anniversary edition, first printing"", ""year"": 2019, ""publishers"": [""Pandasaurus Games""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 522306, ""name"": ""English fifth anniversary edition, second printing"", ""year"": 2019, ""publishers"": [""Pandasaurus Games""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 398378, ""name"": ""English fourth edition"", ""year"": 2017, ""publishers"": [""IDW Games"", ""Pandasaurus Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 235869, ""name"": ""English second edition"", ""year"": 2014, ""publishers"": [""IDW Games"", ""Pandasaurus Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 544542, ""name"": ""IDW English edition 2015"", ""year"": 2015, ""publishers"": [""Grounding"", ""IDW Games"", ""Pandasaurus Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4551.jpeg,, +Dark Cults: The Horror Story Game,1784,Dark Cults,1983,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 1784, ""name"": ""Dark Cults"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 52.6, ""owned"": null, ""rank"": null}]","[{""version_id"": 110926, ""name"": ""First edition"", ""year"": 1983, ""publishers"": [""Dark House""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 110927, ""name"": ""Second edition"", ""year"": 1985, ""publishers"": [""Dark House""], ""languages"": [""English""], ""score"": 3}]",IMG_4552.jpeg,, +Give Me The Brain,176,Give Me the Brain!,1996,boardgame,auto,27673,Czech edition,version_auto,"[{""bgg_id"": 176, ""name"": ""Give Me the Brain!"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 27673, ""name"": ""Czech edition"", ""year"": 1997, ""publishers"": [""Cheapass Games""], ""languages"": [""Czech""], ""score"": 4}, {""version_id"": 28103, ""name"": ""Cheapass English first paper envelope edition 1996"", ""year"": 1996, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 795469, ""name"": ""Cheapass English paper envelope edition 1998"", ""year"": 1998, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 24093, ""name"": ""Cheapass English special edition 2002"", ""year"": 2002, ""publishers"": [""Cheapass Games"", ""James Ernest Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 742802, ""name"": ""German zipper bag edition"", ""year"": 2000, ""publishers"": [""Cheapass Games"", ""Truant Spiele""], ""languages"": [""German""], ""score"": 2}]",IMG_4553.jpeg,, +KILL DOCTOR LUCKY,257,Kill Doctor Lucky,1996,boardgame,auto,520364,"Cheapass envelope edition, second printing",version_auto,"[{""bgg_id"": 257, ""name"": ""Kill Doctor Lucky"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 520364, ""name"": ""Cheapass envelope edition, second printing"", ""year"": 1997, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 28629, ""name"": ""Cheapass boxed edition, sixth printing"", ""year"": 2000, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 342532, ""name"": ""Cheapass English 19.5th Anniversary edition"", ""year"": 2016, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 302015, ""name"": ""Cheapass English/German 19.5th Anniversary edition"", ""year"": 2016, ""publishers"": [""Cheapass Games""], ""languages"": [""English"", ""German""], ""score"": 3}, {""version_id"": 24741, ""name"": ""Cheapass envelope edition, first printing"", ""year"": 1996, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 261344, ""name"": ""Cheapass envelope edition, fourth printing"", ""year"": 1999, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 133486, ""name"": ""Cheapass print & play edition 2011"", ""year"": 2011, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 24760, ""name"": ""Cheapass special edition, eighth printing"", ""year"": 2002, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4555.jpeg,, +ALICE IS MISSING SILENT FALLS EXPANSION,,,,,unmatched,,,,[],[],IMG_4566.jpeg,, +ALICE IS MISSING A SILENT ROLE PLAYING GAME,,,,,unmatched,,,,[],[],IMG_4566.jpeg,, +ETHERFIELDS KITTENBURG EXPANSION,358880,Etherfields: Kittenburg Expansion,2022,boardgame,auto,603694,English edition,version_auto,"[{""bgg_id"": 358880, ""name"": ""Etherfields: Kittenburg Expansion"", ""year"": 2022, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 603694, ""name"": ""English edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 709658, ""name"": ""Polish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 699892, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}]",IMG_4570.jpeg,, +BOTANY EXPANSION TANTALIZING TREES,,,,,unmatched,,,,[],[],IMG_4571.jpeg,, +"BOTANY EXPANSION PERILOUS PERFUMES POISONOUS, CARNIVOROUS, PARASITIC AND BIZARRE PLANTS",,,,,unmatched,,,,[],[],IMG_4571.jpeg,, +Parsely,258849,Parsely,2018,rpgitem,auto,,,version_unknown,"[{""bgg_id"": 258849, ""name"": ""Parsely"", ""year"": 2018, ""type"": ""rpgitem"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4573.jpeg,, +"...and then, we held hands.",153999,"...and then, we held hands.",2015,boardgame,auto,280845,English edition,version_auto,"[{""bgg_id"": 153999, ""name"": ""...and then, we held hands."", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 280845, ""name"": ""English edition"", ""year"": 2015, ""publishers"": [""LudiCreations""], ""languages"": [""English""], ""score"": 3}]",image.jpg,, +Consentacle,166976,Consentacle,2014,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 166976, ""name"": ""Consentacle"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 410382, ""name"": ""English Kickstarter edition"", ""year"": 2018, ""publishers"": [""(Self-Published)""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 596756, ""name"": ""English Print-and-Play edition"", ""year"": 2018, ""publishers"": [""(Self-Published)""], ""languages"": [""English""], ""score"": 3}]",shelf-20260803-171316.jpg,, +The Simpsons Trivia Game,2980,The Simpsons Trivia Game,2000,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2980, ""name"": ""The Simpsons Trivia Game"", ""year"": 2000, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 786, ""rank"": 30823}, {""bgg_id"": 16343, ""name"": ""The Simpsons 2 Trivia Game"", ""year"": 2001, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 95.2, ""owned"": 76, ""rank"": null}]",[],shelf-20260803-213735.jpg,, +THE CAT GAME,231302,The Cat Game,2017,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 231302, ""name"": ""The Cat Game"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 361880, ""name"": ""English/French edition"", ""year"": 2017, ""publishers"": [""Spin Master Ltd.""], ""languages"": [""English"", ""French""], ""score"": 2}, {""version_id"": 433263, ""name"": ""German edition"", ""year"": 0, ""publishers"": [""Spin Master Ltd.""], ""languages"": [""German""], ""score"": 2}]",shelf-20260803-213756.jpg,, +BLINK,1197,Blink,1995,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1197, ""name"": ""Blink"", ""year"": 1995, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 6143, ""rank"": 6149}, {""bgg_id"": 185341, ""name"": ""Blink!"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 111, ""rank"": null}, {""bgg_id"": 15852, ""name"": ""Blinki"", ""year"": 1910, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 90.9, ""owned"": 106, ""rank"": 30046}]",[],shelf-20260803-215650.jpg,, +The Office Trivia Game,352819,The Office Trivia Game,2019,boardgame,approved,,,version_error,"[{""bgg_id"": 352819, ""name"": ""The Office Trivia Game"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 159, ""rank"": null}, {""bgg_id"": 36895, ""name"": ""The Office Trivia Game"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 432, ""rank"": 30024}]",[],shelf-20260803-215703.jpg,, diff --git a/data/title_edits.json b/data/title_edits.json index 567830b..655fdc2 100644 --- a/data/title_edits.json +++ b/data/title_edits.json @@ -52,5 +52,10 @@ "match": "ACTION CASTLE", "title_raw": "Parsely", "confidence": "high" + }, + { + "match": "Patch Work", + "title_raw": "Patchwork", + "confidence": "high" } ] diff --git a/data/title_removals.json b/data/title_removals.json index 1a96662..e9fdf51 100644 --- a/data/title_removals.json +++ b/data/title_removals.json @@ -70,5 +70,17 @@ "photos": [ "IMG_4573.jpeg" ] + }, + { + "title": "SIX-GUN SHOWDOWN", + "photos": [ + "IMG_4573.jpeg" + ] + }, + { + "title": "Blackboa[rd]", + "photos": [ + "IMG_4573.jpeg" + ] } ] diff --git a/data/titles.json b/data/titles.json index d79f333..f03e743 100644 --- a/data/titles.json +++ b/data/titles.json @@ -22,7 +22,8 @@ "art_notes": "Box top shown horizontally on shelf, tagline 'Who's to Blame Logic Game', orange cat illustration", "source_photos": [ "IMG_4499.jpeg", - "IMG_4505.jpeg" + "IMG_4505.jpeg", + "shelf-20260803-215723.jpg" ], "title_normalized": "cat crimes" }, @@ -158,7 +159,7 @@ "title_normalized": "gentle rain" }, { - "title_raw": "Patch Work", + "title_raw": "Patchwork", "confidence": "high", "publisher_hint": "", "edition_hint": "", @@ -168,7 +169,7 @@ "source_photos": [ "IMG_4501.jpeg" ], - "title_normalized": "patch work" + "title_normalized": "patchwork" }, { "title_raw": "SANTORINI", @@ -1668,32 +1669,6 @@ ], "title_normalized": "parsely" }, - { - "title_raw": "SIX-GUN SHOWDOWN", - "confidence": "medium", - "publisher_hint": "", - "edition_hint": "", - "year_hint": null, - "language_hint": "English", - "art_notes": "Western-themed box art with red/orange coloring, partially visible spine text", - "source_photos": [ - "IMG_4573.jpeg" - ], - "title_normalized": "six gun showdown" - }, - { - "title_raw": "Blackboa[rd]", - "confidence": "low", - "publisher_hint": "", - "edition_hint": "", - "year_hint": null, - "language_hint": "English", - "art_notes": "Dark spine at bottom right of cover art, title partially cut off", - "source_photos": [ - "IMG_4573.jpeg" - ], - "title_normalized": "blackboa rd" - }, { "title_raw": "...and then, we held hands.", "confidence": "high", @@ -1719,5 +1694,57 @@ "shelf-20260803-171316.jpg" ], "title_normalized": "consentacle" + }, + { + "title_raw": "The Simpsons Trivia Game", + "confidence": "high", + "publisher_hint": "Matt Groening / The Simpsons", + "edition_hint": "", + "year_hint": null, + "language_hint": "English", + "art_notes": "Green background with die-cut character silhouette shapes of Homer, Marge, Bart, Lisa, and Maggie; includes 'Ay Carumba!' badge and note about included cast poster", + "source_photos": [ + "shelf-20260803-213735.jpg" + ], + "title_normalized": "simpsons trivia game" + }, + { + "title_raw": "THE CAT GAME", + "confidence": "high", + "publisher_hint": "Spin Master", + "edition_hint": "", + "year_hint": null, + "language_hint": "English/French", + "art_notes": "White box with faux-fur textured letters spelling CAT, image of cat wearing top hat and bow tie standing on a scratching post, hand holding a marker/pointer stick, tagline 'The Hair-Raising Drawing Game (with Cats)'", + "source_photos": [ + "shelf-20260803-213756.jpg" + ], + "title_normalized": "cat game" + }, + { + "title_raw": "BLINK", + "confidence": "high", + "publisher_hint": "Mattel Games", + "edition_hint": "", + "year_hint": null, + "language_hint": "English", + "art_notes": "Orange sunburst background box with green bubble letters spelling BLINK, cards showing green stars, red flowers, blue triangles, yellow droplets", + "source_photos": [ + "shelf-20260803-215650.jpg" + ], + "title_normalized": "blink" + }, + { + "title_raw": "The Office Trivia Game", + "confidence": "high", + "publisher_hint": "Cardinal", + "edition_hint": "Ready to Roll, Fast-Paced Game!", + "year_hint": null, + "language_hint": "English", + "art_notes": "Box shows three characters from The Office in an office/warehouse setting, notebook paper design border, red 'Ready to Roll' circular badge", + "source_photos": [ + "shelf-20260803-215703.jpg" + ], + "title_normalized": "office trivia game" } ] diff --git a/src/bggpipe/models.py b/src/bggpipe/models.py index 6e83d2a..1d490e7 100644 --- a/src/bggpipe/models.py +++ b/src/bggpipe/models.py @@ -94,21 +94,30 @@ def _attr_int(elem: ET.Element | None, attr: str = "value") -> int | None: def parse_search(xml_text: str) -> list[SearchResult]: results = [] + by_id: dict[int, int] = {} # bgg_id -> index in results skipped = 0 for item in _root(xml_text).findall("item"): name_elem = item.find("name") if name_elem is None or item.get("id") is None: skipped += 1 # tolerate stragglers; wholesale drift raises below continue - results.append( - SearchResult( - bgg_id=int(item.get("id")), - name=name_elem.get("value", ""), - name_type=name_elem.get("type", "primary"), - year=_attr_int(item.find("yearpublished")), - type=item.get("type", "boardgame"), - ) + result = SearchResult( + bgg_id=int(item.get("id")), + name=name_elem.get("value", ""), + name_type=name_elem.get("type", "primary"), + year=_attr_int(item.find("yearpublished")), + type=item.get("type", "boardgame"), ) + # a multi-type search lists an expansion TWICE — once per matched + # type; keep one entry, preferring the specific type so expansion + # tagging (the base-vs-expansion review guard) survives + if result.bgg_id in by_id: + seen = results[by_id[result.bgg_id]] + if seen.type == "boardgame" and result.type != "boardgame": + results[by_id[result.bgg_id]] = result + continue + by_id[result.bgg_id] = len(results) + results.append(result) if skipped and results: warnings.warn( f"search: {skipped} unparseable item(s) tolerated — schema drift?", diff --git a/src/bggpipe/review.py b/src/bggpipe/review.py index ec4f74b..6e5b532 100644 --- a/src/bggpipe/review.py +++ b/src/bggpipe/review.py @@ -32,6 +32,7 @@ from bggpipe.normalize import normalize_title from bggpipe.resolve import ( MatchRow, TitleEntry, + _score_version, load_titles, read_matches, resolve_version, @@ -356,6 +357,41 @@ class ReviewSession: row["match_status"] = "rejected" self._save(row) + def open_version_ballot(self, row: dict) -> int: + """The human knows which printing a box is even when the photo + showed no cues: put EVERY published version on the row's ballot + (cue-scored when cues exist) and mark it version_ambiguous so the + normal edition pass presents it. Returns the ballot size.""" + if not row["bgg_id"]: + raise ValueError("no BGG match on this row yet") + entry = self.cues_for(row["title_raw"], row["source_photos"]) + things = self.client.things([int(row["bgg_id"])], versions=True) + if not things or not things[0].versions: + raise ValueError("BGG lists no versions for this game") + scored = sorted( + ((v, _score_version(entry, v) if entry else 0) for v in things[0].versions), + key=lambda pair: (-pair[1], str(pair[0].year or "")), + ) + row["version_candidates_json"] = json.dumps( + [ + { + "version_id": v.version_id, + "name": v.name, + "year": v.year, + "publishers": list(v.publishers), + "languages": list(v.languages), + "score": s, + } + for v, s in scored + ], + ensure_ascii=False, + ) + row["version_status"] = "version_ambiguous" + row["version_id"] = "" + row["version_name"] = "" + self._save(row) + return len(scored) + def decide_version(self, row: dict, version_id: int | None) -> None: """Pick a version from the row's stored candidates, or None -> unknown.""" if version_id is None: diff --git a/src/bggpipe/templates/pages/help.html b/src/bggpipe/templates/pages/help.html index a6449a9..4379fe7 100644 --- a/src/bggpipe/templates/pages/help.html +++ b/src/bggpipe/templates/pages/help.html @@ -38,6 +38,7 @@

Vision reads aren't perfect, and you know things the photos don't show. Every line on the Titles page has curation actions, and every one of them is durable: the decision is saved in a small committed file and replayed on every rebuild, so re-running extract or resolve can never undo it.

edit — fix a misread title or add cues you already know (publisher, edition, year, language). A corrected misspelling automatically merges with a correctly-read sighting of the same game from another photo. If the line already had a BGG match, saving re-queues it so resolve searches again with the corrected data.

split into copies — one line, several physical boxes? Splitting makes each photo its own copy, and each copy picks its own edition afterward. Appears on any line whose title was seen in more than one photo. Splitting one game never affects a same-named different edition.

+

pick edition — a matched game with no legible edition cues stays version-less by design (never guess) — but you know which printing your box is. This fetches the game's complete version list into a Review ballot; pick yours there.

remove (inside the edit panel) — for lines that shouldn't exist at all: a book read as a game, box art misread as a title. The line and its matches are discarded and stay gone. This is different from reject on the Review page, which keeps the line visible as "no BGG match" — right for real games BGG doesn't know.

Undo: each decision is one record in data/title_edits.json, data/title_splits.json, or data/title_removals.json — delete the record and the next rebuild restores the old state.

diff --git a/src/bggpipe/templates/pages/titles.html b/src/bggpipe/templates/pages/titles.html index e94bc99..9424c08 100644 --- a/src/bggpipe/templates/pages/titles.html +++ b/src/bggpipe/templates/pages/titles.html @@ -70,6 +70,13 @@ function render() { title="one line, several boxes? make each photo its own copy"> split into copies` : ""} + ${c.bgg_id && ["auto", "approved"].includes(c.status) + && ["version_unknown", "version_error", ""].includes(c.version_status || "") + ? `` + : ""} ${c.shaky ? `` : ""} @@ -92,6 +99,16 @@ async function refresh() { document.getElementById("catbody").addEventListener("click", async e => { const cancel = e.target.closest("button.canceledit"); if (cancel) { EDITING = null; GATE.reset(); render(); refresh().catch(() => {}); return; } + const pe = e.target.closest("button.pickedition"); + if (pe) { + const res = await apiPost("/api/open-versions", { + title_raw: pe.dataset.title, + source_photos: pe.dataset.photos, + row_ix: pe.dataset.rowix === "" ? null : Number(pe.dataset.rowix), + }); + if (res) { GATE.reset(); refresh().catch(() => {}); } + return; + } const ok = e.target.closest("button.confirmread"); if (ok) { const res = await apiPost("/api/edit-title", { diff --git a/src/bggpipe/webreview.py b/src/bggpipe/webreview.py index 7d1b93a..7d58fbc 100644 --- a/src/bggpipe/webreview.py +++ b/src/bggpipe/webreview.py @@ -57,7 +57,7 @@ from bggpipe.models import ( ) from bggpipe.normalize import normalize_title from bggpipe.resolve import TitleEntry -from bggpipe.review import ReviewSession +from bggpipe.review import _BGG_ERRORS, ReviewSession def load_thumbnails(cache_dir: Path) -> dict[int, str]: @@ -539,6 +539,7 @@ def create_app( "bgg_id": row["bgg_id"] if row else "", "bgg_name": row["bgg_name"] if row else "", "version_name": row["version_name"] if row else "", + "version_status": row["version_status"] if row else "", "merged_into": row.get("merged_into", "") if row else "", "row_ix": _ix_of(session.rows, row) if row else None, "cues": { @@ -1087,6 +1088,20 @@ def create_app( replay_titles(cfg) return state() + @app.post("/api/open-versions") + def api_open_versions(body: RowRef) -> dict: + with lock: + revision["n"] += 1 + _refuse_if_rewriting() + row = find_row(body.title_raw, body.source_photos, body.row_ix) + try: + session.open_version_ballot(row) + except ValueError as err: + raise HTTPException(400, str(err)) from err + except _BGG_ERRORS as err: + raise HTTPException(502, f"BGG lookup failed: {err}") from err + return state() + @app.post("/api/veto-merge") def api_veto_merge(body: RowRef) -> dict: with lock: diff --git a/tests/data/titles.json b/tests/data/titles.json index e25d4e6..ff25601 100644 --- a/tests/data/titles.json +++ b/tests/data/titles.json @@ -1,40 +1,110 @@ [ - { - "title_raw": "Catan", - "confidence": "high", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Wingspan", - "confidence": "high", - "publisher_hint": "Stonemaier Games", - "year_hint": 2019, - "language_hint": "English", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Wingspan: European Expansion", - "confidence": "high", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Wingspan Europe", - "confidence": "medium", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Café International", - "confidence": "high", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Citadels", - "confidence": "high", - "source_photos": ["hand-typed-test-list"] - }, - { - "title_raw": "Blorvath: Quest of the Zzyzx", - "confidence": "low", - "source_photos": ["hand-typed-test-list"] - } + { + "title_raw": "Catan", + "confidence": "high", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Wingspan", + "confidence": "high", + "publisher_hint": "Stonemaier Games", + "year_hint": 2019, + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Wingspan: European Expansion", + "confidence": "high", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Wingspan Europe", + "confidence": "medium", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Café International", + "confidence": "high", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Citadels", + "confidence": "high", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "Blorvath: Quest of the Zzyzx", + "confidence": "low", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "CIVILIZATION Game of the Heroic Age - The Dawn of History 8000 BC to 250 BC", + "confidence": "high", + "publisher_hint": "The Avalon Hill Game Company, Baltimore, Maryland", + "edition_hint": "Bookcase Game", + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "ADVANCED CIVILIZATION Game Expansion of the Heroic Age - Featuring New Civilization, Commodity, and Calamity Cards", + "confidence": "high", + "publisher_hint": "The Avalon Hill Game Company, Baltimore, Maryland", + "edition_hint": "Bookcase Game", + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "SORCERER The Game of Magical Conflict", + "confidence": "high", + "publisher_hint": "Simulations Publications Incorporated (SPI)", + "edition_hint": "Designer's Edition", + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "STARFORCE ALPHA CENTAURI Interstellar Conflict in the 25th Century", + "confidence": "high", + "publisher_hint": "Simulations Publications Incorporated (SPI)", + "edition_hint": "Designer's Edition", + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "FLAT TOP", + "confidence": "high", + "year_hint": 1942, + "language_hint": "English", + "source_photos": [ + "hand-typed-test-list" + ] + }, + { + "title_raw": "ALICE IS MISSING: A SILENT ROLE PLAYING GAME", + "confidence": "high", + "source_photos": [ + "hand-typed-test-list" + ] + } ] diff --git a/tests/fixtures/bgg_cache/STUB_FIXTURES.marker b/tests/fixtures/bgg_cache/STUB_FIXTURES.marker deleted file mode 100644 index c34d304..0000000 --- a/tests/fixtures/bgg_cache/STUB_FIXTURES.marker +++ /dev/null @@ -1 +0,0 @@ -This cache contains hand-written stub XML, not real BGG responses. Data resolved from it must not be uploaded. diff --git a/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml b/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml deleted file mode 100644 index f3f02bc..0000000 --- a/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=rpgitem_58faea4564.xml b/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=rpgitem_58faea4564.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=rpgitem_58faea4564.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_7c5116c957.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_7c5116c957.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_7c5116c957.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml +++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml +++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=rpgitem_8704f88656.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=rpgitem_8704f88656.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=rpgitem_8704f88656.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml index 7ed9bac..b80efe7 100644 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml +++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=rpgitem_436f8cfac3.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=rpgitem_436f8cfac3.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=rpgitem_436f8cfac3.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgamee_a7e88a81de.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgamee_a7e88a81de.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgamee_a7e88a81de.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=boardgame-2Cboardgamee_a7e88a81de.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_8efe1bd6f0.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_8efe1bd6f0.xml index 3868c9e..3907bdd 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_8efe1bd6f0.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-GAME-type=rpgitem_8efe1bd6f0.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=boardgame-2Cboardgameexpans_18e95963dd.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=boardgame-2Cboardgameexpans_18e95963dd.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=boardgame-2Cboardgameexpans_18e95963dd.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=boardgame-2Cboardgameexpans_18e95963dd.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=rpgitem_daff8eceef.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=rpgitem_daff8eceef.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-A-SILENT-ROLE-PLAYING-type=rpgitem_daff8eceef.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=boardgame-2Cboardgameexpan_348fc9c865.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=boardgame-2Cboardgameexpan_348fc9c865.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=boardgame-2Cboardgameexpan_348fc9c865.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=rpgitem_82261134d9.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=rpgitem_82261134d9.xml deleted file mode 100644 index 2988563..0000000 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-3A-SILENT-FALLS-EXPANSION-type=rpgitem_82261134d9.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=boardgame-2Cboardgameexpansion_7f29a69be5.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=boardgame-2Cboardgameexpansion_7f29a69be5.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=boardgame-2Cboardgameexpansion_7f29a69be5.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=boardgame-2Cboardgameexpansion_7f29a69be5.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=rpgitem_088ab34fc2.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=rpgitem_088ab34fc2.xml index ba791c3..2c955ea 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=rpgitem_088ab34fc2.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-MISSING-type=rpgitem_088ab34fc2.xml @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=boardgame-2Cboardgameexpansion_6b1ff7dc27.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=boardgame-2Cboardgameexpansion_6b1ff7dc27.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=boardgame-2Cboardgameexpansion_6b1ff7dc27.xml +++ b/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=boardgame-2Cboardgameexpansion_6b1ff7dc27.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=rpgitem_f2de3eea31.xml b/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=rpgitem_f2de3eea31.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ALICE-IS-type=rpgitem_f2de3eea31.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml b/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml deleted file mode 100644 index 0baddd4..0000000 --- a/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=rpgitem_83ec5d7426.xml b/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=rpgitem_83ec5d7426.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=rpgitem_83ec5d7426.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_22856aa961.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_22856aa961.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_22856aa961.xml +++ b/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=boardgame-2Cboardgameexpansion_22856aa961.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=rpgitem_288971e44c.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=rpgitem_288971e44c.xml index ba791c3..3907bdd 100644 --- a/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=rpgitem_288971e44c.xml +++ b/tests/fixtures/bgg_cache/search_query=Blorvath-3A-Quest-of-the-Zzyzx-type=rpgitem_288971e44c.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-type=boardgame-2Cboardgameexpansion_48feb4349d.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-type=boardgame-2Cboardgameexpansion_48feb4349d.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=Blorvath-type=boardgame-2Cboardgameexpansion_48feb4349d.xml +++ b/tests/fixtures/bgg_cache/search_query=Blorvath-type=boardgame-2Cboardgameexpansion_48feb4349d.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Blorvath-type=rpgitem_ad250413dc.xml b/tests/fixtures/bgg_cache/search_query=Blorvath-type=rpgitem_ad250413dc.xml index ba791c3..3907bdd 100644 --- a/tests/fixtures/bgg_cache/search_query=Blorvath-type=rpgitem_ad250413dc.xml +++ b/tests/fixtures/bgg_cache/search_query=Blorvath-type=rpgitem_ad250413dc.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml b/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml deleted file mode 100644 index 53de9b0..0000000 --- a/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Britannia-type=rpgitem_78177b4e85.xml b/tests/fixtures/bgg_cache/search_query=Britannia-type=rpgitem_78177b4e85.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Britannia-type=rpgitem_78177b4e85.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml b/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml deleted file mode 100644 index 66d2d30..0000000 --- a/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=rpgitem_3d56b6309b.xml b/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=rpgitem_3d56b6309b.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=rpgitem_3d56b6309b.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_4292e34c30.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_4292e34c30.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_4292e34c30.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml +++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml index ba791c3..9c47559 100644 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml +++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=rpgitem_05fdc9d88b.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=rpgitem_05fdc9d88b.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=rpgitem_05fdc9d88b.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml index 0736cc9..f8a26ab 100644 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml +++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml @@ -1 +1,562 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=rpgitem_5e9e2b0726.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=rpgitem_5e9e2b0726.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=rpgitem_5e9e2b0726.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml b/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml deleted file mode 100644 index c7d8760..0000000 --- a/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=rpgitem_14e74aa71f.xml b/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=rpgitem_14e74aa71f.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=rpgitem_14e74aa71f.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=boardgame-2Cboardgameexpansion_d875abc790.xml b/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=boardgame-2Cboardgameexpansion_d875abc790.xml index 3cb54f8..02f5611 100644 --- a/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=boardgame-2Cboardgameexpansion_d875abc790.xml +++ b/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=boardgame-2Cboardgameexpansion_d875abc790.xml @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=rpgitem_957f2522ae.xml b/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=rpgitem_957f2522ae.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Caf-C3-A9-International-type=rpgitem_957f2522ae.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml b/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml deleted file mode 100644 index a83a9b8..0000000 --- a/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=rpgitem_04b2bcdf24.xml b/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=rpgitem_04b2bcdf24.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=rpgitem_04b2bcdf24.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Catan-type=boardgame-2Cboardgameexpansion_5be385814d.xml b/tests/fixtures/bgg_cache/search_query=Catan-type=boardgame-2Cboardgameexpansion_5be385814d.xml index 7343b91..dcf4233 100644 --- a/tests/fixtures/bgg_cache/search_query=Catan-type=boardgame-2Cboardgameexpansion_5be385814d.xml +++ b/tests/fixtures/bgg_cache/search_query=Catan-type=boardgame-2Cboardgameexpansion_5be385814d.xml @@ -1 +1,1178 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Catan-type=rpgitem_63fb6e5035.xml b/tests/fixtures/bgg_cache/search_query=Catan-type=rpgitem_63fb6e5035.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Catan-type=rpgitem_63fb6e5035.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Citadels-type=boardgame-2Cboardgameexpansion_9f48c481c4.xml b/tests/fixtures/bgg_cache/search_query=Citadels-type=boardgame-2Cboardgameexpansion_9f48c481c4.xml index e76b16c..9d45d57 100644 --- a/tests/fixtures/bgg_cache/search_query=Citadels-type=boardgame-2Cboardgameexpansion_9f48c481c4.xml +++ b/tests/fixtures/bgg_cache/search_query=Citadels-type=boardgame-2Cboardgameexpansion_9f48c481c4.xml @@ -1 +1,33 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Citadels-type=rpgitem_22dea38263.xml b/tests/fixtures/bgg_cache/search_query=Citadels-type=rpgitem_22dea38263.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Citadels-type=rpgitem_22dea38263.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml b/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml deleted file mode 100644 index 7fc1341..0000000 --- a/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=rpgitem_48015c5934.xml b/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=rpgitem_48015c5934.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=rpgitem_48015c5934.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=boardgame-2Cboardgameexpansion_f71cb1cc0c.xml b/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=boardgame-2Cboardgameexpansion_f71cb1cc0c.xml deleted file mode 100644 index 3814e39..0000000 --- a/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=boardgame-2Cboardgameexpansion_f71cb1cc0c.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=rpgitem_95d15d03fd.xml b/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=rpgitem_95d15d03fd.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=DUNGEON-21-type=rpgitem_95d15d03fd.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml b/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml deleted file mode 100644 index d0f22a6..0000000 --- a/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Diplomacy-type=rpgitem_0747a2387d.xml b/tests/fixtures/bgg_cache/search_query=Diplomacy-type=rpgitem_0747a2387d.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Diplomacy-type=rpgitem_0747a2387d.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml deleted file mode 100644 index 3814e39..0000000 --- a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=rpgitem_3bf546910a.xml b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=rpgitem_3bf546910a.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=rpgitem_3bf546910a.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml b/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml deleted file mode 100644 index 9585ee9..0000000 --- a/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=rpgitem_49ed26a640.xml b/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=rpgitem_49ed26a640.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=rpgitem_49ed26a640.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml b/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml index c930d74..00e851a 100644 --- a/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml +++ b/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=rpgitem_c1e66fb254.xml b/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=rpgitem_c1e66fb254.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=rpgitem_c1e66fb254.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Hebarceos-type=boardgame-2Cboardgameexpansion_b1b7b72de1.xml b/tests/fixtures/bgg_cache/search_query=Hebarceos-type=boardgame-2Cboardgameexpansion_b1b7b72de1.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Hebarceos-type=boardgame-2Cboardgameexpansion_b1b7b72de1.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Hebarceos-type=rpgitem_07740d9a32.xml b/tests/fixtures/bgg_cache/search_query=Hebarceos-type=rpgitem_07740d9a32.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Hebarceos-type=rpgitem_07740d9a32.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml b/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml deleted file mode 100644 index 8a20847..0000000 --- a/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Herbaceous-type=rpgitem_d78832e3ed.xml b/tests/fixtures/bgg_cache/search_query=Herbaceous-type=rpgitem_d78832e3ed.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Herbaceous-type=rpgitem_d78832e3ed.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml b/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml deleted file mode 100644 index 4d1cb0c..0000000 --- a/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=rpgitem_7928f17f52.xml b/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=rpgitem_7928f17f52.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=rpgitem_7928f17f52.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml b/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml deleted file mode 100644 index cf2ba6f..0000000 --- a/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=rpgitem_3550758066.xml b/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=rpgitem_3550758066.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=rpgitem_3550758066.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml b/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml deleted file mode 100644 index f177ea4..0000000 --- a/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=rpgitem_afb691fd45.xml b/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=rpgitem_afb691fd45.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=rpgitem_afb691fd45.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml b/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml deleted file mode 100644 index f1c4a55..0000000 --- a/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=ROYALS-type=rpgitem_740855ed66.xml b/tests/fixtures/bgg_cache/search_query=ROYALS-type=rpgitem_740855ed66.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=ROYALS-type=rpgitem_740855ed66.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml b/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml deleted file mode 100644 index faeec09..0000000 --- a/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SANTORINI-type=rpgitem_b3713fc18f.xml b/tests/fixtures/bgg_cache/search_query=SANTORINI-type=rpgitem_b3713fc18f.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SANTORINI-type=rpgitem_b3713fc18f.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml b/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml deleted file mode 100644 index a336e78..0000000 --- a/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SCRAWL-type=rpgitem_28917ca749.xml b/tests/fixtures/bgg_cache/search_query=SCRAWL-type=rpgitem_28917ca749.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SCRAWL-type=rpgitem_28917ca749.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml b/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml deleted file mode 100644 index 28db624..0000000 --- a/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=rpgitem_77cf1f8445.xml b/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=rpgitem_77cf1f8445.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=rpgitem_77cf1f8445.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml b/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml deleted file mode 100644 index 7b8de8c..0000000 --- a/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=rpgitem_3f9e6315a6.xml b/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=rpgitem_3f9e6315a6.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=rpgitem_3f9e6315a6.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml index ba791c3..d96c30a 100644 --- a/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml +++ b/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml @@ -1 +1,5 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=rpgitem_2ba94ce51c.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=rpgitem_2ba94ce51c.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=rpgitem_2ba94ce51c.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml deleted file mode 100644 index 9dbaf0f..0000000 --- a/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-type=rpgitem_0a90b76555.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-type=rpgitem_0a90b76555.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=SORCERER-type=rpgitem_0a90b76555.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml index ba791c3..cbc112e 100644 --- a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml +++ b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml @@ -1 +1,5 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=rp_d8afe77786.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=rp_d8afe77786.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=rp_d8afe77786.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml deleted file mode 100644 index bb68a9d..0000000 --- a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=rpgitem_5fc9118ed9.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=rpgitem_5fc9118ed9.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=rpgitem_5fc9118ed9.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml b/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml deleted file mode 100644 index e968537..0000000 --- a/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=rpgitem_f01cc4ca29.xml b/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=rpgitem_f01cc4ca29.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=rpgitem_f01cc4ca29.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=boardgame-2Cboardgameexpansion_85d6b5d538.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=boardgame-2Cboardgameexpansion_85d6b5d538.xml index e99a25e..a03af8e 100644 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=boardgame-2Cboardgameexpansion_85d6b5d538.xml +++ b/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=boardgame-2Cboardgameexpansion_85d6b5d538.xml @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=rpgitem_38f0ad0fff.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=rpgitem_38f0ad0fff.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-3A-European-Expansion-type=rpgitem_38f0ad0fff.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=boardgame-2Cboardgameexpansion_f5cb460ffe.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=boardgame-2Cboardgameexpansion_f5cb460ffe.xml index e99a25e..a579cce 100644 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=boardgame-2Cboardgameexpansion_f5cb460ffe.xml +++ b/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=boardgame-2Cboardgameexpansion_f5cb460ffe.xml @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=rpgitem_4387722048.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=rpgitem_4387722048.xml index ba791c3..3907bdd 100644 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=rpgitem_4387722048.xml +++ b/tests/fixtures/bgg_cache/search_query=Wingspan-Europe-type=rpgitem_4387722048.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-type=boardgame-2Cboardgameexpansion_0316afc400.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-type=boardgame-2Cboardgameexpansion_0316afc400.xml index e99a25e..a964cf0 100644 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-type=boardgame-2Cboardgameexpansion_0316afc400.xml +++ b/tests/fixtures/bgg_cache/search_query=Wingspan-type=boardgame-2Cboardgameexpansion_0316afc400.xml @@ -1 +1,117 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wingspan-type=rpgitem_f93bee11fc.xml b/tests/fixtures/bgg_cache/search_query=Wingspan-type=rpgitem_f93bee11fc.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Wingspan-type=rpgitem_f93bee11fc.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml b/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml deleted file mode 100644 index a1c3e2e..0000000 --- a/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=Wiz-War-type=rpgitem_3adf0a77c6.xml b/tests/fixtures/bgg_cache/search_query=Wiz-War-type=rpgitem_3adf0a77c6.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=Wiz-War-type=rpgitem_3adf0a77c6.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml b/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml deleted file mode 100644 index 58285bb..0000000 --- a/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=rpgitem_a3470f199b.xml b/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=rpgitem_a3470f199b.xml deleted file mode 100644 index ba791c3..0000000 --- a/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=rpgitem_a3470f199b.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml b/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml deleted file mode 100644 index 9fa319f..0000000 --- a/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=13-2C66056-stats=1_42106f768e.xml b/tests/fixtures/bgg_cache/thing_id=13-2C66056-stats=1_42106f768e.xml new file mode 100644 index 0000000..3fb8e4d --- /dev/null +++ b/tests/fixtures/bgg_cache/thing_id=13-2C66056-stats=1_42106f768e.xml @@ -0,0 +1,3328 @@ + + https://cf.geekdo-images.com/0XODRpReiZBFUffEcqT5-Q__small/img/SNVfF23OQafv3u8xdFolJnMkBoM=/fit-in/200x150/filters:strip_icc()/pic9156909.png + https://cf.geekdo-images.com/0XODRpReiZBFUffEcqT5-Q__original/img/oRc0AomWA9ZtFqQDZiZbIyKE1j0=/0x0/filters:format(png)/pic9156909.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In CATAN (formerly The Settlers of Catan), players try to be the dominant force on the island of Catan by building settlements, cities and roads. On each turn dice are rolled to determine which resources the island produces. Players build structures by 'spending' resources (sheep, wheat, wood, brick and ore) which are represented by the relevant resource cards; each land type, with the exception of the unproductive desert, produces a specific resource: hills produce brick, forests produce wood, mountains produce ore, fields produce wheat, and pastures produce sheep. + +Set-up includes randomly placing large hexagonal tiles (each depicting one of the five resource-producing terrain types--or the desert) in a honeycomb shape and surrounding them with water tiles, some of which contain ports of exchange. A number disk, the value of which will correspond to the roll of two 6-sided dice, are placed on each terrain tile. Each player is given two settlements (think: houses) and roads (sticks) which are placed on intersections and borders of the terrain tiles. Players collect a hand of resource cards based on which terrain tiles their last-placed settlement is adjacent to. A robber pawn is placed on the desert tile. + +A turn consists of rolling the dice, collecting resource cards based on this dice roll and the position of settlements (or upgraded cities—think: hotels), turning in resource cards (if possible and desired) for improvements, trading cards at a port, possibly playing a development card, or trading resource cards with other players. If the dice roll is a 7, the active player moves the robber to a new terrain tile and steals a resource card from another player who has a settlement adjacent to that tile. + +Points are accumulated by building settlements and cities, having the longest road or the largest army (from some of the development cards), and gathering certain development cards that simply award victory points. When a player has gathered 10 points (some of which may be held in secret), s/he announces this and claims the win. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/n5x9eZiQ7Da4SQjB7M41-w__small/img/dGMw2df-4gOwfLCdUeJceBeLCk8=/fit-in/200x150/filters:strip_icc()/pic6877018.jpg + https://cf.geekdo-images.com/n5x9eZiQ7Da4SQjB7M41-w__original/img/Y6dJpidB1624ox-QCAdiSVsCnf4=/0x0/filters:format(jpeg)/pic6877018.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Rivals for Catan is a reimplementation of Catan Card Game. + +The Rivals for Catan was released in German in September of 2010, on the 15th anniversary of the original card game. An English edition was released in the fourth quarter of 2010. The designer of the game, Klaus Teuber, has stated that he completely reworked many of the original card game's mechanics to make it easier for newcomers to play the game. + +Each player portrays a prince for Catan, developing their individual provinces and competing to build a more successful province than the other. The basic mode of play is similar to the original Catan Card Game, where players expand their provinces by building settlements connected by roads. Players may also build expansions in their settlements that aid them in various ways, or upgrade their settlements to cities to allow more expansions to be built. They build these additions by using resources that they accumulate each turn, which are determined by the roll of a die. Cards are drawn on each turn to replenish the players' hands. The players may also use action cards that directly affect either their own province or their opponent's province. + +The Rivals for Catan features a reduced pool of cards, without the more aggressive style of action cards found in the original Catan Card Game. Therefore, all action cards will be able to be used from the beginning of the game unlike in the original card game. + +Ways to Play: +The Introductory Game focuses on the basics of the card game, featuring gameplay that is more appropriate for newcomers. This game is played to 7 victory points and includes 36 Expansion Cards in four stacks. This play style should take beginner players 25 to 30 minutes to play. + +Three Theme Games add more rules, expansions, and aggressive cards. These Theme Games may be played individually or combined to play a variant called "The Duel of the Princes." Each Theme Game adds 24 Expansion and Event Cards to the cards from the Introductory Game, which are placed in two stacks separately from the cards from the Introductory Game. When playing a Theme Game, playtime should be around 45 to 60 minutes. + +As with the original Catan Card Game, players can also play the Tournament Game, in which each player chooses specific cards to build their deck ahead of time from which they draw from during the game. + +Theme: +The theme of The Rivals for Catan is no longer restricted only to the feudal era of the Middle Ages like the original Catan Card Game. The Introductory Game portrays the very early years of the world of Catan, while each Theme Game takes place in progressively later eras. These eras are known as "The Era of Gold," "The Era of Turmoil," and "The Era of Progress." + +Belongs to the Catan Series. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml b/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml deleted file mode 100644 index 3e6a42a..0000000 --- a/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml b/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml index ebb23c6..fbf4c39 100644 --- a/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml +++ b/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml @@ -1 +1,473 @@ - \ No newline at end of file + + https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__small/img/XDH667tVl2KjQ6szNjT7ceEmh5E=/fit-in/200x150/filters:strip_icc()/pic87459.jpg + https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__original/img/--qlhvNNj8zF9cWLlihdTg0jzmE=/0x0/filters:format(jpeg)/pic87459.jpg + + + + + The use of the word "Advanced" to describe this expansion followed existing Avalon Hill tradition. "Enhanced" is likely more appropriate. Playing with this expansion is no more difficult than playing the base Civilization game. This expansion reworks a few of the original rules, includes a reworked version of Civilization: Expansion Trade Cards Set and adds more civilization advancements to the technology tree. + +Included are more civilization advancements (both quantity and type), which give the players new options for advancement, as well as a slightly restructured commodity trading round, which has new resources and disasters to be traded. The most significant aspect of the game is a restructuring of the advancement/victory conditions, which remove the limits on advancement cards. Some claim this makes the strategies more homogeneous while others claim the reverse is true. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__small/img/XDH667tVl2KjQ6szNjT7ceEmh5E=/fit-in/200x150/filters:strip_icc()/pic87459.jpg + https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__original/img/--qlhvNNj8zF9cWLlihdTg0jzmE=/0x0/filters:format(jpeg)/pic87459.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml b/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml deleted file mode 100644 index 7b06bda..0000000 --- a/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml b/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml deleted file mode 100644 index 369b103..0000000 --- a/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml b/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml deleted file mode 100644 index 9d8f086..0000000 --- a/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml b/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml deleted file mode 100644 index 10952de..0000000 --- a/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml b/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml index 9d18a1a..8e026ad 100644 --- a/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml +++ b/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml @@ -1 +1,550 @@ - \ No newline at end of file + + https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__small/img/OTL4rEL5eQ-8jJ_JubPwIq9LBIQ=/fit-in/200x150/filters:strip_icc()/pic567384.jpg + https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__original/img/JRuDUwwK8S1jG9gZISv_Hwz5Kog=/0x0/filters:format(jpeg)/pic567384.jpg + + + + + + + Adapted from the box: + +The game is a simulation of events within a conjectural future history in which telekinesis is used to move ships through space. It is played on a map which displays 74 star systems in a three-dimensional "sphere" of space measuring roughly 40 light years in diameter, with Earth's home system at the center. A grid of hexagons printed over the map is used to regulate movement and position of pieces. Pieces' exact locations are not known until they "meet" in the same three-dimensional "hex space". + +The pieces in the game represent groups of four interstellar spaceships (StarForces) and space stations (StarGates). Each Player maneuvers his pieces (via Stellar Shifting) to engage those of the enemy. Movement is plotted and executed simultaneously. The game proceeds this way (for a specified number of turns) as the players try to achieve the objectives set forth in the rules. No prior knowledge is required to play the game - just a little ingenuity and common sense. + +Battles take place when units are in the same three-dimensional location. In the Basic Game, the attacking Player compares the total variable strengths of the involved units and consults a simple probability table to determine the outcome of each battle. In the Advanced Game, a small tactical maneuver map is used. When enemy forces engage on the main map, they are transferred to the tactical display. Here they move (in three dimensions), attack and defend using a fixed number of action points per tactical turn. + +Combat outcomes result in pieces not being destroyed but being "randomised"; usually to a location far from all the action. + + +Part of the StarForce Trilogy box set, along with Outreach and StarSoldier. There are also special rules to use Starsoldier as a tactical game for StarForce. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/Cko_tNtjRX8d6avovTl-Ag__small/img/9PYzeERL1pUms7L4hG2WIloVriU=/fit-in/200x150/filters:strip_icc()/pic20984.jpg + https://cf.geekdo-images.com/Cko_tNtjRX8d6avovTl-Ag__original/img/GAXZD5DAX6dgChoy-UXXDrAmenQ=/0x0/filters:format(jpeg)/pic20984.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/RQampTopF1fI_dthUB1TDg__small/img/_U4-K5t8K646btzkBAK3D7sP-9s=/fit-in/200x150/filters:strip_icc()/pic56687.jpg + https://cf.geekdo-images.com/RQampTopF1fI_dthUB1TDg__original/img/9d3TherAOwjA7MzTkTQHtCY5cxc=/0x0/filters:format(jpeg)/pic56687.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__small/img/OTL4rEL5eQ-8jJ_JubPwIq9LBIQ=/fit-in/200x150/filters:strip_icc()/pic567384.jpg + https://cf.geekdo-images.com/8PIdXg87V8l-VuCZAplQlQ__original/img/JRuDUwwK8S1jG9gZISv_Hwz5Kog=/0x0/filters:format(jpeg)/pic567384.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/Cko_tNtjRX8d6avovTl-Ag__small/img/9PYzeERL1pUms7L4hG2WIloVriU=/fit-in/200x150/filters:strip_icc()/pic20984.jpg + https://cf.geekdo-images.com/Cko_tNtjRX8d6avovTl-Ag__original/img/GAXZD5DAX6dgChoy-UXXDrAmenQ=/0x0/filters:format(jpeg)/pic20984.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/fPWr5Hd4H-PjUcQTtbicNQ__small/img/t7KpLAefJXyV1OX89UG7F1UvC8A=/fit-in/200x150/filters:strip_icc()/pic1220943.jpg + https://cf.geekdo-images.com/fPWr5Hd4H-PjUcQTtbicNQ__original/img/RhZT3RK-EScpzeAPzVJbzKz__8o=/0x0/filters:format(jpeg)/pic1220943.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml b/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml index 8d0a1ef..bc2deb5 100644 --- a/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml +++ b/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml @@ -1 +1,537 @@ - \ No newline at end of file + + https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__small/img/thPXwIIE3knD9igpLusCdeHVsMI=/fit-in/200x150/filters:strip_icc()/pic806423.jpg + https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__original/img/5m1hrtRgt6lst9tajA4o169D4wA=/0x0/filters:format(jpeg)/pic806423.jpg + + + + + Flat Top is a board wargame of high complexity that covers the battles of the Solomon Seas between the United States and Japan in 1942. It is very well researched and covers all aspects of naval and air combat as it existed in 1942. The system depicts weather, air searches, air combat, surface combat, carrier operations, submarines, air bases, supplies, and much more. The game requires intense planning and searching since movement is covert and the map is huge. + +The units are individual ships and submarines with each air point representing three aircraft. Hexes are twenty miles, and each turn represents one hour. + +The game includes thirteen hundred counters, 4 maps to create a 44" x 28" map of the South Pacific, four Allied/Japanese operations cards, three player aid cards and two log sheets. + + + First edition Battle Line has two counter card sheets containing 800 counters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/h1Z904DrkP4_cCVN8JguHQ__small/img/ICJBK6xRsfyukpLxRUa2ktNRJ4w=/fit-in/200x150/filters:strip_icc()/pic3638352.jpg + https://cf.geekdo-images.com/h1Z904DrkP4_cCVN8JguHQ__original/img/vB6K6i7lPPPtOuUNIvFxwcVafQM=/0x0/filters:format(jpeg)/pic3638352.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/1UF2e6YeUTiP0ICTXBQNsg__small/img/-oVo9FdnSFHCk_xTcOikRTV9140=/fit-in/200x150/filters:strip_icc()/pic3316814.jpg + https://cf.geekdo-images.com/1UF2e6YeUTiP0ICTXBQNsg__original/img/9iF0xPDylqnVxgxCAca4yPBY9Ps=/0x0/filters:format(jpeg)/pic3316814.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__small/img/thPXwIIE3knD9igpLusCdeHVsMI=/fit-in/200x150/filters:strip_icc()/pic806423.jpg + https://cf.geekdo-images.com/U4aLOWpOLNtUjQ5BirlGLA__original/img/5m1hrtRgt6lst9tajA4o169D4wA=/0x0/filters:format(jpeg)/pic806423.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml b/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml deleted file mode 100644 index e30e60b..0000000 --- a/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=266192-versions=1_4904563f7f.xml b/tests/fixtures/bgg_cache/thing_id=266192-versions=1_4904563f7f.xml index 22f21a2..3fdbd3a 100644 --- a/tests/fixtures/bgg_cache/thing_id=266192-versions=1_4904563f7f.xml +++ b/tests/fixtures/bgg_cache/thing_id=266192-versions=1_4904563f7f.xml @@ -1,25 +1,4791 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__small/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__original/img/cI782Zis9cT66j2MjSHKJGnFPNw=/0x0/filters:format(jpeg)/pic4458123.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wingspan is a competitive, medium-weight, card-driven, engine-building board game from Stonemaier Games. It's designed by Elizabeth Hargrave and features 180 birds illustrated by Natalia Rojas and Ana Maria Martinez. + +You are bird enthusiasts—researchers, bird watchers, ornithologists, and collectors—seeking to discover and attract the best birds to your network of wildlife preserves. Each bird extends a chain of powerful combinations in one of your habitats (actions). These habitats focus on several key aspects of growth: + + + Gain food tokens via custom dice in a birdfeeder dice tower + Lay eggs using egg miniatures in a variety of colors + Draw from hundreds of unique bird cards and play them + + +The winner is the player with the most points after 4 rounds. + +—description from the publisher + +From the 7th printing on, the base game box includes Wingspan: Swift-Start Promo Pack. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/DU3QyL46wIv4JNFGzImgQw__small/img/viEgyaKn2TAO550msdZOoe8Pu9Q=/fit-in/200x150/filters:strip_icc()/pic5279037.jpg + https://cf.geekdo-images.com/DU3QyL46wIv4JNFGzImgQw__original/img/OGQJQa4lhNcyNXMbfJy37uwXBjk=/0x0/filters:format(jpeg)/pic5279037.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/YFdhwcBDDYltRF9A9lI5gQ__small/img/TfKFMcJ7cqMekLun9_RrqWWfI2E=/fit-in/200x150/filters:strip_icc()/pic6581724.png + https://cf.geekdo-images.com/YFdhwcBDDYltRF9A9lI5gQ__original/img/sikjbpY9miYkXBJk3u-ohxc-4Gs=/0x0/filters:format(png)/pic6581724.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/w8IX3z4b2SxesfNbwRe9-A__small/img/I6b6mwH8YWOW8m-nTXoCZEFng9w=/fit-in/200x150/filters:strip_icc()/pic6521799.png + https://cf.geekdo-images.com/w8IX3z4b2SxesfNbwRe9-A__original/img/kVLFfawjW9hAFaT9mduEAtuhclA=/0x0/filters:format(png)/pic6521799.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__small/img/qTpNYm01lP97PTs__K60dP9wgOA=/fit-in/200x150/filters:strip_icc()/pic4799378.jpg + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__original/img/y6d1xBYI6Bv17bJQriYn0F0Btig=/0x0/filters:format(jpeg)/pic4799378.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__small/img/qTpNYm01lP97PTs__K60dP9wgOA=/fit-in/200x150/filters:strip_icc()/pic4799378.jpg + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__original/img/y6d1xBYI6Bv17bJQriYn0F0Btig=/0x0/filters:format(jpeg)/pic4799378.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__small/img/qTpNYm01lP97PTs__K60dP9wgOA=/fit-in/200x150/filters:strip_icc()/pic4799378.jpg + https://cf.geekdo-images.com/7eS4_oQ2kQtg75s9DAfFMg__original/img/y6d1xBYI6Bv17bJQriYn0F0Btig=/0x0/filters:format(jpeg)/pic4799378.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/N6hmz_i701n6tW4MM5_-Ng__small/img/ywy8p3t7NLBM4YzL7UP8W3BAbZM=/fit-in/200x150/filters:strip_icc()/pic5728079.jpg + https://cf.geekdo-images.com/N6hmz_i701n6tW4MM5_-Ng__original/img/acJ2923KhxL_taSNjqLeI3Q6wqc=/0x0/filters:format(jpeg)/pic5728079.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/u5OTOBspRC87SkA2kO3XHg__small/img/0AV-WFct47TBOlxR8A4La15xaNw=/fit-in/200x150/filters:strip_icc()/pic8311894.jpg + https://cf.geekdo-images.com/u5OTOBspRC87SkA2kO3XHg__original/img/LpIJzCDY7Td6-DiKy89bAOS2TtU=/0x0/filters:format(jpeg)/pic8311894.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/Pnt1EXejpsriVH9X0dIsEA__small/img/qrwBh5j2TMiJrRK_vYGWOFr1Fag=/fit-in/200x150/filters:strip_icc()/pic5847791.jpg + https://cf.geekdo-images.com/Pnt1EXejpsriVH9X0dIsEA__original/img/ZNuFvhFuIcjaGGodO4q_np5OP18=/0x0/filters:format(jpeg)/pic5847791.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__small/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__original/img/cI782Zis9cT66j2MjSHKJGnFPNw=/0x0/filters:format(jpeg)/pic4458123.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__small/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__original/img/cI782Zis9cT66j2MjSHKJGnFPNw=/0x0/filters:format(jpeg)/pic4458123.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__small/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg + https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__original/img/cI782Zis9cT66j2MjSHKJGnFPNw=/0x0/filters:format(jpeg)/pic4458123.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/a2p0qmHQOLXZ4XP2Oi-HeA__small/img/V81DVhfNllqnB8cArAKavLFm0GQ=/fit-in/200x150/filters:strip_icc()/pic6135481.jpg + https://cf.geekdo-images.com/a2p0qmHQOLXZ4XP2Oi-HeA__original/img/BVmlX3u-Ix5sQZiSfFLyODVKnP4=/0x0/filters:format(jpeg)/pic6135481.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/x3w46AsSmJtKhccAPVPFfg__small/img/ZveQUxBYDkSnAJk0iAYnziWTscE=/fit-in/200x150/filters:strip_icc()/pic5579454.jpg + https://cf.geekdo-images.com/x3w46AsSmJtKhccAPVPFfg__original/img/E4UBLrQBHjmzGQa8Flm00AUIMDE=/0x0/filters:format(jpeg)/pic5579454.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/JjN5KOHRiqLF2mtINv1hvw__small/img/vutVZWSKiWeKf91CzZB_WRMp4UU=/fit-in/200x150/filters:strip_icc()/pic4526373.jpg + https://cf.geekdo-images.com/JjN5KOHRiqLF2mtINv1hvw__original/img/yMYPcHgdmlfNp8xr_sr43pkvXRI=/0x0/filters:format(jpeg)/pic4526373.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/-0pDaOlr0nrw5Y4BTObqcQ__small/img/wz5Eq8CvSOzsKQuWqZeq_yJrJgg=/fit-in/200x150/filters:strip_icc()/pic8280885.jpg + https://cf.geekdo-images.com/-0pDaOlr0nrw5Y4BTObqcQ__original/img/YxsjLN-9E5ptb2Eik8A_kmQLJP8=/0x0/filters:format(jpeg)/pic8280885.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/Ng8-mJSA16uZ42ht6wCc9Q__small/img/Pg8yOUfzxpjY__H7MsIc3eo80y8=/fit-in/200x150/filters:strip_icc()/pic4510226.jpg + https://cf.geekdo-images.com/Ng8-mJSA16uZ42ht6wCc9Q__original/img/p0DKFtle1qQvpzel3obes08Y7v0=/0x0/filters:format(jpeg)/pic4510226.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/joGavl9pH3D46OXl0LLggQ__small/img/tpZ0IZLwZ-Vj3j7svpQsvwzInlk=/fit-in/200x150/filters:strip_icc()/pic7203599.jpg + https://cf.geekdo-images.com/joGavl9pH3D46OXl0LLggQ__original/img/_AZqVe5vzIhMqfTXC_LZCMk2vnA=/0x0/filters:format(jpeg)/pic7203599.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/WV872b2Im2V-R29YFiNxXw__small/img/wo3lZEPPCf4RzNMUjMwNt8XgAtU=/fit-in/200x150/filters:strip_icc()/pic4962803.jpg + https://cf.geekdo-images.com/WV872b2Im2V-R29YFiNxXw__original/img/FAyjLBlMbURSaj8sM9O5XwqdEfQ=/0x0/filters:format(jpeg)/pic4962803.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/7AehIUmhh9bVh-Wi9uqRzg__small/img/Cy3DOP9EPuqyKG9k8Ebz_QYSsG4=/fit-in/200x150/filters:strip_icc()/pic5031480.jpg + https://cf.geekdo-images.com/7AehIUmhh9bVh-Wi9uqRzg__original/img/fBu1vCTkJ5Pl3IWPNwMHMsrDPHc=/0x0/filters:format(jpeg)/pic5031480.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/nr07dZdpSE8v74rlmTUjSA__small/img/BcODhAGtMDgDZEk5rcixKLPEOvo=/fit-in/200x150/filters:strip_icc()/pic5739226.jpg + https://cf.geekdo-images.com/nr07dZdpSE8v74rlmTUjSA__original/img/IsBC3KPgQehbvUB0rMHYfroprF0=/0x0/filters:format(jpeg)/pic5739226.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/pvYVuF0dKUhprxsk48rZVg__small/img/EYICRApNp9SkL_wx7Y4LQRij98g=/fit-in/200x150/filters:strip_icc()/pic4619957.png + https://cf.geekdo-images.com/pvYVuF0dKUhprxsk48rZVg__original/img/KW73GQWIqEEC999RA8tIh6oNAtI=/0x0/filters:format(png)/pic4619957.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/u8S3Go7RKfjZ3_5rcL6IYw__small/img/brD4nRpK6Dnn2VO1gTcVvpXUIAY=/fit-in/200x150/filters:strip_icc()/pic5735580.jpg + https://cf.geekdo-images.com/u8S3Go7RKfjZ3_5rcL6IYw__original/img/gPzgUvwgAbfZ9X1_QeeZpOSrKzs=/0x0/filters:format(jpeg)/pic5735580.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/ATBmIMCnmiJO3A9AHB6qhA__small/img/Cu8F6k7rNQBfx8xfomBzYCxoU9Y=/fit-in/200x150/filters:strip_icc()/pic9050401.png + https://cf.geekdo-images.com/ATBmIMCnmiJO3A9AHB6qhA__original/img/EnrHp3g8fHnVGkd6If-SbRLjNzg=/0x0/filters:format(png)/pic9050401.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/uHHB4-EMwh-_dt4XtqlVog__small/img/bt6uMZnuNnQvqjfI8pX2OS0uOK8=/fit-in/200x150/filters:strip_icc()/pic5786620.jpg + https://cf.geekdo-images.com/uHHB4-EMwh-_dt4XtqlVog__original/img/SutYQoX8WXJReK-EkWjWyDfsUMg=/0x0/filters:format(jpeg)/pic5786620.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/aSrLzouX3R0CaR7ngNqcvw__small/img/L5ZCG5Xm5E7XmsGpavcChgQFO38=/fit-in/200x150/filters:strip_icc()/pic6464139.png + https://cf.geekdo-images.com/aSrLzouX3R0CaR7ngNqcvw__original/img/3EbkT1wYDzo2mVKK5td6OTa0O1c=/0x0/filters:format(png)/pic6464139.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/whZd5N84b2Kk8Nk02cc-Lw__small/img/b-7JM80ZPNrDGsfUvJia7LRoS9A=/fit-in/200x150/filters:strip_icc()/pic6135483.jpg + https://cf.geekdo-images.com/whZd5N84b2Kk8Nk02cc-Lw__original/img/pHOhlFt_BlpyI8V1W3i4QRPQJ0c=/0x0/filters:format(jpeg)/pic6135483.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/QqYDqtz-GuCzFvBA5SHnKw__small/img/X2MrvLWLgv_ctdhda1uI_T65iYc=/fit-in/200x150/filters:strip_icc()/pic6135482.jpg + https://cf.geekdo-images.com/QqYDqtz-GuCzFvBA5SHnKw__original/img/txakrNXEtgEjzlqa23zs0R0-0Cs=/0x0/filters:format(jpeg)/pic6135482.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/4GeZT-ixvQsjcqBBYPxMpw__small/img/Tp538M_-qOeg7My3Bqs4tMEJVyA=/fit-in/200x150/filters:strip_icc()/pic6276198.png + https://cf.geekdo-images.com/4GeZT-ixvQsjcqBBYPxMpw__original/img/YdQRo4exYDwYjfG4cdrvbb-AkzE=/0x0/filters:format(png)/pic6276198.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/YsOi9t9cmungXzNeEs5UdA__small/img/HQHMsGXztx7CeL4LTgzxh0d_7fs=/fit-in/200x150/filters:strip_icc()/pic9426034.jpg + https://cf.geekdo-images.com/YsOi9t9cmungXzNeEs5UdA__original/img/OqAIQspbnQcQjL5gSRnbMJUagOs=/0x0/filters:format(jpeg)/pic9426034.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/nxyQVEybJku_EkLZD9uCjQ__small/img/vT9yA-N_pnriIaURwml0mMdFJwQ=/fit-in/200x150/filters:strip_icc()/pic8572352.jpg + https://cf.geekdo-images.com/nxyQVEybJku_EkLZD9uCjQ__original/img/uE4hwND29SkxLQu196kgkVFY_xs=/0x0/filters:format(jpeg)/pic8572352.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/AWNt83LN-WAUZhnYHcXrBA__small/img/NzQrQHaa0vQvUEt5Bl1tk6nZ5bc=/fit-in/200x150/filters:strip_icc()/pic5076501.jpg + https://cf.geekdo-images.com/AWNt83LN-WAUZhnYHcXrBA__original/img/j_bvliOurMTyc5XSi_hFcV-aPjU=/0x0/filters:format(jpeg)/pic5076501.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/UJwAleHINmtfsaW6NPrBRQ__small/img/AKRGTdYrponMLsIlT-JS0ICL29k=/fit-in/200x150/filters:strip_icc()/pic7160325.jpg + https://cf.geekdo-images.com/UJwAleHINmtfsaW6NPrBRQ__original/img/Eioax1ltx0nfnafGfEnEs-HMlew=/0x0/filters:format(jpeg)/pic7160325.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/hC8kPIMubW1IWYOR52cHlA__small/img/cTDUHgZLJb6k0RhFdx9WHeLTwNs=/fit-in/200x150/filters:strip_icc()/pic9623467.jpg + https://cf.geekdo-images.com/hC8kPIMubW1IWYOR52cHlA__original/img/8tYZUwv3rArnUfbVwMvlKu3VRkk=/0x0/filters:format(jpeg)/pic9623467.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/espdRedYtOEvoTU28dTetw__small/img/TZ9PGEqeFsqGnpKp0S3MlgJ7LNo=/fit-in/200x150/filters:strip_icc()/pic6427209.jpg + https://cf.geekdo-images.com/espdRedYtOEvoTU28dTetw__original/img/h9JzXNEFll3exL2xFXvkwtJwTn8=/0x0/filters:format(jpeg)/pic6427209.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/83cLqB5YuQmzGw420LF0pg__small/img/fnV-a_EBwaMtVvYBFhsZqJoGV2c=/fit-in/200x150/filters:strip_icc()/pic4744955.jpg + https://cf.geekdo-images.com/83cLqB5YuQmzGw420LF0pg__original/img/4L3rl0RkBvPIOZhpYOnGJlsw844=/0x0/filters:format(jpeg)/pic4744955.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/mqmNPUNOT-KmVC5XzHqgiA__small/img/U-Z1b7Sku5TDoEftSABt2jJDeJE=/fit-in/200x150/filters:strip_icc()/pic6974486.jpg + https://cf.geekdo-images.com/mqmNPUNOT-KmVC5XzHqgiA__original/img/r6IsXd9T05ZtnaJtiNBvdr4J3ec=/0x0/filters:format(jpeg)/pic6974486.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/mqmNPUNOT-KmVC5XzHqgiA__small/img/U-Z1b7Sku5TDoEftSABt2jJDeJE=/fit-in/200x150/filters:strip_icc()/pic6974486.jpg + https://cf.geekdo-images.com/mqmNPUNOT-KmVC5XzHqgiA__original/img/r6IsXd9T05ZtnaJtiNBvdr4J3ec=/0x0/filters:format(jpeg)/pic6974486.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/9qjaaP9D-G6avUMVTUfzfg__small/img/vOAjhGECNK8O3Kq5L6PWe8hqEa0=/fit-in/200x150/filters:strip_icc()/pic5203273.jpg + https://cf.geekdo-images.com/9qjaaP9D-G6avUMVTUfzfg__original/img/7wAdQ6zf29qjPY2llftPbZ66sWE=/0x0/filters:format(jpeg)/pic5203273.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/QRQZRK_DhSCNrHNKrWTHjw__small/img/pRyGg7KWGyMAeNtzSXvmXKWbKMA=/fit-in/200x150/filters:strip_icc()/pic5532242.jpg + https://cf.geekdo-images.com/QRQZRK_DhSCNrHNKrWTHjw__original/img/suQvkrt7mHKF35d389PYwWjLktU=/0x0/filters:format(jpeg)/pic5532242.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/fJlGBHYQyKAZftK3ZNse5A__small/img/UpDN1wyXGLLzeXLhp76xsKQ3lEM=/fit-in/200x150/filters:strip_icc()/pic9489987.png + https://cf.geekdo-images.com/fJlGBHYQyKAZftK3ZNse5A__original/img/RVYGnYAierXabUI-tj8DPnhR8Z4=/0x0/filters:format(png)/pic9489987.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/btv61TRDF4j8xXoJmCeCYw__small/img/MJ9hPqSCU5Rgrs17rwEBhlN0UdE=/fit-in/200x150/filters:strip_icc()/pic5531710.png + https://cf.geekdo-images.com/btv61TRDF4j8xXoJmCeCYw__original/img/B7RtYSLlbq0E6EDcvGm7FFcPvdI=/0x0/filters:format(png)/pic5531710.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml b/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml deleted file mode 100644 index 64be42c..0000000 --- a/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml b/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml deleted file mode 100644 index ee33c40..0000000 --- a/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml b/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml deleted file mode 100644 index 66a1c13..0000000 --- a/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml b/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml index 7610e3d..fcd21d5 100644 --- a/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml +++ b/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml @@ -1 +1,707 @@ - \ No newline at end of file + + https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__small/img/Vo85InhIcQUg1myZBiHCL22uu8A=/fit-in/200x150/filters:strip_icc()/pic10078.jpg + https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__original/img/eGfEPINMJA_0pAKWAYyjJaXmaQo=/0x0/filters:format(jpeg)/pic10078.jpg + + + + + + + + + Sorcerer is a fantasy wargame. Each player has an army consisting of Sorcerers, human infantry, and magical units (trolls, demons, and dragons). Sorcerers specialize in types of magic represented by 7 different colors. Sorcerer adds a twist to the old "combat differential" system (attack strength minus defense strength) by adding a circular system of combat bonuses based upon what colors of magic are attacking each other; Blue/Green/Yellow/Grey/Orange/Red/Purple with each color having a strong advantage over it's neighbor to the right (with Purple circling around to have power over Blue) and a disadvantage against it's neighbor to the left, with lessening combat bonuses the further away the color is from itself. Combat bonuses are also given based on map position as the hexes alternate colors of magic instead of representing physical terrain. Attacking from one's own color is good. + +Several different scenarios are included in the rulebook that range from 1 to 6 players. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__small/img/Vo85InhIcQUg1myZBiHCL22uu8A=/fit-in/200x150/filters:strip_icc()/pic10078.jpg + https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__original/img/eGfEPINMJA_0pAKWAYyjJaXmaQo=/0x0/filters:format(jpeg)/pic10078.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__small/img/-gErHFk_f_I1VCtPATCfFnUXwzg=/fit-in/200x150/filters:strip_icc()/pic162215.jpg + https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__original/img/SmLq9Ek_eQQY22d9RR1KMVzvZrs=/0x0/filters:format(jpeg)/pic162215.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/6PzQJaC0yM57G1BqsIyWDA__small/img/dToTgfcoYlMXtY3WQIAdRoV92Cw=/fit-in/200x150/filters:strip_icc()/pic1220937.jpg + https://cf.geekdo-images.com/6PzQJaC0yM57G1BqsIyWDA__original/img/Aka747_k1gwm3uMO175vJwVe9NE=/0x0/filters:format(jpeg)/pic1220937.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/5jjVx3HxQGYOedpJCO0M2w__small/img/A26lvJ3YzHDj6ORPsoDYs-E1Hb8=/fit-in/200x150/filters:strip_icc()/pic361569.jpg + https://cf.geekdo-images.com/5jjVx3HxQGYOedpJCO0M2w__original/img/FaQ0icl0S8FgMg6ZQxVpr5xNPgA=/0x0/filters:format(jpeg)/pic361569.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__small/img/-gErHFk_f_I1VCtPATCfFnUXwzg=/fit-in/200x150/filters:strip_icc()/pic162215.jpg + https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__original/img/SmLq9Ek_eQQY22d9RR1KMVzvZrs=/0x0/filters:format(jpeg)/pic162215.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml b/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml deleted file mode 100644 index 4b9cb69..0000000 --- a/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=400001-versions=1_6c87ca2e4a.xml b/tests/fixtures/bgg_cache/thing_id=400001-versions=1_6c87ca2e4a.xml deleted file mode 100644 index ebee33f..0000000 --- a/tests/fixtures/bgg_cache/thing_id=400001-versions=1_6c87ca2e4a.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=400002-versions=1_a82fe6afff.xml b/tests/fixtures/bgg_cache/thing_id=400002-versions=1_a82fe6afff.xml deleted file mode 100644 index 24e2613..0000000 --- a/tests/fixtures/bgg_cache/thing_id=400002-versions=1_a82fe6afff.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=478-2C205398-stats=1_9bd49e518b.xml b/tests/fixtures/bgg_cache/thing_id=478-2C205398-stats=1_9bd49e518b.xml index bbc07d7..edae150 100644 --- a/tests/fixtures/bgg_cache/thing_id=478-2C205398-stats=1_9bd49e518b.xml +++ b/tests/fixtures/bgg_cache/thing_id=478-2C205398-stats=1_9bd49e518b.xml @@ -1,14 +1,1544 @@ - - - - - - - - - - - - - + + https://cf.geekdo-images.com/shXqRK7Sfsp-jCLwoN3kqw__small/img/Y_o8GdhShAWME_ZH2c7yTxHJIWk=/fit-in/200x150/filters:strip_icc()/pic636868.jpg + https://cf.geekdo-images.com/shXqRK7Sfsp-jCLwoN3kqw__original/img/G5HKV77V6Q62qaArIHGRLjMnvzY=/0x0/filters:format(jpeg)/pic636868.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In Citadels, players take on new roles each round to represent characters they hire in order to help them acquire gold and erect buildings. The game ends at the close of a round in which a player erects his/her eighth building. Players then tally their points, and the player with the highest score wins. + +Players start with a number of building cards in their hand; buildings come in five colors, with the purple buildings typically having a special ability and the other colored buildings providing a benefit when you play particular characters. At the start of each round, the player who was king the previous round discards one of the eight character cards at random, chooses one, then passes the cards to the next player, etc. until each player has secretly chosen a character. Each character has a special ability, and the usefulness of any character depends upon your situation, and that of your opponents. The characters then carry out their actions in numerical order: the assassin eliminating another character for the round, the thief stealing all gold from another character, the wizard swapping building cards with another player, the warlord optionally destroys a building in play, and so on. + +On a turn, a player earns two or more gold (or draws two building cards then discards one), then optionally constructs one building (or up to three if playing the architect this round). Buildings cost gold equal to the number of symbols on them, and each building is worth a certain number of points. In addition to points from buildings, at the end of the game a player scores bonus points for having eight buildings or buildings of all five colors. + +The expansion Citadels: The Dark City was initially released as a separate item, but the second edition of the game from Hans im Glück (packaged in a tin box) and the third edition from Fantasy Flight Games included this expansion and can be recognized by its rectangular box (not square). With Dark City, Citadels supports a maximum of eight players. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/sHd0jkZZLDgixHjAXtn7kA__small/img/HB0Z5D7uwBjf1lCCPjMck-5VP9A=/fit-in/200x150/filters:strip_icc()/pic3119514.jpg + https://cf.geekdo-images.com/sHd0jkZZLDgixHjAXtn7kA__original/img/9n76iqzSN06hlbX4DuuPD6fSkHQ=/0x0/filters:format(jpeg)/pic3119514.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In Citadels, players take on new roles each round to represent characters they hire in order to help them acquire gold and erect buildings. The game ends at the close of a round in which a player erects their seventh building. Players then tally their points, and the player with the highest score wins. + +Players start the game with a number of building cards in their hand; buildings come in five colors, with the purple buildings typically having a special ability and the other colored buildings providing a benefit when you play particular characters. At the start of each round, the player who was king the previous round discards one of the eight character cards at random, chooses one, then passes the cards to the next player, etc. until each player has secretly chosen a character. Each character has a special ability, and the usefulness of any character depends upon your situation, and that of your opponents. The characters then carry out their actions in numerical order: the assassin eliminating another character for the round, the thief stealing all gold from another character, the wizard swapping building cards with another player, the warlord optionally destroys a building in play, and so on. + +On a turn, a player earns two or more gold (or draws two building cards then discards one), then optionally constructs one building (or up to three if playing the architect this round). Buildings cost gold equal to the number of symbols on them, and each building is worth a certain number of points. In addition to points from buildings, at the end of the game a player scores bonus points for having eight buildings or buildings of all five colors. + +The 2016 edition of Citadels includes twenty-seven characters — eight from the original Citadels, ten from the Dark City expansion, and nine new ones — along with thirty unique building districts, and the rulebook includes six preset lists of characters and districts beyond the starter list, each crafted to encourage a different style and intensity of gameplay. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml b/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml deleted file mode 100644 index 4e19eaf..0000000 --- a/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml b/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml index 3565a0d..7ce25ca 100644 --- a/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml +++ b/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml @@ -1 +1,1401 @@ - \ No newline at end of file + + https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__small/img/AI7xWgZxUCdXZHPH5WXCXWSAKUI=/fit-in/200x150/filters:strip_icc()/pic114473.jpg + https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__original/img/121amP5yjflTHIFW017EGPe5Rjk=/0x0/filters:format(jpeg)/pic114473.jpg + + + + + + + + + + + + + Civilization is a game of skill for 2 to 7 players. It covers the development of ancient civilizations from the invention of agriculture c. 8000 B.C. to the emergence of Rome around the middle of the third century B.C. Each player leads a nation of peoples over a map board of the Eastern Mediterranean and Near East as they attempt to carve a niche for themselves and their culture. + +Although battles and territorial strategy are important, this is not a war game because it is not won by battle or conquest. Instead, the object of play is to gain a level of overall advancement involving cultural, economic, and political factors so that such conflicts that do arise are a result of rivalry and land shortage rather than a desire to eliminate other players. Nomad and farmer, warrior and merchant, artisan and citizen all have an essential part to play in the development of civilization. It is the player who most effectively changes emphasis between these various outlooks who will achieve the best balance and win. + +(from the Introduction to the Avalon Hill edition rulebook) + +This game has a huge following and is widely regarded as one of the best games about ancient civilizations. Each player takes on the role of leader of an ancient civilization, such as the Illyrians or Babylonians. Your task is to guide your people through the ages by expanding your empire and using its proceeds to finance new technological advances, such as Literacy, Metalworking, or Law. The advancements help your civilization better cope with its problems as well as help bring new advancements. + +Civilization is widely thought to be the first game ever to incorporate a "technology tree," allowing players to gain certain items and abilities only after particular other items were obtained. This influential mechanism has been adopted by countless other board games, card games, and computer games. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/YnRVKSq3NrLKVGPNzcYvqg__small/img/CUSJ06HO4-802yb7VSq_MgpOSpE=/fit-in/200x150/filters:strip_icc()/pic374847.jpg + https://cf.geekdo-images.com/YnRVKSq3NrLKVGPNzcYvqg__original/img/DVfIjAcXRotFftj6yPOc7KKYXNA=/0x0/filters:format(jpeg)/pic374847.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__small/img/AI7xWgZxUCdXZHPH5WXCXWSAKUI=/fit-in/200x150/filters:strip_icc()/pic114473.jpg + https://cf.geekdo-images.com/tUdVpt5daNITDrLXqN931Q__original/img/121amP5yjflTHIFW017EGPe5Rjk=/0x0/filters:format(jpeg)/pic114473.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/R-VdJrpcD-XQtOHTU54DpQ__small/img/7_HXU37q0wZiKM-VWVxTwMTOLKk=/fit-in/200x150/filters:strip_icc()/pic1020595.jpg + https://cf.geekdo-images.com/R-VdJrpcD-XQtOHTU54DpQ__original/img/gI4hB4eY7vu8Is615PRjGBNG4is=/0x0/filters:format(jpeg)/pic1020595.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/zEminRfeYQmnvM9eMV1Wyw__small/img/L6GCoByPwMm-KunJK_alLcBRIjs=/fit-in/200x150/filters:strip_icc()/pic4457817.jpg + https://cf.geekdo-images.com/zEminRfeYQmnvM9eMV1Wyw__original/img/B_jmfYl_UhY4LrOMBK7GMyfl_hE=/0x0/filters:format(jpeg)/pic4457817.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/aJHOsppklwIXovhoGwEuAA__small/img/XIPlcUDY3363I-Jt8IP5OTXX_vQ=/fit-in/200x150/filters:strip_icc()/pic238631.jpg + https://cf.geekdo-images.com/aJHOsppklwIXovhoGwEuAA__original/img/5fz9rJwh-jDYpJBmJoJGJt1RyqE=/0x0/filters:format(jpeg)/pic238631.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/1zGIlIl3k5dKGEdNik6Q9Q__small/img/607f0w9cjvMTxtWzrdts7hs1AFA=/fit-in/200x150/filters:strip_icc()/pic1715239.jpg + https://cf.geekdo-images.com/1zGIlIl3k5dKGEdNik6Q9Q__original/img/FWPoUaXDZW2uqWXb0midiaUpMb4=/0x0/filters:format(jpeg)/pic1715239.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/9J852lHEw0wbiJudNCv0pQ__small/img/xXTlAt67JRooZ73O7_6vbjjhjHk=/fit-in/200x150/filters:strip_icc()/pic48837.jpg + https://cf.geekdo-images.com/9J852lHEw0wbiJudNCv0pQ__original/img/qMFVL518fBSTQN78aQ_koFCXXlU=/0x0/filters:format(jpeg)/pic48837.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/JHYS4FrA5HRrqz1Y6-RY7w__small/img/NmeCS7LE2EwVUYDPkHDlDkPM75o=/fit-in/200x150/filters:strip_icc()/pic62839.jpg + https://cf.geekdo-images.com/JHYS4FrA5HRrqz1Y6-RY7w__original/img/T7yJDtvYwlFdOOQ6UQOhhAaS4cA=/0x0/filters:format(jpeg)/pic62839.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__small/img/fKk_2yW28nhsnHw6Pp1FYIWIXws=/fit-in/200x150/filters:strip_icc()/pic158559.jpg + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__original/img/PnHxIw46htmx_ldUPphFczleXhY=/0x0/filters:format(jpeg)/pic158559.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/jSnYrGQeBClcliERGfzKFg__small/img/xNbbQ6zqCHO6OWYQsv5WX_vU1xo=/fit-in/200x150/filters:strip_icc()/pic2001664.jpg + https://cf.geekdo-images.com/jSnYrGQeBClcliERGfzKFg__original/img/WROv5B6wK3q-QoaWBM9m6pblN4g=/0x0/filters:format(jpeg)/pic2001664.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__small/img/fKk_2yW28nhsnHw6Pp1FYIWIXws=/fit-in/200x150/filters:strip_icc()/pic158559.jpg + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__original/img/PnHxIw46htmx_ldUPphFczleXhY=/0x0/filters:format(jpeg)/pic158559.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__small/img/fKk_2yW28nhsnHw6Pp1FYIWIXws=/fit-in/200x150/filters:strip_icc()/pic158559.jpg + https://cf.geekdo-images.com/R22TvjAW9iXWBz9c_EfHZQ__original/img/PnHxIw46htmx_ldUPphFczleXhY=/0x0/filters:format(jpeg)/pic158559.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/test_resolve.py b/tests/test_resolve.py index 6b43408..6ad27ec 100644 --- a/tests/test_resolve.py +++ b/tests/test_resolve.py @@ -58,18 +58,18 @@ def rows_by_title(client) -> dict[str, object]: def test_catan_auto_matches_base_game(rows_by_title): row = rows_by_title["Catan"] - assert (row.match_status, row.bgg_id, row.bgg_name) == ("auto", 13, "CATAN") + assert (row.match_status, row.bgg_id, row.bgg_name) == ("auto", 13, "Catan") assert row.version_status == "version_unknown" # no cues -> never guess def test_wingspan_auto_with_version_from_cues(rows_by_title): row = rows_by_title["Wingspan"] assert (row.match_status, row.bgg_id) == ("auto", 266192) - # cues: Stonemaier + 2019 + English -> the first edition, not the - # 2020 printing (score 5 vs 3) and not the German edition - assert row.version_status == "version_auto" - assert row.version_id == 465063 - assert row.version_name == "English first edition" + # Stonemaier + 2019 + English narrows 46 real versions to a few + # English printings — several plausible, so review decides; the 2019 + # first printing must be on the ballot + assert row.version_status == "version_ambiguous" + assert 433233 in {v["version_id"] for v in row.version_candidates} def test_expansion_matches_expansion_not_base(rows_by_title): @@ -87,7 +87,7 @@ def test_wingspan_europe_spine_never_matches_base(rows_by_title): def test_accented_title_resolves(rows_by_title): row = rows_by_title["Café International"] - assert (row.match_status, row.bgg_id) == ("auto", 373) + assert (row.match_status, row.bgg_id) == ("auto", 214) def test_same_name_editions_stay_ambiguous(rows_by_title): @@ -110,17 +110,19 @@ def test_run_resolve_writes_csv_and_is_idempotent(client, tmp_path): cfg = Config(data_dir=data_dir) first = run_resolve(cfg, client=client) - assert len(first) == 7 + assert len(first) == 13 with cfg.matches_path.open(newline="") as f: rows = list(csv.DictReader(f)) - assert len(rows) == 7 + assert len(rows) == 13 by_title = {r["title_raw"]: r for r in rows} assert by_title["Catan"]["match_status"] == "auto" assert by_title["Citadels"]["match_status"] == "ambiguous" candidates = json.loads(by_title["Citadels"]["candidates_json"]) assert len(candidates) == 2 - assert by_title["Wingspan"]["version_id"] == "465063" + # ambiguous edition: no id recorded, the candidates carry the ballot + assert by_title["Wingspan"]["version_status"] == "version_ambiguous" + assert "433233" in by_title["Wingspan"]["version_candidates_json"] # second run: everything already in matches.csv is skipped, file unchanged before = cfg.matches_path.read_text() @@ -239,9 +241,13 @@ def test_civilization_resolves_via_truncation(client): ) row = resolve_entry(client, entry) assert (row.match_status, row.bgg_id) == ("auto", 71) - # publisher cue picks the Avalon Hill version, not Hartland/Gibsons - assert row.version_status == "version_auto" - assert row.version_id == 71001 + # the publisher cue keeps Avalon Hill printings on the ballot; the + # real version list is too crowded for a single confident pick + assert row.version_status == "version_ambiguous" + assert any( + any("Avalon Hill" in p for p in (v.get("publishers") or [])) + for v in row.version_candidates + ) def test_advanced_civilization_resolves_as_expansion(client): @@ -286,7 +292,7 @@ def test_starforce_two_word_head_matches_full_title(client): ) row = resolve_entry(client, entry) assert (row.match_status, row.bgg_id) == ("auto", 2524) - assert row.version_status == "version_auto" + assert row.version_status == "version_ambiguous" def test_wrong_year_hint_never_drives_a_version(client): @@ -307,8 +313,11 @@ def test_run_resolve_saves_progress_when_token_missing(tmp_path): crashing the run and losing everything.""" partial_cache = tmp_path / "cache" partial_cache.mkdir() - for f in FIXTURES.glob("search_query=Catan-*"): - shutil.copy(f, partial_cache / f.name) + for pattern in ("search_query=Catan-*", "thing_id=13-*"): + # the real Catan search has enough hits that the popularity + # tiebreak fetches /thing stats — that request is cached too + for f in FIXTURES.glob(pattern): + shutil.copy(f, partial_cache / f.name) data_dir = tmp_path / "data" data_dir.mkdir() @@ -508,7 +517,7 @@ def test_run_resolve_force_rebuilds_from_scratch(client, tmp_path): write_matches(cfg.matches_path, rows) forced = run_resolve(cfg, force=True, client=client) - assert len(forced) == 7 # every title re-resolved, none skipped + assert len(forced) == 13 # every title re-resolved, none skipped fresh = {r["title_raw"]: r for r in read_matches(cfg.matches_path)} assert fresh["Catan"]["match_status"] == "auto" @@ -693,4 +702,4 @@ def test_rpg_falls_back_to_rpgitem_search(client): row = resolve_entry(client, entry) assert row.match_status == "auto" assert row.type == "rpgitem" - assert row.bgg_id == 400001 + assert row.bgg_id == 311654 diff --git a/tests/test_review.py b/tests/test_review.py index 5e2dfee..e76dcab 100644 --- a/tests/test_review.py +++ b/tests/test_review.py @@ -201,15 +201,17 @@ def test_unmatched_research_from_fixture_cache_with_version(tmp_path): run_review( cfg, console=quiet_console(), - input_fn=scripted("f Wingspan", "1"), + # the real search lists a fan pack first; Wingspan proper is #2 + input_fn=scripted("f Wingspan", "2"), client=fixture_client(), ) (row,) = read_matches(cfg.matches_path) assert row["match_status"] == "approved" assert row["bgg_id"] == "266192" - # cues + fixture versions -> resolved to the 2019 Stonemaier English edition - assert row["version_status"] == "version_auto" - assert row["version_id"] == "465063" + # cues + the real version list -> a handful of English Stonemaier + # printings stay plausible; the edition pass gets the ballot + assert row["version_status"] == "version_ambiguous" + assert "433233" in row["version_candidates_json"] def test_resumable_quit_midway_then_continue(tmp_path): @@ -440,14 +442,36 @@ def test_fill_version_uses_the_approved_rows_own_cues(tmp_path): ], ) (cfg.data_dir / "titles.json").write_text(json.dumps([entry_good, entry_bad])) + two_versions = """ + + + + + + + + + + + + + + + """ + crafted = BGGClient( + cache_dir=tmp_path / "crafted_cache", + transport=httpx.MockTransport( + lambda req: httpx.Response(200, text=two_versions) + ), + ) session = ReviewSession( - cfg, console=quiet_console(), input_fn=scripted(), client=fixture_client() + cfg, console=quiet_console(), input_fn=scripted(), client=crafted ) row = session.rows[0] session.decide_pick(row, {"bgg_id": 266192, "name": "Wingspan", "year": 2019}) # the row's own photo (good.jpg) must select entry_good's cues assert row["version_status"] == "version_auto" - assert row["version_id"] == "465063" + assert row["version_id"] == "111" def test_dismiss_failure_keeps_ticket_visible(tmp_path, monkeypatch): @@ -534,3 +558,38 @@ def test_split_copies_survive_resolve_rerun(tmp_path): saved = read_matches(cfg.matches_path) assert len(saved) == 3 # not re-merged, not re-resolved assert [r["source_photos"] for r in saved] == ["a.jpg", "b.jpg", "c.jpg"] + + +def test_open_version_ballot_puts_every_edition_up_for_review(tmp_path): + # a cue-less row is version_unknown by design — but the human knows + # which printing the box is; the ballot fetches the FULL version list + cfg = _setup( + tmp_path, + [ + _row( + title_raw="Wingspan", + match_status="auto", + bgg_id="266192", + bgg_name="Wingspan", + version_status="version_unknown", + ) + ], + ) + session = ReviewSession( + cfg, console=quiet_console(), input_fn=scripted(), client=fixture_client() + ) + row = session.rows[0] + count = session.open_version_ballot(row) + assert count == 46 # the real recorded version list, complete + assert row["version_status"] == "version_ambiguous" + candidates = json.loads(row["version_candidates_json"]) + assert {c["version_id"] for c in candidates} >= {433233} + saved = read_matches(cfg.matches_path)[0] + assert saved["version_status"] == "version_ambiguous" # persisted + + unmatched = _setup(tmp_path / "second", [_row(title_raw="Mystery")]) + session2 = ReviewSession( + unmatched, console=quiet_console(), input_fn=scripted(), client=fixture_client() + ) + with pytest.raises(ValueError, match="no BGG match"): + session2.open_version_ballot(session2.rows[0]) diff --git a/tests/test_webreview.py b/tests/test_webreview.py index e691778..7abca74 100644 --- a/tests/test_webreview.py +++ b/tests/test_webreview.py @@ -1089,3 +1089,42 @@ def test_generic_camera_names_never_overwrite(tmp_path): assert res3.json()["saved"] == ["IMG_9999.jpeg"] assert (cfg.photos_dir / "IMG_9999.jpeg").read_bytes() == b"\xff\xd8reshoot" assert not (cfg.extract_raw_dir / "IMG_9999.jpeg.json").exists() + + +def test_open_versions_endpoint_routes_row_into_review(tmp_path): + from pathlib import Path as _P + + cfg = make_cfg(tmp_path) + rows = read_matches(cfg.matches_path) + rows.append( + _row( + title_raw="Wingspan", + match_status="auto", + bgg_id="266192", + bgg_name="Wingspan", + version_status="version_unknown", + ) + ) + write_matches(cfg.matches_path, rows) + fixtures = BGGClient(cache_dir=_P("tests/fixtures/bgg_cache")) + web = TestClient(create_app(cfg, client=fixtures)) + res = web.post( + "/api/open-versions", + json={"title_raw": "Wingspan", "source_photos": "shelf.jpg"}, + ) + assert res.status_code == 200 + versions = res.json()["versions"] + assert any(v["title_raw"] == "Wingspan" for v in versions) # in the pass + # a BGG outage surfaces as a gateway error, not a fake success + rows = read_matches(cfg.matches_path) + for r in rows: + if r["title_raw"] == "Dungeon!": + r["version_status"] = "version_unknown" + unauthorized = TestClient( + create_app(cfg, client=unauthorized_client(tmp_path / "x")) + ) + res = unauthorized.post( + "/api/open-versions", + json={"title_raw": "Dungeon!", "source_photos": "shelf.jpg"}, + ) + assert res.status_code == 502