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
- Wait until the stream is live (or has ended and an archiveStreamUrl exists), then retry
- Schedule the download for after the announced start time plus a margin
- Note freshlive.jp (now FreshLive) service changes; verify the platform still operates this content
- 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
- Schedule downloads after the announced broadcast start time
- Treat 'upcoming' as a retryable state with backoff, unlike permanent unavailability
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
- Video %s is not available
- Invalid path
- Unauthorized user "%s"
- Missing "id" field in extractor result
- Missing "title" field in extractor result
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/c48495a5fe61f560.
Report an issue: GitHub.