ytdl-org/youtube-dl · error · ExtractorError
Mediasite says: %s
Error message
Mediasite says: %s
What it means
Raised by the Mediasite extractor when the getPlayerOptions JSON-RPC response has a null 'Presentation' object, meaning the requested resource id has no playable presentation. The message embeds PlayerPresentationStatusMessage, the site's own status text. Note the guard is written after `presentation['Title']` is already dereferenced on the line above, so in practice this code path can crash with a TypeError before the raise — a known code-order defect.
Source
Thrown at youtube_dl/extractor/mediasite.py:158
'%s/GetPlayerOptions' % service_path, resource_id,
headers={
'Content-type': 'application/json; charset=utf-8',
'X-Requested-With': 'XMLHttpRequest',
},
data=json.dumps({
'getPlayerOptionsRequest': {
'ResourceId': resource_id,
'QueryString': query,
'UrlReferrer': data.get('UrlReferrer', ''),
'UseScreenReader': False,
}
}).encode('utf-8'))['d']
presentation = player_options['Presentation']
title = presentation['Title']
if presentation is None:
raise ExtractorError(
'Mediasite says: %s' % player_options['PlayerPresentationStatusMessage'],
expected=True)
thumbnails = []
formats = []
for snum, Stream in enumerate(presentation['Streams']):
stream_type = Stream.get('StreamType')
if stream_type is None:
continue
video_urls = Stream.get('VideoUrls')
if not isinstance(video_urls, list):
video_urls = []
stream_id = self._STREAM_TYPES.get(
stream_type, 'type%u' % stream_type)
stream_formats = []View on GitHub (pinned to 956b8c5855)
Solutions
- Verify the Mediasite presentation URL in a browser and confirm the recording is published.
- Pass institutional cookies (--cookies) if the presentation requires authentication.
- Update youtube-dl / switch to yt-dlp where the None-check ordering is fixed so the real status message is shown.
- Report the URL if the presentation is public yet still fails, so the extractor's player-options handling can be updated.
Example fix
// before
presentation = player_options['Presentation']
title = presentation['Title']
if presentation is None:
raise ExtractorError('Mediasite says: %s' % player_options['PlayerPresentationStatusMessage'], expected=True)
// after (check before dereferencing)
presentation = player_options['Presentation']
if presentation is None:
raise ExtractorError('Mediasite says: %s' % player_options['PlayerPresentationStatusMessage'], expected=True)
title = presentation['Title'] Defensive patterns
Strategy: validation
Type guard
def mediasite_presentation_missing(player_options):
return not isinstance(player_options, dict) or player_options.get('Presentation') is None Try / catch
try:
info = ydl.extract_info(url, download=False)
except ExtractorError as e:
if 'Mediasite says:' in str(e):
reason = str(e).split('says:', 1)[1].strip()
handle_status(reason) # 'Unauthorized', 'NotFound', etc.
else:
raise Prevention
- Confirm presentations are published and public before extraction.
- Pass institutional session cookies for auth-protected Mediasite deployments.
- Watch for the pre-existing None-dereference bug: a TypeError here means the same root cause hit the broken code path.
When it happens
Trigger: POST of getPlayerOptionsRequest for a resource id returns d.PlayerPresentationStatusMessage with a failed status and Presentation == null; accessing presentation['Title'] first means a None presentation usually raises TypeError ('NoneType' object is not subscriptable) instead of this ExtractorError.
Common situations: Mediasite recording deleted or not yet processed; resource id from an old bookmark; permission-restricted presentation requiring institution auth; the Title-before-None-check ordering bug turning every genuine case into an unhandled TypeError.
Related errors
- %s said: %s
- Unable to login: %s
- lynda returned error: %s
- Course %s does not exist
- That clip does not exist.
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/c4e520bf86db6065.
Report an issue: GitHub.