ytdl-org/youtube-dl · error · ExtractorError

%s

Error message

%s

What it means

Raised by StitcherShowIE/StitcherBaseIE._call_api when a call to api.prod.stitcher.com returns a JSON body whose errors[0].message field is non-empty; the API error text is re-raised verbatim as an ExtractorError (expected=True). The variable is misspelled 'error_massage' in the source but the behavior is plain error passthrough.

Source

Thrown at youtube_dl/extractor/stitcher.py:25

    clean_podcast_url,
    ExtractorError,
    int_or_none,
    str_or_none,
    try_get,
    url_or_none,
)


class StitcherBaseIE(InfoExtractor):
    _VALID_URL_BASE = r'https?://(?:www\.)?stitcher\.com/(?:podcast|show)/'

    def _call_api(self, path, video_id, query):
        resp = self._download_json(
            'https://api.prod.stitcher.com/' + path,
            video_id, query=query)
        error_massage = try_get(resp, lambda x: x['errors'][0]['message'])
        if error_massage:
            raise ExtractorError(error_massage, expected=True)
        return resp['data']

    def _extract_description(self, data):
        return clean_html(data.get('html_description') or data.get('description'))

    def _extract_audio_url(self, episode):
        return url_or_none(episode.get('audio_url') or episode.get('guid'))

    def _extract_show_info(self, show):
        return {
            'thumbnail': show.get('image_base_url'),
            'series': show.get('title'),
        }

    def _extract_episode(self, episode, audio_url, show_info):
        info = {
            'id': compat_str(episode['id']),
            'display_id': episode.get('slug'),

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the exact API message embedded in the ExtractorError — it is Stitcher's own reason (not found, removed, etc.) and dictates the fix.
  2. Verify the show/episode URL on stitcher.com and re-copy it; ids in URLs drift when shows are renamed.
  3. Upgrade youtube-dl/yt-dlp; Stitcher API changes are handled upstream.
  4. If the podcast left Stitcher, find its RSS feed (often listed on the show's site) and download episodes from the feed directly.

Example fix

// before: caller treats every failure as a network bug
// after: surface the API's own message
try {
  info = ydl.extractInfo(url, {download: false});
} catch (e) {
  if (e.message.includes('said') === false) throw e; // not applicable here
}
// Python:
try:
    ydl.extract_info(url)
except ExtractorError as e:
    if e.expected:
        print('Stitcher API said:', str(e))  # passthrough of errors[0].message
Defensive patterns

Strategy: try-catch

Validate before calling

# Optional: hit the Stitcher API yourself first to validate the id
import json, urllib.request
resp = json.load(urllib.request.urlopen('https://api.prod.stitcher.com/shows/%s/episodes' % show_id))
if resp.get('errors'):
    print('API refused:', resp['errors'][0]['message'])

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if e.expected:
        log.warning('Stitcher API said: %s', str(e))  # site's own message
        return None
    raise

Prevention

When it happens

Trigger: Any _download_json request to https://api.prod.stitcher.com/<path> (show feed, episode) where the response contains a non-null errors[0].message — e.g. unknown show id, removed episode, or geoblock reported by the API.

Common situations: Podcast/episode removed from Stitcher; URL with an old or wrong id; Stitcher API schema changed so formerly-valid ids now return errors; SiriusXM shutdown of Stitcher content.

Related errors


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