ytdl-org/youtube-dl · error · ExtractorError

Unable to log in

Error message

Unable to log in

What it means

Raised by VimeoBaseInfoExtractor._login when the login POST fails for any reason other than the 418 bad-credentials case — network errors, unexpected status codes, HTML challenge pages, or the endpoint changing. It is the generic fallback of the except block and is NOT expected=True, so it usually surfaces as an unexpected extraction error.

Source

Thrown at youtube_dl/extractor/vimeo.py:74

            'email': username,
            'password': password,
            'service': 'vimeo',
            'token': token,
        }
        self._set_vimeo_cookie('vuid', vuid)
        try:
            self._download_webpage(
                self._LOGIN_URL, None, 'Logging in',
                data=urlencode_postdata(data), headers={
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Referer': self._LOGIN_URL,
                })
        except ExtractorError as e:
            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 418:
                raise ExtractorError(
                    'Unable to log in: bad username or password',
                    expected=True)
            raise ExtractorError('Unable to log in')

    def _get_video_password(self):
        password = self._downloader.params.get('videopassword')
        if password is None:
            raise ExtractorError(
                'This video is protected by a password, use the --video-password option',
                expected=True)
        return password

    def _verify_video_password(self, url, video_id, password, token, vuid):
        if url.startswith('http://'):
            # vimeo only supports https now, but the user can give an http url
            url = url.replace('http://', 'https://')
        self._set_vimeo_cookie('vuid', vuid)
        return self._download_webpage(
            url + '/password', video_id, 'Verifying the password',
            'Wrong password', data=urlencode_postdata({
                'password': password,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Retry after a delay or from a different IP if rate-limited or bot-challenged.
  2. Confirm plain password login still works in a browser on the same network; if Vimeo now requires JS/verification, extractor password login may be dead — prefer cookies (--cookies).
  3. If credentials are actually wrong, you will get the 418 branch instead; check which message you received before debugging the network.
  4. Keep youtube-dl updated for changes to the login flow.
Defensive patterns

Strategy: retry

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if not e.expected and 'Unable to log in' in str(e):
        backoff_retry(url, max_attempts=3)  # generic login failure: may be transient (rate limit, challenge)
    else:
        raise

Prevention

When it happens

Trigger: The POST to https://vimeo.com/log_in raises an ExtractorError whose cause is not a 418 HTTPError — e.g. 429 rate limit, Cloudflare/interstitial response, timeout, or markup change breaking the follow-up handling.

Common situations: Repeated automated logins triggering rate limiting; Vimeo adding bot protection to the login flow; transient proxy/TLS failures; the login form flow changing (CSRF token extraction already done via _extract_xsrft_and_vuid failing first would raise earlier).

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/a7e9a9a756be9478. Report an issue: GitHub.