ytdl-org/youtube-dl · error · ExtractorError
This video is unavailable
Error message
This video is unavailable
What it means
ProSiebenSat1BaseIE raises ExtractorError('This video is unavailable', expected=True) when the per-source URL request to vas.sim-technik.de .../videos/{clip_id}/sources/url returns a JSON whose status_code is not 0. Status 0 means success for this endpoint; any other code means the VAS backend refuses to serve stream URLs for that source (expired, offline, or blocked).
Source
Thrown at youtube_dl/extractor/prosiebensat1.py:116
return None
return (bitrate // 1000) if bitrate % 1000 == 0 else bitrate
for source_id in source_ids:
client_id = self._SALT[:2] + sha1(''.join([self._SALT, clip_id, self._TOKEN, server_id, client_location, source_id, self._SALT, self._CLIENT_NAME]).encode('utf-8')).hexdigest()
urls = self._download_json(
'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources/url' % clip_id,
clip_id, 'Downloading urls JSON', fatal=False, query={
'access_token': self._TOKEN,
'client_id': client_id,
'client_location': client_location,
'client_name': self._CLIENT_NAME,
'server_id': server_id,
'source_ids': source_id,
})
if not urls:
continue
if urls.get('status_code') != 0:
raise ExtractorError('This video is unavailable', expected=True)
urls_sources = urls['sources']
if isinstance(urls_sources, dict):
urls_sources = urls_sources.values()
for source in urls_sources:
source_url = source.get('url')
if not source_url:
continue
protocol = source.get('protocol')
mimetype = source.get('mimetype')
if mimetype == 'application/f4m+xml' or 'f4mgenerator' in source_url or determine_ext(source_url) == 'f4m':
formats.extend(self._extract_f4m_formats(
source_url, clip_id, f4m_id='hds', fatal=False))
elif mimetype == 'application/x-mpegURL':
formats.extend(self._extract_m3u8_formats(
source_url, clip_id, 'mp4', 'm3u8_native',
m3u8_id='hls', fatal=False))
elif mimetype == 'application/dash+xml':
formats.extend(self._extract_mpd_formats(View on GitHub (pinned to 956b8c5855)
Solutions
- Verify the clip still plays on the broadcaster's website; if not, the URL is dead — remove it.
- Update youtube-dl — VAS client_id/server_id parameters drift over time and are patched frequently.
- If the content is catch-up TV, note it may simply have expired; find the current episode URL.
- Retry later if the clip is part of a pre-broadcast placeholder (availability not yet started).
Defensive patterns
Strategy: try-catch
Try / catch
try:
info = ydl.extract_info(url)
except ExtractorError as e:
if 'This video is unavailable' in str(e):
mark_expired(url) # schedule no retry Prevention
- Check clip availability on the broadcaster site before queueing old URLs.
- Update youtube-dl when VAS parameter drift is suspected.
- Treat non-zero status_code as permanent for that URL; retrying rarely helps.
When it happens
Trigger: For each source_id/client_id combo, the extractor fetches the sources/url JSON; if urls exists but urls['status_code'] != 0, it raises immediately (does not try the next source). Typical for clips whose streaming rights lapsed, deleted VOD entries, or sources disabled for the requesting client_location.
Common situations: Old embed/clip URLs after the broadcaster took content offline; time-limited catch-up TV expiring; API client/server id mismatch in the extractor after backend changes; regionally disabled sources.
Related errors
- This video is DRM protected.
- %s said: %s
- Unable to login: %s
- lynda returned error: %s
- Course %s does not exist
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/2358158f46b74d87.
Report an issue: GitHub.