feat: Add universal setlist.fm importer with MBID map
Some checks failed
Deploy Fediversion / deploy (push) Failing after 1s

This commit is contained in:
fullsizemalt 2025-12-28 17:30:34 -08:00
parent cdaeec1280
commit 73df24f28f

122
backend/run_import.py Normal file
View file

@ -0,0 +1,122 @@
"""
Universal Setlist.fm importer for any band
Usage: python run_import.py <band_slug>
"""
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 <band-slug> # 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}")