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
- Read the exact API message embedded in the ExtractorError — it is Stitcher's own reason (not found, removed, etc.) and dictates the fix.
- Verify the show/episode URL on stitcher.com and re-copy it; ids in URLs drift when shows are renamed.
- Upgrade youtube-dl/yt-dlp; Stitcher API changes are handled upstream.
- 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
- Treat the raised text as authoritative — it is Stitcher's own errors[0].message.
- Verify show/episode URLs on stitcher.com before batch jobs.
- Stitcher content has been winding down; keep a podcast RSS fallback.
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
- %s said: %s
- %s said: %s
- data['errorMsg'] (dynamic server message)
- error['error_description']
- Invalid url %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/f3fea2ff2c0f15c3.
Report an issue: GitHub.