{"action":"created","comment":{"url":"https://api.github.com/repos/mrworf/plexupdate/pulls/comments/103533690","pull_request_review_id":24323597,"id":103533690,"diff_hunk":"@@ -0,0 +1,226 @@\n+#!/bin/bash\n+######## INDEX ########\n+# GPT -> getPlexToken\n+# GPS -> getPlexServerToken\n+# GPW -> getPlexWebToken\n+# HELPERS -> keypair, rawurlencode, trimQuotes\n+# RNNG -> running\n+# SHARED -> warn, info, warn\n+\n+######## CONSTANTS ########\n+# Current pages we need - Do not change unless Plex.tv changes again\n+URL_LOGIN='https://plex.tv/users/sign_in.json'\n+URL_DOWNLOAD='https://plex.tv/api/downloads/1.json?channel=plexpass'\n+URL_DOWNLOAD_PUBLIC='https://plex.tv/api/downloads/1.json'\n+\n+# Default options for package managers, override if needed\n+REDHAT_INSTALL=\"dnf -y install\"\n+DEBIAN_INSTALL=\"dpkg -i\"\n+DISTRO_INSTALL=\"\"\n+\n+#URL for new version check\n+UPSTREAM_GIT_URL=\"https://raw.githubusercontent.com/${GIT_OWNER:-mrworf}/plexupdate/${BRANCHNAME:-master}\"\n+\n+#Files \"owned\" by plexupdate, for autoupdate\n+PLEXUPDATE_FILES=\"plexupdate.sh plexupdate-core extras/installer.sh extras/cronwrapper\"\n+\n+\n+######## FUNCTIONS ########\n+#### Token Management #####\n+\n+# GPT\n+getPlexToken() {\n+\tif [ -n \"$TOKEN\" ]; then\n+\t\t[ \"$VERBOSE\" = \"yes\" ] && info \"Fetching token from config\"\n+\telif getPlexServerToken; then\n+\t\t[ \"$VERBOSE\" = \"yes\" ] && info \"Fetching token from Plex server\"\n+\telif [ -z \"$TOKEN\" -a -n \"$EMAIL\" -a -n \"$PASS\" ]; then\n+\t\t#TOFIX\n+\t\twarn \"Storing your email and password has been deprecated. Please re-run extras/installer.sh or see LINK_TO_FAQ.\"\n+\t\tgetPlexWebToken\n+\t# Check if we're connected to a terminal\n+\telif [ -z \"$TOKEN\" -a -t 0 ]; then\n+\t\tinfo \"To continue, you will need to provide your Plex account credentials.\"\n+\t\tinfo \"Your email and password will only be used to retrieve a 'token' and will not be saved anywhere.\"\n+\t\techo\n+\t\twhile true; do\n+\t\t\tread -e -p \"PlexPass Email Address: \" -i \"$EMAIL\" EMAIL\n+\t\t\tif [ -z \"${EMAIL}\" ] || [[ \"$EMAIL\" == *\"@\"* ]] && [[ \"$EMAIL\" != *\"@\"*\".\"* ]]; then\n+\t\t\t\tinfo \"Please provide a valid email address\"\n+\t\t\telse\n+\t\t\t\tbreak\n+\t\t\tfi\n+\t\tdone\n+\t\twhile true; do\n+\t\t\tread -e -p \"PlexPass Password: \" -i \"$PASS\" PASS\n+\t\t\tif [ -z \"$PASS\" ]; then\n+\t\t\t\tinfo \"Please provide a password\"\n+\t\t\telse\n+\t\t\t\tbreak\n+\t\t\tfi\n+\t\tdone\n+\t\tgetPlexWebToken\n+\tfi\n+\n+\t[ -n \"$TOKEN\" ] # simulate exit status\n+}\n+\n+# GPS\n+getPlexServerToken() {\n+\tif [ -f /etc/default/plexmediaserver ]; then\n+\t\tsource /etc/default/plexmediaserver\n+\tfi\n+\n+\t# List possible locations to find Plex Server preference file\n+\tlocal VALIDPATHS=(\"${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR}\" \"/var/lib/plexmediaserver/Library/Application Support/\" \"${HOME}/Library/Application Support/\")\n+\tlocal PREFFILE=\"/Plex Media Server/Preferences.xml\"\n+\n+\tfor I in \"${VALIDPATHS[@]}\" ; do\n+\t\tif [ ! -z \"${I}\" -a -f \"${I}${PREFFILE}\" ]; then\n+\t\t\t# When running installer.sh directly from wget, $0 will return bash\n+\t\t\tif [ \"$(basename $0)\" = \"installer.sh\" -o \"$(basename $0)\" = \"bash\" ]; then\n+\t\t\t\tTOKEN=$(sudo sed -n 's/.*PlexOnlineToken=\"\\([[:alnum:]]*\\).*\".*/\\1/p' \"${I}${PREFFILE}\" 2>/dev/null)\n+\t\t\telse\n+\t\t\t\tTOKEN=$(sed -n 's/.*PlexOnlineToken=\"\\([[:alnum:]]*\\).*\".*/\\1/p' \"${I}${PREFFILE}\" 2>/dev/null)\n+\t\t\tfi\n+\t\tfi\n+\tdone\n+\n+\t[ -n \"$TOKEN\" ] # simulate exit status\n+}\n+\n+# GPW\n+getPlexWebToken() {\n+\tFILE_POSTDATA=$(mktemp /tmp/plexupdate.postdata.XXXX)\n+\tFILE_RAW=$(mktemp /tmp/plexupdate.raw.XXXX)\n+\tFILE_FAILCAUSE=$(mktemp /tmp/plexupdate.failcause.XXXX)\n+\n+\t# Fields we need to submit for login to work\n+\t#\n+\t# Field\t\t\tValue\n+\t# utf8\t\t\t&#x2713;\n+\t# authenticity_token\t<Need to be obtained from web page>\n+\t# user[login]\t\t$EMAIL\n+\t# user[password]\t$PASS\n+\t# user[remember_me]\t0\n+\t# commit\t\tSign in\n+\n+\t# Build post data\n+\techo -ne >\"${FILE_POSTDATA}\" \"$(keypair \"user[login]\" \"${EMAIL}\" )\"\n+\techo -ne >>\"${FILE_POSTDATA}\" \"&$(keypair \"user[password]\" \"${PASS}\" )\"\n+\techo -ne >>\"${FILE_POSTDATA}\" \"&$(keypair \"user[remember_me]\" \"0\" )\"\n+\n+\t# Authenticate (using Plex Single Sign On)\n+\twget --header \"X-Plex-Client-Identifier: 4a745ae7-1839-e44e-1e42-aebfa578c865\" --header \"X-Plex-Product: Plex SSO\" \"${URL_LOGIN}\" --post-file=\"${FILE_POSTDATA}\" -q -S -O \"${FILE_FAILCAUSE}\" 2>\"${FILE_RAW}\"\n+\n+\t# Provide some details to the end user\n+\tRESULTCODE=$(head -n1 \"${FILE_RAW}\" | grep -oe '[1-5][0-9][0-9]')\n+\tif [ $RESULTCODE -eq 401 ]; then\n+\t\terror \"Username and/or password incorrect\"\n+\telif [ $RESULTCODE -ne 201 ]; then\n+\t\terror \"Failed to log in, debug information:\"\n+\t\tcat \"${FILE_RAW}\" >&2\n+\telse\n+\t\tTOKEN=$(<\"${FILE_FAILCAUSE}\"  grep -ioe '\"authToken\":\"[^\"]*' | cut -c 14-)\n+\tfi\n+\n+\t# Clean up temp files since they may contain sensitive information\n+\trm \"${FILE_FAILCAUSE}\" \"${FILE_POSTDATA}\" \"${FILE_RAW}\"\n+\n+\t[ -n \"$TOKEN\" ] # simulate exit status\n+}\n+\n+# HELPERS\n+keypair() {\n+\tlocal key=\"$( rawurlencode \"$1\" )\"\n+\tlocal val=\"$( rawurlencode \"$2\" )\"\n+\n+\techo \"${key}=${val}\"\n+}\n+\n+rawurlencode() {\n+\tlocal string=\"${1}\"\n+\tlocal strlen=${#string}\n+\tlocal encoded=\"\"\n+\n+\tfor (( pos=0 ; pos<strlen ; pos++ )); do\n+\t\tc=${string:$pos:1}\n+\t\tcase \"$c\" in\n+\t\t[-_.~a-zA-Z0-9] ) o=\"${c}\" ;;\n+\t\t* )               printf -v o '%%%02x' \"'$c\"\n+\t\tesac\n+\t\tencoded+=\"${o}\"\n+\tdone\n+\techo \"${encoded}\"\n+}\n+\n+trimQuotes() {\n+\tlocal __buffer=$1\n+\n+\t# Remove leading single quote\n+\t__buffer=${__buffer#\\'}\n+\t# Remove ending single quote\n+\t__buffer=${__buffer%\\'}\n+\n+\techo $__buffer\n+}\n+\n+getRemoteSHA() {\n+\t(wget -q \"$1\" -O - 2>/dev/null || return 1) | sha1sum | cut -f1 -d\" \"","path":"plexupdate-core","position":169,"original_position":169,"commit_id":"861cf1fdf52bcbd407eb0d154b2e5027e1ef8d7d","original_commit_id":"861cf1fdf52bcbd407eb0d154b2e5027e1ef8d7d","user":{"login":"demonbane","id":7385,"avatar_url":"https://avatars3.githubusercontent.com/u/7385?v=3","gravatar_id":"","url":"https://api.github.com/users/demonbane","html_url":"https://github.com/demonbane","followers_url":"https://api.github.com/users/demonbane/followers","following_url":"https://api.github.com/users/demonbane/following{/other_user}","gists_url":"https://api.github.com/users/demonbane/gists{/gist_id}","starred_url":"https://api.github.com/users/demonbane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/demonbane/subscriptions","organizations_url":"https://api.github.com/users/demonbane/orgs","repos_url":"https://api.github.com/users/demonbane/repos","events_url":"https://api.github.com/users/demonbane/events{/privacy}","received_events_url":"https://api.github.com/users/demonbane/received_events","type":"User","site_admin":false},"body":"Hmm. That **should** have worked since return should exit the function immediately, but I just tested it and it didn't...\r\n\r\n```bash\r\n$ foo() { (false || return 1) | true; }\r\n$ foo\r\n$ echo $?\r\n0\r\n```\r\n\r\nFix incoming.","created_at":"2017-02-28T19:31:01Z","updated_at":"2017-02-28T19:31:01Z","html_url":"https://github.com/mrworf/plexupdate/pull/169#discussion_r103533690","pull_request_url":"https://api.github.com/repos/mrworf/plexupdate/pulls/169","_links":{"self":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/comments/103533690"},"html":{"href":"https://github.com/mrworf/plexupdate/pull/169#discussion_r103533690"},"pull_request":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/169"}}},"pull_request":{"url":"https://api.github.com/repos/mrworf/plexupdate/pulls/169","id":106941303,"html_url":"https://github.com/mrworf/plexupdate/pull/169","diff_url":"https://github.com/mrworf/plexupdate/pull/169.diff","patch_url":"https://github.com/mrworf/plexupdate/pull/169.patch","issue_url":"https://api.github.com/repos/mrworf/plexupdate/issues/169","number":169,"state":"open","locked":false,"title":"Switch to using only tokens for plexupdate.sh","user":{"login":"demonbane","id":7385,"avatar_url":"https://avatars3.githubusercontent.com/u/7385?v=3","gravatar_id":"","url":"https://api.github.com/users/demonbane","html_url":"https://github.com/demonbane","followers_url":"https://api.github.com/users/demonbane/followers","following_url":"https://api.github.com/users/demonbane/following{/other_user}","gists_url":"https://api.github.com/users/demonbane/gists{/gist_id}","starred_url":"https://api.github.com/users/demonbane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/demonbane/subscriptions","organizations_url":"https://api.github.com/users/demonbane/orgs","repos_url":"https://api.github.com/users/demonbane/repos","events_url":"https://api.github.com/users/demonbane/events{/privacy}","received_events_url":"https://api.github.com/users/demonbane/received_events","type":"User","site_admin":false},"body":"This is a bit of a massive change, but I think it's worth it for both security and future simplicity. The goal here is to only store a token in plexupdate.conf, not email/pass as we've historically been doing.\r\n\r\nTo implement this, I've extracted ALL of the token-handling code out of plexupdate.sh and into extras/get-plex-token. This gets sourced by plexupdate.sh if it needs a token and can't get it, otherwise it just sits there.\r\n\r\nSince it's been abstracted out, there are now a couple of extra cool things we can do here. Using the exact same code, installer.sh can get your Plex token and write it to plexupdate.conf for you. Or, if you'd prefer to do stuff manually, you can manually execute extras/get-plex-token and it'll print your token for you so you can manually add it into plexupdate.conf if you'd like.\r\n\r\nThe biggest thing that I tried to make sure of was that, as long as you have a properly configured plexupdate.conf, you could continue to run plexupdate.sh as a completely standalone script without requiring anything else out of the repo.","created_at":"2017-02-20T05:19:09Z","updated_at":"2017-02-28T19:31:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ca98c00af9c8885495b91bd8188e2bd92f3c633b","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mrworf/plexupdate/pulls/169/commits","review_comments_url":"https://api.github.com/repos/mrworf/plexupdate/pulls/169/comments","review_comment_url":"https://api.github.com/repos/mrworf/plexupdate/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mrworf/plexupdate/issues/169/comments","statuses_url":"https://api.github.com/repos/mrworf/plexupdate/statuses/861cf1fdf52bcbd407eb0d154b2e5027e1ef8d7d","head":{"label":"demonbane:extract-tokens","ref":"extract-tokens","sha":"861cf1fdf52bcbd407eb0d154b2e5027e1ef8d7d","user":{"login":"demonbane","id":7385,"avatar_url":"https://avatars3.githubusercontent.com/u/7385?v=3","gravatar_id":"","url":"https://api.github.com/users/demonbane","html_url":"https://github.com/demonbane","followers_url":"https://api.github.com/users/demonbane/followers","following_url":"https://api.github.com/users/demonbane/following{/other_user}","gists_url":"https://api.github.com/users/demonbane/gists{/gist_id}","starred_url":"https://api.github.com/users/demonbane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/demonbane/subscriptions","organizations_url":"https://api.github.com/users/demonbane/orgs","repos_url":"https://api.github.com/users/demonbane/repos","events_url":"https://api.github.com/users/demonbane/events{/privacy}","received_events_url":"https://api.github.com/users/demonbane/received_events","type":"User","site_admin":false},"repo":{"id":55994938,"name":"plexupdate","full_name":"demonbane/plexupdate","owner":{"login":"demonbane","id":7385,"avatar_url":"https://avatars3.githubusercontent.com/u/7385?v=3","gravatar_id":"","url":"https://api.github.com/users/demonbane","html_url":"https://github.com/demonbane","followers_url":"https://api.github.com/users/demonbane/followers","following_url":"https://api.github.com/users/demonbane/following{/other_user}","gists_url":"https://api.github.com/users/demonbane/gists{/gist_id}","starred_url":"https://api.github.com/users/demonbane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/demonbane/subscriptions","organizations_url":"https://api.github.com/users/demonbane/orgs","repos_url":"https://api.github.com/users/demonbane/repos","events_url":"https://api.github.com/users/demonbane/events{/privacy}","received_events_url":"https://api.github.com/users/demonbane/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/demonbane/plexupdate","description":"Plex Update script to simplify the life of Linux Plex Media Server users.","fork":true,"url":"https://api.github.com/repos/demonbane/plexupdate","forks_url":"https://api.github.com/repos/demonbane/plexupdate/forks","keys_url":"https://api.github.com/repos/demonbane/plexupdate/keys{/key_id}","collaborators_url":"https://api.github.com/repos/demonbane/plexupdate/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/demonbane/plexupdate/teams","hooks_url":"https://api.github.com/repos/demonbane/plexupdate/hooks","issue_events_url":"https://api.github.com/repos/demonbane/plexupdate/issues/events{/number}","events_url":"https://api.github.com/repos/demonbane/plexupdate/events","assignees_url":"https://api.github.com/repos/demonbane/plexupdate/assignees{/user}","branches_url":"https://api.github.com/repos/demonbane/plexupdate/branches{/branch}","tags_url":"https://api.github.com/repos/demonbane/plexupdate/tags","blobs_url":"https://api.github.com/repos/demonbane/plexupdate/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/demonbane/plexupdate/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/demonbane/plexupdate/git/refs{/sha}","trees_url":"https://api.github.com/repos/demonbane/plexupdate/git/trees{/sha}","statuses_url":"https://api.github.com/repos/demonbane/plexupdate/statuses/{sha}","languages_url":"https://api.github.com/repos/demonbane/plexupdate/languages","stargazers_url":"https://api.github.com/repos/demonbane/plexupdate/stargazers","contributors_url":"https://api.github.com/repos/demonbane/plexupdate/contributors","subscribers_url":"https://api.github.com/repos/demonbane/plexupdate/subscribers","subscription_url":"https://api.github.com/repos/demonbane/plexupdate/subscription","commits_url":"https://api.github.com/repos/demonbane/plexupdate/commits{/sha}","git_commits_url":"https://api.github.com/repos/demonbane/plexupdate/git/commits{/sha}","comments_url":"https://api.github.com/repos/demonbane/plexupdate/comments{/number}","issue_comment_url":"https://api.github.com/repos/demonbane/plexupdate/issues/comments{/number}","contents_url":"https://api.github.com/repos/demonbane/plexupdate/contents/{+path}","compare_url":"https://api.github.com/repos/demonbane/plexupdate/compare/{base}...{head}","merges_url":"https://api.github.com/repos/demonbane/plexupdate/merges","archive_url":"https://api.github.com/repos/demonbane/plexupdate/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/demonbane/plexupdate/downloads","issues_url":"https://api.github.com/repos/demonbane/plexupdate/issues{/number}","pulls_url":"https://api.github.com/repos/demonbane/plexupdate/pulls{/number}","milestones_url":"https://api.github.com/repos/demonbane/plexupdate/milestones{/number}","notifications_url":"https://api.github.com/repos/demonbane/plexupdate/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/demonbane/plexupdate/labels{/name}","releases_url":"https://api.github.com/repos/demonbane/plexupdate/releases{/id}","deployments_url":"https://api.github.com/repos/demonbane/plexupdate/deployments","created_at":"2016-04-11T17:58:54Z","updated_at":"2016-04-11T17:58:55Z","pushed_at":"2017-02-27T02:02:44Z","git_url":"git://github.com/demonbane/plexupdate.git","ssh_url":"git@github.com:demonbane/plexupdate.git","clone_url":"https://github.com/demonbane/plexupdate.git","svn_url":"https://github.com/demonbane/plexupdate","homepage":null,"size":315,"stargazers_count":0,"watchers_count":0,"language":"Shell","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mrworf:master","ref":"master","sha":"acb8cc2fb8eef96a48c87ac8d3e9284e4d7549d8","user":{"login":"mrworf","id":1848354,"avatar_url":"https://avatars3.githubusercontent.com/u/1848354?v=3","gravatar_id":"","url":"https://api.github.com/users/mrworf","html_url":"https://github.com/mrworf","followers_url":"https://api.github.com/users/mrworf/followers","following_url":"https://api.github.com/users/mrworf/following{/other_user}","gists_url":"https://api.github.com/users/mrworf/gists{/gist_id}","starred_url":"https://api.github.com/users/mrworf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrworf/subscriptions","organizations_url":"https://api.github.com/users/mrworf/orgs","repos_url":"https://api.github.com/users/mrworf/repos","events_url":"https://api.github.com/users/mrworf/events{/privacy}","received_events_url":"https://api.github.com/users/mrworf/received_events","type":"User","site_admin":false},"repo":{"id":18640896,"name":"plexupdate","full_name":"mrworf/plexupdate","owner":{"login":"mrworf","id":1848354,"avatar_url":"https://avatars3.githubusercontent.com/u/1848354?v=3","gravatar_id":"","url":"https://api.github.com/users/mrworf","html_url":"https://github.com/mrworf","followers_url":"https://api.github.com/users/mrworf/followers","following_url":"https://api.github.com/users/mrworf/following{/other_user}","gists_url":"https://api.github.com/users/mrworf/gists{/gist_id}","starred_url":"https://api.github.com/users/mrworf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrworf/subscriptions","organizations_url":"https://api.github.com/users/mrworf/orgs","repos_url":"https://api.github.com/users/mrworf/repos","events_url":"https://api.github.com/users/mrworf/events{/privacy}","received_events_url":"https://api.github.com/users/mrworf/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mrworf/plexupdate","description":"Plex Update script to simplify the life of Linux Plex Media Server users.","fork":false,"url":"https://api.github.com/repos/mrworf/plexupdate","forks_url":"https://api.github.com/repos/mrworf/plexupdate/forks","keys_url":"https://api.github.com/repos/mrworf/plexupdate/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrworf/plexupdate/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrworf/plexupdate/teams","hooks_url":"https://api.github.com/repos/mrworf/plexupdate/hooks","issue_events_url":"https://api.github.com/repos/mrworf/plexupdate/issues/events{/number}","events_url":"https://api.github.com/repos/mrworf/plexupdate/events","assignees_url":"https://api.github.com/repos/mrworf/plexupdate/assignees{/user}","branches_url":"https://api.github.com/repos/mrworf/plexupdate/branches{/branch}","tags_url":"https://api.github.com/repos/mrworf/plexupdate/tags","blobs_url":"https://api.github.com/repos/mrworf/plexupdate/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrworf/plexupdate/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrworf/plexupdate/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrworf/plexupdate/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrworf/plexupdate/statuses/{sha}","languages_url":"https://api.github.com/repos/mrworf/plexupdate/languages","stargazers_url":"https://api.github.com/repos/mrworf/plexupdate/stargazers","contributors_url":"https://api.github.com/repos/mrworf/plexupdate/contributors","subscribers_url":"https://api.github.com/repos/mrworf/plexupdate/subscribers","subscription_url":"https://api.github.com/repos/mrworf/plexupdate/subscription","commits_url":"https://api.github.com/repos/mrworf/plexupdate/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrworf/plexupdate/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrworf/plexupdate/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrworf/plexupdate/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrworf/plexupdate/contents/{+path}","compare_url":"https://api.github.com/repos/mrworf/plexupdate/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrworf/plexupdate/merges","archive_url":"https://api.github.com/repos/mrworf/plexupdate/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrworf/plexupdate/downloads","issues_url":"https://api.github.com/repos/mrworf/plexupdate/issues{/number}","pulls_url":"https://api.github.com/repos/mrworf/plexupdate/pulls{/number}","milestones_url":"https://api.github.com/repos/mrworf/plexupdate/milestones{/number}","notifications_url":"https://api.github.com/repos/mrworf/plexupdate/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrworf/plexupdate/labels{/name}","releases_url":"https://api.github.com/repos/mrworf/plexupdate/releases{/id}","deployments_url":"https://api.github.com/repos/mrworf/plexupdate/deployments","created_at":"2014-04-10T15:09:14Z","updated_at":"2017-02-28T13:38:16Z","pushed_at":"2017-02-27T02:02:45Z","git_url":"git://github.com/mrworf/plexupdate.git","ssh_url":"git@github.com:mrworf/plexupdate.git","clone_url":"https://github.com/mrworf/plexupdate.git","svn_url":"https://github.com/mrworf/plexupdate","homepage":null,"size":251,"stargazers_count":539,"watchers_count":539,"language":"Shell","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":74,"mirror_url":null,"open_issues_count":3,"forks":74,"open_issues":3,"watchers":539,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/169"},"html":{"href":"https://github.com/mrworf/plexupdate/pull/169"},"issue":{"href":"https://api.github.com/repos/mrworf/plexupdate/issues/169"},"comments":{"href":"https://api.github.com/repos/mrworf/plexupdate/issues/169/comments"},"review_comments":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/169/comments"},"review_comment":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mrworf/plexupdate/pulls/169/commits"},"statuses":{"href":"https://api.github.com/repos/mrworf/plexupdate/statuses/861cf1fdf52bcbd407eb0d154b2e5027e1ef8d7d"}}}}
{"actor":{"display_login":"demonbane"}}