From 7ccb2d88f8cfbc39a7823ef8f3970397ef606352 Mon Sep 17 00:00:00 2001 From: petitminion Date: Fri, 3 Nov 2023 16:13:53 +0000 Subject: [PATCH] Avoid troi radio to give duplicates (#2231) --- .../radios/lb_recommendations.py | 61 +++++++++++-------- changes/changelog.d/2231.bugfix | 1 + 2 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 changes/changelog.d/2231.bugfix diff --git a/api/funkwhale_api/radios/lb_recommendations.py b/api/funkwhale_api/radios/lb_recommendations.py index a50441418..ad67c6e91 100644 --- a/api/funkwhale_api/radios/lb_recommendations.py +++ b/api/funkwhale_api/radios/lb_recommendations.py @@ -56,33 +56,37 @@ def build_radio_queryset(patch, config, radio_qs): if not recommendations: raise ValueError("No candidates found by troi") - recommended_recording_mbids = [ + recommended_mbids = [ recommended_recording.mbid for recommended_recording in recommendations.playlists[0].recordings ] logger.info("Searching for MusicBrainz ID in Funkwhale database") - qs_mbid = music_models.Track.objects.all().filter( - mbid__in=recommended_recording_mbids + qs_recommended = ( + music_models.Track.objects.all() + .filter(mbid__in=recommended_mbids) + .order_by("mbid", "pk") + .distinct("mbid") ) - mbids_found = [str(i.mbid) for i in qs_mbid] + qs_recommended_mbid = [str(i.mbid) for i in qs_recommended] - recommended_recording_mbids_not_found = [ - mbid for mbid in recommended_recording_mbids if mbid not in mbids_found + recommended_mbids_not_qs = [ + mbid for mbid in recommended_mbids if mbid not in qs_recommended_mbid ] - cached_mbid_match = cache.get_many(recommended_recording_mbids_not_found) + cached_match = cache.get_many(recommended_mbids_not_qs) + cached_match_mbid = [str(i) for i in cached_match.keys()] - if qs_mbid and cached_mbid_match: + if qs_recommended and cached_match_mbid: logger.info("MusicBrainz IDs found in Funkwhale database and redis") - mbids_found = [str(i.mbid) for i in qs_mbid] - mbids_found.extend([i for i in cached_mbid_match.keys()]) - elif qs_mbid and not cached_mbid_match: + qs_recommended_mbid.extend(cached_match_mbid) + mbids_found = qs_recommended_mbid + elif qs_recommended and not cached_match_mbid: logger.info("MusicBrainz IDs found in Funkwhale database") - mbids_found = mbids_found - elif not qs_mbid and cached_mbid_match: + mbids_found = qs_recommended_mbid + elif not qs_recommended and cached_match_mbid: logger.info("MusicBrainz IDs found in redis cache") - mbids_found = [i for i in cached_mbid_match.keys()] + mbids_found = cached_match_mbid else: logger.info( "Couldn't find any matches in Funkwhale database. Trying to match all" @@ -106,23 +110,32 @@ def build_radio_queryset(patch, config, radio_qs): + str(end_time_resolv - start_time_resolv) ) - cached_mbid_match = cache.get_many(recommended_recording_mbids_not_found) + cached_match = cache.get_many(recommended_mbids) - if not qs_mbid and not cached_mbid_match: + if not mbids_found and not cached_match: raise ValueError("No candidates found for troi radio") - logger.info("Radio generation with troi took " + str(end_time_resolv - start_time)) - logger.info("qs_mbid is " + str(mbids_found)) + mbids_found_pks = list( + music_models.Track.objects.all() + .filter(mbid__in=mbids_found) + .order_by("mbid", "pk") + .distinct("mbid") + .values_list("pk", flat=True) + ) - if qs_mbid and cached_mbid_match: + mbids_found_pks_unique = [ + i for i in mbids_found_pks if i not in cached_match.keys() + ] + + if mbids_found and cached_match: return radio_qs.filter( - Q(mbid__in=mbids_found) | Q(pk__in=cached_mbid_match.values()) + Q(pk__in=mbids_found_pks_unique) | Q(pk__in=cached_match.values()) ) - if qs_mbid and not cached_mbid_match: - return radio_qs.filter(mbid__in=mbids_found) + if mbids_found and not cached_match: + return radio_qs.filter(pk__in=mbids_found_pks_unique) - if not qs_mbid and cached_mbid_match: - return radio_qs.filter(pk__in=cached_mbid_match.values()) + if not mbids_found and cached_match: + return radio_qs.filter(pk__in=cached_match.values()) class TroiPatch: diff --git a/changes/changelog.d/2231.bugfix b/changes/changelog.d/2231.bugfix new file mode 100644 index 000000000..e114bd9d1 --- /dev/null +++ b/changes/changelog.d/2231.bugfix @@ -0,0 +1 @@ +Avoid troi radio to give duplicates (#2231)