ytdl-org/youtube-dl · error · ExtractorError

%s does not exist

Error message

%s does not exist

What it means

Raised by TwitchStreamIE when the stream GraphQL response's data.user is falsy — Twitch reports no user object for the channel name, i.e. the channel does not exist (renamed, banned, or typo). Expected error naming the channel.

Source

Thrown at youtube_dl/extractor/twitch.py:790

                'operationName': 'ComscoreStreamingQuery',
                'variables': {
                    'channel': channel_name,
                    'clipSlug': '',
                    'isClip': False,
                    'isLive': True,
                    'isVodOrCollection': False,
                    'vodID': '',
                },
            }, {
                'operationName': 'VideoPreviewOverlay',
                'variables': {'login': channel_name},
            }],
            'Downloading stream GraphQL')

        user = gql[0]['data']['user']

        if not user:
            raise ExtractorError(
                '%s does not exist' % channel_name, expected=True)

        stream = user['stream']

        if not stream:
            raise ExtractorError('%s is offline' % channel_name, expected=True)

        access_token = self._download_access_token(
            channel_name, 'stream', 'channelName')
        token = access_token['value']

        stream_id = stream.get('id') or channel_name
        query = {
            'allow_source': 'true',
            'allow_audio_only': 'true',
            'allow_spectre': 'true',
            'p': random.randint(1000000, 10000000),
            'player': 'twitchweb',

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Verify the channel name on twitch.tv and use the current login slug from the directory URL.
  2. If the channel was renamed, find its new name and retry.
  3. If suspended, no fix — content is gone.
  4. Update to yt-dlp in case the GraphQL shape changed.
Defensive patterns

Strategy: validation

Validate before calling

import requests
q = [{'operationName': 'StreamMetadata', 'variables': {'login': channel}}]
r = requests.post('https://gql.twitch.tv/gql', json=q, headers={'Client-ID': CLIENT_ID})
if not r.json()[0]['data'].get('user'):
    skip(channel, 'channel does not exist')

Type guard

def channel_exists(data: dict) -> bool:
    return bool(data.get('user'))

Try / catch

try:
    ydl.extract_info(channel_url)
except ExtractorError as e:
    if 'does not exist' in str(e):
        resolve_new_channel_name(channel)  # renamed channels keep old URLs dead
    else:
        raise

Prevention

When it happens

Trigger: Extracting a twitch.tv/<name> live URL where the StreamMetadata query returns user: null — nonexistent or renamed channel names.

Common situations: Channels renamed by the owner (old URLs die), suspended/banned channels, typos in the channel name, localized display names used instead of the login slug.

Related errors


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