feat: Add multi-band musician seed script with 31 musicians and 52 memberships
Some checks failed
Deploy Fediversion / deploy (push) Failing after 1s
Some checks failed
Deploy Fediversion / deploy (push) Failing after 1s
This commit is contained in:
parent
af6a4ae5d3
commit
2c7ff6207a
1 changed files with 417 additions and 0 deletions
417
backend/scripts/seed_musicians.py
Normal file
417
backend/scripts/seed_musicians.py
Normal file
|
|
@ -0,0 +1,417 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Seed script for multi-band musicians.
|
||||
Creates Musician records and their BandMembership relationships.
|
||||
|
||||
Key musicians who span multiple bands:
|
||||
- Dead Family: Bob Weir, Phil Lesh, Mickey Hart, Bill Kreutzmann, Jeff Chimenti, Oteil Burbridge, John Mayer
|
||||
- JRAD: Joe Russo, Scott Metzger, Marco Benevento, Dave Dreiwitz, Tom Hamilton
|
||||
- Billy Strings: Billy Strings himself, plus touring members
|
||||
- Goose: Rick Mitarotonda, Peter Anspach, Trevor Weekz, Ben Atkind, Jeff Arevalo
|
||||
- SCI: Bill Nershi, Kyle Hollingsworth, Michael Travis, Keith Moseley, Michael Kang, Jason Hann
|
||||
- Disco Biscuits: Jon Gutwillig, Marc Brownstein, Aron Magner, Allen Aucoin
|
||||
"""
|
||||
|
||||
import sys
|
||||
sys.path.insert(0, '.')
|
||||
|
||||
from sqlmodel import Session, select
|
||||
from database import engine
|
||||
from models import Musician, Artist, Vertical, BandMembership
|
||||
from slugify import generate_slug as slugify
|
||||
from datetime import datetime
|
||||
|
||||
def create_musician(session: Session, name: str, primary_instrument: str = None,
|
||||
bio: str = None, image_url: str = None, wikipedia_url: str = None,
|
||||
instagram_url: str = None, birth_year: int = None,
|
||||
origin_city: str = None, origin_state: str = None) -> Musician:
|
||||
"""Create or get a musician by name"""
|
||||
slug = slugify(name)
|
||||
existing = session.exec(select(Musician).where(Musician.slug == slug)).first()
|
||||
if existing:
|
||||
print(f" Musician already exists: {name}")
|
||||
return existing
|
||||
|
||||
musician = Musician(
|
||||
name=name,
|
||||
slug=slug,
|
||||
primary_instrument=primary_instrument,
|
||||
bio=bio,
|
||||
image_url=image_url,
|
||||
wikipedia_url=wikipedia_url,
|
||||
instagram_url=instagram_url,
|
||||
birth_year=birth_year,
|
||||
origin_city=origin_city,
|
||||
origin_state=origin_state,
|
||||
origin_country="USA"
|
||||
)
|
||||
session.add(musician)
|
||||
session.commit()
|
||||
session.refresh(musician)
|
||||
print(f" Created musician: {name}")
|
||||
return musician
|
||||
|
||||
|
||||
def get_or_create_artist(session: Session, name: str) -> Artist:
|
||||
"""Get or create an artist (band) by name"""
|
||||
slug = slugify(name)
|
||||
existing = session.exec(select(Artist).where(Artist.slug == slug)).first()
|
||||
if existing:
|
||||
return existing
|
||||
|
||||
artist = Artist(name=name, slug=slug)
|
||||
session.add(artist)
|
||||
session.commit()
|
||||
session.refresh(artist)
|
||||
print(f" Created artist: {name}")
|
||||
return artist
|
||||
|
||||
|
||||
def create_membership(session: Session, musician: Musician, artist: Artist,
|
||||
role: str, start_year: int = None, end_year: int = None,
|
||||
notes: str = None) -> BandMembership:
|
||||
"""Create a band membership record"""
|
||||
# Check if already exists
|
||||
existing = session.exec(
|
||||
select(BandMembership)
|
||||
.where(BandMembership.musician_id == musician.id)
|
||||
.where(BandMembership.artist_id == artist.id)
|
||||
).first()
|
||||
if existing:
|
||||
return existing
|
||||
|
||||
membership = BandMembership(
|
||||
musician_id=musician.id,
|
||||
artist_id=artist.id,
|
||||
role=role,
|
||||
start_date=datetime(start_year, 1, 1) if start_year else None,
|
||||
end_date=datetime(end_year, 12, 31) if end_year else None,
|
||||
notes=notes
|
||||
)
|
||||
session.add(membership)
|
||||
session.commit()
|
||||
print(f" -> {musician.name} in {artist.name} as {role}")
|
||||
return membership
|
||||
|
||||
|
||||
def seed_dead_family(session: Session):
|
||||
"""Seed Grateful Dead family musicians"""
|
||||
print("\n🎸 Seeding Dead Family musicians...")
|
||||
|
||||
# Create band artists
|
||||
grateful_dead = get_or_create_artist(session, "Grateful Dead")
|
||||
dead_and_co = get_or_create_artist(session, "Dead & Company")
|
||||
ratdog = get_or_create_artist(session, "Ratdog")
|
||||
phil_and_friends = get_or_create_artist(session, "Phil Lesh & Friends")
|
||||
furthur = get_or_create_artist(session, "Furthur")
|
||||
the_dead = get_or_create_artist(session, "The Dead")
|
||||
bob_weir_wolf_bros = get_or_create_artist(session, "Bob Weir & Wolf Bros")
|
||||
|
||||
# Bob Weir
|
||||
bob = create_musician(
|
||||
session, "Bob Weir", "Guitar",
|
||||
bio="Founding member of the Grateful Dead. Rhythm guitarist and vocalist.",
|
||||
birth_year=1947, origin_city="San Francisco", origin_state="CA",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Bob_Weir"
|
||||
)
|
||||
create_membership(session, bob, grateful_dead, "Rhythm Guitar, Vocals", 1965, 1995)
|
||||
create_membership(session, bob, ratdog, "Guitar, Vocals", 1995, 2014)
|
||||
create_membership(session, bob, the_dead, "Guitar, Vocals", 2003, 2009)
|
||||
create_membership(session, bob, furthur, "Guitar, Vocals", 2009, 2014)
|
||||
create_membership(session, bob, dead_and_co, "Guitar, Vocals", 2015, 2023)
|
||||
create_membership(session, bob, bob_weir_wolf_bros, "Guitar, Vocals", 2018)
|
||||
|
||||
# Phil Lesh
|
||||
phil = create_musician(
|
||||
session, "Phil Lesh", "Bass",
|
||||
bio="Founding member of the Grateful Dead. Bassist.",
|
||||
birth_year=1940, origin_city="Berkeley", origin_state="CA",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Phil_Lesh"
|
||||
)
|
||||
create_membership(session, phil, grateful_dead, "Bass", 1965, 1995)
|
||||
create_membership(session, phil, phil_and_friends, "Bass", 1998)
|
||||
create_membership(session, phil, the_dead, "Bass", 2003, 2009)
|
||||
create_membership(session, phil, furthur, "Bass", 2009, 2014)
|
||||
|
||||
# Mickey Hart
|
||||
mickey = create_musician(
|
||||
session, "Mickey Hart", "Drums",
|
||||
bio="Grateful Dead drummer and percussionist.",
|
||||
birth_year=1943, origin_city="Brooklyn", origin_state="NY",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Mickey_Hart"
|
||||
)
|
||||
create_membership(session, mickey, grateful_dead, "Drums, Percussion", 1967, 1995)
|
||||
create_membership(session, mickey, the_dead, "Drums", 2003, 2009)
|
||||
create_membership(session, mickey, furthur, "Drums", 2009, 2014)
|
||||
create_membership(session, mickey, dead_and_co, "Drums", 2015, 2023)
|
||||
|
||||
# Bill Kreutzmann
|
||||
bill_k = create_musician(
|
||||
session, "Bill Kreutzmann", "Drums",
|
||||
bio="Founding Grateful Dead drummer.",
|
||||
birth_year=1946, origin_city="Palo Alto", origin_state="CA",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Bill_Kreutzmann"
|
||||
)
|
||||
create_membership(session, bill_k, grateful_dead, "Drums", 1965, 1995)
|
||||
create_membership(session, bill_k, the_dead, "Drums", 2003, 2009)
|
||||
create_membership(session, bill_k, furthur, "Drums", 2009, 2014)
|
||||
create_membership(session, bill_k, dead_and_co, "Drums", 2015, 2023)
|
||||
|
||||
# Jeff Chimenti - key multi-band musician
|
||||
jeff_c = create_musician(
|
||||
session, "Jeff Chimenti", "Keys",
|
||||
bio="Keyboardist with multiple Dead projects. Known for versatile playing style.",
|
||||
birth_year=1968, origin_city="San Jose", origin_state="CA",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Jeff_Chimenti"
|
||||
)
|
||||
create_membership(session, jeff_c, ratdog, "Keyboards", 1997, 2014)
|
||||
create_membership(session, jeff_c, the_dead, "Keyboards", 2003, 2009)
|
||||
create_membership(session, jeff_c, furthur, "Keyboards", 2009, 2014)
|
||||
create_membership(session, jeff_c, dead_and_co, "Keyboards", 2015, 2023)
|
||||
|
||||
# Oteil Burbridge - key multi-band musician
|
||||
oteil = create_musician(
|
||||
session, "Oteil Burbridge", "Bass",
|
||||
bio="Bassist for Dead & Company and Allman Brothers Band.",
|
||||
birth_year=1964, origin_city="Washington", origin_state="DC",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Oteil_Burbridge"
|
||||
)
|
||||
allman_brothers = get_or_create_artist(session, "Allman Brothers Band")
|
||||
create_membership(session, oteil, allman_brothers, "Bass", 1997, 2014)
|
||||
create_membership(session, oteil, dead_and_co, "Bass", 2015, 2023)
|
||||
|
||||
# John Mayer
|
||||
john_m = create_musician(
|
||||
session, "John Mayer", "Guitar",
|
||||
bio="Solo artist and Dead & Company lead guitarist.",
|
||||
birth_year=1977, origin_city="Bridgeport", origin_state="CT",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/John_Mayer",
|
||||
instagram_url="https://instagram.com/johnmayer"
|
||||
)
|
||||
create_membership(session, john_m, dead_and_co, "Lead Guitar, Vocals", 2015, 2023)
|
||||
|
||||
|
||||
def seed_jrad(session: Session):
|
||||
"""Seed Joe Russo's Almost Dead musicians"""
|
||||
print("\n🎸 Seeding JRAD musicians...")
|
||||
|
||||
jrad = get_or_create_artist(session, "Joe Russo's Almost Dead")
|
||||
|
||||
# Joe Russo
|
||||
joe = create_musician(
|
||||
session, "Joe Russo", "Drums",
|
||||
bio="Drummer and bandleader of JRAD. Also plays with Furthur and other projects.",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Joe_Russo_(drummer)"
|
||||
)
|
||||
furthur = get_or_create_artist(session, "Furthur")
|
||||
create_membership(session, joe, jrad, "Drums", 2013)
|
||||
create_membership(session, joe, furthur, "Drums", 2009, 2014)
|
||||
|
||||
# Scott Metzger
|
||||
scott = create_musician(
|
||||
session, "Scott Metzger", "Guitar",
|
||||
bio="Guitarist for JRAD and many other projects.",
|
||||
)
|
||||
create_membership(session, scott, jrad, "Guitar", 2013)
|
||||
|
||||
# Marco Benevento
|
||||
marco = create_musician(
|
||||
session, "Marco Benevento", "Keys",
|
||||
bio="Keyboardist for JRAD and solo artist.",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Marco_Benevento"
|
||||
)
|
||||
create_membership(session, marco, jrad, "Keyboards", 2013)
|
||||
|
||||
# Dave Dreiwitz
|
||||
dave_d = create_musician(
|
||||
session, "Dave Dreiwitz", "Bass",
|
||||
bio="Bassist for JRAD and Ween.",
|
||||
)
|
||||
ween = get_or_create_artist(session, "Ween")
|
||||
create_membership(session, dave_d, jrad, "Bass", 2013)
|
||||
create_membership(session, dave_d, ween, "Bass", 2000)
|
||||
|
||||
# Tom Hamilton
|
||||
tom_h = create_musician(
|
||||
session, "Tom Hamilton", "Guitar",
|
||||
bio="Guitarist for JRAD, Ghost Light, and American Babies.",
|
||||
)
|
||||
ghost_light = get_or_create_artist(session, "Ghost Light")
|
||||
create_membership(session, tom_h, jrad, "Guitar", 2013)
|
||||
create_membership(session, tom_h, ghost_light, "Guitar", 2017)
|
||||
|
||||
|
||||
def seed_goose(session: Session):
|
||||
"""Seed Goose musicians"""
|
||||
print("\n🎸 Seeding Goose musicians...")
|
||||
|
||||
goose = get_or_create_artist(session, "Goose")
|
||||
|
||||
rick = create_musician(
|
||||
session, "Rick Mitarotonda", "Guitar",
|
||||
bio="Frontman and lead guitarist of Goose.",
|
||||
origin_city="Norwalk", origin_state="CT"
|
||||
)
|
||||
create_membership(session, rick, goose, "Lead Guitar, Vocals", 2014)
|
||||
|
||||
peter = create_musician(
|
||||
session, "Peter Anspach", "Keys",
|
||||
bio="Keyboardist and guitarist for Goose.",
|
||||
)
|
||||
create_membership(session, peter, goose, "Keys, Guitar, Vocals", 2016)
|
||||
|
||||
trevor = create_musician(
|
||||
session, "Trevor Weekz", "Bass",
|
||||
bio="Bassist for Goose.",
|
||||
)
|
||||
create_membership(session, trevor, goose, "Bass", 2016)
|
||||
|
||||
ben = create_musician(
|
||||
session, "Ben Atkind", "Drums",
|
||||
bio="Drummer for Goose.",
|
||||
)
|
||||
create_membership(session, ben, goose, "Drums", 2014)
|
||||
|
||||
jeff_a = create_musician(
|
||||
session, "Jeff Arevalo", "Percussion",
|
||||
bio="Percussionist for Goose.",
|
||||
)
|
||||
create_membership(session, jeff_a, goose, "Percussion", 2018)
|
||||
|
||||
|
||||
def seed_sci(session: Session):
|
||||
"""Seed String Cheese Incident musicians"""
|
||||
print("\n🎸 Seeding SCI musicians...")
|
||||
|
||||
sci = get_or_create_artist(session, "The String Cheese Incident")
|
||||
|
||||
bill_n = create_musician(
|
||||
session, "Bill Nershi", "Guitar",
|
||||
bio="Guitarist and founding member of String Cheese Incident.",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Bill_Nershi"
|
||||
)
|
||||
create_membership(session, bill_n, sci, "Guitar, Vocals", 1993)
|
||||
|
||||
kyle = create_musician(
|
||||
session, "Kyle Hollingsworth", "Keys",
|
||||
bio="Keyboardist for String Cheese Incident.",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Kyle_Hollingsworth"
|
||||
)
|
||||
create_membership(session, kyle, sci, "Keyboards", 1993)
|
||||
|
||||
travis = create_musician(
|
||||
session, "Michael Travis", "Drums",
|
||||
bio="Drummer for String Cheese Incident.",
|
||||
)
|
||||
create_membership(session, travis, sci, "Drums", 1993)
|
||||
|
||||
kang = create_musician(
|
||||
session, "Michael Kang", "Mandolin",
|
||||
bio="Mandolin and violin player for String Cheese Incident.",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Michael_Kang"
|
||||
)
|
||||
create_membership(session, kang, sci, "Mandolin, Violin, Guitar", 1993)
|
||||
|
||||
keith = create_musician(
|
||||
session, "Keith Moseley", "Bass",
|
||||
bio="Bassist for String Cheese Incident.",
|
||||
)
|
||||
create_membership(session, keith, sci, "Bass", 1993)
|
||||
|
||||
jason_h = create_musician(
|
||||
session, "Jason Hann", "Percussion",
|
||||
bio="Percussionist for String Cheese Incident.",
|
||||
)
|
||||
create_membership(session, jason_h, sci, "Percussion", 2004)
|
||||
|
||||
|
||||
def seed_biscuits(session: Session):
|
||||
"""Seed Disco Biscuits musicians"""
|
||||
print("\n🎸 Seeding Disco Biscuits musicians...")
|
||||
|
||||
biscuits = get_or_create_artist(session, "The Disco Biscuits")
|
||||
|
||||
barber = create_musician(
|
||||
session, "Jon Gutwillig", "Guitar",
|
||||
bio="Guitarist for Disco Biscuits. Known as 'Barber'.",
|
||||
)
|
||||
create_membership(session, barber, biscuits, "Guitar", 1995)
|
||||
|
||||
brownie = create_musician(
|
||||
session, "Marc Brownstein", "Bass",
|
||||
bio="Bassist for Disco Biscuits. Known as 'Brownie'.",
|
||||
)
|
||||
create_membership(session, brownie, biscuits, "Bass", 1995)
|
||||
|
||||
aron = create_musician(
|
||||
session, "Aron Magner", "Keys",
|
||||
bio="Keyboardist for Disco Biscuits.",
|
||||
)
|
||||
create_membership(session, aron, biscuits, "Keyboards", 1995)
|
||||
|
||||
allen = create_musician(
|
||||
session, "Allen Aucoin", "Drums",
|
||||
bio="Drummer for Disco Biscuits.",
|
||||
)
|
||||
create_membership(session, allen, biscuits, "Drums", 1995)
|
||||
|
||||
|
||||
def seed_billy_strings(session: Session):
|
||||
"""Seed Billy Strings musicians"""
|
||||
print("\n🎸 Seeding Billy Strings band...")
|
||||
|
||||
billy_band = get_or_create_artist(session, "Billy Strings")
|
||||
|
||||
billy = create_musician(
|
||||
session, "Billy Strings", "Guitar",
|
||||
bio="Grammy-winning bluegrass guitarist and singer.",
|
||||
birth_year=1992, origin_city="Lansing", origin_state="MI",
|
||||
wikipedia_url="https://en.wikipedia.org/wiki/Billy_Strings",
|
||||
instagram_url="https://instagram.com/billystrings"
|
||||
)
|
||||
create_membership(session, billy, billy_band, "Guitar, Vocals", 2016)
|
||||
|
||||
jarrod = create_musician(
|
||||
session, "Jarrod Walker", "Mandolin",
|
||||
bio="Mandolinist for Billy Strings.",
|
||||
)
|
||||
create_membership(session, jarrod, billy_band, "Mandolin", 2021)
|
||||
|
||||
royal = create_musician(
|
||||
session, "Royal Masat", "Bass",
|
||||
bio="Bassist for Billy Strings.",
|
||||
)
|
||||
create_membership(session, royal, billy_band, "Bass", 2019)
|
||||
|
||||
alex = create_musician(
|
||||
session, "Alex Hargreaves", "Fiddle",
|
||||
bio="Fiddler for Billy Strings.",
|
||||
)
|
||||
create_membership(session, alex, billy_band, "Fiddle", 2021)
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("Seeding Multi-Band Musicians")
|
||||
print("=" * 60)
|
||||
|
||||
with Session(engine) as session:
|
||||
seed_dead_family(session)
|
||||
seed_jrad(session)
|
||||
seed_goose(session)
|
||||
seed_sci(session)
|
||||
seed_biscuits(session)
|
||||
seed_billy_strings(session)
|
||||
|
||||
# Summary
|
||||
total_musicians = session.exec(select(Musician)).all()
|
||||
total_memberships = session.exec(select(BandMembership)).all()
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"✅ Created {len(total_musicians)} musicians")
|
||||
print(f"✅ Created {len(total_memberships)} band memberships")
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Add table
Reference in a new issue