{"record":{"id":"91d5463016b20404","repo":"ytdl-org/youtube-dl","slug":"s-said-s-91d546","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/sbs.py","lineNumber":67,"sourceCode":"    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        player_params = self._download_json(\n            'http://www.sbs.com.au/api/video_pdkvars/id/%s?form=json' % video_id, video_id)\n\n        error = player_params.get('error')\n        if error:\n            error_message = 'Sorry, The video you are looking for does not exist.'\n            video_data = error.get('results') or {}\n            error_code = error.get('errorCode')\n            if error_code == 'ComingSoon':\n                error_message = '%s is not yet available.' % video_data.get('title', '')\n            elif error_code in ('Forbidden', 'intranetAccessOnly'):\n                error_message = 'Sorry, This video cannot be accessed via this website'\n            elif error_code == 'Expired':\n                error_message = 'Sorry, %s is no longer available.' % video_data.get('title', '')\n            raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True)\n\n        urls = player_params['releaseUrls']\n        theplatform_url = (urls.get('progressive') or urls.get('html')\n                           or urls.get('standard') or player_params['relatedItemsURL'])\n\n        return {\n            '_type': 'url_transparent',\n            'ie_key': 'ThePlatform',\n            'id': video_id,\n            'url': smuggle_url(self._proto_relative_url(theplatform_url), {'force_smil_url': True}),\n        }\n","sourceCodeStart":49,"sourceCodeEnd":79,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/sbs.py#L49-L79","documentation":"Raised by the SBS (Australian broadcaster) extractor when the player JSON's 'error' object is set. The code maps errorCode to a human message: 'ComingSoon' -> '<title> is not yet available.', 'Forbidden'/'intranetAccessOnly' -> cannot be accessed via this website, 'Expired' -> '<title> is no longer available.', default -> video does not exist. Final message: 'SBS said: <mapped message>'. Expected=True.","triggerScenarios":"Extracting an sbs.com.au video id whose player endpoint returns an error object: premieres in the future (ComingSoon), geo- or platform-blocked (Forbidden/intranetAccessOnly), expired after its availability window (Expired).","commonSituations":"Trying to download an upcoming show before it airs; content only viewable inside Australia; news/episodes past their licensing window.","solutions":["Act on the mapped message: for ComingSoon wait until after broadcast; for Expired the asset is gone; for Forbidden you need access from the permitted region/network.","Confirm availability on the SBS On Demand website.","Schedule extraction only within the published availability window."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if str(e).startswith('SBS said:'):\n        m = str(e)\n        if 'not yet available' in m: schedule_later(url)\n        elif 'no longer available' in m: drop(url)\n        else: log_geo_or_forbidden(url)\n    else:\n        raise","preventionTips":["Parse the mapped message to bucket the failure: upcoming vs expired vs forbidden.","For ComingSoon items, re-run after the broadcast starts rather than retrying blindly.","Remember Forbidden/intranetAccessOnly require access from the permitted network/region."],"tags":["sbs","geo-restriction","availability","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}