ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by the HiDive extractor when the play/settings response has a restrictionReason that is not 'RegionRestricted' (which becomes raise_geo_restricted) and not the literal 'None' — e.g. 'SubscriptionRequired'. Marked expected=True.

Source

Thrown at youtube_dl/extractor/hidive.py:75

    def _real_extract(self, url):
        mobj = re.match(self._VALID_URL, url)
        title, key = mobj.group('title', 'key')
        video_id = '%s/%s' % (title, key)

        settings = self._download_json(
            'https://www.hidive.com/play/settings', video_id,
            data=urlencode_postdata({
                'Title': title,
                'Key': key,
                'PlayerId': 'f4f895ce1ca713ba263b91caeb1daa2d08904783',
            }))

        restriction = settings.get('restrictionReason')
        if restriction == 'RegionRestricted':
            self.raise_geo_restricted()

        if restriction and restriction != 'None':
            raise ExtractorError(
                '%s said: %s' % (self.IE_NAME, restriction), expected=True)

        formats = []
        subtitles = {}
        for rendition_id, rendition in settings['renditions'].items():
            bitrates = rendition.get('bitrates')
            if not isinstance(bitrates, dict):
                continue
            m3u8_url = url_or_none(bitrates.get('hls'))
            if not m3u8_url:
                continue
            formats.extend(self._extract_m3u8_formats(
                m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
                m3u8_id='%s-hls' % rendition_id, fatal=False))
            cc_files = rendition.get('ccFiles')
            if not isinstance(cc_files, list):
                continue
            for cc_file in cc_files:

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Verify an active HiDive subscription covers the title (play it in a browser)
  2. Log in with valid credentials/cookies before extracting
  3. Check the restriction value with -v (e.g. SubscriptionRequired) and address that specifically
  4. Update youtube-dl/yt-dlp in case the settings endpoint changed
Defensive patterns

Strategy: try-catch

Validate before calling

import requests
settings = requests.post('https://www.hidive.com/play/settings', data=payload).json()
r = settings.get('restrictionReason')
if r and r != 'None':
    print('HiDive restriction:', r)

Type guard

def hidive_playable(settings):
    r = settings.get('restrictionReason')
    return r in (None, 'None') and isinstance(settings.get('renditions'), dict)

Try / catch

try:
    ydl.extract_info(url)
except DownloadError as e:
    if 'restrictionReason' in str(e) or 'HiDive said' in str(e):
        if 'Subscription' in str(e):
            flag_needs_subscription(url)
        raise

Prevention

When it happens

Trigger: POSTing Title/Key/PlayerId to hidive.com/play/settings for a title your account cannot stream: no subscription, expired session, or mature-content rating locks.

Common situations: Trying to download premium HiDive titles without an active subscription, using expired cookies, or account region/profile restrictions.

Related errors


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