Adding acousticbrainz support
This commit is contained in:
parent
568c59599b
commit
5e0af940dd
|
@ -1,3 +1,4 @@
|
||||||
|
import logging
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from django.core.exceptions import ValidationError
|
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.music.models import Artist, Library, Track, Upload
|
||||||
from funkwhale_api.tags.models import Tag
|
from funkwhale_api.tags.models import Tag
|
||||||
|
|
||||||
from . import filters, models
|
from . import filters, models, utils
|
||||||
from .registries import registry
|
from .registries import registry
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SimpleRadio(object):
|
class SimpleRadio(object):
|
||||||
related_object_field = None
|
related_object_field = None
|
||||||
|
@ -201,7 +204,7 @@ class NextNotFound(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@registry.register(name="similar")
|
@registry.register(name="similar_history")
|
||||||
class SimilarRadio(RelatedObjectRadio):
|
class SimilarRadio(RelatedObjectRadio):
|
||||||
model = Track
|
model = Track
|
||||||
|
|
||||||
|
@ -254,6 +257,27 @@ class SimilarRadio(RelatedObjectRadio):
|
||||||
return random.choice([c[0] for c in next_candidates])
|
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")
|
@registry.register(name="artist")
|
||||||
class ArtistRadio(RelatedObjectRadio):
|
class ArtistRadio(RelatedObjectRadio):
|
||||||
model = Artist
|
model = Artist
|
||||||
|
|
|
@ -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
|
|
@ -25,7 +25,7 @@
|
||||||
<button class="item basic" ref="playNow" data-ref="playNow" :disabled="!playable" @click.stop.prevent="addNext(true)" :title="labels.playNow">
|
<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 }}
|
<i class="play icon"></i>{{ labels.playNow }}
|
||||||
</button>
|
</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>
|
<i class="feed icon"></i><translate translate-context="*/Queue/Button.Label/Short, Verb">Play radio</translate>
|
||||||
</button>
|
</button>
|
||||||
<button v-if="track" class="item basic" :disabled="!playable" @click.stop="$store.commit('playlists/chooseTrack', track)">
|
<button v-if="track" class="item basic" :disabled="!playable" @click.stop="$store.commit('playlists/chooseTrack', track)">
|
||||||
|
|
Loading…
Reference in New Issue