Adding acousticbrainz support

This commit is contained in:
Petitminion 2021-10-24 19:15:44 +02:00
parent 568c59599b
commit 5e0af940dd
3 changed files with 62 additions and 3 deletions

View File

@ -1,3 +1,4 @@
import logging
import random
from django.core.exceptions import ValidationError
@ -11,9 +12,11 @@ from funkwhale_api.moderation import filters as moderation_filters
from funkwhale_api.music.models import Artist, Library, Track, Upload
from funkwhale_api.tags.models import Tag
from . import filters, models
from . import filters, models, utils
from .registries import registry
logger = logging.getLogger(__name__)
class SimpleRadio(object):
related_object_field = None
@ -201,7 +204,7 @@ class NextNotFound(Exception):
pass
@registry.register(name="similar")
@registry.register(name="similar_history")
class SimilarRadio(RelatedObjectRadio):
model = Track
@ -254,6 +257,27 @@ class SimilarRadio(RelatedObjectRadio):
return random.choice([c[0] for c in next_candidates])
@registry.register(name="similar_mbid")
class SimilarAcousticRadio(RelatedObjectRadio):
model = Track
def get_regex(self):
related_mbid = str(self.session.related_object.mbid)
if not related_mbid:
logger.info(f"No mbid found for the related object.")
pass
mbids_regex = str()
mbids = utils.get_similar_tracks_mbids_from_mbid(related_mbid, "rosamerica")
for mbid in mbids:
mbids_regex = str(mbids_regex) + str(mbid + "|")
return mbids_regex
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
mbids_regex = self.get_regex()
return queryset.filter(mbid__regex=r'({mbids_regex})'.format(mbids_regex=mbids_regex))
@registry.register(name="artist")
class ArtistRadio(RelatedObjectRadio):
model = Artist

View File

@ -0,0 +1,35 @@
import json
import logging
import requests
logger = logging.getLogger(__name__)
VALID_METRICS = ['mfccs', 'mfccsw', 'gfccs', 'gfccsw', 'key', 'bpm', 'onsetrate', 'moods',
'instruments', 'dortmund', 'rosamerica', 'tzanetakis']
class EndpointError(Exception):
pass
def get_similar_tracks_mbids_from_mbid(mbid, annoy_similarity):
if annoy_similarity not in VALID_METRICS:
raise AttributeError("Metric %s is not valid. Must be one of : " + print(VALID_METRICS))
headers = {'Content-Type': 'application/json'}
endpoint = "acousticbrainz.org/api/v1/similarity"
similar_tracks_mbids = []
similar_tracks = requests.get(
'https://{endpoint}/{annoy_similarity}/?recording_ids={mbid}&remove_dups&n_neighbours=1000'
.format(endpoint=endpoint, annoy_similarity=annoy_similarity, mbid=mbid), headers=headers
)
if similar_tracks.status_code != 200:
logger.warning("Error while querying {endpoint!r} : {similar_tracks.content!r}")
raise EndpointError
j = json.loads(similar_tracks.content)
for tracks in j['{mbid}'.format(mbid=mbid)]['0']:
similar_tracks_mbids.append(tracks['recording_mbid'])
return similar_tracks_mbids

View File

@ -25,7 +25,7 @@
<button class="item basic" ref="playNow" data-ref="playNow" :disabled="!playable" @click.stop.prevent="addNext(true)" :title="labels.playNow">
<i class="play icon"></i>{{ labels.playNow }}
</button>
<button v-if="track" class="item basic" :disabled="!playable" @click.stop.prevent="$store.dispatch('radios/start', {type: 'similar', objectId: track.id})" :title="labels.startRadio">
<button v-if="track" class="item basic" :disabled="!playable" @click.stop.prevent="$store.dispatch('radios/start', {type: 'similar_history', objectId: track.id})" :title="labels.startRadio">
<i class="feed icon"></i><translate translate-context="*/Queue/Button.Label/Short, Verb">Play radio</translate>
</button>
<button v-if="track" class="item basic" :disabled="!playable" @click.stop="$store.commit('playlists/chooseTrack', track)">