def _get_feedback_for_recording(recording_type, recording): score = _parse_int_arg('score') offset = get_non_negative_param('offset', default=0) count = get_non_negative_param('count', default=DEFAULT_ITEMS_PER_GET) count = min(count, MAX_ITEMS_PER_GET) if score: if score not in [-1, 1]: log_raise_400("Score can have a value of 1 or -1.", request.args) feedback = db_feedback.get_feedback_for_recording(recording_type, recording, limit=count, offset=offset, score=score) total_count = db_feedback.get_feedback_count_for_recording( recording_type, recording) feedback = [fb.to_api() for fb in feedback] return jsonify({ "feedback": feedback, "count": len(feedback), "total_count": total_count, "offset": offset })
def get_feedback_for_user(user_name): """ Get feedback given by user ``user_name``. The format for the JSON returned is defined in our :ref:`feedback-json-doc`. If the optional argument ``score`` is not given, this endpoint will return all the feedback submitted by the user. Otherwise filters the feedback to be returned by score. :param score: Optional, If 1 then returns the loved recordings, if -1 returns hated recordings. :type score: ``int`` :param count: Optional, number of feedback items to return, Default: :data:`~webserver.views.api.DEFAULT_ITEMS_PER_GET` Max: :data:`~webserver.views.api.MAX_ITEMS_PER_GET`. :type count: ``int`` :param offset: Optional, number of feedback items to skip from the beginning, for pagination. Ex. An offset of 5 means the top 5 feedback will be skipped, defaults to 0. :type offset: ``int`` :param metadata: Optional, 'true' or 'false' if this call should return the metadata for the feedback. :type metadata: ``str`` :statuscode 200: Yay, you have data! :resheader Content-Type: *application/json* """ score = _parse_int_arg('score') metadata = parse_boolean_arg('metadata') offset = get_non_negative_param('offset', default=0) count = get_non_negative_param('count', default=DEFAULT_ITEMS_PER_GET) count = min(count, MAX_ITEMS_PER_GET) user = db_user.get_by_mb_id(user_name) if user is None: raise APINotFound("Cannot find user: %s" % user_name) if score: if score not in [-1, 1]: log_raise_400("Score can have a value of 1 or -1.", request.args) feedback = db_feedback.get_feedback_for_user(user_id=user["id"], limit=count, offset=offset, score=score, metadata=metadata) total_count = db_feedback.get_feedback_count_for_user(user["id"]) feedback = [fb.to_api() for fb in feedback] return jsonify({ "feedback": feedback, "count": len(feedback), "total_count": total_count, "offset": offset })
def huesound(color): """ Fetch a list of releases that have cover art that has a predominant color that is close to the given color. .. code-block:: json { "payload": { "releases" : [ { "artist_name": "Letherette", "color": [ 250, 90, 192 ], "dist": 109.973, "release_mbid": "00a109da-400c-4350-9751-6e6f25e89073", "caa_id": 34897349734, "release_name": "EP5", "recordings": "< array of listen formatted metadata >", }, ". . ." ] } } :statuscode 200: success :resheader Content-Type: *application/json* """ try: if len(color) != 6: raise ValueError() color_tuple = tuple(int(color[i:i + 2], 16) for i in (0, 2, 4)) except ValueError: raise APIBadRequest("color must be a 6 digit hex color code.") count = _parse_int_arg("count", DEFAULT_NUMBER_OF_RELEASES) cache_key = HUESOUND_PAGE_CACHE_KEY % (color, count) results = cache.get(cache_key, decode=True) if not results: results = get_releases_for_color(*color_tuple, count) results = [c.to_api() for c in results] cache.set(cache_key, results, DEFAULT_CACHE_EXPIRE_TIME, encode=True) return jsonify({"payload": {"releases": results}})
def get_feedback_for_recording(recording_msid): """ Get feedback for recording with given ``recording_msid``. The format for the JSON returned is defined in our :ref:`feedback-json-doc`. :param score: Optional, If 1 then returns the loved recordings, if -1 returns hated recordings. :type score: ``int`` :param count: Optional, number of feedback items to return, Default: :data:`~webserver.views.api.DEFAULT_ITEMS_PER_GET` Max: :data:`~webserver.views.api.MAX_ITEMS_PER_GET`. :type count: ``int`` :param offset: Optional, number of feedback items to skip from the beginning, for pagination. Ex. An offset of 5 means the top 5 feedback will be skipped, defaults to 0. :type offset: ``int`` :statuscode 200: Yay, you have data! :resheader Content-Type: *application/json* """ if not is_valid_uuid(recording_msid): log_raise_400("%s MSID format invalid." % recording_msid) score = _parse_int_arg('score') offset = _get_non_negative_param('offset', default=0) count = _get_non_negative_param('count', default=DEFAULT_ITEMS_PER_GET) count = min(count, MAX_ITEMS_PER_GET) if score: if score not in [-1, 1]: log_raise_400("Score can have a value of 1 or -1.", request.args) feedback = db_feedback.get_feedback_for_recording( recording_msid=recording_msid, limit=count, offset=offset, score=score) total_count = db_feedback.get_feedback_count_for_recording(recording_msid) for i, fb in enumerate(feedback): fb.user_id = fb.user_name del fb.user_name feedback[i] = fb.dict() return jsonify({ "feedback": feedback, "count": len(feedback), "total_count": total_count, "offset": offset })