ytdl-org/youtube-dl · error · ExtractorError

Video %s is unavailable

Error message

Video %s is unavailable

What it means

Raised by ARDMediathekIE when the downloaded webpage contains the German string '>Leider liegt eine Störung vor.' ('unfortunately there is a disruption'). This is ARD's own error banner, translated by the extractor into 'Video %s is unavailable'. Marked expected=True.

Source

Thrown at youtube_dl/extractor/ard.py:183

        document_id = None

        numid = re.search(r'documentId=([0-9]+)', url)
        if numid:
            document_id = video_id = numid.group(1)
        else:
            video_id = m.group('video_id')

        webpage = self._download_webpage(url, video_id)

        ERRORS = (
            ('>Leider liegt eine Störung vor.', 'Video %s is unavailable'),
            ('>Der gewünschte Beitrag ist nicht mehr verfügbar.<',
             'Video %s is no longer available'),
        )

        for pattern, message in ERRORS:
            if pattern in webpage:
                raise ExtractorError(message % video_id, expected=True)

        if re.search(r'[\?&]rss($|[=&])', url):
            doc = compat_etree_fromstring(webpage.encode('utf-8'))
            if doc.tag == 'rss':
                return GenericIE()._extract_rss(url, video_id, doc)

        title = self._og_search_title(webpage, default=None) or self._html_search_regex(
            [r'<h1(?:\s+class="boxTopHeadline")?>(.*?)</h1>',
             r'<meta name="dcterms\.title" content="(.*?)"/>',
             r'<h4 class="headline">(.*?)</h4>',
             r'<title[^>]*>(.*?)</title>'],
            webpage, 'title')
        description = self._og_search_description(webpage, default=None) or self._html_search_meta(
            'dcterms.abstract', webpage, 'description', default=None)
        if description is None:
            description = self._html_search_meta(
                'description', webpage, 'meta description', default=None)
        if description is None:

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Retry later — 'Störung' typically denotes a temporary disruption
  2. Test another ARD video to distinguish a sitewide outage from a broken item
  3. If only one item fails permanently, look for a re-published URL on the ARD site
Defensive patterns

Strategy: retry

Validate before calling

# Distinguish sitewide outage from a broken item before queueing retries
import requests
ok = requests.get('https://www.ardmediathek.de/ard/video/Y-3JHrH8r2mQ4K4M8Q226I6/').status_code == 200
probe = requests.get(url).text
item_disrupted = 'Leider liegt eine Störung vor' in probe

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'is unavailable' in str(e):  # ARD's 'Störung' banner
        retry_with_backoff(url, hours=1)  # transient disruption

Prevention

When it happens

Trigger: GET of the ARD page returns HTML embedding the Störung banner; server-side outages; specific item broken in the Mediathek backend while the page still resolves.

Common situations: Transient ARD backend outages; single broken items amid otherwise working content; scraping during Mediathek maintenance windows.

Related errors


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