ytdl-org/youtube-dl · error · ExtractorError
%s said: %s
Error message
%s said: %s
What it means
Raised by the SBS (Australian broadcaster) extractor when the player JSON's 'error' object is set. The code maps errorCode to a human message: 'ComingSoon' -> '<title> is not yet available.', 'Forbidden'/'intranetAccessOnly' -> cannot be accessed via this website, 'Expired' -> '<title> is no longer available.', default -> video does not exist. Final message: 'SBS said: <mapped message>'. Expected=True.
Source
Thrown at youtube_dl/extractor/sbs.py:67
}]
def _real_extract(self, url):
video_id = self._match_id(url)
player_params = self._download_json(
'http://www.sbs.com.au/api/video_pdkvars/id/%s?form=json' % video_id, video_id)
error = player_params.get('error')
if error:
error_message = 'Sorry, The video you are looking for does not exist.'
video_data = error.get('results') or {}
error_code = error.get('errorCode')
if error_code == 'ComingSoon':
error_message = '%s is not yet available.' % video_data.get('title', '')
elif error_code in ('Forbidden', 'intranetAccessOnly'):
error_message = 'Sorry, This video cannot be accessed via this website'
elif error_code == 'Expired':
error_message = 'Sorry, %s is no longer available.' % video_data.get('title', '')
raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True)
urls = player_params['releaseUrls']
theplatform_url = (urls.get('progressive') or urls.get('html')
or urls.get('standard') or player_params['relatedItemsURL'])
return {
'_type': 'url_transparent',
'ie_key': 'ThePlatform',
'id': video_id,
'url': smuggle_url(self._proto_relative_url(theplatform_url), {'force_smil_url': True}),
}
View on GitHub (pinned to 956b8c5855)
Solutions
- Act on the mapped message: for ComingSoon wait until after broadcast; for Expired the asset is gone; for Forbidden you need access from the permitted region/network.
- Confirm availability on the SBS On Demand website.
- Schedule extraction only within the published availability window.
Defensive patterns
Strategy: try-catch
Try / catch
try:
ydl.extract_info(url)
except ExtractorError as e:
if str(e).startswith('SBS said:'):
m = str(e)
if 'not yet available' in m: schedule_later(url)
elif 'no longer available' in m: drop(url)
else: log_geo_or_forbidden(url)
else:
raise Prevention
- Parse the mapped message to bucket the failure: upcoming vs expired vs forbidden.
- For ComingSoon items, re-run after the broadcast starts rather than retrying blindly.
- Remember Forbidden/intranetAccessOnly require access from the permitted network/region.
When it happens
Trigger: Extracting an sbs.com.au video id whose player endpoint returns an error object: premieres in the future (ComingSoon), geo- or platform-blocked (Forbidden/intranetAccessOnly), expired after its availability window (Expired).
Common situations: Trying to download an upcoming show before it airs; content only viewable inside Australia; news/episodes past their licensing window.
Related errors
- %s returned error: %s
- This video is not available from your country.
- %s said: video is not available
- %s returned error: %s - %s
- %s: No songs found, try using proxy
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/91d5463016b20404.
Report an issue: GitHub.