{"action":"created","comment":{"url":"https://api.github.com/repos/Flexget/Flexget/pulls/comments/195634294","pull_request_review_id":129042935,"id":195634294,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NTYzNDI5NA==","diff_hunk":"@@ -95,173 +106,151 @@ def _login(self, task, config):\n \n             if 'isAuthenticatedUser' not in profile_response.cookies:\n                 raise plugin.PluginError('Failed to login. Check username and password.')\n+            log.debug('Succesfully logged in: %s', email)\n         except RequestException as e:\n             raise plugin.PluginError('Request error: %s' % e.args[0])\n \n-    def _get_page(self, task, config, url):\n-        self._login(task, config)\n+    def _get_favourites_entries(self, task, config, profileId):\n+        # Details of profile using the $profileId:\n+        # https://www.npostart.nl/api/account/@me/profile/$profileId  (?refresh=1)\n+        # XMLHttpRequest could also be done on, but is not reliable, because if a series is\n+        # bookmarked after episode is already broadcasted, it does not appear in this list.\n+        # https://www.npostart.nl/ums/accounts/@me/favourites/episodes?dateFrom=2018-06-04&dateTo=2018-06-05\n+        profile_details_url = 'https://www.npostart.nl/api/account/@me/profile/'\n \n+        entries = []\n         try:\n-            page_response = requests.get(url)\n-            if page_response.url != url:\n-                raise plugin.PluginError('Unexpected page: {} (expected {})'.format(page_response.url, url))\n-\n-            return page_response\n+            profile = requests.get(profile_details_url + profileId).json()\n+            log.info('Retrieving favorites for profile %s', profile['name'])\n+            for favourite in profile['favourites']:\n+                if favourite['mediaType'] == 'series':\n+                    entries += self._get_series_episodes(task, config, favourite['mediaId'])\n         except RequestException as e:\n             raise plugin.PluginError('Request error: %s' % e.args[0])\n+        return entries\n \n-    def _get_watchlist_entries(self, task, config, page):\n-        watchlist = page.find('div', attrs={'id': 'component-grid-watchlist'})\n-        return self._parse_tiles(task, config, watchlist)\n-\n-    _series_info = dict()\n-\n-    def _get_series_info(self, task, config, episode_name, episode_url):\n-        log.info('Retrieving series info for %s', episode_name)\n-        try:\n-            response = requests.get(episode_url)\n-            page = get_soup(response.content)\n-\n-            series_url = page.find('a', class_='npo-episode-header-program-info')['href']\n+    def _get_series_episodes(self, task, config, mediaId, series_info=None, page=1):\n+        episode_tiles_url = 'https://www.npostart.nl/media/series/{0}/episodes'\n+        episode_tiles_parameters = {'page': str(page),\n+                                    'tilemapping': 'dedicated',\n+                                    'tiletype': 'asset'}\n \n-            if series_url not in self._series_info:\n-                response = requests.get(series_url)\n-                page = get_soup(response.content)\n+        if not series_info:\n+            series_info = self._get_series_info(task, config, mediaId)\n \n-                series_info = self._parse_series_info(task, config, page, series_url)\n-                self._series_info[series_url] = series_info\n+        headers = {'Origin': 'https://www.npostart.nl',\n+                   'X-XSRF-TOKEN': requests.cookies['XSRF-TOKEN'],\n+                   'X-Requested-With': 'XMLHttpRequest'}\n+        if page > 1:\n+            headers['Referer'] = episode_tiles_url.format(mediaId) + '?page={0}'.format(page-1)  # referer from prev page\n \n-            return self._series_info[series_url]\n+        log.info('Retrieving episodes page %s for %s (%s)', page, series_info['npo_name'], mediaId)\n+        entries = []\n+        try:\n+            episodes = requests.get(episode_tiles_url.format(mediaId),\n+                                    params=episode_tiles_parameters,\n+                                    headers=headers).json()\n+            new_entries = self._parse_tiles(task, config, episodes['tiles'], series_info)\n+            entries += new_entries\n+\n+            if new_entries and episodes['nextLink']:  # only fetch next page if we accepted any from current page\n+                log.debug('NextLink for more episodes: %s', episodes['nextLink'])\n+                entries += self._get_series_episodes(task, config, mediaId, series_info,\n+                                                     page=int(episodes['nextLink'].rsplit('page=')[1]))\n         except RequestException as e:\n             raise plugin.PluginError('Request error: %s' % e.args[0])\n \n-    def _parse_series_info(self, task, config, page, series_url):\n-        tvseries = page.find('section', class_='npo-header-episode-meta')\n-        series_info = Entry()  # create a stub to store the common values for all episodes of this series\n-        series_info['npo_url'] = series_url\n-        series_info['npo_name'] = tvseries.find('h1').text\n-        series_info['npo_description'] = tvseries.find('div', id='metaContent').find('p').text\n-        series_info['npo_language'] = 'nl'  # hard-code the language as if in NL, for loookup plugins\n-        return series_info\n+        if not entries and page == 1:\n+            log.info('No new episodes found for %s (%s)', series_info['npo_name'], mediaId)\n+        return entries\n \n-    def _get_series_episodes(self, task, config, series_name, series_url):\n-        log.info('Retrieving new episodes for %s', series_name)\n+    def _get_series_info(self, task, config, mediaId):\n+        series_info_url = 'https://www.npostart.nl/{0}'\n+        log.info('Retrieving series info for %s', mediaId)\n         try:\n-            response = requests.get(series_url)\n+            response = requests.get(series_info_url.format(mediaId))\n+            log.debug('Series info found at: %s', response.url)\n             page = get_soup(response.content)\n-\n-            series_info = self._parse_series_info(task, config, page, series_url)\n-            episodes = page.find('div', id='component-grid-episodes')\n-            entries = self._parse_tiles(task, config, episodes, series_info)\n-\n-            if not entries:\n-                log.warning('No episodes found for %s', series_name)\n-\n-            return entries\n+            series = page.find('section', class_='npo-header-episode-meta')\n+            # create a stub to store the common values for all episodes of this series\n+            series_info = {'npo_url': response.url,  # we were redirected to the true URL\n+                           'npo_name': series.find('h1').text,\n+                           'npo_description': series.find('div', id='metaContent').find('p').text,\n+                           'npo_language': 'nl'}  # hard-code the language as if in NL, for lookup plugins\n+            log.debug('Parsed series info for: %s (%s)', series_info['npo_name'], mediaId)\n         except RequestException as e:\n             raise plugin.PluginError('Request error: %s' % e.args[0])\n+        return series_info\n \n-    def _parse_tiles(self, task, config, tiles, series_info=None):\n+    def _parse_tiles(self, task, config, tiles, series_info):\n         max_age = config.get('max_episode_age_days')\n-        entries = list()\n+        entries = []\n \n         if tiles is not None:\n-            for list_item in tiles.findAll('div', class_='npo-asset-tile-container'):\n-                url = list_item.find('a')['href']\n-                episode_name = next(list_item.find('h2').stripped_strings)\n-                timer = next(list_item.find('div', class_='npo-asset-tile-timer').stripped_strings)\n-                remove_url = list_item.find('div', class_='npo-asset-tile-delete')\n-\n-                episode_id = url.split('/')[-1]\n-                title = '{} ({})'.format(episode_name, episode_id)\n-\n-                not_available = list_item.find('div', class_='npo-asset-tile-availability')['data-to']\n-                if not_available:\n-                    log.debug('Skipping %s, no longer available', title)\n-                    continue\n-\n-                entry_date = url.split('/')[4]\n-                entry_date = self._parse_date(entry_date)\n-\n-                if max_age >= 0 and (date.today() - entry_date) > timedelta(days=max_age):\n-                    log.debug('Skipping %s, aired on %s', title, entry_date)\n-                    continue\n-\n-                if not series_info:\n-                    tile_series_info = self._get_series_info(task, config, episode_name, url)\n-                else:\n-                    tile_series_info = series_info\n-\n-                series_name = tile_series_info['npo_name']\n-\n-                e = Entry()\n-                e['url'] = url\n-                e['title'] = title\n-                e['series_name'] = series_name\n-                e['series_name_plain'] = self._convert_plain(series_name)\n-                e['series_date'] = entry_date\n-                e['series_id_type'] = 'date'\n-                e['npo_url'] = tile_series_info['npo_url']\n-                e['npo_name'] = tile_series_info['npo_name']\n-                e['npo_description'] = tile_series_info['npo_description']\n-                e['npo_language'] = tile_series_info['npo_language']\n-                e['npo_runtime'] = timer.strip('min').strip()\n-                e['language'] = tile_series_info['npo_language']\n-\n-                if remove_url and remove_url['data-link']:\n-                    e['remove_url'] = remove_url['data-link']\n-\n-                    if config.get('remove_accepted'):\n-                        e.on_complete(self.entry_complete, task=task)\n-\n-                entries.append(e)\n-\n-        return entries\n-\n-    def _get_favorites_entries(self, task, config, page):\n-        max_age = config.get('max_episode_age_days')\n-        if max_age >= 3:\n-            log.warning('If max_episode_age_days is 3 days or more, the plugin will still check all series')\n-        elif max_age > -1:\n-            return self._get_recent_entries(task, config, page)\n-\n-        series = page.find('div', attrs={'id': 'component-grid-favourite-series'})\n-\n-        entries = list()\n-        for list_item in series.findAll('div', class_='npo-ankeiler-tile-container'):\n-            url = list_item.find('a')['href']\n-            series_name = next(list_item.find('h2').stripped_strings)\n-\n-            entries += self._get_series_episodes(task, config, series_name, url)\n-\n-        return entries\n-\n-    def _get_recent_entries(self, task, config, page):\n-        max_age = config.get('max_episode_age_days')\n-\n-        episodes = page.find('div', id='grid-favourite-episodes-today')\n-        entries = self._parse_tiles(task, config, episodes)\n-\n-        if max_age >= 1:\n-            episodes = page.find('div', id='grid-favourite-episodes-yesterday')\n-            entries += self._parse_tiles(task, config, episodes)\n-\n-        if max_age >= 2:\n-            episodes = page.find('div', id='grid-favourite-episodes-day-before-yesterday')\n-            entries += self._parse_tiles(task, config, episodes)\n+            for tile in tiles:\n+                # there is only one list_item per tile\n+                for list_item in get_soup(tile).findAll('div', class_='npo-asset-tile-container'):\n+                    episode_id = list_item['id']\n+                    log.debug('Parsing episode: %s', episode_id)\n+\n+                    url = list_item.find('a')['href']\n+                    # Check if the URL found to the episode matches the expected pattern\n+                    if len(url.split('/')) != 6:\n+                        log.info('Skipping %s, the URL has an unexpected pattern: %s', episode_id, url)","path":"flexget/plugins/input/npo_watchlist.py","position":267,"original_position":267,"commit_id":"ce827ed6064414bac9f46aa2e6035ee393ad5a80","original_commit_id":"ce827ed6064414bac9f46aa2e6035ee393ad5a80","user":{"login":"cvium","id":675118,"node_id":"MDQ6VXNlcjY3NTExOA==","avatar_url":"https://avatars1.githubusercontent.com/u/675118?v=4","gravatar_id":"","url":"https://api.github.com/users/cvium","html_url":"https://github.com/cvium","followers_url":"https://api.github.com/users/cvium/followers","following_url":"https://api.github.com/users/cvium/following{/other_user}","gists_url":"https://api.github.com/users/cvium/gists{/gist_id}","starred_url":"https://api.github.com/users/cvium/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cvium/subscriptions","organizations_url":"https://api.github.com/users/cvium/orgs","repos_url":"https://api.github.com/users/cvium/repos","events_url":"https://api.github.com/users/cvium/events{/privacy}","received_events_url":"https://api.github.com/users/cvium/received_events","type":"User","site_admin":false},"body":"level","created_at":"2018-06-15T05:08:42Z","updated_at":"2018-06-15T05:08:42Z","html_url":"https://github.com/Flexget/Flexget/pull/2153#discussion_r195634294","pull_request_url":"https://api.github.com/repos/Flexget/Flexget/pulls/2153","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/comments/195634294"},"html":{"href":"https://github.com/Flexget/Flexget/pull/2153#discussion_r195634294"},"pull_request":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/2153"}}},"pull_request":{"url":"https://api.github.com/repos/Flexget/Flexget/pulls/2153","id":194390111,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk0MzkwMTEx","html_url":"https://github.com/Flexget/Flexget/pull/2153","diff_url":"https://github.com/Flexget/Flexget/pull/2153.diff","patch_url":"https://github.com/Flexget/Flexget/pull/2153.patch","issue_url":"https://api.github.com/repos/Flexget/Flexget/issues/2153","number":2153,"state":"open","locked":false,"title":"Update NPO Watchlist plugin","user":{"login":"mfonville","id":6221544,"node_id":"MDQ6VXNlcjYyMjE1NDQ=","avatar_url":"https://avatars0.githubusercontent.com/u/6221544?v=4","gravatar_id":"","url":"https://api.github.com/users/mfonville","html_url":"https://github.com/mfonville","followers_url":"https://api.github.com/users/mfonville/followers","following_url":"https://api.github.com/users/mfonville/following{/other_user}","gists_url":"https://api.github.com/users/mfonville/gists{/gist_id}","starred_url":"https://api.github.com/users/mfonville/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mfonville/subscriptions","organizations_url":"https://api.github.com/users/mfonville/orgs","repos_url":"https://api.github.com/users/mfonville/repos","events_url":"https://api.github.com/users/mfonville/events{/privacy}","received_events_url":"https://api.github.com/users/mfonville/received_events","type":"User","site_admin":false},"body":"- NPO has greatly overhauled their site, everything is now on www.npostart.nl\r\n- The 'recent' watchlist feature was not reliable anymore with the new 'subscribing' to a series mechanism, because it hides every episode before the subscription moment\r\n- In the future maybe this can be re-added when there will be enough time to figure out handling of edge-cases\r\n- Track which series are subscribed to via a more reliable JSON-inteface of the user's profile, instead of using bs4 for that\r\n- Get all episode data of a series through XmlHttpRequest, more reliable with respect to UI changes\r\n- Add pagination support to fetching episodes (this was missing, without our knowledge)\r\n- Update the serie to test, \"De dijken breken' that was original part of the test, is not available anymore, so it is replace by \"Zondag met Lubach\"\r\n- Test with \"Zondag met Lubach\" the first episode, so that pagination is tested as well\r\n\r\n### Motivation for changes:\r\nOld plugin was broken, because of changes to the NPO website\r\n","created_at":"2018-06-12T19:55:56Z","updated_at":"2018-06-15T05:08:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8cfe4ae5b74d5c8c2862e9ccc21e20693e839744","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Flexget/Flexget/pulls/2153/commits","review_comments_url":"https://api.github.com/repos/Flexget/Flexget/pulls/2153/comments","review_comment_url":"https://api.github.com/repos/Flexget/Flexget/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Flexget/Flexget/issues/2153/comments","statuses_url":"https://api.github.com/repos/Flexget/Flexget/statuses/ce827ed6064414bac9f46aa2e6035ee393ad5a80","head":{"label":"mfonville:develop","ref":"develop","sha":"ce827ed6064414bac9f46aa2e6035ee393ad5a80","user":{"login":"mfonville","id":6221544,"node_id":"MDQ6VXNlcjYyMjE1NDQ=","avatar_url":"https://avatars0.githubusercontent.com/u/6221544?v=4","gravatar_id":"","url":"https://api.github.com/users/mfonville","html_url":"https://github.com/mfonville","followers_url":"https://api.github.com/users/mfonville/followers","following_url":"https://api.github.com/users/mfonville/following{/other_user}","gists_url":"https://api.github.com/users/mfonville/gists{/gist_id}","starred_url":"https://api.github.com/users/mfonville/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mfonville/subscriptions","organizations_url":"https://api.github.com/users/mfonville/orgs","repos_url":"https://api.github.com/users/mfonville/repos","events_url":"https://api.github.com/users/mfonville/events{/privacy}","received_events_url":"https://api.github.com/users/mfonville/received_events","type":"User","site_admin":false},"repo":{"id":137029068,"node_id":"MDEwOlJlcG9zaXRvcnkxMzcwMjkwNjg=","name":"Flexget","full_name":"mfonville/Flexget","owner":{"login":"mfonville","id":6221544,"node_id":"MDQ6VXNlcjYyMjE1NDQ=","avatar_url":"https://avatars0.githubusercontent.com/u/6221544?v=4","gravatar_id":"","url":"https://api.github.com/users/mfonville","html_url":"https://github.com/mfonville","followers_url":"https://api.github.com/users/mfonville/followers","following_url":"https://api.github.com/users/mfonville/following{/other_user}","gists_url":"https://api.github.com/users/mfonville/gists{/gist_id}","starred_url":"https://api.github.com/users/mfonville/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mfonville/subscriptions","organizations_url":"https://api.github.com/users/mfonville/orgs","repos_url":"https://api.github.com/users/mfonville/repos","events_url":"https://api.github.com/users/mfonville/events{/privacy}","received_events_url":"https://api.github.com/users/mfonville/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mfonville/Flexget","description":"The official FlexGet repository","fork":true,"url":"https://api.github.com/repos/mfonville/Flexget","forks_url":"https://api.github.com/repos/mfonville/Flexget/forks","keys_url":"https://api.github.com/repos/mfonville/Flexget/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mfonville/Flexget/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mfonville/Flexget/teams","hooks_url":"https://api.github.com/repos/mfonville/Flexget/hooks","issue_events_url":"https://api.github.com/repos/mfonville/Flexget/issues/events{/number}","events_url":"https://api.github.com/repos/mfonville/Flexget/events","assignees_url":"https://api.github.com/repos/mfonville/Flexget/assignees{/user}","branches_url":"https://api.github.com/repos/mfonville/Flexget/branches{/branch}","tags_url":"https://api.github.com/repos/mfonville/Flexget/tags","blobs_url":"https://api.github.com/repos/mfonville/Flexget/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mfonville/Flexget/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mfonville/Flexget/git/refs{/sha}","trees_url":"https://api.github.com/repos/mfonville/Flexget/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mfonville/Flexget/statuses/{sha}","languages_url":"https://api.github.com/repos/mfonville/Flexget/languages","stargazers_url":"https://api.github.com/repos/mfonville/Flexget/stargazers","contributors_url":"https://api.github.com/repos/mfonville/Flexget/contributors","subscribers_url":"https://api.github.com/repos/mfonville/Flexget/subscribers","subscription_url":"https://api.github.com/repos/mfonville/Flexget/subscription","commits_url":"https://api.github.com/repos/mfonville/Flexget/commits{/sha}","git_commits_url":"https://api.github.com/repos/mfonville/Flexget/git/commits{/sha}","comments_url":"https://api.github.com/repos/mfonville/Flexget/comments{/number}","issue_comment_url":"https://api.github.com/repos/mfonville/Flexget/issues/comments{/number}","contents_url":"https://api.github.com/repos/mfonville/Flexget/contents/{+path}","compare_url":"https://api.github.com/repos/mfonville/Flexget/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mfonville/Flexget/merges","archive_url":"https://api.github.com/repos/mfonville/Flexget/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mfonville/Flexget/downloads","issues_url":"https://api.github.com/repos/mfonville/Flexget/issues{/number}","pulls_url":"https://api.github.com/repos/mfonville/Flexget/pulls{/number}","milestones_url":"https://api.github.com/repos/mfonville/Flexget/milestones{/number}","notifications_url":"https://api.github.com/repos/mfonville/Flexget/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mfonville/Flexget/labels{/name}","releases_url":"https://api.github.com/repos/mfonville/Flexget/releases{/id}","deployments_url":"https://api.github.com/repos/mfonville/Flexget/deployments","created_at":"2018-06-12T06:46:53Z","updated_at":"2018-06-13T19:29:58Z","pushed_at":"2018-06-13T19:29:55Z","git_url":"git://github.com/mfonville/Flexget.git","ssh_url":"git@github.com:mfonville/Flexget.git","clone_url":"https://github.com/mfonville/Flexget.git","svn_url":"https://github.com/mfonville/Flexget","homepage":"http://www.flexget.com","size":52963,"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,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"Flexget:develop","ref":"develop","sha":"b1a3563a2e4fcdc53745df1a490805c54fe98c91","user":{"login":"Flexget","id":682553,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4MjU1Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/682553?v=4","gravatar_id":"","url":"https://api.github.com/users/Flexget","html_url":"https://github.com/Flexget","followers_url":"https://api.github.com/users/Flexget/followers","following_url":"https://api.github.com/users/Flexget/following{/other_user}","gists_url":"https://api.github.com/users/Flexget/gists{/gist_id}","starred_url":"https://api.github.com/users/Flexget/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Flexget/subscriptions","organizations_url":"https://api.github.com/users/Flexget/orgs","repos_url":"https://api.github.com/users/Flexget/repos","events_url":"https://api.github.com/users/Flexget/events{/privacy}","received_events_url":"https://api.github.com/users/Flexget/received_events","type":"Organization","site_admin":false},"repo":{"id":1512901,"node_id":"MDEwOlJlcG9zaXRvcnkxNTEyOTAx","name":"Flexget","full_name":"Flexget/Flexget","owner":{"login":"Flexget","id":682553,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4MjU1Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/682553?v=4","gravatar_id":"","url":"https://api.github.com/users/Flexget","html_url":"https://github.com/Flexget","followers_url":"https://api.github.com/users/Flexget/followers","following_url":"https://api.github.com/users/Flexget/following{/other_user}","gists_url":"https://api.github.com/users/Flexget/gists{/gist_id}","starred_url":"https://api.github.com/users/Flexget/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Flexget/subscriptions","organizations_url":"https://api.github.com/users/Flexget/orgs","repos_url":"https://api.github.com/users/Flexget/repos","events_url":"https://api.github.com/users/Flexget/events{/privacy}","received_events_url":"https://api.github.com/users/Flexget/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Flexget/Flexget","description":"The official FlexGet repository","fork":false,"url":"https://api.github.com/repos/Flexget/Flexget","forks_url":"https://api.github.com/repos/Flexget/Flexget/forks","keys_url":"https://api.github.com/repos/Flexget/Flexget/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Flexget/Flexget/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Flexget/Flexget/teams","hooks_url":"https://api.github.com/repos/Flexget/Flexget/hooks","issue_events_url":"https://api.github.com/repos/Flexget/Flexget/issues/events{/number}","events_url":"https://api.github.com/repos/Flexget/Flexget/events","assignees_url":"https://api.github.com/repos/Flexget/Flexget/assignees{/user}","branches_url":"https://api.github.com/repos/Flexget/Flexget/branches{/branch}","tags_url":"https://api.github.com/repos/Flexget/Flexget/tags","blobs_url":"https://api.github.com/repos/Flexget/Flexget/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Flexget/Flexget/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Flexget/Flexget/git/refs{/sha}","trees_url":"https://api.github.com/repos/Flexget/Flexget/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Flexget/Flexget/statuses/{sha}","languages_url":"https://api.github.com/repos/Flexget/Flexget/languages","stargazers_url":"https://api.github.com/repos/Flexget/Flexget/stargazers","contributors_url":"https://api.github.com/repos/Flexget/Flexget/contributors","subscribers_url":"https://api.github.com/repos/Flexget/Flexget/subscribers","subscription_url":"https://api.github.com/repos/Flexget/Flexget/subscription","commits_url":"https://api.github.com/repos/Flexget/Flexget/commits{/sha}","git_commits_url":"https://api.github.com/repos/Flexget/Flexget/git/commits{/sha}","comments_url":"https://api.github.com/repos/Flexget/Flexget/comments{/number}","issue_comment_url":"https://api.github.com/repos/Flexget/Flexget/issues/comments{/number}","contents_url":"https://api.github.com/repos/Flexget/Flexget/contents/{+path}","compare_url":"https://api.github.com/repos/Flexget/Flexget/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Flexget/Flexget/merges","archive_url":"https://api.github.com/repos/Flexget/Flexget/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Flexget/Flexget/downloads","issues_url":"https://api.github.com/repos/Flexget/Flexget/issues{/number}","pulls_url":"https://api.github.com/repos/Flexget/Flexget/pulls{/number}","milestones_url":"https://api.github.com/repos/Flexget/Flexget/milestones{/number}","notifications_url":"https://api.github.com/repos/Flexget/Flexget/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Flexget/Flexget/labels{/name}","releases_url":"https://api.github.com/repos/Flexget/Flexget/releases{/id}","deployments_url":"https://api.github.com/repos/Flexget/Flexget/deployments","created_at":"2011-03-22T19:33:44Z","updated_at":"2018-06-14T08:39:33Z","pushed_at":"2018-06-13T19:29:57Z","git_url":"git://github.com/Flexget/Flexget.git","ssh_url":"git@github.com:Flexget/Flexget.git","clone_url":"https://github.com/Flexget/Flexget.git","svn_url":"https://github.com/Flexget/Flexget","homepage":"http://www.flexget.com","size":52564,"stargazers_count":839,"watchers_count":839,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":391,"mirror_url":null,"archived":false,"open_issues_count":99,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":391,"open_issues":99,"watchers":839,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/2153"},"html":{"href":"https://github.com/Flexget/Flexget/pull/2153"},"issue":{"href":"https://api.github.com/repos/Flexget/Flexget/issues/2153"},"comments":{"href":"https://api.github.com/repos/Flexget/Flexget/issues/2153/comments"},"review_comments":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/2153/comments"},"review_comment":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Flexget/Flexget/pulls/2153/commits"},"statuses":{"href":"https://api.github.com/repos/Flexget/Flexget/statuses/ce827ed6064414bac9f46aa2e6035ee393ad5a80"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"cvium"}}