chore: add script to fix set names in db
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run
This commit is contained in:
parent
ff411321c6
commit
a2f0965ff5
1 changed files with 105 additions and 0 deletions
105
backend/fix_set_names.py
Normal file
105
backend/fix_set_names.py
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
import requests
|
||||
from sqlmodel import Session, select
|
||||
from database import engine
|
||||
from models import Performance, Show, Song
|
||||
from import_elgoose import fetch_json
|
||||
|
||||
BASE_URL = "https://elgoose.net/api/v2"
|
||||
|
||||
def fix_set_names():
|
||||
print("🔧 Fixing set names in database...")
|
||||
|
||||
with Session(engine) as session:
|
||||
# Load maps (we need show_id and song_id mapping if we rely on API IDs...
|
||||
# but API setlists endpoint returns show_id and song_id (El Goose IDs))
|
||||
# We need to match existing performances by show/song/position.
|
||||
|
||||
# To avoid re-fetching ALL simple tables, let's just map on the fly or load needed.
|
||||
# Actually, simpler:
|
||||
# 1. Fetch setlists page.
|
||||
# 2. For each item, find corresponding Performance in DB using elgoose IDs?
|
||||
# Wait, Performance table doesn't store El Goose IDs directly (no external_id column).
|
||||
# It links to Show and Song. Show and Song *might* not strictly store external ID either (only slug/etc).
|
||||
# But `import_elgoose.py` maps them.
|
||||
|
||||
# We need to map El Goose Show ID -> local Show ID
|
||||
# We need to map El Goose Song ID -> local Song ID
|
||||
|
||||
# This is tricky without storing external IDs.
|
||||
# However, we can fetch all shows and map via date? No, Shows might map via...
|
||||
# Wait, how does `import_elgoose.py` map?
|
||||
# distinct show_id map.
|
||||
|
||||
print("Loading Show Map (by date + venue? No, we need external IDs)...")
|
||||
# Since we didn't save external IDs on Show/Song tables, we have to rebuild the map
|
||||
# the same way import_elgoose does (fetching shows to get their IDs and matching to DB).
|
||||
# This is heavy.
|
||||
|
||||
# ALTERNATIVE:
|
||||
# Just map by (Show Date, Song Title, Position)?
|
||||
# Show Date is in Show table. Song Title in Song table. Performance has position.
|
||||
# API setlist item has: showdate, songname, position, setnumber.
|
||||
# This is sufficient!
|
||||
|
||||
page = 1
|
||||
updated_count = 0
|
||||
|
||||
while True:
|
||||
print(f" Fetching page {page}...", end="", flush=True)
|
||||
data = fetch_json("setlists", {"page": page})
|
||||
if not data:
|
||||
print(" Done.")
|
||||
break
|
||||
|
||||
print(f" Loop {len(data)} items...", end="", flush=True)
|
||||
|
||||
for item in data:
|
||||
show_date_str = item.get('showdate')
|
||||
song_name = item.get('songname')
|
||||
position = item.get('position')
|
||||
setnumber = item.get('setnumber', '1')
|
||||
|
||||
if not show_date_str or not song_name:
|
||||
continue
|
||||
|
||||
# Find DB records
|
||||
# Join Performance -> Show, Song
|
||||
db_perf = session.exec(
|
||||
select(Performance)
|
||||
.join(Show)
|
||||
.join(Song)
|
||||
.where(Show.date == show_date_str)
|
||||
.where(Song.title == song_name)
|
||||
.where(Performance.position == position)
|
||||
).first()
|
||||
|
||||
if db_perf:
|
||||
# Logic to determine set name
|
||||
set_val = str(setnumber) if setnumber is not None else '1'
|
||||
|
||||
new_set_name = "Set 1"
|
||||
if set_val.isdigit():
|
||||
new_set_name = f"Set {set_val}"
|
||||
elif set_val.lower() == 'e':
|
||||
new_set_name = "Encore"
|
||||
elif set_val.lower() == 'e2':
|
||||
new_set_name = "Encore 2"
|
||||
elif set_val.lower() == 's':
|
||||
new_set_name = "Soundcheck"
|
||||
else:
|
||||
new_set_name = f"Set {set_val}"
|
||||
|
||||
if db_perf.set_name != new_set_name:
|
||||
db_perf.set_name = new_set_name
|
||||
session.add(db_perf)
|
||||
updated_count += 1
|
||||
|
||||
session.commit()
|
||||
print(f" Committed (Total updated: {updated_count})")
|
||||
page += 1
|
||||
|
||||
if page > 200: # Safety
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
fix_set_names()
|
||||
Loading…
Add table
Reference in a new issue