From 78b4c4184698e888bfba8f0d9610ca1f46cb3584 Mon Sep 17 00:00:00 2001 From: Michaƫl Ball Date: Sat, 16 Jun 2018 12:18:24 +0100 Subject: Weight track selection by similarity score --- lastfm_similarity.py | 58 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/lastfm_similarity.py b/lastfm_similarity.py index f381d23..73e705d 100644 --- a/lastfm_similarity.py +++ b/lastfm_similarity.py @@ -142,6 +142,7 @@ class LastFMSimilarity(EventPlugin): if stream.getcode() == 200: similar_tracks = [] + track_weights = [] try: response = json.loads(str(stream.read(), "utf-8")) @@ -152,8 +153,9 @@ class LastFMSimilarity(EventPlugin): if similarity_score >= self._similarity_strictness: similar_tracks.append( (track["artist"]["name"], track["name"])) + track_weights.append(similarity_score) - return similar_tracks + return similar_tracks, track_weights except KeyError: if mbid: @@ -191,6 +193,7 @@ class LastFMSimilarity(EventPlugin): if stream.getcode() == 200: similar_artists = [] + artist_weights = [] try: response = json.loads(str(stream.read(), "utf-8")) @@ -200,8 +203,9 @@ class LastFMSimilarity(EventPlugin): if similarity_score >= self._similarity_strictness: similar_artists.append(artist["name"]) + artist_weights.append(similarity_score) - return similar_artists + return similar_artists, artist_weights except KeyError: if mbid: @@ -220,23 +224,22 @@ class LastFMSimilarity(EventPlugin): track = song.get("title") candidates = [] + weights = [] try: mbid = song.get("musicbrainz_releasetrackid") - candidates = self._find_similar_tracks(track, artist, mbid) + candidates, weights = self._find_similar_tracks( + track, artist, mbid) except KeyError: - candidates = self._find_similar_tracks(track, artist) + candidates, weights = self._find_similar_tracks(track, artist) + found_tracks = [] + found_track_weights = [] if candidates: - random.shuffle(candidates) - - for candidate in candidates: + for idx, candidate in enumerate(candidates): if not self._check_artist_played(candidate[0]): - print_d("[similarity] found track match: %s - %s" - % (candidate[0], candidate[1])) - query = Query.StrictQueryMatcher( "&(artist = \"%s\", title = \"%s\")" % (candidate[0], candidate[1])) @@ -249,18 +252,43 @@ class LastFMSimilarity(EventPlugin): if self._check_track_played(song.get("~filename")): continue - app.window.playlist.enqueue([song]) + print_d("[similarity] found track match: %s - %s" + % (candidate[0], candidate[1])) - return + found_tracks.append(song) + found_track_weights.append(weights[idx]) except AttributeError: pass - artist_candidates = self._find_similar_artists(artist) + if found_tracks: + selected_track = random.choices( + found_tracks, found_track_weights, k=1)[0] + app.window.playlist.enqueue([selected_track]) + return + + artist_candidates, artist_weights = self._find_similar_artists(artist) - for artist in artist_candidates: + found_artists = [] + found_artist_weights = [] + + for idx, artist in enumerate(artist_candidates): if not self._check_artist_played(artist): print_d("[similarity] found artist match: %s" % artist) + found_artists.append(artist) + found_artist_weights.append(artist_weights[idx]) + + while True: + if found_artists: + artist = random.choices( + found_artists, found_artist_weights, k=1)[0] + + for idx, a in enumerate(found_artists): + if a == artist: + found_artist_weights.pop(idx) + + found_artists.remove(artist) + query = Query.StrictQueryMatcher( "&(artist = \"%s\", title != \"[silence]\")" % artist) try: @@ -277,6 +305,8 @@ class LastFMSimilarity(EventPlugin): except AttributeError: pass + else: + return def plugin_on_song_started(self, song): """Append current track to last played tracks and artists.""" -- cgit v1.2.3