{"record":{"id":"cb8add31e269b316","repo":"ytdl-org/youtube-dl","slug":"s-said-s-cb8add","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/streamcloud.py","lineNumber":65,"sourceCode":"\n        self._sleep(6, video_id)\n\n        webpage = self._download_webpage(\n            url, video_id, data=urlencode_postdata(fields), headers={\n                b'Content-Type': b'application/x-www-form-urlencoded',\n            })\n\n        try:\n            title = self._html_search_regex(\n                r'<h1[^>]*>([^<]+)<', webpage, 'title')\n            video_url = self._search_regex(\n                r'file:\\s*\"([^\"]+)\"', webpage, 'video URL')\n        except ExtractorError:\n            message = self._html_search_regex(\n                r'(?s)<div[^>]+class=([\"\\']).*?msgboxinfo.*?\\1[^>]*>(?P<message>.+?)</div>',\n                webpage, 'message', default=None, group='message')\n            if message:\n                raise ExtractorError('%s said: %s' % (self.IE_NAME, message), expected=True)\n            raise\n        thumbnail = self._search_regex(\n            r'image:\\s*\"([^\"]+)\"', webpage, 'thumbnail URL', fatal=False)\n\n        return {\n            'id': video_id,\n            'title': title,\n            'url': video_url,\n            'thumbnail': thumbnail,\n            'http_headers': {\n                'Referer': url,\n            },\n        }\n","sourceCodeStart":47,"sourceCodeEnd":79,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/streamcloud.py#L47-L79","documentation":"Raised by StreamcloudIE when the post-wait page yields neither the <h1> title nor the 'file: \"...\"' video URL regex match, but DOES contain a div with class msgboxinfo. The site's own info message (e.g. 'maintenance', 'only registered users', country block) is relayed as '<IE> said: <message>' with expected=True. If no msgboxinfo exists, the original regex error is re-raised instead.","triggerScenarios":"Submitting the hidden-field form after the 6-second sleep and receiving a page whose player config is absent but an informational msgboxinfo div is present.","commonSituations":"Streamcloud maintenance windows; per-file download limits hit; aggressive IP/rate limiting after many downloads in one session.","solutions":["Read the relayed msgboxinfo text — it states Streamcloud's actual refusal reason (limit, maintenance, region).","Slow down: add delays or rotate exit IP if you are rate-limited; the extractor already sleeps 6s per file.","Retry later if the message indicates maintenance; use an alternative mirror of the file otherwise.","Upgrade youtube-dl/yt-dlp in case the player markup (file:/h1 regexes) changed and the msgbox path is masking a real parse failure."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'said:' in str(e):\n        log.warning('Streamcloud message: %s', str(e))\n        handle_rate_limit_or_maintenance(str(e))\n    else:\n        raise","preventionTips":["Throttle streamcloud requests; the host rate-limits aggressively (extractor already sleeps 6s).","Read the relayed msgboxinfo text before assuming a bug.","Keep extractor versions current in case player markup changes break the regex path."],"tags":["site-message","rate-limit","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}