103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
"""
|
|
Direct Date-Based Setlist Importer
|
|
Matches setlists to shows by date
|
|
"""
|
|
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 main():
|
|
print("DATE-BASED SETLIST IMPORTER")
|
|
print("=" * 40)
|
|
|
|
with Session(engine) as session:
|
|
# Build show map by date
|
|
shows = session.exec(select(Show)).all()
|
|
show_by_date = {}
|
|
for s in shows:
|
|
date_str = s.date.strftime('%Y-%m-%d')
|
|
show_by_date[date_str] = s.id
|
|
print(f"Mapped {len(show_by_date)} shows by date")
|
|
|
|
# Build song map by title (lowercase)
|
|
songs = session.exec(select(Song)).all()
|
|
song_map = {s.title.lower().strip(): s.id for s in songs}
|
|
print(f"Mapped {len(song_map)} songs")
|
|
|
|
# Get existing performances for dedup
|
|
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")
|
|
|
|
# Fetch setlists page by page
|
|
print("\\nImporting setlists...")
|
|
page = 1
|
|
total_added = 0
|
|
|
|
while page <= 200: # Safety limit
|
|
print(f" Page {page}...", end="", flush=True)
|
|
|
|
url = f"{BASE_URL}/setlists.json"
|
|
try:
|
|
resp = requests.get(url, params={"page": page}, timeout=60)
|
|
data = resp.json().get('data', [])
|
|
except Exception as e:
|
|
print(f" Error: {e}")
|
|
break
|
|
|
|
if not data:
|
|
print(" Done (no data)")
|
|
break
|
|
|
|
added_this_page = 0
|
|
for item in data:
|
|
# Get showdate and match to our shows
|
|
showdate = item.get('showdate')
|
|
if not showdate:
|
|
continue
|
|
|
|
our_show_id = show_by_date.get(showdate)
|
|
if not our_show_id:
|
|
continue
|
|
|
|
# Match song
|
|
song_name = (item.get('songname') or '').lower().strip()
|
|
song_id = song_map.get(song_name)
|
|
if not song_id:
|
|
continue
|
|
|
|
position = item.get('position', 0)
|
|
key = (our_show_id, song_id, position)
|
|
|
|
if key in existing:
|
|
continue
|
|
|
|
perf = Performance(
|
|
show_id=our_show_id,
|
|
song_id=song_id,
|
|
position=position,
|
|
set_name=item.get('setnumber'),
|
|
segue=(item.get('transition', ', ') != ', '),
|
|
notes=item.get('footnote')
|
|
)
|
|
session.add(perf)
|
|
existing.add(key)
|
|
added_this_page += 1
|
|
total_added += 1
|
|
|
|
session.commit()
|
|
print(f" +{added_this_page} ({total_added} total)")
|
|
page += 1
|
|
|
|
print(f"\\n✓ Added {total_added} performances")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|