payload: {"action":"created","comment":{"url":"https://api.github.com/repos/MTG/freesound/pulls/comments/320320043","pull_request_review_id":283057574,"id":320320043,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMyMDMyMDA0Mw==","diff_hunk":"@@ -22,19 +22,320 @@\n import math\n import random\n import socket\n+import json\n \n+import re\n from django.conf import settings\n \n import sounds\n+from search import forms\n from search.forms import SEARCH_SORT_OPTIONS_WEB\n-from search.views import search_prepare_sort, search_prepare_query\n-from utils.search.solr import Solr, SolrQuery, SolrResponseInterpreter, SolrException\n+from utils.search.solr import Solr, SolrQuery, SolrResponseInterpreter, SolrException, \\\n+    SolrResponseInterpreterPaginator\n from utils.text import remove_control_chars\n+from utils.logging_filters import get_client_ip\n \n logger = logging.getLogger(\"search\")\n console_logger = logging.getLogger(\"console\")\n \n \n+def search_prepare_sort(sort, options):\n+    \"\"\" for ordering by rating order by rating, then by number of ratings \"\"\"\n+    if sort in [x[1] for x in options]:\n+        if sort == \"avg_rating desc\":\n+            sort = [sort, \"num_ratings desc\"]\n+        elif  sort == \"avg_rating asc\":\n+            sort = [sort, \"num_ratings asc\"]\n+        else:\n+            sort = [sort]\n+    else:\n+        sort = [forms.SEARCH_DEFAULT_SORT]\n+    return sort\n+\n+\n+def search_process_filter(filter_query):\n+    # Process the filter to replace humnan-readable Audio Commons descriptor names for the dynamic field names used in\n+    # Solr (e.g. ac_tonality -> ac_tonality_s, ac_tempo -> ac_tempo_i). The dynamic field names we define in Solr\n+    # schema are '*_b' (for bool), '*_d' (for float), '*_i' (for integer) and '*_s' (for string). At indexing time\n+    # we append these suffixes to the ac descirptor names so Solr can treat the types properly. Now we automatically\n+    # append the suffices to the filter names so users do not need to deal with that.\n+    for name, t in settings.AUDIOCOMMONS_INCLUDED_DESCRIPTOR_NAMES_TYPES:\n+        filter_query = filter_query.replace('ac_{0}:'.format(name), 'ac_{0}{1}:'\n+                                            .format(name, settings.SOLR_DYNAMIC_FIELDS_SUFFIX_MAP[t]))\n+    return filter_query\n+\n+\n+def search_prepare_parameters(request):\n+    \"\"\" Process the query parameters.\n+        Returns: - the params for search_prepare_query() in a dict\n+                 - the variables for the template context\n+    \"\"\"\n+    search_query = request.GET.get(\"q\", \"\")\n+    filter_query = request.GET.get(\"f\", \"\")\n+    filter_query_link_more_when_grouping_packs = filter_query.replace(' ','+')\n+    cluster_id = request.GET.get('cluster_id', \"\")\n+\n+    # Generate array with information of filters\n+    filter_query_split = []\n+    if filter_query != \"\":\n+        for filter_str in re.findall(r'[\\w-]+:\\\"[^\\\"]+', filter_query):\n+            valid_filter = True\n+            filter_str = filter_str + '\"'\n+            filter_display = filter_str.replace('\"', '')\n+            filter_name = filter_str.split(\":\")[0]\n+            if filter_name != \"duration\" and filter_name != \"is_geotagged\":\n+                if filter_name == \"grouping_pack\":\n+                    val = filter_display.split(\":\")[1]\n+                    # If pack does not contain \"_\" then it's not a valid pack filter\n+                    if \"_\" in val:\n+                        filter_display = \"pack:\"+ val.split(\"_\")[1]\n+                    else:\n+                        valid_filter = False\n+\n+                if valid_filter:\n+                    filter = {\n+                        'name': filter_display,\n+                        'remove_url': filter_query.replace(filter_str, ''),\n+                    }\n+                    filter_query_split.append(filter)\n+\n+    if cluster_id != \"\":  # cluster filter is in a separate query parameter\n+        filter_query_split.append({\n+            'name': \"Cluster #\" + cluster_id,\n+            'remove_url': filter_query,\n+        })\n+\n+    try:\n+        current_page = int(request.GET.get(\"page\", 1))\n+    except ValueError:\n+        current_page = 1\n+    sort_unformatted = request.GET.get(\"s\", None)\n+    sort_options = forms.SEARCH_SORT_OPTIONS_WEB\n+    grouping = request.GET.get(\"g\", \"1\")  # Group by default\n+\n+    # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense)\n+    # If the query is through AJAX (for sources remix editing), do not collapse\n+    if \"pack\" in filter_query or request.GET.get(\"ajax\", \"\") == \"1\":\n+        grouping = \"\"\n+\n+    # Set default values\n+    id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id']\n+    tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag']\n+    description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description']\n+    username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username']\n+    pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized']\n+    original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename']\n+\n+    # Parse advanced search options\n+    advanced = request.GET.get(\"advanced\", \"\")\n+    advanced_search_params_dict = {}\n+\n+    # if advanced search\n+    if advanced == \"1\":\n+        a_tag = request.GET.get(\"a_tag\", \"\")\n+        a_filename = request.GET.get(\"a_filename\", \"\")\n+        a_description = request.GET.get(\"a_description\", \"\")\n+        a_packname = request.GET.get(\"a_packname\", \"\")\n+        a_soundid = request.GET.get(\"a_soundid\", \"\")\n+        a_username = request.GET.get(\"a_username\", \"\")\n+        advanced_search_params_dict.update({  # These are stored in a dict to facilitate logging and passing to template\n+            'a_tag': a_tag,\n+            'a_filename': a_filename,\n+            'a_description': a_description,\n+            'a_packname': a_packname,\n+            'a_soundid': a_soundid,\n+            'a_username': a_username,\n+        })\n+\n+        # If none is selected use all (so other filter can be appleid)\n+        if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != \"\" :\n+\n+            # Initialize all weights to 0\n+            id_weight = 0\n+            tag_weight = 0\n+            description_weight = 0\n+            username_weight = 0\n+            pack_tokenized_weight = 0\n+            original_filename_weight = 0\n+\n+            # Set the weights of selected checkboxes\n+            if a_soundid != \"\":\n+                id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id']\n+            if a_tag != \"\":\n+                tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag']\n+            if a_description != \"\":\n+                description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description']\n+            if a_username != \"\":\n+                username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username']\n+            if a_packname != \"\":\n+                pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized']\n+            if a_filename != \"\":\n+                original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename']\n+\n+    sort = search_prepare_sort(sort_unformatted, forms.SEARCH_SORT_OPTIONS_WEB)\n+\n+    logger.info(u'Search (%s)' % json.dumps({\n+        'ip': get_client_ip(request),\n+        'query': search_query,\n+        'filter': filter_query,\n+        'username': request.user.username,\n+        'page': current_page,\n+        'sort': sort[0],\n+        'group_by_pack': grouping,\n+        'advanced': json.dumps(advanced_search_params_dict) if advanced == \"1\" else \"\"\n+    }))\n+\n+    # # we send the query parameters in the context for clustering\n+    # query_params = {","path":"utils/search/search_general.py","position":170,"original_position":170,"commit_id":"93c2b933863b387f4d20bf4b17bbff6668a3cbb7","original_commit_id":"93c2b933863b387f4d20bf4b17bbff6668a3cbb7","user":{"login":"xavierfav","id":10927428,"node_id":"MDQ6VXNlcjEwOTI3NDI4","avatar_url":"https://avatars3.githubusercontent.com/u/10927428?v=4","gravatar_id":"","url":"https://api.github.com/users/xavierfav","html_url":"https://github.com/xavierfav","followers_url":"https://api.github.com/users/xavierfav/followers","following_url":"https://api.github.com/users/xavierfav/following{/other_user}","gists_url":"https://api.github.com/users/xavierfav/gists{/gist_id}","starred_url":"https://api.github.com/users/xavierfav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xavierfav/subscriptions","organizations_url":"https://api.github.com/users/xavierfav/orgs","repos_url":"https://api.github.com/users/xavierfav/repos","events_url":"https://api.github.com/users/xavierfav/events{/privacy}","received_events_url":"https://api.github.com/users/xavierfav/received_events","type":"User","site_admin":false},"body":"These are the parameters that I used to store.\r\nThey correspond to all the parameters need to perform the second step explained before (create Solr query object).","created_at":"2019-09-03T14:57:36Z","updated_at":"2019-09-03T14:57:36Z","html_url":"https://github.com/MTG/freesound/pull/1370#discussion_r320320043","pull_request_url":"https://api.github.com/repos/MTG/freesound/pulls/1370","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/MTG/freesound/pulls/comments/320320043"},"html":{"href":"https://github.com/MTG/freesound/pull/1370#discussion_r320320043"},"pull_request":{"href":"https://api.github.com/repos/MTG/freesound/pulls/1370"}}},"pull_request":{"url":"https://api.github.com/repos/MTG/freesound/pulls/1370","id":313629773,"node_id":"MDExOlB1bGxSZXF1ZXN0MzEzNjI5Nzcz","html_url":"https://github.com/MTG/freesound/pull/1370","diff_url":"https://github.com/MTG/freesound/pull/1370.diff","patch_url":"https://github.com/MTG/freesound/pull/1370.patch","issue_url":"https://api.github.com/repos/MTG/freesound/issues/1370","number":1370,"state":"open","locked":false,"title":"Compact query params","user":{"login":"xavierfav","id":10927428,"node_id":"MDQ6VXNlcjEwOTI3NDI4","avatar_url":"https://avatars3.githubusercontent.com/u/10927428?v=4","gravatar_id":"","url":"https://api.github.com/users/xavierfav","html_url":"https://github.com/xavierfav","followers_url":"https://api.github.com/users/xavierfav/followers","following_url":"https://api.github.com/users/xavierfav/following{/other_user}","gists_url":"https://api.github.com/users/xavierfav/gists{/gist_id}","starred_url":"https://api.github.com/users/xavierfav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xavierfav/subscriptions","organizations_url":"https://api.github.com/users/xavierfav/orgs","repos_url":"https://api.github.com/users/xavierfav/repos","events_url":"https://api.github.com/users/xavierfav/events{/privacy}","received_events_url":"https://api.github.com/users/xavierfav/received_events","type":"User","site_admin":false},"body":"This PR is a Work in Progress.\r\nThe aim is to iteratively discuss the development of the search result clustering engine into Freesound.\r\n\r\nIn this PR, I would like to address the issue of storing and exchanging the query parameters that define the query that a user submits to the search engine. The clustering engine needs to be able to perform the same query that was done for retrieving the results (but for top 1000 results).\r\nThe retrieval of sounds can be summarized as follow:\r\n- gather the url query parameters and **create all search parameters** (processing, include default params, etc...)\r\n- create a Solr query object\r\n- perform the Solr query\r\n\r\nThe idea is that some functions can be moved in utils/search/search_general.py, so we can reuse from the clustering engine.\r\n\r\nInitially, I was storing and passing from views context to HTML pages all the search parameters. A better alternative would be to share a minimal number of parameters, typically the one that are in the search url. \r\n\r\nIn this PR, I extract the query parameters as a string, which I then pass from views context to HTML pages and so on.\r\n\r\nComments on the code changes will be added in the PR.\r\n","created_at":"2019-09-03T14:48:46Z","updated_at":"2019-09-03T14:57:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3fc793992eefac6626518c94c8fd6f963740a8a2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/MTG/freesound/pulls/1370/commits","review_comments_url":"https://api.github.com/repos/MTG/freesound/pulls/1370/comments","review_comment_url":"https://api.github.com/repos/MTG/freesound/pulls/comments{/number}","comments_url":"https://api.github.com/repos/MTG/freesound/issues/1370/comments","statuses_url":"https://api.github.com/repos/MTG/freesound/statuses/93c2b933863b387f4d20bf4b17bbff6668a3cbb7","head":{"label":"xavierfav:compact-query-params","ref":"compact-query-params","sha":"93c2b933863b387f4d20bf4b17bbff6668a3cbb7","user":{"login":"xavierfav","id":10927428,"node_id":"MDQ6VXNlcjEwOTI3NDI4","avatar_url":"https://avatars3.githubusercontent.com/u/10927428?v=4","gravatar_id":"","url":"https://api.github.com/users/xavierfav","html_url":"https://github.com/xavierfav","followers_url":"https://api.github.com/users/xavierfav/followers","following_url":"https://api.github.com/users/xavierfav/following{/other_user}","gists_url":"https://api.github.com/users/xavierfav/gists{/gist_id}","starred_url":"https://api.github.com/users/xavierfav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xavierfav/subscriptions","organizations_url":"https://api.github.com/users/xavierfav/orgs","repos_url":"https://api.github.com/users/xavierfav/repos","events_url":"https://api.github.com/users/xavierfav/events{/privacy}","received_events_url":"https://api.github.com/users/xavierfav/received_events","type":"User","site_admin":false},"repo":{"id":165839122,"node_id":"MDEwOlJlcG9zaXRvcnkxNjU4MzkxMjI=","name":"freesound","full_name":"xavierfav/freesound","private":false,"owner":{"login":"xavierfav","id":10927428,"node_id":"MDQ6VXNlcjEwOTI3NDI4","avatar_url":"https://avatars3.githubusercontent.com/u/10927428?v=4","gravatar_id":"","url":"https://api.github.com/users/xavierfav","html_url":"https://github.com/xavierfav","followers_url":"https://api.github.com/users/xavierfav/followers","following_url":"https://api.github.com/users/xavierfav/following{/other_user}","gists_url":"https://api.github.com/users/xavierfav/gists{/gist_id}","starred_url":"https://api.github.com/users/xavierfav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xavierfav/subscriptions","organizations_url":"https://api.github.com/users/xavierfav/orgs","repos_url":"https://api.github.com/users/xavierfav/repos","events_url":"https://api.github.com/users/xavierfav/events{/privacy}","received_events_url":"https://api.github.com/users/xavierfav/received_events","type":"User","site_admin":false},"html_url":"https://github.com/xavierfav/freesound","description":"The Freesound website","fork":true,"url":"https://api.github.com/repos/xavierfav/freesound","forks_url":"https://api.github.com/repos/xavierfav/freesound/forks","keys_url":"https://api.github.com/repos/xavierfav/freesound/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xavierfav/freesound/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xavierfav/freesound/teams","hooks_url":"https://api.github.com/repos/xavierfav/freesound/hooks","issue_events_url":"https://api.github.com/repos/xavierfav/freesound/issues/events{/number}","events_url":"https://api.github.com/repos/xavierfav/freesound/events","assignees_url":"https://api.github.com/repos/xavierfav/freesound/assignees{/user}","branches_url":"https://api.github.com/repos/xavierfav/freesound/branches{/branch}","tags_url":"https://api.github.com/repos/xavierfav/freesound/tags","blobs_url":"https://api.github.com/repos/xavierfav/freesound/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xavierfav/freesound/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xavierfav/freesound/git/refs{/sha}","trees_url":"https://api.github.com/repos/xavierfav/freesound/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xavierfav/freesound/statuses/{sha}","languages_url":"https://api.github.com/repos/xavierfav/freesound/languages","stargazers_url":"https://api.github.com/repos/xavierfav/freesound/stargazers","contributors_url":"https://api.github.com/repos/xavierfav/freesound/contributors","subscribers_url":"https://api.github.com/repos/xavierfav/freesound/subscribers","subscription_url":"https://api.github.com/repos/xavierfav/freesound/subscription","commits_url":"https://api.github.com/repos/xavierfav/freesound/commits{/sha}","git_commits_url":"https://api.github.com/repos/xavierfav/freesound/git/commits{/sha}","comments_url":"https://api.github.com/repos/xavierfav/freesound/comments{/number}","issue_comment_url":"https://api.github.com/repos/xavierfav/freesound/issues/comments{/number}","contents_url":"https://api.github.com/repos/xavierfav/freesound/contents/{+path}","compare_url":"https://api.github.com/repos/xavierfav/freesound/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xavierfav/freesound/merges","archive_url":"https://api.github.com/repos/xavierfav/freesound/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xavierfav/freesound/downloads","issues_url":"https://api.github.com/repos/xavierfav/freesound/issues{/number}","pulls_url":"https://api.github.com/repos/xavierfav/freesound/pulls{/number}","milestones_url":"https://api.github.com/repos/xavierfav/freesound/milestones{/number}","notifications_url":"https://api.github.com/repos/xavierfav/freesound/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xavierfav/freesound/labels{/name}","releases_url":"https://api.github.com/repos/xavierfav/freesound/releases{/id}","deployments_url":"https://api.github.com/repos/xavierfav/freesound/deployments","created_at":"2019-01-15T11:26:46Z","updated_at":"2019-08-26T14:33:05Z","pushed_at":"2019-09-03T14:32:37Z","git_url":"git://github.com/xavierfav/freesound.git","ssh_url":"git@github.com:xavierfav/freesound.git","clone_url":"https://github.com/xavierfav/freesound.git","svn_url":"https://github.com/xavierfav/freesound","homepage":"https://freesound.org","size":60626,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"MTG:master","ref":"master","sha":"c6408275806560a477e44191bdd00c57b7df04c1","user":{"login":"MTG","id":2728938,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3Mjg5Mzg=","avatar_url":"https://avatars0.githubusercontent.com/u/2728938?v=4","gravatar_id":"","url":"https://api.github.com/users/MTG","html_url":"https://github.com/MTG","followers_url":"https://api.github.com/users/MTG/followers","following_url":"https://api.github.com/users/MTG/following{/other_user}","gists_url":"https://api.github.com/users/MTG/gists{/gist_id}","starred_url":"https://api.github.com/users/MTG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MTG/subscriptions","organizations_url":"https://api.github.com/users/MTG/orgs","repos_url":"https://api.github.com/users/MTG/repos","events_url":"https://api.github.com/users/MTG/events{/privacy}","received_events_url":"https://api.github.com/users/MTG/received_events","type":"Organization","site_admin":false},"repo":{"id":6583992,"node_id":"MDEwOlJlcG9zaXRvcnk2NTgzOTky","name":"freesound","full_name":"MTG/freesound","private":false,"owner":{"login":"MTG","id":2728938,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3Mjg5Mzg=","avatar_url":"https://avatars0.githubusercontent.com/u/2728938?v=4","gravatar_id":"","url":"https://api.github.com/users/MTG","html_url":"https://github.com/MTG","followers_url":"https://api.github.com/users/MTG/followers","following_url":"https://api.github.com/users/MTG/following{/other_user}","gists_url":"https://api.github.com/users/MTG/gists{/gist_id}","starred_url":"https://api.github.com/users/MTG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MTG/subscriptions","organizations_url":"https://api.github.com/users/MTG/orgs","repos_url":"https://api.github.com/users/MTG/repos","events_url":"https://api.github.com/users/MTG/events{/privacy}","received_events_url":"https://api.github.com/users/MTG/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/MTG/freesound","description":"The Freesound website","fork":false,"url":"https://api.github.com/repos/MTG/freesound","forks_url":"https://api.github.com/repos/MTG/freesound/forks","keys_url":"https://api.github.com/repos/MTG/freesound/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MTG/freesound/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MTG/freesound/teams","hooks_url":"https://api.github.com/repos/MTG/freesound/hooks","issue_events_url":"https://api.github.com/repos/MTG/freesound/issues/events{/number}","events_url":"https://api.github.com/repos/MTG/freesound/events","assignees_url":"https://api.github.com/repos/MTG/freesound/assignees{/user}","branches_url":"https://api.github.com/repos/MTG/freesound/branches{/branch}","tags_url":"https://api.github.com/repos/MTG/freesound/tags","blobs_url":"https://api.github.com/repos/MTG/freesound/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MTG/freesound/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MTG/freesound/git/refs{/sha}","trees_url":"https://api.github.com/repos/MTG/freesound/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MTG/freesound/statuses/{sha}","languages_url":"https://api.github.com/repos/MTG/freesound/languages","stargazers_url":"https://api.github.com/repos/MTG/freesound/stargazers","contributors_url":"https://api.github.com/repos/MTG/freesound/contributors","subscribers_url":"https://api.github.com/repos/MTG/freesound/subscribers","subscription_url":"https://api.github.com/repos/MTG/freesound/subscription","commits_url":"https://api.github.com/repos/MTG/freesound/commits{/sha}","git_commits_url":"https://api.github.com/repos/MTG/freesound/git/commits{/sha}","comments_url":"https://api.github.com/repos/MTG/freesound/comments{/number}","issue_comment_url":"https://api.github.com/repos/MTG/freesound/issues/comments{/number}","contents_url":"https://api.github.com/repos/MTG/freesound/contents/{+path}","compare_url":"https://api.github.com/repos/MTG/freesound/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MTG/freesound/merges","archive_url":"https://api.github.com/repos/MTG/freesound/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MTG/freesound/downloads","issues_url":"https://api.github.com/repos/MTG/freesound/issues{/number}","pulls_url":"https://api.github.com/repos/MTG/freesound/pulls{/number}","milestones_url":"https://api.github.com/repos/MTG/freesound/milestones{/number}","notifications_url":"https://api.github.com/repos/MTG/freesound/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MTG/freesound/labels{/name}","releases_url":"https://api.github.com/repos/MTG/freesound/releases{/id}","deployments_url":"https://api.github.com/repos/MTG/freesound/deployments","created_at":"2012-11-07T18:25:03Z","updated_at":"2019-08-13T15:11:27Z","pushed_at":"2019-09-03T14:48:47Z","git_url":"git://github.com/MTG/freesound.git","ssh_url":"git@github.com:MTG/freesound.git","clone_url":"https://github.com/MTG/freesound.git","svn_url":"https://github.com/MTG/freesound","homepage":"https://freesound.org","size":60576,"stargazers_count":175,"watchers_count":175,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":43,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":167,"license":null,"forks":43,"open_issues":167,"watchers":175,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/MTG/freesound/pulls/1370"},"html":{"href":"https://github.com/MTG/freesound/pull/1370"},"issue":{"href":"https://api.github.com/repos/MTG/freesound/issues/1370"},"comments":{"href":"https://api.github.com/repos/MTG/freesound/issues/1370/comments"},"review_comments":{"href":"https://api.github.com/repos/MTG/freesound/pulls/1370/comments"},"review_comment":{"href":"https://api.github.com/repos/MTG/freesound/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/MTG/freesound/pulls/1370/commits"},"statuses":{"href":"https://api.github.com/repos/MTG/freesound/statuses/93c2b933863b387f4d20bf4b17bbff6668a3cbb7"}},"author_association":"MEMBER"}}
other: {"actor":{"display_login":"xavierfav"}}