diff --git a/data/matches.csv b/data/matches.csv index e66ed38..46c27ed 100644 --- a/data/matches.csv +++ b/data/matches.csv @@ -5,7 +5,7 @@ COSMIC ENCOUNTER,40529,Cosmic Encounter,1991,boardgame,approved,,,version_unknow 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,, 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,, +Civilization - Game of the Heroic Age - The Dawn of History 8000 BC to 250 BC,71,Civilization,1980,boardgame,auto,24006,Avalon Hill first edition 1981,version_approved,"[{""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,, diff --git a/data/title_additions.json b/data/title_additions.json new file mode 100644 index 0000000..09d19c4 --- /dev/null +++ b/data/title_additions.json @@ -0,0 +1,12 @@ +[ + { + "title_raw": "Civilization: West Extension Map", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": null, + "language_hint": "", + "art_notes": "", + "source_photos": [] + } +] diff --git a/data/titles.json b/data/titles.json index 34f0266..9ae5064 100644 --- a/data/titles.json +++ b/data/titles.json @@ -1746,5 +1746,16 @@ "shelf-20260803-215703.jpg" ], "title_normalized": "office trivia game" + }, + { + "title_raw": "Civilization: West Extension Map", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": null, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "civilization west extension map" } ] diff --git a/src/bggpipe/templates/pages/review.html b/src/bggpipe/templates/pages/review.html index c9b9380..25b8667 100644 --- a/src/bggpipe/templates/pages/review.html +++ b/src/bggpipe/templates/pages/review.html @@ -141,17 +141,22 @@ function render() { : `
Next: run diff from the pipeline, then check the queue.
`} `; } + // csv order is extraction order — alphabetize so a long session has a + // findable, predictable shape (stable within a payload, so the keyboard + // cursor stays put between polls) + const byTitle = (a, b) => + a.title_raw.localeCompare(b.title_raw, undefined, { sensitivity: "base" }); if (s.pending.length) { html += `