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
- Verify the channel name on twitch.tv and use the current login slug from the directory URL.
- If the channel was renamed, find its new name and retry.
- If suspended, no fix — content is gone.
- 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
- Always use the channel's login slug from the current directory URL, not display names.
- Store channel ids, not names, in long-lived scripts; resolve names at runtime.
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
- Video %s does not exist
- %s is offline
- This clip is no longer available
- Video %s is not available
- Stream %s is upcoming
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/243f5f5cfed52996.
Report an issue: GitHub.