def submit(): raw_data = request.get_data() try: data = ujson.loads(raw_data.decode("utf-8")) except ValueError as e: raise BadRequest("Cannot parse JSON document: %s" % e) if not isinstance(data, list): raise BadRequest("submitted data must be a list") try: result = messybrainz.submit_listens_and_sing_me_a_sweet_song(data) return ujsonify(result) except messybrainz.exceptions.BadDataException as e: raise BadRequest(e)
def submit_listens(listens): return messybrainz.submit_listens_and_sing_me_a_sweet_song(listens)
def _messybrainz_lookup(listens): msb_listens = [] for listen in listens: messy_dict = { 'artist': listen['track_metadata']['artist_name'], 'title': listen['track_metadata']['track_name'], } if 'release_name' in listen['track_metadata']: messy_dict['release'] = listen['track_metadata']['release_name'] if 'additional_info' in listen['track_metadata']: ai = listen['track_metadata']['additional_info'] if 'artist_mbids' in ai and type(ai['artist_mbids']) == list: messy_dict['artist_mbids'] = ai['artist_mbids'] if 'release_mbid' in ai: messy_dict['release_mbid'] = ai['release_mbid'] if 'recording_mbid' in ai: messy_dict['recording_mbid'] = ai['recording_mbid'] if 'track_number' in ai: messy_dict['track_number'] = ai['track_number'] if 'spotify_id' in ai: messy_dict['spotify_id'] = ai['spotify_id'] msb_listens.append(messy_dict) try: msb_responses = messybrainz.submit_listens_and_sing_me_a_sweet_song(msb_listens) except messybrainz.exceptions.BadDataException as e: _log_and_raise_400(str(e)) except messybrainz.exceptions.NoDataFoundException: return [] except messybrainz.exceptions.ErrorAddingException as e: raise ServiceUnavailable(str(e)) augmented_listens = [] for listen, messybrainz_resp in zip(listens, msb_responses['payload']): messybrainz_resp = messybrainz_resp['ids'] if 'additional_info' not in listen['track_metadata']: listen['track_metadata']['additional_info'] = {} try: listen['recording_msid'] = messybrainz_resp['recording_msid'] listen['track_metadata']['additional_info']['artist_msid'] = messybrainz_resp['artist_msid'] except KeyError: current_app.logger.error("MessyBrainz did not return a proper set of ids") raise InternalServerError try: listen['track_metadata']['additional_info']['release_msid'] = messybrainz_resp['release_msid'] except KeyError: pass artist_mbids = messybrainz_resp.get('artist_mbids', []) release_mbid = messybrainz_resp.get('release_mbid', None) recording_mbid = messybrainz_resp.get('recording_mbid', None) if 'artist_mbids' not in listen['track_metadata']['additional_info'] and \ 'release_mbid' not in listen['track_metadata']['additional_info'] and \ 'recording_mbid' not in listen['track_metadata']['additional_info']: if len(artist_mbids) > 0 and release_mbid and recording_mbid: listen['track_metadata']['additional_info']['artist_id'] = artist_mbid listen['track_metadata']['additional_info']['release_mbid'] = release_mbid listen['track_metadata']['additional_info']['recording_mbid'] = recording_mbid augmented_listens.append(listen) return augmented_listens