{"record":{"id":"cad28f6fe4465d8d","repo":"ytdl-org/youtube-dl","slug":"video-s-is-unavailable","errorCode":null,"errorMessage":"Video %s is unavailable","messagePattern":"Video (.+?) is unavailable","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/ard.py","lineNumber":183,"sourceCode":"        document_id = None\n\n        numid = re.search(r'documentId=([0-9]+)', url)\n        if numid:\n            document_id = video_id = numid.group(1)\n        else:\n            video_id = m.group('video_id')\n\n        webpage = self._download_webpage(url, video_id)\n\n        ERRORS = (\n            ('>Leider liegt eine Störung vor.', 'Video %s is unavailable'),\n            ('>Der gewünschte Beitrag ist nicht mehr verfügbar.<',\n             'Video %s is no longer available'),\n        )\n\n        for pattern, message in ERRORS:\n            if pattern in webpage:\n                raise ExtractorError(message % video_id, expected=True)\n\n        if re.search(r'[\\?&]rss($|[=&])', url):\n            doc = compat_etree_fromstring(webpage.encode('utf-8'))\n            if doc.tag == 'rss':\n                return GenericIE()._extract_rss(url, video_id, doc)\n\n        title = self._og_search_title(webpage, default=None) or self._html_search_regex(\n            [r'<h1(?:\\s+class=\"boxTopHeadline\")?>(.*?)</h1>',\n             r'<meta name=\"dcterms\\.title\" content=\"(.*?)\"/>',\n             r'<h4 class=\"headline\">(.*?)</h4>',\n             r'<title[^>]*>(.*?)</title>'],\n            webpage, 'title')\n        description = self._og_search_description(webpage, default=None) or self._html_search_meta(\n            'dcterms.abstract', webpage, 'description', default=None)\n        if description is None:\n            description = self._html_search_meta(\n                'description', webpage, 'meta description', default=None)\n        if description is None:","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/ard.py#L165-L201","documentation":"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.","triggerScenarios":"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.","commonSituations":"Transient ARD backend outages; single broken items amid otherwise working content; scraping during Mediathek maintenance windows.","solutions":["Retry later — 'Störung' typically denotes a temporary disruption","Test another ARD video to distinguish a sitewide outage from a broken item","If only one item fails permanently, look for a re-published URL on the ARD site"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"# Distinguish sitewide outage from a broken item before queueing retries\nimport requests\nok = requests.get('https://www.ardmediathek.de/ard/video/Y-3JHrH8r2mQ4K4M8Q226I6/').status_code == 200\nprobe = requests.get(url).text\nitem_disrupted = 'Leider liegt eine Störung vor' in probe","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'is unavailable' in str(e):  # ARD's 'Störung' banner\n        retry_with_backoff(url, hours=1)  # transient disruption","preventionTips":["Treat 'unavailable' (Störung) as retryable and 'no longer available' as permanent — they need opposite handling","Probe a second ARD video to tell sitewide outages from single broken items"],"tags":["ard","outage","transient","retry-later"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}