fediversion/backend/seed_musicians.py
fullsizemalt 159cbc853c
Some checks failed
Deploy Fediversion / deploy (push) Failing after 1s
feat: Enhance musician API with cross-band sit-in tracking
- Add sit_in_summary to GET /musicians/{slug}
- Add stats: total_bands, current_bands, total_sit_ins
- Include song_title, show_date, vertical in guest appearances
- Add seed_musicians.py for initial musician data
2025-12-28 16:30:38 -08:00

116 lines
4.8 KiB
Python

"""
Seed script to create common cross-band musicians.
These are musicians known for sitting in with multiple bands.
"""
from sqlmodel import Session, select
from database import engine
from models import Musician, Artist, BandMembership
import re
def generate_slug(name: str) -> str:
"""Generate URL-safe slug"""
slug = name.lower()
slug = re.sub(r'[^\w\s-]', '', slug)
slug = re.sub(r'[\s_]+', '-', slug)
return slug.strip('-')
# Notable jam scene musicians who appear across bands
CROSS_BAND_MUSICIANS = [
# Grateful Dead / Dead Family
{"name": "Bob Weir", "primary_instrument": "Guitar", "bands": ["grateful-dead", "dead-and-company"]},
{"name": "Mickey Hart", "primary_instrument": "Drums", "bands": ["grateful-dead", "dead-and-company"]},
{"name": "Bill Kreutzmann", "primary_instrument": "Drums", "bands": ["grateful-dead", "dead-and-company"]},
{"name": "John Mayer", "primary_instrument": "Guitar", "bands": ["dead-and-company"]},
{"name": "Oteil Burbridge", "primary_instrument": "Bass", "bands": ["dead-and-company"]},
{"name": "Jeff Chimenti", "primary_instrument": "Keyboards", "bands": ["dead-and-company"]},
# Goose
{"name": "Rick Mitarotonda", "primary_instrument": "Guitar, Vocals", "bands": ["goose"]},
{"name": "Peter Anspach", "primary_instrument": "Keyboards, Guitar", "bands": ["goose"]},
{"name": "Trevor Weekz", "primary_instrument": "Bass", "bands": ["goose"]},
{"name": "Ben Atkind", "primary_instrument": "Drums", "bands": ["goose"]},
{"name": "Jeff Arevalo", "primary_instrument": "Percussion", "bands": ["goose"]},
# Phish
{"name": "Trey Anastasio", "primary_instrument": "Guitar", "bands": ["phish"]},
{"name": "Page McConnell", "primary_instrument": "Keyboards", "bands": ["phish"]},
{"name": "Mike Gordon", "primary_instrument": "Bass", "bands": ["phish"]},
{"name": "Jon Fishman", "primary_instrument": "Drums", "bands": ["phish"]},
# Billy Strings
{"name": "Billy Strings", "primary_instrument": "Guitar, Vocals", "bands": ["billy-strings"]},
{"name": "Billy Failing", "primary_instrument": "Banjo", "bands": ["billy-strings"]},
{"name": "Royal Masat", "primary_instrument": "Bass", "bands": ["billy-strings"]},
{"name": "Jarrod Walker", "primary_instrument": "Mandolin", "bands": ["billy-strings"]},
# Cross-band sit-in regulars
{"name": "Marcus King", "primary_instrument": "Guitar, Vocals", "bands": []},
{"name": "Pigeons Playing Ping Pong", "primary_instrument": "Funk", "bands": []},
{"name": "Karina Rykman", "primary_instrument": "Bass, Vocals", "bands": []},
]
def seed_musicians():
"""Create musicians if they don't exist"""
print("Seeding musicians...\n")
with Session(engine) as session:
created = 0
for m in CROSS_BAND_MUSICIANS:
slug = generate_slug(m["name"])
existing = session.exec(
select(Musician).where(Musician.slug == slug)
).first()
if existing:
print(f" Exists: {m['name']}")
musician = existing
else:
musician = Musician(
name=m["name"],
slug=slug,
primary_instrument=m["primary_instrument"]
)
session.add(musician)
session.commit()
session.refresh(musician)
created += 1
print(f" Created: {m['name']}")
# Create band memberships
for band_slug in m.get("bands", []):
# Find vertical by slug to get artist
from models import Vertical
vertical = session.exec(
select(Vertical).where(Vertical.slug == band_slug)
).first()
if vertical and vertical.primary_artist_id:
# Check if membership exists
existing_membership = session.exec(
select(BandMembership)
.where(BandMembership.musician_id == musician.id)
.where(BandMembership.artist_id == vertical.primary_artist_id)
).first()
if not existing_membership:
membership = BandMembership(
musician_id=musician.id,
artist_id=vertical.primary_artist_id,
role=m["primary_instrument"]
)
session.add(membership)
print(f" -> Added to {band_slug}")
session.commit()
print(f"\nCreated {created} new musicians")
if __name__ == "__main__":
seed_musicians()