- Fork elmeg-demo codebase for multi-band support - Add data importer infrastructure with base class - Create band-specific importers: - phish.py: Phish.net API v5 - grateful_dead.py: Grateful Stats API - setlistfm.py: Dead & Company, Billy Strings (Setlist.fm) - Add spec-kit configuration for Gemini - Update README with supported bands and architecture
89 lines
3.7 KiB
Python
89 lines
3.7 KiB
Python
from sqlmodel import Session, create_engine, select
|
|
import os
|
|
from models import Show, Song, Venue, Performance, Tour
|
|
from slugify import generate_slug, generate_show_slug, generate_performance_slug
|
|
|
|
# Use environment variable or default to local sqlite for testing
|
|
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./database.db")
|
|
engine = create_engine(DATABASE_URL)
|
|
|
|
def fix_numeric_slugs():
|
|
with Session(engine) as session:
|
|
# 1. Songs
|
|
songs = session.exec(select(Song)).all()
|
|
for song in songs:
|
|
if song.slug and song.slug.isdigit():
|
|
old_slug = song.slug
|
|
new_slug = generate_slug(song.title)
|
|
# Check for collisions
|
|
base_slug = new_slug
|
|
counter = 1
|
|
while session.exec(select(Song).where(Song.slug == new_slug).where(Song.id != song.id)).first():
|
|
new_slug = f"{base_slug}-{counter}"
|
|
counter += 1
|
|
|
|
print(f"Updating Song slug: {old_slug} -> {new_slug}")
|
|
song.slug = new_slug
|
|
session.add(song)
|
|
|
|
# 2. Venues
|
|
venues = session.exec(select(Venue)).all()
|
|
for venue in venues:
|
|
if venue.slug and venue.slug.isdigit():
|
|
old_slug = venue.slug
|
|
new_slug = generate_slug(venue.name)
|
|
# Check for collisions
|
|
base_slug = new_slug
|
|
counter = 1
|
|
while session.exec(select(Venue).where(Venue.slug == new_slug).where(Venue.id != venue.id)).first():
|
|
new_slug = f"{base_slug}-{counter}"
|
|
counter += 1
|
|
|
|
print(f"Updating Venue slug: {old_slug} -> {new_slug}")
|
|
venue.slug = new_slug
|
|
session.add(venue)
|
|
|
|
# 3. Shows
|
|
shows = session.exec(select(Show)).all()
|
|
for show in shows:
|
|
if show.slug and show.slug.isdigit():
|
|
old_slug = show.slug
|
|
venue_name = show.venue.name if (show.venue) else "unknown"
|
|
new_slug = generate_show_slug(show.date.strftime("%Y-%m-%d"), venue_name)
|
|
|
|
# Check for collisions
|
|
base_slug = new_slug
|
|
counter = 1
|
|
while session.exec(select(Show).where(Show.slug == new_slug).where(Show.id != show.id)).first():
|
|
new_slug = f"{base_slug}-{counter}"
|
|
counter += 1
|
|
|
|
print(f"Updating Show slug: {old_slug} -> {new_slug}")
|
|
show.slug = new_slug
|
|
session.add(show)
|
|
|
|
# 4. Performances (checking just in case)
|
|
performances = session.exec(select(Performance)).all()
|
|
for perf in performances:
|
|
if perf.slug and perf.slug.isdigit():
|
|
old_slug = perf.slug
|
|
song_title = perf.song.title if perf.song else "unknown"
|
|
show_date = perf.show.date.strftime("%Y-%m-%d") if perf.show else "unknown"
|
|
new_slug = generate_performance_slug(song_title, show_date)
|
|
|
|
# Check for collisions
|
|
base_slug = new_slug
|
|
counter = 1
|
|
while session.exec(select(Performance).where(Performance.slug == new_slug).where(Performance.id != perf.id)).first():
|
|
new_slug = f"{base_slug}-{counter}"
|
|
counter += 1
|
|
|
|
print(f"Updating Performance slug: {old_slug} -> {new_slug}")
|
|
perf.slug = new_slug
|
|
session.add(perf)
|
|
|
|
session.commit()
|
|
print("Slug fixation complete.")
|
|
|
|
if __name__ == "__main__":
|
|
fix_numeric_slugs()
|