def test_recent_tracks_are_filtered( self, mock_spotify_playlist, mock_spotify_library, mock_calculate_ratings, mock_fetch_recommendations, mock_top_tracks, mock_recent_tracks, ): recent_track_1 = TopTrack(track_name="SWALBR", artist="Cream", playcount=1) recent_track_2 = TopTrack(track_name="Badge", artist="Cream", playcount=1) recent_track_3 = TopTrack(track_name="Layla", artist="Derek & the Dominos", playcount=8) mock_recent_tracks.return_value = [ recent_track_1, recent_track_2, recent_track_3, ] mock_top_tracks.return_value = [recent_track_3] new_recommendation = RecommendedTrack( track_name="Key to the Highway", artist="Derek & the Dominos", recommendation_rating=8, ) already_scrobbled_recommendation_1 = RecommendedTrack( track_name="Badge", artist="Cream", recommendation_rating=8) already_scrobbled_recommendation_2 = RecommendedTrack( track_name="SWALBR", artist="Cream", recommendation_rating=8) recommendations = [ new_recommendation, already_scrobbled_recommendation_1, already_scrobbled_recommendation_2, ] mock_fetch_recommendations.fetch_recommendations.return_value = recommendations mock_calculate_ratings.return_value = recommendations mock_spotify_library.get_saved_tracks.return_value = [] mock_spotify_playlist.get_tracks_in_playlists.return_value = [] self.assertCountEqual( generate_recommendations(spotify=None, lastfm_user="******", lastfm_api_key=""), [new_recommendation], )
def fetch_top_tracks(user, api_key, a_period=period.OVERALL): """Fetches the top tracks for the given user over the given period""" logging.info("Fetching top tracks for user " + user + " over period " + a_period) paginated_json_responses = fetch_paginated_response( URL, user, api_key, "toptracks", [{ "key": "period", "value": a_period }]) top_tracks = [] for json_response in paginated_json_responses: for track in json_response["toptracks"]["track"]: top_tracks.append( TopTrack( parse_track_name(track), parse_artist(track), int(track["playcount"]), )) # Filter out tracks with a playcount of 1, since those really shouldn't be considered "top" top_tracks = [track for track in top_tracks if track.playcount > 1] logging.info("Fetched " + str(len(top_tracks)) + " top tracks") logging.debug("Fetched tracks: " + str(top_tracks)) return top_tracks
def test_blacklisted_artists_filtering_should_ignore_case( self, mock_spotify_playlist, mock_spotify_library, mock_calculate_ratings, mock_fetch_recommendations, mock_top_tracks, mock_recent_tracks, ): mock_recent_tracks.return_value = [] mock_top_tracks.return_value = [ TopTrack(track_name="everything i wanted", artist="Billie Eilish", playcount=5) ] recommendation = RecommendedTrack(track_name="Bad Music", artist="Zayn", recommendation_rating=1) recommendations = [recommendation] mock_fetch_recommendations.fetch_recommendations.return_value = recommendations mock_calculate_ratings.return_value = recommendations mock_spotify_library.get_saved_tracks.return_value = [] mock_spotify_playlist.get_tracks_in_playlists.return_value = [] recommendations = generate_recommendations( lastfm_user="", lastfm_api_key="", spotify=None, blacklisted_artists=["ZAYN"], ) self.assertEqual(0, len(recommendations))
def test_rating_is_reduced_based_on_artist_playcount( self, mock_recent_artists): mock_recent_artists.return_value = [ ScrobbledArtist(artist_name="The Beatles", playcount=9) ] top_track = TopTrack(artist="The Beatles", track_name="Penny Lane", playcount=5) recommended_track_1 = RecommendedTrack( artist="The Beatles", track_name="Strawberry Fields Forever", recommendation_rating=1, ) recommended_track_2 = RecommendedTrack(artist="The Beatles", track_name="Blue Jay Way", recommendation_rating=1) top_tracks_to_recommendations = { top_track: [recommended_track_1, recommended_track_2] } recommendations = calculate_ratings("test", "", top_tracks_to_recommendations) self.assertEqual(5 / (9), recommendations[0].recommendation_rating) self.assertEqual(5 / (9), recommendations[1].recommendation_rating)
def test_blacklisted_artists_are_filtered( self, mock_spotify_playlist, mock_spotify_library, mock_calculate_ratings, mock_fetch_recommendations, mock_top_tracks, mock_recent_tracks, ): mock_recent_tracks.return_value = [] mock_top_tracks.return_value = [ TopTrack(track_name="Here Comes the Sun", artist="The Beatles", playcount=5) ] recommendation_1 = RecommendedTrack(track_name="Badge", artist="Cream", recommendation_rating=1) recommendation_2 = RecommendedTrack(track_name="Penny Lane", artist="The Beatles", recommendation_rating=1) recommendations = [recommendation_1, recommendation_2] mock_fetch_recommendations.fetch_recommendations.return_value = recommendations mock_calculate_ratings.return_value = recommendations mock_spotify_library.get_saved_tracks.return_value = [] mock_spotify_playlist.get_tracks_in_playlists.return_value = [] recommendations = generate_recommendations( lastfm_user="******", lastfm_api_key="", spotify=None, blacklisted_artists=["The Beatles"], ) self.assertCountEqual(recommendations, [recommendation_1])