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
- Verify an active HiDive subscription covers the title (play it in a browser)
- Log in with valid credentials/cookies before extracting
- Check the restriction value with -v (e.g. SubscriptionRequired) and address that specifically
- 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
- Check restrictionReason value with -v — it names the exact gate (subscription, region, rating)
- Pass entitled credentials/cookies for premium titles
- Distinguish geo restriction (raise_geo_restricted) from other restrictions in handling
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
- This video is only available via cable service provider subs
- ', '.join([e['message'] for e in entitlement_issues])
- %s said: %s
- %s said: %s
- Token error: %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/f61bc5f2298883d7.
Report an issue: GitHub.