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

  1. Verify the Mediasite presentation URL in a browser and confirm the recording is published.
  2. Pass institutional cookies (--cookies) if the presentation requires authentication.
  3. Update youtube-dl / switch to yt-dlp where the None-check ordering is fixed so the real status message is shown.
  4. 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

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


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