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

  1. Schedule the download for after 20:00 German local time (adjust for your timezone vs CET/CEST)
  2. 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

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.