From b5aea8c03874dab50b00361d491ff495c487f705 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Sat, 9 Aug 2025 00:29:31 -0700 Subject: [PATCH] fixed issue where items didn't move to wishlist --- .../wishlist_service.cpython-312.pyc | Bin 11817 -> 15521 bytes core/wishlist_service.py | 112 ++++++++++++++++-- 2 files changed, 99 insertions(+), 13 deletions(-) diff --git a/core/__pycache__/wishlist_service.cpython-312.pyc b/core/__pycache__/wishlist_service.cpython-312.pyc index b1536d48b5e7892e0d327d0cbff7037a1e11ed5e..8c6bdd56d7f74df366867f0906501f4c7d86816a 100644 GIT binary patch delta 5489 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 Dict[str, Any]: - """Convert a Spotify track object to a dictionary""" + """Convert a Spotify track object or TrackResult object to a dictionary""" try: - return { + # Add debug logging to see what we're dealing with + logger.info(f"DEBUG: Converting track object to dict. Type: {type(spotify_track)}") + logger.info(f"DEBUG: Has 'title' attribute: {hasattr(spotify_track, 'title')}") + logger.info(f"DEBUG: Has 'artist' attribute: {hasattr(spotify_track, 'artist')}") + logger.info(f"DEBUG: Has 'id' attribute: {hasattr(spotify_track, 'id')}") + + # Check if this is a TrackResult object (has title/artist but no id) + if hasattr(spotify_track, 'title') and hasattr(spotify_track, 'artist') and not hasattr(spotify_track, 'id'): + logger.info("DEBUG: Detected TrackResult object, converting...") + # Handle TrackResult objects - these don't have Spotify IDs + result = { + 'id': f"trackresult_{hash(f'{spotify_track.artist}_{spotify_track.title}')}", + 'name': getattr(spotify_track, 'title', 'Unknown Track'), + 'artists': [{'name': getattr(spotify_track, 'artist', 'Unknown Artist')}], + 'album': {'name': getattr(spotify_track, 'album', 'Unknown Album')}, + 'duration_ms': 0, # TrackResult doesn't have duration + 'preview_url': None, + 'external_urls': {}, + 'popularity': 0, + 'source': 'trackresult' # Mark as reconstructed from TrackResult + } + logger.info(f"DEBUG: TrackResult converted successfully: {result['name']} by {result['artists'][0]['name']}") + return result + + # Handle regular Spotify Track objects + logger.info("DEBUG: Processing as Spotify Track object") + + # Handle artists list carefully to avoid TrackResult serialization issues + artists_list = [] + raw_artists = getattr(spotify_track, 'artists', []) + logger.info(f"DEBUG: Raw artists: {raw_artists}, type: {type(raw_artists)}") + + for artist in raw_artists: + logger.info(f"DEBUG: Processing artist: {artist}, type: {type(artist)}") + if hasattr(artist, 'name'): + artists_list.append({'name': artist.name}) + elif isinstance(artist, str): + artists_list.append({'name': artist}) + else: + # Convert any complex objects to string to avoid serialization issues + artists_list.append({'name': str(artist)}) + + # Handle album safely + album_name = 'Unknown Album' + if hasattr(spotify_track, 'album') and spotify_track.album: + if hasattr(spotify_track.album, 'name'): + album_name = spotify_track.album.name + else: + album_name = str(spotify_track.album) + + result = { 'id': getattr(spotify_track, 'id', None), 'name': getattr(spotify_track, 'name', 'Unknown Track'), - 'artists': [ - {'name': artist.name if hasattr(artist, 'name') else str(artist)} - for artist in getattr(spotify_track, 'artists', []) - ], - 'album': { - 'name': getattr(spotify_track.album, 'name', 'Unknown Album') - if hasattr(spotify_track, 'album') and spotify_track.album - else 'Unknown Album' - }, + 'artists': artists_list, + 'album': {'name': album_name}, 'duration_ms': getattr(spotify_track, 'duration_ms', 0), 'preview_url': getattr(spotify_track, 'preview_url', None), 'external_urls': getattr(spotify_track, 'external_urls', {}), 'popularity': getattr(spotify_track, 'popularity', 0) } + + logger.info(f"DEBUG: Spotify Track converted: {result['name']} by {[a['name'] for a in result['artists']]}") + + # Test JSON serialization before returning to catch any remaining issues + try: + import json + json.dumps(result) + logger.info("DEBUG: Conversion result is JSON serializable") + except Exception as json_error: + logger.error(f"DEBUG: Conversion result is NOT JSON serializable: {json_error}") + logger.error(f"DEBUG: Result content: {result}") + # Return a safe fallback + return { + 'id': f"fallback_{hash(str(spotify_track))}", + 'name': str(getattr(spotify_track, 'name', 'Unknown Track')), + 'artists': [{'name': 'Unknown Artist'}], + 'album': {'name': 'Unknown Album'}, + 'duration_ms': 0, + 'preview_url': None, + 'external_urls': {}, + 'popularity': 0, + 'source': 'fallback' + } + + return result except Exception as e: - logger.error(f"Error converting Spotify track object to dict: {e}") + logger.error(f"Error converting track object to dict: {e}") + logger.error(f"Object type: {type(spotify_track)}") + logger.error(f"Object attributes: {dir(spotify_track)}") return {} # Global singleton instance