{"record":{"id":"f61bc5f2298883d7","repo":"ytdl-org/youtube-dl","slug":"s-said-s-f61bc5","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/hidive.py","lineNumber":75,"sourceCode":"    def _real_extract(self, url):\n        mobj = re.match(self._VALID_URL, url)\n        title, key = mobj.group('title', 'key')\n        video_id = '%s/%s' % (title, key)\n\n        settings = self._download_json(\n            'https://www.hidive.com/play/settings', video_id,\n            data=urlencode_postdata({\n                'Title': title,\n                'Key': key,\n                'PlayerId': 'f4f895ce1ca713ba263b91caeb1daa2d08904783',\n            }))\n\n        restriction = settings.get('restrictionReason')\n        if restriction == 'RegionRestricted':\n            self.raise_geo_restricted()\n\n        if restriction and restriction != 'None':\n            raise ExtractorError(\n                '%s said: %s' % (self.IE_NAME, restriction), expected=True)\n\n        formats = []\n        subtitles = {}\n        for rendition_id, rendition in settings['renditions'].items():\n            bitrates = rendition.get('bitrates')\n            if not isinstance(bitrates, dict):\n                continue\n            m3u8_url = url_or_none(bitrates.get('hls'))\n            if not m3u8_url:\n                continue\n            formats.extend(self._extract_m3u8_formats(\n                m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',\n                m3u8_id='%s-hls' % rendition_id, fatal=False))\n            cc_files = rendition.get('ccFiles')\n            if not isinstance(cc_files, list):\n                continue\n            for cc_file in cc_files:","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/hidive.py#L57-L93","documentation":"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.","triggerScenarios":"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.","commonSituations":"Trying to download premium HiDive titles without an active subscription, using expired cookies, or account region/profile restrictions.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import requests\nsettings = requests.post('https://www.hidive.com/play/settings', data=payload).json()\nr = settings.get('restrictionReason')\nif r and r != 'None':\n    print('HiDive restriction:', r)","typeGuard":"def hidive_playable(settings):\n    r = settings.get('restrictionReason')\n    return r in (None, 'None') and isinstance(settings.get('renditions'), dict)","tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept DownloadError as e:\n    if 'restrictionReason' in str(e) or 'HiDive said' in str(e):\n        if 'Subscription' in str(e):\n            flag_needs_subscription(url)\n        raise","preventionTips":["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"],"tags":["hidive","entitlement","subscription","extractor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}