53 lines
1.3 KiB
Python
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
|