ytdl-org/youtube-dl · warning · ExtractorError

Stream %s is upcoming

Error message

Stream %s is upcoming

What it means

Raised by the FreshLive extractor when the program info embedded in window.__CONTEXT__ has status 'upcoming', meaning the stream has been announced but has not started yet. It is expected=True and simply tells the caller to wait: no stream URL exists for extraction until the broadcast begins.

Source

Thrown at youtube_dl/extractor/freshlive.py:52

    }

    def _real_extract(self, url):
        video_id = self._match_id(url)

        webpage = self._download_webpage(url, video_id)

        options = self._parse_json(
            self._search_regex(
                r'window\.__CONTEXT__\s*=\s*({.+?});\s*</script>',
                webpage, 'initial context'),
            video_id)

        info = options['context']['dispatcher']['stores']['ProgramStore']['programs'][video_id]

        title = info['title']

        if info.get('status') == 'upcoming':
            raise ExtractorError('Stream %s is upcoming' % video_id, expected=True)

        stream_url = info.get('liveStreamUrl') or info['archiveStreamUrl']

        is_live = info.get('liveStreamUrl') is not None

        formats = self._extract_m3u8_formats(
            stream_url, video_id, 'mp4',
            'm3u8_native', m3u8_id='hls')

        if is_live:
            title = self._live_title(title)

        return {
            'id': video_id,
            'formats': formats,
            'title': title,
            'description': info.get('description'),
            'thumbnail': info.get('thumbnailUrl'),

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Wait until the stream is live (or has ended and an archiveStreamUrl exists), then retry
  2. Schedule the download for after the announced start time plus a margin
  3. Note freshlive.jp (now FreshLive) service changes; verify the platform still operates this content
  4. Update yt-dlp in case the __CONTEXT__ payload structure changed

Example fix

# before
youtube_dl 'https://freshlive.jp/xx/123456'  # 2 hours before start
# ERROR: Stream 123456 is upcoming

# after
# wait until broadcast starts, then
yt-dlp 'https://freshlive.jp/xx/123456'
Defensive patterns

Strategy: retry

Validate before calling

# Parse the embedded context to check stream status first
import re, json
m = re.search(r'window\.__CONTEXT__\s*=\s*({.+?});\s*</script>', webpage)
ctx = json.loads(m.group(1))
status = ctx['context']['dispatcher']['stores']['ProgramStore']['programs'][vid]['status']
if status == 'upcoming':
    schedule_retry(announced_start_time + margin)

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'is upcoming' in str(e):
        schedule_retry_at_stream_start(url)

Prevention

When it happens

Trigger: options['context']['dispatcher']['stores']['ProgramStore']['programs'][video_id] has status == 'upcoming' before liveStreamUrl/archiveStreamUrl are consulted. Triggered by opening a scheduled FreshLive stream page before its start time.

Common situations: Users queuing downloads ahead of announced streams; reminder-bots hitting the page early; timezone confusion about the broadcast start.

Related errors


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