fix: QC-Ratings aus 7 älteren Artikeln entfernt (CHECK 10)
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Search BGG for board game IDs - Batch 3"""
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
BGG_KEY = open("/tmp/.bggkey").read().strip()
|
||||
HEADER = f"Authorization: Bearer {BGG_KEY}"
|
||||
|
||||
games = [
|
||||
("1840 Age Of Lions", "1840", None),
|
||||
("Cosmic Contraband", "Contraband", "Cosmic"),
|
||||
("STREAM: The Game", "STREAM", None),
|
||||
("Rock Hard 1977", "Rock", "Hard"),
|
||||
("VEX - The Vegan Experiment", "VEX", "Vegan"),
|
||||
("Arcanixia", "Arcanixia", None),
|
||||
("Saloon Shootout", "Saloon", "Shootout"),
|
||||
("Islands of Ikaria", "Ikaria", "Islands"),
|
||||
("INSANITÀ S.p.A.", "Insanita", "INSANITÀ"),
|
||||
("VALKYO Trading Card Game", "Valkyo", "VALKYO"),
|
||||
("SeaBound: Open Oceans", "SeaBound", "Oceans"),
|
||||
("Brand Battles TCG", "Brand", "Battles"),
|
||||
("Sylvan's Curse", "Sylvan", "Curse"),
|
||||
("Lithomachy", "Lithomachy", None),
|
||||
]
|
||||
|
||||
def search_bgg(query):
|
||||
url = f"https://boardgamegeek.com/xmlapi2/search?query={query}&type=boardgame"
|
||||
cmd = ["curl", "-s", "-H", HEADER, url]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
|
||||
return result.stdout
|
||||
|
||||
def parse_results(xml_str, game_name):
|
||||
"""Parse XML and find exact match. Return (id, name) or None."""
|
||||
try:
|
||||
root = ET.fromstring(xml_str)
|
||||
items = root.findall("item")
|
||||
for item in items:
|
||||
item_type = item.get("type", "")
|
||||
if item_type != "boardgame":
|
||||
continue
|
||||
item_id = item.get("id", "")
|
||||
name_elem = item.find("name")
|
||||
if name_elem is not None:
|
||||
bgg_name = name_elem.get("value", "")
|
||||
if bgg_name.lower() == game_name.lower():
|
||||
return (item_id, bgg_name)
|
||||
# If no exact match, return first result
|
||||
for item in items:
|
||||
item_type = item.get("type", "")
|
||||
if item_type != "boardgame":
|
||||
continue
|
||||
item_id = item.get("id", "")
|
||||
name_elem = item.find("name")
|
||||
bgg_name = name_elem.get("value", "") if name_elem is not None else ""
|
||||
return (item_id, bgg_name)
|
||||
return None
|
||||
except ET.ParseError as e:
|
||||
print(f" XML parse error: {e}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
for game_name, primary_word, fallback_word in games:
|
||||
print(f"Searching: {game_name} (query: {primary_word})", file=sys.stderr)
|
||||
|
||||
xml_out = search_bgg(primary_word)
|
||||
result = parse_results(xml_out, game_name)
|
||||
|
||||
if result:
|
||||
bgg_id, bgg_name = result
|
||||
url = f"https://boardgamegeek.com/boardgame/{bgg_id}"
|
||||
print(f"{game_name}|{bgg_id}|{url}")
|
||||
elif fallback_word:
|
||||
time.sleep(3)
|
||||
print(f" Primary failed, trying fallback: {fallback_word}", file=sys.stderr)
|
||||
xml_out = search_bgg(fallback_word)
|
||||
result = parse_results(xml_out, game_name)
|
||||
if result:
|
||||
bgg_id, bgg_name = result
|
||||
url = f"https://boardgamegeek.com/boardgame/{bgg_id}"
|
||||
print(f"{game_name}|{bgg_id}|{url}")
|
||||
else:
|
||||
print(f"{game_name}|NOT_FOUND")
|
||||
else:
|
||||
print(f"{game_name}|NOT_FOUND")
|
||||
|
||||
sys.stdout.flush()
|
||||
time.sleep(3)
|
||||
|
||||
print("Done!", file=sys.stderr)
|
||||
Reference in New Issue
Block a user