ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised inside PBS's redirect-handling loop when a video redirect's JSON info returns status 'error'. The message interpolates the extractor name and either a mapped message for the http_code (from _ERRORS) or the server's own message. A 403 is diverted to raise_geo_restricted first, so this raise covers other HTTP codes.

Source

Thrown at youtube_dl/extractor/pbs.py:617

                        })

        formats = []
        http_url = None
        for num, redirect in enumerate(redirects):
            redirect_id = redirect.get('eeid')

            redirect_info = self._download_json(
                '%s?format=json' % redirect['url'], display_id,
                'Downloading %s video url info' % (redirect_id or num),
                headers=self.geo_verification_headers())

            if redirect_info['status'] == 'error':
                message = self._ERRORS.get(
                    redirect_info['http_code'], redirect_info['message'])
                if redirect_info['http_code'] == 403:
                    self.raise_geo_restricted(
                        msg=message, countries=self._GEO_COUNTRIES)
                raise ExtractorError(
                    '%s said: %s' % (self.IE_NAME, message), expected=True)

            format_url = redirect_info.get('url')
            if not format_url:
                continue

            if determine_ext(format_url) == 'm3u8':
                formats.extend(self._extract_m3u8_formats(
                    format_url, display_id, 'mp4', m3u8_id='hls', fatal=False))
            else:
                formats.append({
                    'url': format_url,
                    'format_id': redirect_id,
                })
                if re.search(r'^https?://.*(?:\d+k|baseline)', format_url):
                    http_url = format_url
        self._remove_duplicate_formats(formats)
        m3u8_formats = list(filter(

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Try the video on pbs.org in a browser to confirm it still streams; if removed, use the station's own site
  2. For non-403 errors outside the US, still test with a US IP/VPN since PBS availability is US-centric
  3. If only one part fails, extract remaining parts individually by their segment URLs
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except GeoRestrictedError:
    print('PBS blocked this video regionally')
except ExtractorError as e:
    if e.expected and 'said:' in str(e):
        print('PBS partner error:', str(e))

Prevention

When it happens

Trigger: Extracting a PBS video where one of its 'redirect' sources (PBS Media Manager partners) returns {'status': 'error', 'http_code': N}. Typical codes: 404 (partner removed the asset), 403 handled separately as geo-block, or partner-specific errors mapped in _ERRORS.

Common situations: PBS partner stations pulling content after broadcast rights expire; regional member-station content unavailable outside the US; a single broken redirect in a multi-part video where other parts still work.

Related errors


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