""" scripts/fix_exact_portraits.py Directly fetches unblocked CDN portraits for: - $uicideboy$ - 100k Track - AZ - Aminé And audits any remaining fallback stubs across the entire 500 cohort. """ from pathlib import Path import sys import requests ROOT_DIR = Path(__file__).resolve().parent.parent if str(ROOT_DIR) not in sys.path: sys.path.insert(0, str(ROOT_DIR)) from core.database import get_connection def fetch_deezer_portrait(query_term: str): """Fetches high-res unblocked Deezer artist avatar.""" url = f"https://api.deezer.com/search/artist?q={query_term}&limit=5" try: r = requests.get(url, timeout=10) if r.status_code == 200: artists = r.json().get("data", []) for a in artists: img = a.get("picture_xl") or a.get("picture_big") or a.get("picture_medium") if img and "artist-default" not in img: return img except Exception: pass return None def main(): print("=" * 65) print("HIFFI INTELLIGENCE: EXACT ARTIST PORTRAIT DIRECT RESOLUTION") print("=" * 65) conn = get_connection() cur = conn.cursor() # Exact direct CDN portraits for the 4 specific artists direct_targets = { "$uicideboy$": fetch_deezer_portrait("Suicideboys") or "https://e-cdns-images.dzcdn.net/images/artist/f3a0932bb82f5342a8b3017a4c7ebbb4/1000x1000-000000-80-0-0.jpg", "100k Track": fetch_deezer_portrait("100k Track") or "https://e-cdns-images.dzcdn.net/images/artist/b13a17e0e7a17730e206b009e43685e1/1000x1000-000000-80-0-0.jpg", "AZ": fetch_deezer_portrait("AZ") or "https://e-cdns-images.dzcdn.net/images/artist/81f80875c7438c8beab8ec7c524029ce/1000x1000-000000-80-0-0.jpg", "Aminé": fetch_deezer_portrait("Amine") or "https://e-cdns-images.dzcdn.net/images/artist/99e2850901e19d2da079f8e4a9e53ce9/1000x1000-000000-80-0-0.jpg", } for name, img_url in direct_targets.items(): if img_url: cur.execute(""" UPDATE artists SET image_url = ?, image_verified_flag = 1 WHERE LOWER(artist_name) = LOWER(?) """, (img_url, name)) print(f"[UPDATED] {name:<15} -> {img_url}") conn.commit() # Scan for any other artist whose current image contains 'ui-avatars' or Last.fm star cur.execute(""" SELECT artist_id, artist_name, image_url FROM artists WHERE image_url LIKE '%ui-avatars.com%' OR image_url LIKE '%2a96cbd8b46e442fc41c2b86b821562f%' """) stubs = cur.fetchall() print(f"\nRemaining stub avatars in catalog: {len(stubs)}") for artist_id, artist_name, _ in stubs: fallback_img = fetch_deezer_portrait(artist_name) if fallback_img: cur.execute("UPDATE artists SET image_url = ?, image_verified_flag = 1 WHERE artist_id = ?", (fallback_img, artist_id)) print(f"[RESOLVED] {artist_name} -> {fallback_img}") conn.commit() conn.close() print("\n" + "=" * 65) print("Exact portraits committed to database.") print("=" * 65) if __name__ == "__main__": main()