From 85edf1ee1ad2be867500dff0850408757ac9a7af Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 11 Nov 2025 12:10:41 -0800 Subject: [PATCH] Update web_server.py --- web_server.py | 130 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 25 deletions(-) diff --git a/web_server.py b/web_server.py index 622f641f..ecc12a1c 100644 --- a/web_server.py +++ b/web_server.py @@ -14455,8 +14455,8 @@ def get_discover_recent_releases(): try: database = get_database() - # Get cached recent albums - albums = database.get_discovery_recent_albums(limit=10) + # Get cached recent albums (max 20) + albums = database.get_discovery_recent_albums(limit=20) return jsonify({"success": True, "albums": albums}) @@ -14466,30 +14466,42 @@ def get_discover_recent_releases(): @app.route('/api/discover/release-radar', methods=['GET']) def get_discover_release_radar(): - """Get release radar playlist - 50 tracks from discovery pool (new releases only)""" + """Get release radar playlist - 50 tracks randomly selected from all recent albums""" try: import random database = get_database() - # Get new release tracks from discovery pool (is_new_release = True, last 30 days) - discovery_tracks = database.get_discovery_pool_tracks(limit=500, new_releases_only=True) - - if not discovery_tracks: + if not spotify_client or not spotify_client.is_authenticated(): + return jsonify({"success": True, "tracks": []}) + + # Get all recent albums from cache + recent_albums = database.get_discovery_recent_albums(limit=20) + + if not recent_albums: return jsonify({"success": True, "tracks": []}) - # Convert to JSON format all_tracks = [] - for track in discovery_tracks: - all_tracks.append({ - "spotify_track_id": track.spotify_track_id, - "track_name": track.track_name, - "artist_name": track.artist_name, - "album_name": track.album_name, - "album_cover_url": track.album_cover_url, - "duration_ms": track.duration_ms, - "track_data_json": track.track_data_json - }) + + # Get tracks from each recent album + for album in recent_albums: + try: + # Get album tracks from Spotify + album_data = spotify_client.get_album(album['album_spotify_id']) + if album_data and 'tracks' in album_data: + for track in album_data['tracks']['items']: + all_tracks.append({ + "spotify_track_id": track['id'], + "track_name": track['name'], + "artist_name": album['artist_name'], + "album_name": album['album_name'], + "album_cover_url": album['album_cover_url'], + "duration_ms": track.get('duration_ms', 0), + "track_data_json": track + }) + except Exception as e: + print(f"Error getting tracks for album {album['album_name']}: {e}") + continue # Randomly select up to 50 tracks random.shuffle(all_tracks) @@ -14499,24 +14511,25 @@ def get_discover_release_radar(): except Exception as e: print(f"Error getting release radar: {e}") + import traceback + traceback.print_exc() return jsonify({"success": False, "error": str(e)}), 500 @app.route('/api/discover/weekly', methods=['GET']) def get_discover_weekly(): - """Get discovery weekly playlist - 50 tracks from discovery pool (all tracks, not just new)""" + """Get discovery weekly playlist - 50 tracks from similar artists, watchlist artists, and database albums""" try: import random database = get_database() - # Get all tracks from discovery pool (not just new releases) - discovery_tracks = database.get_discovery_pool_tracks(limit=500, new_releases_only=False) - - if not discovery_tracks: + if not spotify_client or not spotify_client.is_authenticated(): return jsonify({"success": True, "tracks": []}) - # Convert to JSON format all_tracks = [] + + # 1. Get tracks from discovery pool (similar artists) - aim for ~30 tracks + discovery_tracks = database.get_discovery_pool_tracks(limit=300, new_releases_only=False) for track in discovery_tracks: all_tracks.append({ "spotify_track_id": track.spotify_track_id, @@ -14528,7 +14541,72 @@ def get_discover_weekly(): "track_data_json": track.track_data_json }) - # Randomly select 50 tracks + # 2. Get tracks from random watchlist artists - aim for ~10 tracks + try: + watchlist_artists = database.get_watchlist_artists() + if watchlist_artists: + random_watchlist = random.sample(watchlist_artists, min(2, len(watchlist_artists))) + for artist in random_watchlist: + try: + albums = spotify_client.get_artist_albums(artist.spotify_artist_id, album_type='album', limit=10) + if albums: + random_album = random.choice(albums) + album_data = spotify_client.get_album(random_album.id) + if album_data and 'tracks' in album_data: + for track in album_data['tracks']['items'][:5]: # 5 tracks per album + all_tracks.append({ + "spotify_track_id": track['id'], + "track_name": track['name'], + "artist_name": artist.artist_name, + "album_name": random_album.name, + "album_cover_url": random_album.image_url if hasattr(random_album, 'image_url') else None, + "duration_ms": track.get('duration_ms', 0), + "track_data_json": track + }) + except Exception as e: + continue + except Exception as e: + print(f"Error getting watchlist tracks: {e}") + + # 3. Get tracks from random database albums - aim for ~10 tracks + try: + # Get random albums from database + with database._get_connection() as conn: + cursor = conn.cursor() + cursor.execute(""" + SELECT DISTINCT a.title, ar.name as artist_name + FROM albums_new a + JOIN artists_new ar ON a.artist_id = ar.id + ORDER BY RANDOM() + LIMIT 2 + """) + db_albums = cursor.fetchall() + + for album_row in db_albums: + try: + # Search for album on Spotify + query = f"album:{album_row['title']} artist:{album_row['artist_name']}" + search_results = spotify_client.search_albums(query, limit=1) + if search_results and len(search_results) > 0: + spotify_album = search_results[0] + album_data = spotify_client.get_album(spotify_album.id) + if album_data and 'tracks' in album_data: + for track in album_data['tracks']['items'][:5]: # 5 tracks per album + all_tracks.append({ + "spotify_track_id": track['id'], + "track_name": track['name'], + "artist_name": album_row['artist_name'], + "album_name": album_row['title'], + "album_cover_url": spotify_album.image_url if hasattr(spotify_album, 'image_url') else None, + "duration_ms": track.get('duration_ms', 0), + "track_data_json": track + }) + except Exception as e: + continue + except Exception as e: + print(f"Error getting database album tracks: {e}") + + # Randomly select 50 tracks from the combined pool random.shuffle(all_tracks) selected_tracks = all_tracks[:50] @@ -14536,6 +14614,8 @@ def get_discover_weekly(): except Exception as e: print(f"Error getting discovery weekly: {e}") + import traceback + traceback.print_exc() return jsonify({"success": False, "error": str(e)}), 500 @app.route('/api/metadata/start', methods=['POST'])