ytdl-org/youtube-dl · error · ExtractorError

error_msg % video_id

Error message

error_msg % video_id

What it means

The message is a template (error_msg % video_id) applied in VKIE's ERRORS dict loop: when the video_ext.php page matches one of several known VK error markers (author blocked, video deleted, region-locked, rightholder complaint), the matching human-readable string is formatted with the video ID and raised. The placeholder in the report represents the template, not literal output.

Solutions

  1. Read the formatted message to identify the category: author blocked, deleted, region-locked, or rightholder complaint
  2. For region errors, retry from an IP in an allowed region
  3. For deleted/removed videos, no download is possible — drop the entry from batch jobs
Defensive patterns

Strategy: try-catch

Try / catch

from youtube_dl.utils import ExtractorError
import re
try:
    ydl.extract_info(url)
except ExtractorError as e:
    m = str(e)
    if 'not available in your region' in m:
        retry_via_proxy(url)
    elif re.search(r'(deleted|blocked|removed)', m):
        drop(url)  # permanent — do not retry

Prevention

When it happens

Trigger: The embed page contains one of the ERRORS markers, e.g. '<!>This video is no longer available, because its author has been blocked.' or '<!>The video .+? is not available in your region.'; each maps to a 'Video %s ...' message with expected=True.

Common situations: Dead playlist links whose authors were banned; copyright takedowns; region restrictions when downloading from another country.

Related errors


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

Appendix: source

Thrown at youtube_dl/extractor/vk.py:385

                r'<!>Access denied':
                'Access denied to video %s.',

                r'<!>Видеозапись недоступна, так как её автор был заблокирован.':
                'Video %s is no longer available, because its author has been blocked.',

                r'<!>This video is no longer available, because its author has been blocked.':
                'Video %s is no longer available, because its author has been blocked.',

                r'<!>This video is no longer available, because it has been deleted.':
                'Video %s is no longer available, because it has been deleted.',

                r'<!>The video .+? is not available in your region.':
                'Video %s is not available in your region.',
            }

            for error_re, error_msg in ERRORS.items():
                if re.search(error_re, info_page):
                    raise ExtractorError(error_msg % video_id, expected=True)

            player = self._parse_json(self._search_regex(
                r'var\s+playerParams\s*=\s*({.+?})\s*;\s*\n',
                info_page, 'player params'), video_id)

        youtube_url = YoutubeIE._extract_url(info_page)
        if youtube_url:
            return self.url_result(youtube_url, YoutubeIE.ie_key())

        vimeo_url = VimeoIE._extract_url(url, info_page)
        if vimeo_url is not None:
            return self.url_result(vimeo_url, VimeoIE.ie_key())

        pladform_url = PladformIE._extract_url(info_page)
        if pladform_url:
            return self.url_result(pladform_url, PladformIE.ie_key())

        m_rutube = re.search(

View on GitHub (pinned to 956b8c5855)