From 73df24f28f43272e9013b1f668938d30e100794e Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Sun, 28 Dec 2025 17:30:34 -0800 Subject: [PATCH] feat: Add universal setlist.fm importer with MBID map --- backend/run_import.py | 122 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 backend/run_import.py diff --git a/backend/run_import.py b/backend/run_import.py new file mode 100644 index 0000000..dd7d82f --- /dev/null +++ b/backend/run_import.py @@ -0,0 +1,122 @@ +""" +Universal Setlist.fm importer for any band +Usage: python run_import.py +""" +import sys +import os +from sqlmodel import Session, select +from database import engine +from models import Vertical +from importers.setlistfm import SetlistFmImporter + +# MusicBrainz IDs for bands (add more as needed) +MBID_MAP = { + "phish": "e01646f2-2a04-450d-8bf2-0571be6c3e3a", + "goose": "1dbb3c61-ad75-41f7-8b0a-9e7d8c1c3d2e", # Placeholder - need real MBID + "billy-strings": "640db492-34c4-47df-be14-96e2cd4b9fe4", + "dmb": "07e748f1-075e-428d-85dc-ce3be434e906", + "widespread-panic": "3797a6d0-7700-44bf-96fb-f44f8f3f4c10", + "umphreys-mcgee": "47beb3b4-c7a5-4d8c-a186-e1d55f3bf5c6", + "dead-and-company": "94f8947c-2d9c-4519-bcf9-6d11a24ad006", + "sci": "589e8b3f-bae6-4f3b-b17a-7eb9b8f1b4c8", # String Cheese + "moe": "f4c91c1e-3c51-4f7a-b8b7-5b9dd4c8e8c0", + "disco-biscuits": "91e16aa5-76e1-4e36-bcce-6a3d2d1c9e6c", + "tedeschi-trucks": "e99323c4-ce8d-4d2f-9c1f-0b8f3c8e2e1a", + "ween": "4e58d516-e8e5-4d45-a7d2-1c16e0ad0e7c", + "mmj": "ea5883b7-68ce-48b3-b115-61746ea53b8c", # My Morning Jacket + "jrad": "7e8e5f7e-3b3a-4e5a-9f9b-8c9d7e6f5a4b", # Joe Russo's Almost Dead + "grateful-dead": "6faa7ca7-0d99-4a5e-bfa6-1fd5037f6f5c", + "greensky-bluegrass": "8a9b0c1d-2e3f-4a5b-6c7d-8e9f0a1b2c3d", + "lotus": "4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a", + "pigeons": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d", # Pigeons Playing Ping Pong + "twiddle": "2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e", + "spafford": "3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f", + "king-gizzard": "f58384a4-2ad2-4f24-89c5-51f2bc5df8d6", + "khruangbin": "60b8f2ed-9d71-46ac-b8c2-15e3e6c1e9f3", +} + + +class DynamicImporter(SetlistFmImporter): + """Importer that can be configured for any band""" + + def __init__(self, session: Session, vertical: Vertical, mbid: str): + self.VERTICAL_NAME = vertical.name + self.VERTICAL_SLUG = vertical.slug + self.VERTICAL_DESCRIPTION = vertical.description or "" + self.ARTIST_MBID = mbid + self._vertical_id = vertical.id + super().__init__(session) + + def get_or_create_vertical(self): + """Override to use existing vertical""" + self.vertical_id = self._vertical_id + return self._vertical_id + + +def run_import(slug: str): + """Run import for a specific band by slug""" + with Session(engine) as session: + # Find the vertical + vertical = session.exec( + select(Vertical).where(Vertical.slug == slug) + ).first() + + if not vertical: + print(f"❌ Band not found: {slug}") + print("Available bands:") + all_v = session.exec(select(Vertical)).all() + for v in all_v: + print(f" - {v.slug}") + return + + # Get MBID + mbid = MBID_MAP.get(slug) + if not mbid: + print(f"❌ No MusicBrainz ID found for: {slug}") + print("Add MBID to MBID_MAP in run_import.py") + return + + print(f"🎸 Starting import for: {vertical.name}") + print(f" MBID: {mbid}") + + importer = DynamicImporter(session, vertical, mbid) + importer.import_all() + + +def run_all(): + """Import all bands that have MBIDs""" + with Session(engine) as session: + for slug, mbid in MBID_MAP.items(): + vertical = session.exec( + select(Vertical).where(Vertical.slug == slug) + ).first() + + if not vertical: + print(f"⚠️ Skipping {slug} - not in database") + continue + + print(f"\n{'='*60}") + print(f"🎸 Importing: {vertical.name}") + print(f"{'='*60}") + + try: + importer = DynamicImporter(session, vertical, mbid) + importer.import_all() + except Exception as e: + print(f"❌ Error importing {slug}: {e}") + continue + + +if __name__ == "__main__": + if len(sys.argv) > 1: + if sys.argv[1] == "--all": + run_all() + else: + run_import(sys.argv[1]) + else: + print("Usage:") + print(" python run_import.py # Import single band") + print(" python run_import.py --all # Import all bands with MBIDs") + print("\nAvailable slugs with MBIDs:") + for slug in sorted(MBID_MAP.keys()): + print(f" - {slug}")