{"record":{"id":"5b03497617a4b469","repo":"ytdl-org/youtube-dl","slug":"s-said-s-5b0349","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/pluralsight.py","lineNumber":108,"sourceCode":"            return self._download_json(\n                'https://app.pluralsight.com/player/user/api/v1/player/payload',\n                display_id, data=urlencode_postdata({'courseId': course_id}),\n                headers={'Referer': url})\n\n    def _download_course_rpc(self, course_id, url, display_id):\n        response = self._download_json(\n            self._GRAPHQL_EP, display_id, data=json.dumps({\n                'query': self._GRAPHQL_COURSE_TMPL % course_id,\n                'variables': {}\n            }).encode('utf-8'), headers=self._GRAPHQL_HEADERS)\n\n        course = try_get(\n            response, lambda x: x['data']['rpc']['bootstrapPlayer']['course'],\n            dict)\n        if course:\n            return course\n\n        raise ExtractorError(\n            '%s said: %s' % (self.IE_NAME, response['error']['message']),\n            expected=True)\n\n\nclass PluralsightIE(PluralsightBaseIE):\n    IE_NAME = 'pluralsight'\n    _VALID_URL = r'https?://(?:(?:www|app)\\.)?pluralsight\\.com/(?:training/)?player\\?'\n    _LOGIN_URL = 'https://app.pluralsight.com/id/'\n\n    _NETRC_MACHINE = 'pluralsight'\n\n    _TESTS = [{\n        'url': 'http://www.pluralsight.com/training/player?author=mike-mckeown&name=hosting-sql-server-windows-azure-iaas-m7-mgmt&mode=live&clip=3&course=hosting-sql-server-windows-azure-iaas',\n        'md5': '4d458cf5cf4c593788672419a8dd4cf8',\n        'info_dict': {\n            'id': 'hosting-sql-server-windows-azure-iaas-m7-mgmt-04',\n            'ext': 'mp4',\n            'title': 'Demo Monitoring',","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/pluralsight.py#L90-L126","documentation":"Raised by PluralsightBaseIE._download_course when the GraphQL bootstrapPlayer response lacks data.rpc.bootstrapPlayer.course. The message is '<IE_NAME> said: <response.error.message>' — the GraphQL server's error, e.g. unauthorized or course not found. Expected=True: the API responded with an error payload.","triggerScenarios":"POST to the GraphQL endpoint with the course query where Pluralsight returns an 'error' object: unauthenticated access to paid courses, invalid course id, or the rpc/bootstrapPlayer field renamed (then 'message' itself may KeyError).","commonSituations":"Extracting paid courses without valid login; expired session token from --cookies; Pluralsight moving to a different player bootstrap API, breaking the query shape.","solutions":["Authenticate first (netrc/cookies with a valid Pluralsight subscription)","Confirm the course id in the URL is real by opening it at pluralsight.com","Update yt-dlp — Pluralsight's GraphQL schema changes are fixed there periodically"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'Pluralsight said:' in str(e):\n        # GraphQL error text: unauthorized → fix session; not found → fix URL\n        handle(str(e))","preventionTips":["Always run Pluralsight with valid --username/--password or --cookies","Confirm course ids resolve in a browser before extraction","Track yt-dlp updates — the GraphQL schema drifts"],"tags":["pluralsight","graphql","api-error","authentication","extractor-error","expected"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}