ytdl-org/youtube-dl · error · ExtractorError
This video is only available after 20:00
Error message
This video is only available after 20:00
What it means
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.
Source
Thrown at youtube_dl/extractor/ard.py:39
xpath_text,
)
from ..compat import compat_etree_fromstring
class ARDMediathekBaseIE(InfoExtractor):
_GEO_COUNTRIES = ['DE']
def _extract_media_info(self, media_info_url, webpage, video_id):
media_info = self._download_json(
media_info_url, video_id, 'Downloading media JSON')
return self._parse_media_info(media_info, video_id, '"fsk"' in webpage)
def _parse_media_info(self, media_info, video_id, fsk):
formats = self._extract_formats(media_info, video_id)
if not formats:
if fsk:
raise ExtractorError(
'This video is only available after 20:00', expected=True)
elif media_info.get('_geoblocked'):
self.raise_geo_restricted(
'This video is not available due to geoblocking',
countries=self._GEO_COUNTRIES)
self._sort_formats(formats)
subtitles = {}
subtitle_url = media_info.get('_subtitleUrl')
if subtitle_url:
subtitles['de'] = [{
'ext': 'ttml',
'url': subtitle_url,
}]
return {
'id': video_id,View on GitHub (pinned to 956b8c5855)
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']
Example fix
# before (runs at 14:00 CET) youtube-dl 'https://www.ardmediathek.de/ard/video/fsk-film/...' # after at 20:05 CET youtube-dl 'https://www.ardmediathek.de/ard/video/fsk-film/...'
Defensive patterns
Strategy: retry
Validate before calling
# Schedule FSK content only in the legal window (after 20:00 Europe/Berlin)
from datetime import datetime, timezone, timedelta
berlin = timezone(timedelta(hours=2)) # CEST; use +1 for CET
now = datetime.now(berlin)
fsk_ready = now.hour >= 20
if fsk_ready:
extract(url)
else:
schedule_at(url, hour=20, tz='Europe/Berlin') Try / catch
try:
ydl.extract_info(url)
except ExtractorError as e:
if 'only available after 20:00' in str(e):
schedule_retry_after_2000_berlin(url) # deterministic time-gated retry
else:
raise Prevention
- 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
When it happens
Trigger: 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.
Common situations: Scheduled downloads of German TV content running before 20:00 CET/CEST; FSK-flagged movies in the Mediathek.
Related errors
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/58318a9fbde042e1.
Report an issue: GitHub.