{"record":{"id":"5284d2c88deaae94","repo":"ytdl-org/youtube-dl","slug":"validation-errormessage-dynamic-server-message","errorCode":null,"errorMessage":"validation['errorMessage'] (dynamic server message)","messagePattern":"validation\\['errorMessage'\\] \\(dynamic server message\\)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/zoom.py","lineNumber":51,"sourceCode":"        try:\n            form = self._form_hidden_inputs('password_form', webpage)\n        except ExtractorError:\n            form = None\n        if form:\n            password = self._downloader.params.get('videopassword')\n            if not password:\n                raise ExtractorError(\n                    'This video is protected by a passcode, use the --video-password option', expected=True)\n            is_meeting = form.get('useWhichPasswd') == 'meeting'\n            validation = self._download_json(\n                base_url + 'rec/validate%s_passwd' % ('_meet' if is_meeting else ''),\n                play_id, 'Validating passcode', 'Wrong passcode', data=urlencode_postdata({\n                    'id': form[('meet' if is_meeting else 'file') + 'Id'],\n                    'passwd': password,\n                    'action': form.get('action'),\n                }))\n            if not validation.get('status'):\n                raise ExtractorError(validation['errorMessage'], expected=True)\n            webpage = self._download_webpage(url, play_id)\n\n        data = self._parse_json(self._search_regex(\n            r'(?s)window\\.__data__\\s*=\\s*({.+?});',\n            webpage, 'data'), play_id, js_to_json)\n\n        return {\n            'id': play_id,\n            'title': data['topic'],\n            'url': data['viewMp4Url'],\n            'width': int_or_none(data.get('viewResolvtionsWidth')),\n            'height': int_or_none(data.get('viewResolvtionsHeight')),\n            'http_headers': {\n                'Referer': base_url,\n            },\n            'filesize_approx': parse_filesize(data.get('fileSize')),\n        }\n","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/zoom.py#L33-L69","documentation":"Raised by the Zoom extractor after a passcode was submitted to rec/validate(_meet)_passwd and the JSON response has status != true. The raised message is the server-provided errorMessage, marked expected=True, so it almost always means the passcode was wrong for this recording.","triggerScenarios":"Calling with --video-password where the passcode does not match the recording: typos, case-sensitive mistakes, stale passcode after the link was re-shared with a new code, or submitting a 'meeting' passcode where the form expects the recording-file passcode.","commonSituations":"Copying the passcode with stray whitespace or quotes; the host rotated the passcode; confusing the meeting passcode with the recording passcode.","solutions":["Re-check the passcode against the one the sharer provided (watch for case and surrounding spaces)","Confirm you are using the current share link — hosts can regenerate links with new passcodes","If the page shows a passcode prompt in a browser, test the same value there first"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt, pwd in enumerate(candidate_passcodes):\n    ydl.params['videopassword'] = pwd\n    try:\n        ydl.download([url]); break\n    except ExtractorError as e:\n        if 'passcode' not in str(e).lower() and 'password' not in str(e).lower():\n            raise  # not an auth failure - stop\n        if attempt == len(candidate_passcodes) - 1:\n            raise","preventionTips":["Trim whitespace and preserve case when reading Zoom passcodes from email/chat","Treat a wrong-passcode error as retryable only with a DIFFERENT passcode, never the same one"],"tags":["zoom","password","authentication","dynamic-message"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}