{"action":"created","comment":{"url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/comments/175263869","pull_request_review_id":104772296,"id":175263869,"diff_hunk":"@@ -0,0 +1,1116 @@\n+# -*- coding: utf-8 -*-\n+# vim: ts=4 sw=4 et\n+#\n+# Python MPV library module\n+# Copyright (C) 2017 Sebastian Götte <code@jaseg.net>\n+#\n+# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General\n+# Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any\n+# later version.\n+#\n+# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied\n+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more\n+# details.\n+#\n+# You should have received a copy of the GNU Affero General Public License along with this program.  If not, see\n+# <http://www.gnu.org/licenses/>.\n+#\n+\n+from __future__ import unicode_literals\n+from __future__ import print_function\n+from __future__ import division\n+from __future__ import absolute_import\n+from builtins import int\n+# from builtins import super\n+from builtins import range\n+from builtins import str\n+from future import standard_library\n+standard_library.install_aliases()\n+from builtins import object\n+from ctypes import *\n+import ctypes.util\n+import threading\n+import os\n+import sys\n+from warnings import warn\n+from functools import partial, wraps\n+import collections\n+import re\n+import traceback\n+\n+# from builtins import *\n+\n+if os.name == 'nt':\n+    backend = CDLL('mpv-1.dll')\n+    fs_enc = 'utf-8'\n+else:\n+    import locale\n+    lc, enc = locale.getlocale(locale.LC_NUMERIC)\n+    # libmpv requires LC_NUMERIC to be set to \"C\". Since messing with global variables everyone else relies upon is\n+    # still better than segfaulting, we are setting LC_NUMERIC to \"C\".\n+    locale.setlocale(locale.LC_NUMERIC, 'C')\n+\n+    sofile = ctypes.util.find_library('mpv')\n+    if sofile is None:\n+        raise OSError(\"Cannot find libmpv in the usual places. Depending on your distro, you may try installing an \"\n+                \"mpv-devel or mpv-libs package. If you have libmpv around but this script can't find it, maybe consult \"\n+                \"the documentation for ctypes.util.find_library which this script uses to look up the library \"\n+                \"filename.\")\n+    backend = CDLL(sofile)\n+    fs_enc = sys.getfilesystemencoding()\n+\n+\n+class MpvHandle(c_void_p):\n+    pass\n+\n+class MpvOpenGLCbContext(c_void_p):\n+    pass\n+\n+\n+class PropertyUnavailableError(AttributeError):\n+    pass\n+\n+class ErrorCode(object):\n+    \"\"\"For documentation on these, see mpv's libmpv/client.h.\"\"\"\n+    SUCCESS                 = 0\n+    EVENT_QUEUE_FULL        = -1\n+    NOMEM                   = -2\n+    UNINITIALIZED           = -3\n+    INVALID_PARAMETER       = -4\n+    OPTION_NOT_FOUND        = -5\n+    OPTION_FORMAT           = -6\n+    OPTION_ERROR            = -7\n+    PROPERTY_NOT_FOUND      = -8\n+    PROPERTY_FORMAT         = -9\n+    PROPERTY_UNAVAILABLE    = -10\n+    PROPERTY_ERROR          = -11\n+    COMMAND                 = -12\n+\n+    EXCEPTION_DICT = {\n+             0:     None,\n+            -1:     lambda *a: MemoryError('mpv event queue full', *a),\n+            -2:     lambda *a: MemoryError('mpv cannot allocate memory', *a),\n+            -3:     lambda *a: ValueError('Uninitialized mpv handle used', *a),\n+            -4:     lambda *a: ValueError('Invalid value for mpv parameter', *a),\n+            -5:     lambda *a: AttributeError('mpv option does not exist', *a),\n+            -6:     lambda *a: TypeError('Tried to set mpv option using wrong format', *a),\n+            -7:     lambda *a: ValueError('Invalid value for mpv option', *a),\n+            -8:     lambda *a: AttributeError('mpv property does not exist', *a),\n+            # Currently (mpv 0.18.1) there is a bug causing a PROPERTY_FORMAT error to be returned instead of\n+            # INVALID_PARAMETER when setting a property-mapped option to an invalid value.\n+            -9:     lambda *a: TypeError('Tried to get/set mpv property using wrong format, or passed invalid value', *a),\n+            -10:    lambda *a: PropertyUnavailableError('mpv property is not available', *a),\n+            -11:    lambda *a: RuntimeError('Generic error getting or setting mpv property', *a),\n+            -12:    lambda *a: SystemError('Error running mpv command', *a) }\n+\n+    @staticmethod\n+    def default_error_handler(ec, *args):\n+        return ValueError(_mpv_error_string(ec).decode('utf-8'), ec, *args)\n+\n+    @classmethod\n+    def raise_for_ec(kls, ec, func, *args):\n+        ec = 0 if ec > 0 else ec\n+        ex = kls.EXCEPTION_DICT.get(ec , kls.default_error_handler)\n+        if ex:\n+            raise ex(ec, *args)\n+\n+\n+class MpvFormat(c_int):\n+    NONE        = 0\n+    STRING      = 1\n+    OSD_STRING  = 2\n+    FLAG        = 3\n+    INT64       = 4\n+    DOUBLE      = 5\n+    NODE        = 6\n+    NODE_ARRAY  = 7\n+    NODE_MAP    = 8\n+    BYTE_ARRAY  = 9\n+\n+    def __eq__(self, other):\n+        return self is other or self.value == other or self.value == int(other)\n+\n+    def __repr__(self):\n+        return ['NONE', 'STRING', 'OSD_STRING', 'FLAG', 'INT64', 'DOUBLE', 'NODE', 'NODE_ARRAY', 'NODE_MAP',\n+                'BYTE_ARRAY'][self.value]\n+\n+    def __hash__(self):\n+        return self.value\n+\n+\n+class MpvEventID(c_int):\n+    NONE                    = 0\n+    SHUTDOWN                = 1\n+    LOG_MESSAGE             = 2\n+    GET_PROPERTY_REPLY      = 3\n+    SET_PROPERTY_REPLY      = 4\n+    COMMAND_REPLY           = 5\n+    START_FILE              = 6\n+    END_FILE                = 7\n+    FILE_LOADED             = 8\n+    TRACKS_CHANGED          = 9\n+    TRACK_SWITCHED          = 10\n+    IDLE                    = 11\n+    PAUSE                   = 12\n+    UNPAUSE                 = 13\n+    TICK                    = 14\n+    SCRIPT_INPUT_DISPATCH   = 15\n+    CLIENT_MESSAGE          = 16\n+    VIDEO_RECONFIG          = 17\n+    AUDIO_RECONFIG          = 18\n+    METADATA_UPDATE         = 19\n+    SEEK                    = 20\n+    PLAYBACK_RESTART        = 21\n+    PROPERTY_CHANGE         = 22\n+    CHAPTER_CHANGE          = 23\n+\n+    ANY = ( SHUTDOWN, LOG_MESSAGE, GET_PROPERTY_REPLY, SET_PROPERTY_REPLY, COMMAND_REPLY, START_FILE, END_FILE,\n+            FILE_LOADED, TRACKS_CHANGED, TRACK_SWITCHED, IDLE, PAUSE, UNPAUSE, TICK, SCRIPT_INPUT_DISPATCH,\n+            CLIENT_MESSAGE, VIDEO_RECONFIG, AUDIO_RECONFIG, METADATA_UPDATE, SEEK, PLAYBACK_RESTART, PROPERTY_CHANGE,\n+            CHAPTER_CHANGE )\n+\n+    def __repr__(self):\n+        return ['NONE', 'SHUTDOWN', 'LOG_MESSAGE', 'GET_PROPERTY_REPLY', 'SET_PROPERTY_REPLY', 'COMMAND_REPLY',\n+                'START_FILE', 'END_FILE', 'FILE_LOADED', 'TRACKS_CHANGED', 'TRACK_SWITCHED', 'IDLE', 'PAUSE', 'UNPAUSE',\n+                'TICK', 'SCRIPT_INPUT_DISPATCH', 'CLIENT_MESSAGE', 'VIDEO_RECONFIG', 'AUDIO_RECONFIG',\n+                'METADATA_UPDATE', 'SEEK', 'PLAYBACK_RESTART', 'PROPERTY_CHANGE', 'CHAPTER_CHANGE'][self.value]","path":"mycroft/audio/services/mpv/mpv_lib.py","position":176,"original_position":176,"commit_id":"a2ec6b994959094d5c10cf34a0bb1214e8213138","original_commit_id":"a2ec6b994959094d5c10cf34a0bb1214e8213138","user":{"login":"codacy-bot","id":19940114,"avatar_url":"https://avatars1.githubusercontent.com/u/19940114?v=4","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [Sequence index is not an int, slice, or instance with __index__](https://app.codacy.com/app/MatthewScholefield/mycroft-core/pullRequest?prid=1443864)","created_at":"2018-03-17T17:10:19Z","updated_at":"2018-03-17T17:10:19Z","html_url":"https://github.com/MycroftAI/mycroft-core/pull/1489#discussion_r175263869","pull_request_url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/comments/175263869"},"html":{"href":"https://github.com/MycroftAI/mycroft-core/pull/1489#discussion_r175263869"},"pull_request":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489"}}},"pull_request":{"url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489","id":175710357,"html_url":"https://github.com/MycroftAI/mycroft-core/pull/1489","diff_url":"https://github.com/MycroftAI/mycroft-core/pull/1489.diff","patch_url":"https://github.com/MycroftAI/mycroft-core/pull/1489.patch","issue_url":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/1489","number":1489,"state":"open","locked":false,"title":"Feature mpv audio backend","user":{"login":"JarbasAl","id":33701864,"avatar_url":"https://avatars0.githubusercontent.com/u/33701864?v=4","gravatar_id":"","url":"https://api.github.com/users/JarbasAl","html_url":"https://github.com/JarbasAl","followers_url":"https://api.github.com/users/JarbasAl/followers","following_url":"https://api.github.com/users/JarbasAl/following{/other_user}","gists_url":"https://api.github.com/users/JarbasAl/gists{/gist_id}","starred_url":"https://api.github.com/users/JarbasAl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JarbasAl/subscriptions","organizations_url":"https://api.github.com/users/JarbasAl/orgs","repos_url":"https://api.github.com/users/JarbasAl/repos","events_url":"https://api.github.com/users/JarbasAl/events{/privacy}","received_events_url":"https://api.github.com/users/JarbasAl/received_events","type":"User","site_admin":false},"body":"## Description\r\n\r\nAdds mpv audio backend, needs clean shutdown or the audio may keep playing even if you stop mycroft #1488 \r\n\r\ni used https://github.com/jaseg/python-mpv however it does not work in py2 (and i didnt test in py3) therefore i include a changed version in this PR\r\n\r\n## How to test\r\n\r\nChange your config file \r\n\r\n```\r\n\"Audio\": {\r\n    \"backends\": {\r\n      \"local\": {\r\n        \"type\": \"mpg123\",\r\n        \"active\": true\r\n      },\r\n      \"vlc\": {\r\n        \"type\": \"vlc\",\r\n        \"active\": true\r\n      },\r\n      \"mpv\": {\r\n        \"type\": \"mpv\",\r\n        \"active\": true\r\n      }\r\n    },\r\n    \"default-backend\": \"mpv\"\r\n  }\r\n```\r\ninstall mpv\r\n\r\n`sudo apt-get install mpv`\r\n\r\nuse some skill with audio, works well with youtube skill\r\n\r\n## Contributor license agreement signed?\r\nCLA [yes ] (Whether you have signed a [CLA - Contributor Licensing Agreement](https://mycroft.ai/cla/)\r\n","created_at":"2018-03-17T17:06:16Z","updated_at":"2018-03-17T17:10:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7e068c5732b7973a03140a4b3288b2deacfe3747","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489/commits","review_comments_url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489/comments","review_comment_url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/1489/comments","statuses_url":"https://api.github.com/repos/MycroftAI/mycroft-core/statuses/a2ec6b994959094d5c10cf34a0bb1214e8213138","head":{"label":"JarbasAl:feature_mpv_audiobackend","ref":"feature_mpv_audiobackend","sha":"a2ec6b994959094d5c10cf34a0bb1214e8213138","user":{"login":"JarbasAl","id":33701864,"avatar_url":"https://avatars0.githubusercontent.com/u/33701864?v=4","gravatar_id":"","url":"https://api.github.com/users/JarbasAl","html_url":"https://github.com/JarbasAl","followers_url":"https://api.github.com/users/JarbasAl/followers","following_url":"https://api.github.com/users/JarbasAl/following{/other_user}","gists_url":"https://api.github.com/users/JarbasAl/gists{/gist_id}","starred_url":"https://api.github.com/users/JarbasAl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JarbasAl/subscriptions","organizations_url":"https://api.github.com/users/JarbasAl/orgs","repos_url":"https://api.github.com/users/JarbasAl/repos","events_url":"https://api.github.com/users/JarbasAl/events{/privacy}","received_events_url":"https://api.github.com/users/JarbasAl/received_events","type":"User","site_admin":false},"repo":{"id":110881871,"name":"jarbas-core","full_name":"JarbasAl/jarbas-core","owner":{"login":"JarbasAl","id":33701864,"avatar_url":"https://avatars0.githubusercontent.com/u/33701864?v=4","gravatar_id":"","url":"https://api.github.com/users/JarbasAl","html_url":"https://github.com/JarbasAl","followers_url":"https://api.github.com/users/JarbasAl/followers","following_url":"https://api.github.com/users/JarbasAl/following{/other_user}","gists_url":"https://api.github.com/users/JarbasAl/gists{/gist_id}","starred_url":"https://api.github.com/users/JarbasAl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JarbasAl/subscriptions","organizations_url":"https://api.github.com/users/JarbasAl/orgs","repos_url":"https://api.github.com/users/JarbasAl/repos","events_url":"https://api.github.com/users/JarbasAl/events{/privacy}","received_events_url":"https://api.github.com/users/JarbasAl/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/JarbasAl/jarbas-core","description":"Mycroft Core, the Mycroft Artificial Intelligence platform.","fork":true,"url":"https://api.github.com/repos/JarbasAl/jarbas-core","forks_url":"https://api.github.com/repos/JarbasAl/jarbas-core/forks","keys_url":"https://api.github.com/repos/JarbasAl/jarbas-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JarbasAl/jarbas-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JarbasAl/jarbas-core/teams","hooks_url":"https://api.github.com/repos/JarbasAl/jarbas-core/hooks","issue_events_url":"https://api.github.com/repos/JarbasAl/jarbas-core/issues/events{/number}","events_url":"https://api.github.com/repos/JarbasAl/jarbas-core/events","assignees_url":"https://api.github.com/repos/JarbasAl/jarbas-core/assignees{/user}","branches_url":"https://api.github.com/repos/JarbasAl/jarbas-core/branches{/branch}","tags_url":"https://api.github.com/repos/JarbasAl/jarbas-core/tags","blobs_url":"https://api.github.com/repos/JarbasAl/jarbas-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JarbasAl/jarbas-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JarbasAl/jarbas-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/JarbasAl/jarbas-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JarbasAl/jarbas-core/statuses/{sha}","languages_url":"https://api.github.com/repos/JarbasAl/jarbas-core/languages","stargazers_url":"https://api.github.com/repos/JarbasAl/jarbas-core/stargazers","contributors_url":"https://api.github.com/repos/JarbasAl/jarbas-core/contributors","subscribers_url":"https://api.github.com/repos/JarbasAl/jarbas-core/subscribers","subscription_url":"https://api.github.com/repos/JarbasAl/jarbas-core/subscription","commits_url":"https://api.github.com/repos/JarbasAl/jarbas-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/JarbasAl/jarbas-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/JarbasAl/jarbas-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/JarbasAl/jarbas-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/JarbasAl/jarbas-core/contents/{+path}","compare_url":"https://api.github.com/repos/JarbasAl/jarbas-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JarbasAl/jarbas-core/merges","archive_url":"https://api.github.com/repos/JarbasAl/jarbas-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JarbasAl/jarbas-core/downloads","issues_url":"https://api.github.com/repos/JarbasAl/jarbas-core/issues{/number}","pulls_url":"https://api.github.com/repos/JarbasAl/jarbas-core/pulls{/number}","milestones_url":"https://api.github.com/repos/JarbasAl/jarbas-core/milestones{/number}","notifications_url":"https://api.github.com/repos/JarbasAl/jarbas-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JarbasAl/jarbas-core/labels{/name}","releases_url":"https://api.github.com/repos/JarbasAl/jarbas-core/releases{/id}","deployments_url":"https://api.github.com/repos/JarbasAl/jarbas-core/deployments","created_at":"2017-11-15T20:17:26Z","updated_at":"2018-03-15T04:36:00Z","pushed_at":"2018-03-17T17:00:17Z","git_url":"git://github.com/JarbasAl/jarbas-core.git","ssh_url":"git@github.com:JarbasAl/jarbas-core.git","clone_url":"https://github.com/JarbasAl/jarbas-core.git","svn_url":"https://github.com/JarbasAl/jarbas-core","homepage":"https://mycroft.ai","size":219424,"stargazers_count":8,"watchers_count":8,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":2,"open_issues":0,"watchers":8,"default_branch":"jarbas-dev"}},"base":{"label":"MycroftAI:dev","ref":"dev","sha":"e66ddd669f815b6f8074a3afb5d8443622e815a2","user":{"login":"MycroftAI","id":14171097,"avatar_url":"https://avatars0.githubusercontent.com/u/14171097?v=4","gravatar_id":"","url":"https://api.github.com/users/MycroftAI","html_url":"https://github.com/MycroftAI","followers_url":"https://api.github.com/users/MycroftAI/followers","following_url":"https://api.github.com/users/MycroftAI/following{/other_user}","gists_url":"https://api.github.com/users/MycroftAI/gists{/gist_id}","starred_url":"https://api.github.com/users/MycroftAI/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MycroftAI/subscriptions","organizations_url":"https://api.github.com/users/MycroftAI/orgs","repos_url":"https://api.github.com/users/MycroftAI/repos","events_url":"https://api.github.com/users/MycroftAI/events{/privacy}","received_events_url":"https://api.github.com/users/MycroftAI/received_events","type":"Organization","site_admin":false},"repo":{"id":59299524,"name":"mycroft-core","full_name":"MycroftAI/mycroft-core","owner":{"login":"MycroftAI","id":14171097,"avatar_url":"https://avatars0.githubusercontent.com/u/14171097?v=4","gravatar_id":"","url":"https://api.github.com/users/MycroftAI","html_url":"https://github.com/MycroftAI","followers_url":"https://api.github.com/users/MycroftAI/followers","following_url":"https://api.github.com/users/MycroftAI/following{/other_user}","gists_url":"https://api.github.com/users/MycroftAI/gists{/gist_id}","starred_url":"https://api.github.com/users/MycroftAI/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MycroftAI/subscriptions","organizations_url":"https://api.github.com/users/MycroftAI/orgs","repos_url":"https://api.github.com/users/MycroftAI/repos","events_url":"https://api.github.com/users/MycroftAI/events{/privacy}","received_events_url":"https://api.github.com/users/MycroftAI/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/MycroftAI/mycroft-core","description":"Mycroft Core, the Mycroft Artificial Intelligence platform.","fork":false,"url":"https://api.github.com/repos/MycroftAI/mycroft-core","forks_url":"https://api.github.com/repos/MycroftAI/mycroft-core/forks","keys_url":"https://api.github.com/repos/MycroftAI/mycroft-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MycroftAI/mycroft-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MycroftAI/mycroft-core/teams","hooks_url":"https://api.github.com/repos/MycroftAI/mycroft-core/hooks","issue_events_url":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/events{/number}","events_url":"https://api.github.com/repos/MycroftAI/mycroft-core/events","assignees_url":"https://api.github.com/repos/MycroftAI/mycroft-core/assignees{/user}","branches_url":"https://api.github.com/repos/MycroftAI/mycroft-core/branches{/branch}","tags_url":"https://api.github.com/repos/MycroftAI/mycroft-core/tags","blobs_url":"https://api.github.com/repos/MycroftAI/mycroft-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MycroftAI/mycroft-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MycroftAI/mycroft-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/MycroftAI/mycroft-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MycroftAI/mycroft-core/statuses/{sha}","languages_url":"https://api.github.com/repos/MycroftAI/mycroft-core/languages","stargazers_url":"https://api.github.com/repos/MycroftAI/mycroft-core/stargazers","contributors_url":"https://api.github.com/repos/MycroftAI/mycroft-core/contributors","subscribers_url":"https://api.github.com/repos/MycroftAI/mycroft-core/subscribers","subscription_url":"https://api.github.com/repos/MycroftAI/mycroft-core/subscription","commits_url":"https://api.github.com/repos/MycroftAI/mycroft-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/MycroftAI/mycroft-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/MycroftAI/mycroft-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/MycroftAI/mycroft-core/contents/{+path}","compare_url":"https://api.github.com/repos/MycroftAI/mycroft-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MycroftAI/mycroft-core/merges","archive_url":"https://api.github.com/repos/MycroftAI/mycroft-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MycroftAI/mycroft-core/downloads","issues_url":"https://api.github.com/repos/MycroftAI/mycroft-core/issues{/number}","pulls_url":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls{/number}","milestones_url":"https://api.github.com/repos/MycroftAI/mycroft-core/milestones{/number}","notifications_url":"https://api.github.com/repos/MycroftAI/mycroft-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MycroftAI/mycroft-core/labels{/name}","releases_url":"https://api.github.com/repos/MycroftAI/mycroft-core/releases{/id}","deployments_url":"https://api.github.com/repos/MycroftAI/mycroft-core/deployments","created_at":"2016-05-20T14:11:07Z","updated_at":"2018-03-16T21:13:22Z","pushed_at":"2018-03-17T17:06:17Z","git_url":"git://github.com/MycroftAI/mycroft-core.git","ssh_url":"git@github.com:MycroftAI/mycroft-core.git","clone_url":"https://github.com/MycroftAI/mycroft-core.git","svn_url":"https://github.com/MycroftAI/mycroft-core","homepage":"https://mycroft.ai","size":121456,"stargazers_count":2147,"watchers_count":2147,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":532,"mirror_url":null,"archived":false,"open_issues_count":184,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":532,"open_issues":184,"watchers":2147,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489"},"html":{"href":"https://github.com/MycroftAI/mycroft-core/pull/1489"},"issue":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/1489"},"comments":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/issues/1489/comments"},"review_comments":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489/comments"},"review_comment":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/pulls/1489/commits"},"statuses":{"href":"https://api.github.com/repos/MycroftAI/mycroft-core/statuses/a2ec6b994959094d5c10cf34a0bb1214e8213138"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"codacy-bot"}}