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

  1. Verify the clip still plays on the broadcaster's website; if not, the URL is dead — remove it.
  2. Update youtube-dl — VAS client_id/server_id parameters drift over time and are patched frequently.
  3. If the content is catch-up TV, note it may simply have expired; find the current episode URL.
  4. 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

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


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