{"record":{"id":"58318a9fbde042e1","repo":"ytdl-org/youtube-dl","slug":"this-video-is-only-available-after-20-00","errorCode":null,"errorMessage":"This video is only available after 20:00","messagePattern":"This video is only available after 20:00","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/ard.py","lineNumber":39,"sourceCode":"    xpath_text,\n)\nfrom ..compat import compat_etree_fromstring\n\n\nclass ARDMediathekBaseIE(InfoExtractor):\n    _GEO_COUNTRIES = ['DE']\n\n    def _extract_media_info(self, media_info_url, webpage, video_id):\n        media_info = self._download_json(\n            media_info_url, video_id, 'Downloading media JSON')\n        return self._parse_media_info(media_info, video_id, '\"fsk\"' in webpage)\n\n    def _parse_media_info(self, media_info, video_id, fsk):\n        formats = self._extract_formats(media_info, video_id)\n\n        if not formats:\n            if fsk:\n                raise ExtractorError(\n                    'This video is only available after 20:00', expected=True)\n            elif media_info.get('_geoblocked'):\n                self.raise_geo_restricted(\n                    'This video is not available due to geoblocking',\n                    countries=self._GEO_COUNTRIES)\n\n        self._sort_formats(formats)\n\n        subtitles = {}\n        subtitle_url = media_info.get('_subtitleUrl')\n        if subtitle_url:\n            subtitles['de'] = [{\n                'ext': 'ttml',\n                'url': subtitle_url,\n            }]\n\n        return {\n            'id': video_id,","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/ard.py#L21-L57","documentation":"Raised by the ARD extractor when no formats could be extracted and the referring webpage contains '\"fsk\"', indicating an age-rated (FSK) broadcast whose streams are only released after 20:00 German time. This mirrors German youth-protection rules that lock certain content before 20:00. Marked expected=True.","triggerScenarios":"Extracting an FSK-16/18 item during the daytime; _extract_formats returns empty and fsk=True because the webpage contains the literal '\"fsk\"'; ARD Media JSON present but streams withheld.","commonSituations":"Scheduled downloads of German TV content running before 20:00 CET/CEST; FSK-flagged movies in the Mediathek.","solutions":["Schedule the download for after 20:00 German local time (adjust for your timezone vs CET/CEST)","Use a German exit node if you additionally suspect geoblocking — this class also sets _GEO_COUNTRIES=['DE']"],"exampleFix":"# before (runs at 14:00 CET)\nyoutube-dl 'https://www.ardmediathek.de/ard/video/fsk-film/...'\n\n# after\nat 20:05 CET youtube-dl 'https://www.ardmediathek.de/ard/video/fsk-film/...'","handlingStrategy":"retry","validationCode":"# Schedule FSK content only in the legal window (after 20:00 Europe/Berlin)\nfrom datetime import datetime, timezone, timedelta\nberlin = timezone(timedelta(hours=2))  # CEST; use +1 for CET\nnow = datetime.now(berlin)\nfsk_ready = now.hour >= 20\nif fsk_ready:\n    extract(url)\nelse:\n    schedule_at(url, hour=20, tz='Europe/Berlin')","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'only available after 20:00' in str(e):\n        schedule_retry_after_2000_berlin(url)  # deterministic time-gated retry\n    else:\n        raise","preventionTips":["Run German FSK-locked downloads only between 20:00 and 06:00 Europe/Berlin","Also verify a DE IP — ARD sets _GEO_COUNTRIES=['DE'] and empty formats can mask geoblocking"],"tags":["ard","fsk","age-restriction","geo","scheduling"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}