{"action":"created","comment":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/171377004","pull_request_review_id":100218847,"id":171377004,"diff_hunk":"@@ -0,0 +1,264 @@\n+\"\"\"\n+Proxy camera platform that enables image processing of camera data.\n+\n+For more details about this platform, please refer to the documentation\n+https://home-assistant.io/components/proxy\n+\"\"\"\n+import logging\n+import asyncio\n+import aiohttp\n+import async_timeout\n+\n+import voluptuous as vol\n+\n+from homeassistant.util.async import run_coroutine_threadsafe\n+from homeassistant.helpers import config_validation as cv\n+import homeassistant.util.dt as dt_util\n+from homeassistant.const import (\n+    CONF_NAME, CONF_ENTITY_ID, HTTP_HEADER_HA_AUTH)\n+from homeassistant.components.camera import (\n+    PLATFORM_SCHEMA, Camera)\n+from homeassistant.helpers.aiohttp_client import (\n+    async_get_clientsession, async_aiohttp_proxy_web)\n+\n+REQUIREMENTS = ['pillow==5.0.0']\n+\n+_LOGGER = logging.getLogger(__name__)\n+\n+CONF_MAX_IMAGE_WIDTH = \"max_image_width\"\n+CONF_IMAGE_QUALITY = \"image_quality\"\n+CONF_IMAGE_REFRESH_RATE = \"image_refresh_rate\"\n+CONF_FORCE_RESIZE = \"force_resize\"\n+CONF_MAX_STREAM_WIDTH = \"max_stream_width\"\n+CONF_STREAM_QUALITY = \"stream_quality\"\n+CONF_CACHE_IMAGES = \"cache_images\"\n+\n+DEFAULT_BASENAME = \"Camera Proxy\"\n+DEFAULT_QUALITY = 75\n+\n+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({\n+    vol.Required(CONF_ENTITY_ID): cv.entity_id,\n+    vol.Optional(CONF_NAME): cv.string,\n+    vol.Optional(CONF_MAX_IMAGE_WIDTH): int,\n+    vol.Optional(CONF_IMAGE_QUALITY): int,\n+    vol.Optional(CONF_IMAGE_REFRESH_RATE): float,\n+    vol.Optional(CONF_FORCE_RESIZE, False): cv.boolean,\n+    vol.Optional(CONF_CACHE_IMAGES, False): cv.boolean,\n+    vol.Optional(CONF_MAX_STREAM_WIDTH): int,\n+    vol.Optional(CONF_STREAM_QUALITY): int,\n+})\n+\n+\n+@asyncio.coroutine\n+def async_setup_platform(hass, config, async_add_devices, discovery_info=None):\n+    \"\"\"Set up the Proxy camera platform.\"\"\"\n+    async_add_devices([ProxyCamera(hass, config)])\n+\n+    return True\n+\n+\n+@asyncio.coroutine\n+def _read_frame(req):\n+    \"\"\"Read a single frame from an MJPEG stream.\"\"\"\n+    # based on https://gist.github.com/russss/1143799\n+    import cgi\n+    # Read in HTTP headers:\n+    stream = req.content\n+    # multipart/x-mixed-replace; boundary=--frameboundary\n+    _mimetype, options = cgi.parse_header(req.headers['content-type'])\n+    boundary = options.get('boundary').encode('utf-8')\n+    if not boundary:\n+        _LOGGER.error(\"Malformed MJPEG missing boundary\")\n+        raise Exception(\"Can't find content-type\")\n+\n+    line = yield from stream.readline()\n+    # Seek ahead to the first chunk\n+    while line.strip() != boundary:\n+        line = yield from stream.readline()\n+    # Read in chunk headers\n+    while line.strip() != b'':\n+        parts = line.split(b':')\n+        if len(parts) > 1 and parts[0].lower() == b'content-length':\n+            # Grab chunk length\n+            length = int(parts[1].strip())\n+        line = yield from stream.readline()\n+    image = yield from stream.read(length)\n+    return image\n+\n+\n+def _resize_image(image, opts):\n+    \"\"\"Resize image.\"\"\"\n+    from PIL import Image\n+    import io\n+\n+    if not opts:\n+        return image\n+\n+    quality = opts.quality if opts.quality else DEFAULT_QUALITY\n+    new_width = opts.max_width\n+\n+    img = Image.open(io.BytesIO(image))\n+    imgfmt = str(img.format)\n+    if imgfmt != 'PNG' and imgfmt != 'JPEG':\n+        _LOGGER.debug(\"Image is of unsupported type: %s\", imgfmt)\n+        return image\n+\n+    (old_width, old_height) = img.size\n+    old_size = len(image)\n+    if old_width <= new_width:\n+        if opts.quality is None:\n+            _LOGGER.debug(\"Image is smaller-than / equal-to requested width\")\n+            return image\n+        new_width = old_width\n+\n+    scale = new_width / float(old_width)\n+    new_height = int((float(old_height)*float(scale)))\n+\n+    img = img.resize((new_width, new_height), Image.ANTIALIAS)\n+    imgbuf = io.BytesIO()\n+    img.save(imgbuf, \"JPEG\", optimize=True, quality=quality)\n+    newimage = imgbuf.getvalue()\n+    if not opts.force_resize and len(newimage) >= old_size:\n+        _LOGGER.debug(\"Using original image(%d bytes) \"\n+                      \"because resized image (%d bytes) is not smaller\",\n+                      old_size, len(newimage))\n+        return image\n+\n+    _LOGGER.debug(\"Resized image \"\n+                  \"from (%dx%d - %d bytes) \"\n+                  \"to (%dx%d - %d bytes)\",\n+                  old_width, old_height, old_size,\n+                  new_width, new_height, len(newimage))\n+    return newimage\n+\n+\n+class ImageOpts():","path":"homeassistant/components/camera/proxy.py","position":135,"original_position":135,"commit_id":"cc17067cc87fbe0cf03ebfcd9702f413c9000b39","original_commit_id":"cc17067cc87fbe0cf03ebfcd9702f413c9000b39","user":{"login":"balloob","id":1444314,"avatar_url":"https://avatars3.githubusercontent.com/u/1444314?v=4","gravatar_id":"","url":"https://api.github.com/users/balloob","html_url":"https://github.com/balloob","followers_url":"https://api.github.com/users/balloob/followers","following_url":"https://api.github.com/users/balloob/following{/other_user}","gists_url":"https://api.github.com/users/balloob/gists{/gist_id}","starred_url":"https://api.github.com/users/balloob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/balloob/subscriptions","organizations_url":"https://api.github.com/users/balloob/orgs","repos_url":"https://api.github.com/users/balloob/repos","events_url":"https://api.github.com/users/balloob/events{/privacy}","received_events_url":"https://api.github.com/users/balloob/received_events","type":"User","site_admin":false},"body":"You can optionally use the `attrs` package which is installed as part of Home Assistant core","created_at":"2018-02-28T20:35:12Z","updated_at":"2018-02-28T20:35:13Z","html_url":"https://github.com/home-assistant/home-assistant/pull/12006#discussion_r171377004","pull_request_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments/171377004"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/12006#discussion_r171377004"},"pull_request":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006"}}},"pull_request":{"url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006","id":165580213,"html_url":"https://github.com/home-assistant/home-assistant/pull/12006","diff_url":"https://github.com/home-assistant/home-assistant/pull/12006.diff","patch_url":"https://github.com/home-assistant/home-assistant/pull/12006.patch","issue_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/12006","number":12006,"state":"open","locked":false,"title":"Add camera proxy","user":{"login":"PhracturedBlue","id":3126449,"avatar_url":"https://avatars1.githubusercontent.com/u/3126449?v=4","gravatar_id":"","url":"https://api.github.com/users/PhracturedBlue","html_url":"https://github.com/PhracturedBlue","followers_url":"https://api.github.com/users/PhracturedBlue/followers","following_url":"https://api.github.com/users/PhracturedBlue/following{/other_user}","gists_url":"https://api.github.com/users/PhracturedBlue/gists{/gist_id}","starred_url":"https://api.github.com/users/PhracturedBlue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhracturedBlue/subscriptions","organizations_url":"https://api.github.com/users/PhracturedBlue/orgs","repos_url":"https://api.github.com/users/PhracturedBlue/repos","events_url":"https://api.github.com/users/PhracturedBlue/events{/privacy}","received_events_url":"https://api.github.com/users/PhracturedBlue/received_events","type":"User","site_admin":false},"body":"## Description:\r\nAs per discussion in #11577, this is an implementation of a camera proxy.  Its primary purpose is to reduce the bandwidth utilization of streaming images to the frontend.\r\n\r\nNote that this does not implement dynamic sizing as requested by the frontend as that part of #11577 was more controversial.  I may try to implement that capability in a separate patch in the future.\r\n\r\n**Pull request in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io) with documentation (if applicable):** home-assistant/home-assistant.github.io#<home-assistant.github.io PR number goes here>\r\n\r\n## Example entry for `configuration.yaml` (if applicable):\r\n```yaml\r\ncamera:\r\n  - platform: foscam\r\n    ip: xx.xx.xx.xx\r\n  - platform: proxy\r\n    entity_id: camera.proxy\r\n    max_stream_width: 360\r\n    max_image_width: 480\r\n    stream_quality: 60\r\n    image_refresh_rate: 10\r\n```\r\n\r\n## Checklist:\r\n  - [x] The code change is tested and works locally.\r\n\r\nIf user exposed functionality or configuration variables are added/changed:\r\n  - [ ] Documentation added/updated in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io)\r\n\r\nIf the code communicates with devices, web services, or third-party tools:\r\n  - [x] Local tests with `tox` run successfully. **Your PR cannot be merged unless tests pass**\r\n  - [x] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).\r\n  - [x] New dependencies are only imported inside functions that use them ([example][ex-import]).\r\n  - [x] New dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.\r\n  - [ ] New files were added to `.coveragerc`.\r\n\r\nIf the code does not interact with devices:\r\n  - [ ] Local tests with `tox` run successfully. **Your PR cannot be merged unless tests pass**\r\n  - [ ] Tests have been added to verify that the new code works.\r\n\r\n","created_at":"2018-01-28T18:29:31Z","updated_at":"2018-02-28T20:35:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"05ff45fe35c8b65c4d4f4f8381d7ea6f3a75d9fd","assignee":null,"assignees":[],"requested_reviewers":[{"login":"andrey-git","id":5478779,"avatar_url":"https://avatars0.githubusercontent.com/u/5478779?v=4","gravatar_id":"","url":"https://api.github.com/users/andrey-git","html_url":"https://github.com/andrey-git","followers_url":"https://api.github.com/users/andrey-git/followers","following_url":"https://api.github.com/users/andrey-git/following{/other_user}","gists_url":"https://api.github.com/users/andrey-git/gists{/gist_id}","starred_url":"https://api.github.com/users/andrey-git/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrey-git/subscriptions","organizations_url":"https://api.github.com/users/andrey-git/orgs","repos_url":"https://api.github.com/users/andrey-git/repos","events_url":"https://api.github.com/users/andrey-git/events{/privacy}","received_events_url":"https://api.github.com/users/andrey-git/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":527871105,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/cla-signed","name":"cla-signed","color":"008000","default":false},{"id":526146744,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/new-platform","name":"new-platform","color":"ededed","default":false},{"id":819281976,"url":"https://api.github.com/repos/home-assistant/home-assistant/labels/platform:%20camera.proxy","name":"platform: camera.proxy","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006/commits","review_comments_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006/comments","review_comment_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments{/number}","comments_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/12006/comments","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/cc17067cc87fbe0cf03ebfcd9702f413c9000b39","head":{"label":"PhracturedBlue:camera2","ref":"camera2","sha":"cc17067cc87fbe0cf03ebfcd9702f413c9000b39","user":{"login":"PhracturedBlue","id":3126449,"avatar_url":"https://avatars1.githubusercontent.com/u/3126449?v=4","gravatar_id":"","url":"https://api.github.com/users/PhracturedBlue","html_url":"https://github.com/PhracturedBlue","followers_url":"https://api.github.com/users/PhracturedBlue/followers","following_url":"https://api.github.com/users/PhracturedBlue/following{/other_user}","gists_url":"https://api.github.com/users/PhracturedBlue/gists{/gist_id}","starred_url":"https://api.github.com/users/PhracturedBlue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhracturedBlue/subscriptions","organizations_url":"https://api.github.com/users/PhracturedBlue/orgs","repos_url":"https://api.github.com/users/PhracturedBlue/repos","events_url":"https://api.github.com/users/PhracturedBlue/events{/privacy}","received_events_url":"https://api.github.com/users/PhracturedBlue/received_events","type":"User","site_admin":false},"repo":{"id":93423461,"name":"home-assistant","full_name":"PhracturedBlue/home-assistant","owner":{"login":"PhracturedBlue","id":3126449,"avatar_url":"https://avatars1.githubusercontent.com/u/3126449?v=4","gravatar_id":"","url":"https://api.github.com/users/PhracturedBlue","html_url":"https://github.com/PhracturedBlue","followers_url":"https://api.github.com/users/PhracturedBlue/followers","following_url":"https://api.github.com/users/PhracturedBlue/following{/other_user}","gists_url":"https://api.github.com/users/PhracturedBlue/gists{/gist_id}","starred_url":"https://api.github.com/users/PhracturedBlue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhracturedBlue/subscriptions","organizations_url":"https://api.github.com/users/PhracturedBlue/orgs","repos_url":"https://api.github.com/users/PhracturedBlue/repos","events_url":"https://api.github.com/users/PhracturedBlue/events{/privacy}","received_events_url":"https://api.github.com/users/PhracturedBlue/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/PhracturedBlue/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","fork":true,"url":"https://api.github.com/repos/PhracturedBlue/home-assistant","forks_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/forks","keys_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/teams","hooks_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/events","assignees_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/tags","blobs_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/languages","stargazers_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/subscription","commits_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/merges","archive_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/downloads","issues_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/PhracturedBlue/home-assistant/deployments","created_at":"2017-06-05T16:19:53Z","updated_at":"2017-06-05T16:19:59Z","pushed_at":"2018-02-07T23:05:20Z","git_url":"git://github.com/PhracturedBlue/home-assistant.git","ssh_url":"git@github.com:PhracturedBlue/home-assistant.git","clone_url":"https://github.com/PhracturedBlue/home-assistant.git","svn_url":"https://github.com/PhracturedBlue/home-assistant","homepage":"https://home-assistant.io","size":78102,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"home-assistant:dev","ref":"dev","sha":"1d2e930900dbf78ec6b80359c10088160f0d6291","user":{"login":"home-assistant","id":13844975,"avatar_url":"https://avatars3.githubusercontent.com/u/13844975?v=4","gravatar_id":"","url":"https://api.github.com/users/home-assistant","html_url":"https://github.com/home-assistant","followers_url":"https://api.github.com/users/home-assistant/followers","following_url":"https://api.github.com/users/home-assistant/following{/other_user}","gists_url":"https://api.github.com/users/home-assistant/gists{/gist_id}","starred_url":"https://api.github.com/users/home-assistant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/home-assistant/subscriptions","organizations_url":"https://api.github.com/users/home-assistant/orgs","repos_url":"https://api.github.com/users/home-assistant/repos","events_url":"https://api.github.com/users/home-assistant/events{/privacy}","received_events_url":"https://api.github.com/users/home-assistant/received_events","type":"Organization","site_admin":false},"repo":{"id":12888993,"name":"home-assistant","full_name":"home-assistant/home-assistant","owner":{"login":"home-assistant","id":13844975,"avatar_url":"https://avatars3.githubusercontent.com/u/13844975?v=4","gravatar_id":"","url":"https://api.github.com/users/home-assistant","html_url":"https://github.com/home-assistant","followers_url":"https://api.github.com/users/home-assistant/followers","following_url":"https://api.github.com/users/home-assistant/following{/other_user}","gists_url":"https://api.github.com/users/home-assistant/gists{/gist_id}","starred_url":"https://api.github.com/users/home-assistant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/home-assistant/subscriptions","organizations_url":"https://api.github.com/users/home-assistant/orgs","repos_url":"https://api.github.com/users/home-assistant/repos","events_url":"https://api.github.com/users/home-assistant/events{/privacy}","received_events_url":"https://api.github.com/users/home-assistant/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/home-assistant/home-assistant","description":":house_with_garden: Open-source home automation platform running on Python 3","fork":false,"url":"https://api.github.com/repos/home-assistant/home-assistant","forks_url":"https://api.github.com/repos/home-assistant/home-assistant/forks","keys_url":"https://api.github.com/repos/home-assistant/home-assistant/keys{/key_id}","collaborators_url":"https://api.github.com/repos/home-assistant/home-assistant/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/home-assistant/home-assistant/teams","hooks_url":"https://api.github.com/repos/home-assistant/home-assistant/hooks","issue_events_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/events{/number}","events_url":"https://api.github.com/repos/home-assistant/home-assistant/events","assignees_url":"https://api.github.com/repos/home-assistant/home-assistant/assignees{/user}","branches_url":"https://api.github.com/repos/home-assistant/home-assistant/branches{/branch}","tags_url":"https://api.github.com/repos/home-assistant/home-assistant/tags","blobs_url":"https://api.github.com/repos/home-assistant/home-assistant/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/home-assistant/home-assistant/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/home-assistant/home-assistant/git/refs{/sha}","trees_url":"https://api.github.com/repos/home-assistant/home-assistant/git/trees{/sha}","statuses_url":"https://api.github.com/repos/home-assistant/home-assistant/statuses/{sha}","languages_url":"https://api.github.com/repos/home-assistant/home-assistant/languages","stargazers_url":"https://api.github.com/repos/home-assistant/home-assistant/stargazers","contributors_url":"https://api.github.com/repos/home-assistant/home-assistant/contributors","subscribers_url":"https://api.github.com/repos/home-assistant/home-assistant/subscribers","subscription_url":"https://api.github.com/repos/home-assistant/home-assistant/subscription","commits_url":"https://api.github.com/repos/home-assistant/home-assistant/commits{/sha}","git_commits_url":"https://api.github.com/repos/home-assistant/home-assistant/git/commits{/sha}","comments_url":"https://api.github.com/repos/home-assistant/home-assistant/comments{/number}","issue_comment_url":"https://api.github.com/repos/home-assistant/home-assistant/issues/comments{/number}","contents_url":"https://api.github.com/repos/home-assistant/home-assistant/contents/{+path}","compare_url":"https://api.github.com/repos/home-assistant/home-assistant/compare/{base}...{head}","merges_url":"https://api.github.com/repos/home-assistant/home-assistant/merges","archive_url":"https://api.github.com/repos/home-assistant/home-assistant/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/home-assistant/home-assistant/downloads","issues_url":"https://api.github.com/repos/home-assistant/home-assistant/issues{/number}","pulls_url":"https://api.github.com/repos/home-assistant/home-assistant/pulls{/number}","milestones_url":"https://api.github.com/repos/home-assistant/home-assistant/milestones{/number}","notifications_url":"https://api.github.com/repos/home-assistant/home-assistant/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/home-assistant/home-assistant/labels{/name}","releases_url":"https://api.github.com/repos/home-assistant/home-assistant/releases{/id}","deployments_url":"https://api.github.com/repos/home-assistant/home-assistant/deployments","created_at":"2013-09-17T07:29:48Z","updated_at":"2018-02-28T19:28:44Z","pushed_at":"2018-02-28T20:29:40Z","git_url":"git://github.com/home-assistant/home-assistant.git","ssh_url":"git@github.com:home-assistant/home-assistant.git","clone_url":"https://github.com/home-assistant/home-assistant.git","svn_url":"https://github.com/home-assistant/home-assistant","homepage":"https://home-assistant.io","size":79203,"stargazers_count":12867,"watchers_count":12867,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3708,"mirror_url":null,"archived":false,"open_issues_count":867,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":3708,"open_issues":867,"watchers":12867,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006"},"html":{"href":"https://github.com/home-assistant/home-assistant/pull/12006"},"issue":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/12006"},"comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/issues/12006/comments"},"review_comments":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006/comments"},"review_comment":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/home-assistant/home-assistant/pulls/12006/commits"},"statuses":{"href":"https://api.github.com/repos/home-assistant/home-assistant/statuses/cc17067cc87fbe0cf03ebfcd9702f413c9000b39"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"balloob"}}