yt-dlp/yt-dlp · error · ExtractorError

This video is only available for registered users. You may w

Error message

This video is only available for registered users. You may want to use --cookies.

What it means

dplay/Discovery+ playback authorization error. _process_errors inspects the error JSON from a failed disco API call; error code 'access.denied.missingpackage' (your account's package lacks this content) or 'invalid.token' (missing or bad authorization token) raises this expected error suggesting cookies. The st cookie from a logged-in browser session is what the extractor needs to mint a valid Bearer token.

Source

Thrown at yt_dlp/extractor/dplay.py:49

                query['deviceId'] = uuid.uuid4().hex
            token = self._download_json(
                disco_base + 'token', display_id, 'Downloading token',
                query=query)['data']['attributes']['token']

            # Save cache only if cookies are not being set
            if not self._get_cookies(disco_base).get('st'):
                self._auth_token_cache[key] = token

        return f'Bearer {token}'

    def _process_errors(self, e, geo_countries):
        info = self._parse_json(e.cause.response.read().decode('utf-8'), None)
        error = info['errors'][0]
        error_code = error.get('code')
        if error_code == 'access.denied.geoblocked':
            self.raise_geo_restricted(countries=geo_countries)
        elif error_code in ('access.denied.missingpackage', 'invalid.token'):
            raise ExtractorError(
                'This video is only available for registered users. You may want to use --cookies.', expected=True)
        raise ExtractorError(info['errors'][0]['detail'], expected=True)

    def _update_disco_api_headers(self, headers, disco_base, display_id, realm):
        headers['Authorization'] = self._get_auth(disco_base, display_id, realm, False)

    def _download_video_playback_info(self, disco_base, video_id, headers):
        streaming = self._download_json(
            disco_base + 'playback/videoPlaybackInfo/' + video_id,
            video_id, headers=headers)['data']['attributes']['streaming']
        streaming_list = []
        for format_id, format_dict in streaming.items():
            streaming_list.append({
                'type': format_id,
                'url': format_dict.get('url'),
            })
        return streaming_list

View on GitHub (pinned to 81ecd58b13)

Solutions

  1. Log in on the site in a browser and export cookies, then run with --cookies cookies.txt.
  2. If you already passed cookies, re-export them: they may be for the wrong domain/region or expired.
  3. missingpackage means your subscription tier does not include the content - check your plan in the account page.
  4. The geoblocked variant (access.denied.geoblocked) needs a --proxy in a licensed country, not cookies.

Example fix

# before
yt-dlp https://www.dplay.com/video/...
# after
yt-dlp --cookies ~/cookies.txt https://www.dplay.com/video/...
Defensive patterns

Strategy: try-catch

Try / catch

from yt_dlp.utils import ExtractorError

try:
    info = ydl.extract_info(url, download=False)
except ExtractorError as e:
    if 'only available for registered users' in str(e):
        enable_cookies('cookies.txt')  # re-run with a logged-in session
    raise

Prevention

When it happens

Trigger: Calling the disco playbackInfo API without a logged-in session for content requiring registration; an account without the required subscription package (missingpackage); expired session cookies (invalid.token).

Common situations: Downloading DPlay/Discovery+/Eurosport/food-network style URLs without --cookies; free-tier accounts hitting premium content; cookie files exported before the site session expired.

Related errors


AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22). Data as JSON: /api/errors/813d4f1ca3dc1d5b. Report an issue: GitHub.