{"record":{"id":"922027b0f035cee0","repo":"ytdl-org/youtube-dl","slug":"s-said-s-922027","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/eporner.py","lineNumber":83,"sourceCode":"        title = self._og_search_title(webpage, default=None) or self._html_search_regex(\n            r'<title>(.+?) - EPORNER', webpage, 'title')\n\n        # Reverse engineered from vjs.js\n        def calc_hash(s):\n            return ''.join((encode_base_n(int(s[lb:lb + 8], 16), 36) for lb in range(0, 32, 8)))\n\n        video = self._download_json(\n            'http://www.eporner.com/xhr/video/%s' % video_id,\n            display_id, note='Downloading video JSON',\n            query={\n                'hash': calc_hash(hash),\n                'device': 'generic',\n                'domain': 'www.eporner.com',\n                'fallback': 'false',\n            })\n\n        if video.get('available') is False:\n            raise ExtractorError(\n                '%s said: %s' % (self.IE_NAME, video['message']), expected=True)\n\n        sources = video['sources']\n\n        formats = []\n        for kind, formats_dict in sources.items():\n            if not isinstance(formats_dict, dict):\n                continue\n            for format_id, format_dict in formats_dict.items():\n                if not isinstance(format_dict, dict):\n                    continue\n                src = url_or_none(format_dict.get('src'))\n                if not src or not src.startswith('http'):\n                    continue\n                if kind == 'hls':\n                    formats.extend(self._extract_m3u8_formats(\n                        src, display_id, 'mp4', entry_protocol='m3u8_native',\n                        m3u8_id=kind, fatal=False))","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/eporner.py#L65-L101","documentation":"Error \"%s said: %s\" thrown in ytdl-org/youtube-dl.","triggerScenarios":"Thrown at youtube_dl/extractor/eporner.py:83 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Read the Eporner error message; the video may be removed or unavailable."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}