{"record":{"id":"fa0ca1f895844b60","repo":"ytdl-org/youtube-dl","slug":"unable-to-login-s-some-documents-go-to-pluralsi","errorCode":null,"errorMessage":"Unable to login: %s some documents. Go to pluralsight.com, log in and agree with what Pluralsight requires.","messagePattern":"Unable to login: (.+?) some documents\\. Go to pluralsight\\.com, log in and agree with what Pluralsight requires\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/pluralsight.py","lineNumber":210,"sourceCode":"            headers={'Content-Type': 'application/x-www-form-urlencoded'})\n\n        error = self._search_regex(\n            r'<span[^>]+class=\"field-validation-error\"[^>]*>([^<]+)</span>',\n            response, 'error message', default=None)\n        if error:\n            raise ExtractorError('Unable to login: %s' % error, expected=True)\n\n        if all(not re.search(p, response) for p in (\n                r'__INITIAL_STATE__', r'[\"\\']currentUser[\"\\']',\n                # new layout?\n                r'>\\s*Sign out\\s*<')):\n            BLOCKED = 'Your account has been blocked due to suspicious activity'\n            if BLOCKED in response:\n                raise ExtractorError(\n                    'Unable to login: %s' % BLOCKED, expected=True)\n            MUST_AGREE = 'To continue using Pluralsight, you must agree to'\n            if any(p in response for p in (MUST_AGREE, '>Disagree<', '>Agree<')):\n                raise ExtractorError(\n                    'Unable to login: %s some documents. Go to pluralsight.com, '\n                    'log in and agree with what Pluralsight requires.'\n                    % MUST_AGREE, expected=True)\n\n            raise ExtractorError('Unable to log in')\n\n    def _get_subtitles(self, author, clip_idx, clip_id, lang, name, duration, video_id):\n        captions = None\n        if clip_id:\n            captions = self._download_json(\n                '%s/transcript/api/v1/caption/json/%s/%s'\n                % (self._API_BASE, clip_id, lang), video_id,\n                'Downloading captions JSON', 'Unable to download captions JSON',\n                fatal=False)\n        if not captions:\n            captions_post = {\n                'a': author,\n                'cn': int(clip_idx),","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/pluralsight.py#L192-L228","documentation":"Raised by PluralsightIE._login when the login response lacks all success markers but contains agreement UI strings ('To continue using Pluralsight, you must agree to', '>Disagree<', '>Agree<'). Pluralsight requires accepting updated terms/policies, which the CLI login flow cannot do, so the user is directed to the website to agree.","triggerScenarios":"Pluralsight ships new ToS/privacy documents; any login (API or scripted) returns the agreement interstitial. Detected only after the field-validation and blocked-account checks pass.","commonSituations":"Long-unused accounts returning after Pluralsight policy updates; automation accounts that never render pages; recurring occurrence each time new documents are published.","solutions":["Log in at pluralsight.com in a browser and click Agree on the pending documents","Then re-export cookies (--cookies) or retry credential login","Repeat whenever Pluralsight publishes new mandatory agreements"],"exampleFix":"# before: scripted login hits the agreement wall\nyoutube_dl --username me@example.com --password '...' PS_URL\n# after: agree once in browser, export session, then\nyoutube_dl --cookies cookies.txt PS_URL","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'you must agree to' in str(e):\n        pause_batch('Log in at pluralsight.com and accept the new terms, then rerun')","preventionTips":["Agree to new Pluralsight documents in a browser whenever they appear","Use --cookies after agreeing so the CLI never needs to","Expect this after long gaps between uses"],"tags":["pluralsight","authentication","terms-of-service","login","extractor-error","expected"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}