elmeg-demo/backend/sync_artists.py

104 lines
3.5 KiB
Python

"""
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)