128 lines
4.4 KiB
Python
128 lines
4.4 KiB
Python
"""
|
|
Fast Setlist Importer - Skips validation checks for speed
|
|
Run after main import if it times out
|
|
"""
|
|
import requests
|
|
from datetime import datetime
|
|
from sqlmodel import Session, select
|
|
from database import engine
|
|
from models import Show, Song, Performance
|
|
|
|
BASE_URL = "https://elgoose.net/api/v2"
|
|
|
|
def fetch_json(endpoint, params=None):
|
|
url = f"{BASE_URL}/{endpoint}.json"
|
|
try:
|
|
response = requests.get(url, params=params, timeout=30)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
if data.get('error') == 1:
|
|
return None
|
|
return data.get('data', [])
|
|
except Exception as e:
|
|
print(f"Error: {e}")
|
|
return None
|
|
|
|
def main():
|
|
print("FAST SETLIST IMPORTER")
|
|
print("=" * 40)
|
|
|
|
with Session(engine) as session:
|
|
# Build lookup maps
|
|
print("Building show map...")
|
|
shows = session.exec(select(Show)).all()
|
|
# Map API show_id to our show_id
|
|
# We need the API show_id. The 'notes' field might have showtitle but not API id.
|
|
# Problem: We don't store API show_id in our DB!
|
|
# We need to re-fetch shows and match by date+venue_id
|
|
|
|
show_map = {} # api_show_id -> our_show_id
|
|
song_map = {} # api_song_id -> our_song_id
|
|
|
|
# Fetch shows from API to build map
|
|
print("Fetching API shows to build map...")
|
|
page = 1
|
|
while True:
|
|
data = fetch_json("shows", {"artist": 1, "page": page})
|
|
if not data:
|
|
break
|
|
for s in data:
|
|
api_show_id = s['show_id']
|
|
show_date = datetime.strptime(s['showdate'], '%Y-%m-%d')
|
|
# Find matching show in our DB
|
|
our_show = session.exec(
|
|
select(Show).where(Show.date == show_date)
|
|
).first()
|
|
if our_show:
|
|
show_map[api_show_id] = our_show.id
|
|
page += 1
|
|
if page > 50:
|
|
break
|
|
print(f"Mapped {len(show_map)} shows")
|
|
|
|
# Build song map
|
|
print("Building song map...")
|
|
songs_data = fetch_json("songs")
|
|
if songs_data:
|
|
for s in songs_data:
|
|
api_song_id = s['id']
|
|
our_song = session.exec(
|
|
select(Song).where(Song.title == s['name'])
|
|
).first()
|
|
if our_song:
|
|
song_map[api_song_id] = our_song.id
|
|
print(f"Mapped {len(song_map)} songs")
|
|
|
|
# Get existing performances to skip
|
|
print("Loading existing performances...")
|
|
existing = set()
|
|
perfs = session.exec(select(Performance.show_id, Performance.song_id, Performance.position)).all()
|
|
for p in perfs:
|
|
existing.add((p[0], p[1], p[2]))
|
|
print(f"Found {len(existing)} existing performances")
|
|
|
|
# Import setlists page by page
|
|
print("\\nImporting setlists...")
|
|
page = 1
|
|
total_added = 0
|
|
|
|
while True:
|
|
data = fetch_json("setlists", {"page": page})
|
|
if not data:
|
|
print(f"No data on page {page}, done.")
|
|
break
|
|
|
|
added_this_page = 0
|
|
for perf_data in data:
|
|
our_show_id = show_map.get(perf_data.get('show_id'))
|
|
our_song_id = song_map.get(perf_data.get('song_id'))
|
|
position = perf_data.get('position', 0)
|
|
|
|
if not our_show_id or not our_song_id:
|
|
continue
|
|
|
|
key = (our_show_id, our_song_id, position)
|
|
if key in existing:
|
|
continue
|
|
|
|
perf = Performance(
|
|
show_id=our_show_id,
|
|
song_id=our_song_id,
|
|
position=position,
|
|
set_name=perf_data.get('set'),
|
|
segue=bool(perf_data.get('segue', 0)),
|
|
notes=perf_data.get('notes')
|
|
)
|
|
session.add(perf)
|
|
existing.add(key)
|
|
added_this_page += 1
|
|
total_added += 1
|
|
|
|
session.commit()
|
|
print(f"Page {page}: +{added_this_page} ({total_added} total)")
|
|
page += 1
|
|
|
|
print(f"\\n✓ Added {total_added} performances")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|