{"record":{"id":"ff563b12c41d4be4","repo":"ytdl-org/youtube-dl","slug":"s-returned-error-s-ff563b","errorCode":null,"errorMessage":"%s returned error: %s","messagePattern":"(.+?) returned error: (.+?)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/pladform.py","lineNumber":69,"sourceCode":"        mobj = re.search(\n            r'<iframe[^>]+src=([\"\\'])(?P<url>(?:https?:)?//out\\.pladform\\.ru/player\\?.+?)\\1', webpage)\n        if mobj:\n            return mobj.group('url')\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query)\n        pl = qs.get('pl', ['1'])[0]\n\n        video = self._download_xml(\n            'http://out.pladform.ru/getVideo', video_id, query={\n                'pl': pl,\n                'videoid': video_id,\n            })\n\n        def fail(text):\n            raise ExtractorError(\n                '%s returned error: %s' % (self.IE_NAME, text),\n                expected=True)\n\n        if video.tag == 'error':\n            fail(video.text)\n\n        quality = qualities(('ld', 'sd', 'hd'))\n\n        formats = []\n        for src in video.findall('./src'):\n            if src is None:\n                continue\n            format_url = src.text\n            if not format_url:\n                continue\n            if src.get('type') == 'hls' or determine_ext(format_url) == 'm3u8':\n                formats.extend(self._extract_m3u8_formats(\n                    format_url, video_id, 'mp4', entry_protocol='m3u8_native',","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/pladform.py#L51-L87","documentation":"Raised by PladformIE via its local fail() helper when the XML returned by out.pladform.ru/getVideo has root tag 'error'. The final message is '<IE_NAME> returned error: <video.text>' — the text of the XML error element, e.g. 'video not found'. Expected=True, so it reflects a Pladform-side rejection, not a downloader fault.","triggerScenarios":"Calling getVideo with pl/videoid query params the backend rejects: deleted video, wrong 'pl' player id from the query string, or the videoid only valid on a different player. The XML root being <error> is the trigger.","commonSituations":"Videos on Russian portals (vesti, etc.) removed after rights expiry; copy-pasted embed URLs whose 'pl' parameter belongs to another publisher; Pladform changing error payload from XML to JSON so the tag check misses and extraction fails differently.","solutions":["Confirm the video still plays on the original hosting page in a browser","Extract from the embedding article URL rather than the bare pladform player URL so the correct 'pl' param is used","Update youtube-dl/yt-dlp for extractor fixes against API changes"],"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 'returned error' in str(e):\n        # Pladform's own <error> text; usually 'video not found'\n        log.info('Removed upstream: %s', e)","preventionTips":["Extract from the embedding article URL, not the bare player URL, to inherit the right 'pl' id","Preserve the full query string when copying pladform links","Archive promptly — Russian portal videos expire with rights"],"tags":["pladform","xml","api-error","content-gone","extractor-error","expected"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}