{"record":{"id":"5c6fa964469a7b84","repo":"ytdl-org/youtube-dl","slug":"wrong-video-password","errorCode":null,"errorMessage":"Wrong video password","messagePattern":"Wrong video password","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vimeo.py","lineNumber":598,"sourceCode":"\n    @staticmethod\n    def _extract_url(url, webpage):\n        urls = VimeoIE._extract_urls(url, webpage)\n        return urls[0] if urls else None\n\n    def _verify_player_video_password(self, url, video_id, headers):\n        password = self._get_video_password()\n        data = urlencode_postdata({\n            'password': base64.b64encode(password.encode()),\n        })\n        headers = merge_dicts(headers, {\n            'Content-Type': 'application/x-www-form-urlencoded',\n        })\n        checked = self._download_json(\n            url + '/check-password', video_id,\n            'Verifying the password', data=data, headers=headers)\n        if checked is False:\n            raise ExtractorError('Wrong video password', expected=True)\n        return checked\n\n    def _real_initialize(self):\n        self._login()\n\n    def _extract_from_api(self, video_id, unlisted_hash=None):\n        token = self._download_json(\n            'https://vimeo.com/_rv/jwt', video_id, headers={\n                'X-Requested-With': 'XMLHttpRequest'\n            })['token']\n        api_url = 'https://api.vimeo.com/videos/' + video_id\n        if unlisted_hash:\n            api_url += ':' + unlisted_hash\n        video = self._download_json(\n            api_url, video_id, headers={\n                'Authorization': 'jwt ' + token,\n            }, query={\n                'fields': 'config_url,created_time,description,license,metadata.connections.comments.total,metadata.connections.likes.total,release_time,stats.plays',","sourceCodeStart":580,"sourceCodeEnd":616,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vimeo.py#L580-L616","documentation":"Raised by VimeoIE._verify_player_video_password when the player.vimeo.com /check-password endpoint returns JSON that is exactly False — Vimeo's explicit signal that the base64-submitted password did not match. expected=True, deterministic per attempt.","triggerScenarios":"Calling a player.vimeo.com/video/<id> URL for a password-protected video where the POSTed password (base64-encoded in _verify_player_video_password) is incorrect; the check-password response is literal false.","commonSituations":"Typo'd --video-password; password changed since the link was shared; case/whitespace issues when copying; passing the account password instead of the video password.","solutions":["Re-enter the exact video password (not the login password) via --video-password.","Verify the password in a browser by opening the same player URL.","Trim whitespace/newlines when injecting the password from files or env vars in scripts.","On repeated failures, ask the uploader to confirm the password — it may have been rotated."],"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 'Wrong video password' in str(e):\n        re_prompt_password_retry(max_attempts=3, then_skip=True)\n    else:\n        raise","preventionTips":["Trim whitespace when reading video passwords from files/env.","Confirm the password in a browser on the same player URL.","Rate-limit password attempts; Vimeo can throttle repeated check-password calls."],"tags":["vimeo","password","private-video","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}