feat: add sync_artists.py to populate Artists from elgoose API
This commit is contained in:
parent
d276cdbd76
commit
e0414d1548
1 changed files with 104 additions and 0 deletions
104
backend/sync_artists.py
Normal file
104
backend/sync_artists.py
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
"""
|
||||
Sync original_artist data from elgoose.net API to local Songs.
|
||||
Then create Artist records and link Songs.
|
||||
"""
|
||||
import httpx
|
||||
from sqlmodel import Session, select
|
||||
from database import engine
|
||||
from models import Song, Artist
|
||||
from slugify import generate_slug as slugify
|
||||
|
||||
BASE_URL = "https://elgoose.net/api/v2"
|
||||
|
||||
def fetch_all_songs():
|
||||
"""Fetch all songs from elgoose API"""
|
||||
url = f"{BASE_URL}/songs"
|
||||
print(f"Fetching songs from {url}...")
|
||||
response = httpx.get(url, timeout=30)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
return data.get("data", [])
|
||||
|
||||
def sync_original_artists():
|
||||
"""Sync original_artist from API to local Songs"""
|
||||
api_songs = fetch_all_songs()
|
||||
print(f"Fetched {len(api_songs)} songs from API")
|
||||
|
||||
with Session(engine) as session:
|
||||
updated = 0
|
||||
|
||||
for api_song in api_songs:
|
||||
# Skip originals (isoriginal=1 means Goose original)
|
||||
if api_song.get("isoriginal") == 1:
|
||||
continue
|
||||
|
||||
slug = api_song.get("slug")
|
||||
original_artist = api_song.get("original_artist")
|
||||
|
||||
if not slug or not original_artist or original_artist == "Goose":
|
||||
continue
|
||||
|
||||
# Find matching local Song by slug
|
||||
local_song = session.exec(select(Song).where(Song.slug == slug)).first()
|
||||
if local_song and not local_song.original_artist:
|
||||
local_song.original_artist = original_artist
|
||||
session.add(local_song)
|
||||
updated += 1
|
||||
print(f"Updated: {local_song.title} -> {original_artist}")
|
||||
|
||||
session.commit()
|
||||
print(f"\nSynced original_artist for {updated} cover songs")
|
||||
return updated
|
||||
|
||||
def create_artist_records():
|
||||
"""Create Artist records from original_artist strings and link Songs"""
|
||||
with Session(engine) as session:
|
||||
songs = session.exec(select(Song).where(Song.original_artist != None)).all()
|
||||
print(f"Found {len(songs)} songs with original_artist")
|
||||
|
||||
created = 0
|
||||
linked = 0
|
||||
|
||||
for song in songs:
|
||||
if not song.original_artist or song.artist_id:
|
||||
continue
|
||||
|
||||
artist_name = song.original_artist.strip()
|
||||
if not artist_name or artist_name == "Goose":
|
||||
continue
|
||||
|
||||
artist_slug = slugify(artist_name)
|
||||
|
||||
# Find or Create Artist
|
||||
artist = session.exec(select(Artist).where(Artist.slug == artist_slug)).first()
|
||||
if not artist:
|
||||
artist = Artist(name=artist_name, slug=artist_slug)
|
||||
session.add(artist)
|
||||
session.commit()
|
||||
session.refresh(artist)
|
||||
created += 1
|
||||
print(f"Created Artist: {artist_name}")
|
||||
|
||||
# Link Song
|
||||
song.artist_id = artist.id
|
||||
session.add(song)
|
||||
linked += 1
|
||||
|
||||
session.commit()
|
||||
print(f"\nCreated {created} artists, linked {linked} songs")
|
||||
return created, linked
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("=" * 50)
|
||||
print("ARTIST SYNC FROM ELGOOSE API")
|
||||
print("=" * 50)
|
||||
|
||||
# Step 1: Sync original_artist strings
|
||||
updated_count = sync_original_artists()
|
||||
|
||||
# Step 2: Create Artist records and link
|
||||
created, linked = create_artist_records()
|
||||
|
||||
print("=" * 50)
|
||||
print(f"COMPLETE: Updated {updated_count} songs, Created {created} artists, Linked {linked} songs")
|
||||
print("=" * 50)
|
||||
Loading…
Add table
Reference in a new issue