ytdl-org/youtube-dl · error · ExtractorError

%s returned error: %s

Error message

%s returned error: %s

What it means

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.

Source

Thrown at youtube_dl/extractor/pladform.py:69

        mobj = re.search(
            r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//out\.pladform\.ru/player\?.+?)\1', webpage)
        if mobj:
            return mobj.group('url')

    def _real_extract(self, url):
        video_id = self._match_id(url)

        qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query)
        pl = qs.get('pl', ['1'])[0]

        video = self._download_xml(
            'http://out.pladform.ru/getVideo', video_id, query={
                'pl': pl,
                'videoid': video_id,
            })

        def fail(text):
            raise ExtractorError(
                '%s returned error: %s' % (self.IE_NAME, text),
                expected=True)

        if video.tag == 'error':
            fail(video.text)

        quality = qualities(('ld', 'sd', 'hd'))

        formats = []
        for src in video.findall('./src'):
            if src is None:
                continue
            format_url = src.text
            if not format_url:
                continue
            if src.get('type') == 'hls' or determine_ext(format_url) == 'm3u8':
                formats.extend(self._extract_m3u8_formats(
                    format_url, video_id, 'mp4', entry_protocol='m3u8_native',

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Confirm the video still plays on the original hosting page in a browser
  2. Extract from the embedding article URL rather than the bare pladform player URL so the correct 'pl' param is used
  3. Update youtube-dl/yt-dlp for extractor fixes against API changes
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if e.expected and 'returned error' in str(e):
        # Pladform's own <error> text; usually 'video not found'
        log.info('Removed upstream: %s', e)

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/ff563b12c41d4be4. Report an issue: GitHub.