funkwhale/api/funkwhale_api/radios/utils.py

53 lines
1.3 KiB
Python

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