yt-dlp/yt-dlp · error · ExtractorError
No video found
Error message
No video found
What it means
Thrown by SteamIE (_VALID_URL store.steampowered.com/video/*) when neither the rgMovieFlashvars JSON nor a div.movieFrame.modal element yields a YouTube video id. Steam store videos are YouTube embeds, so without a YOUTUBE_VIDEO_ID the extractor has nothing to return and raises this expected error.
Source
Thrown at yt_dlp/extractor/steam.py:166
'view_count': int,
},
'add_ie': ['Youtube'],
'params': {'skip_download': 'm3u8'},
}]
def _real_extract(self, url):
file_id = self._match_id(url)
webpage = self._download_webpage(url, file_id)
flashvars = self._search_json(
r'var\s+rgMovieFlashvars\s*=', webpage, 'flashvars',
file_id, default={}, transform_source=js_to_json)
youtube_id = (
traverse_obj(flashvars, (..., 'YOUTUBE_VIDEO_ID', {str}, any))
or traverse_obj(webpage, (
{find_element(cls='movieFrame modal', html=True)}, {extract_attributes}, 'id', {str})))
if not youtube_id:
raise ExtractorError('No video found', expected=True)
return self.url_result(youtube_id, YoutubeIE)
class SteamCommunityBroadcastIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?steamcommunity\.com/broadcast/watch/(?P<id>\d+)'
_TESTS = [{
'url': 'https://steamcommunity.com/broadcast/watch/76561199073851486',
'info_dict': {
'id': '76561199073851486',
'ext': 'mp4',
'title': str,
'uploader_id': '1113585758',
'uploader': 'pepperm!nt',
'live_status': 'is_live',
},
'params': {'skip_download': 'Livestream'},
}]View on GitHub (pinned to 81ecd58b13)
Solutions
- Update yt-dlp (yt-dlp -U / pip install -U yt-dlp) in case the extractor was already patched for new markup.
- Open the page in a browser and confirm the video is a YouTube embed; grab the YouTube URL directly from the page and download with yt-dlp <youtube_url>.
- If the page shows a login/age gate, provide cookies (--cookies-from-browser) and retry.
- Report the URL to yt-dlp issues if the video plays in a browser but extraction still fails.
Defensive patterns
Strategy: validation
Validate before calling
# before full extraction, confirm the page exposes a YouTube embed
import re, html
page = requests.get(url).text
has_yt = re.search(r'YOUTUBE_VIDEO_ID', page) or 'movieFrame modal' in page
if not has_yt:
skip(url) Type guard
def is_no_video_error(e: Exception) -> bool:
return isinstance(e, ExtractorError) and e.expected and str(e) == 'No video found' Try / catch
try:
ydl.extract_info(url)
except ExtractorError as e:
if str(e) == 'No video found':
log.info('steam page has no embeddable video: %s', url)
else:
raise Prevention
- Check the store page in a browser before batch-downloading trailers.
- Provide cookies when pages sit behind age gates.
- Prefer extracting the underlying YouTube URL when you can see it in the page.
When it happens
Trigger: A store.steampowered.com/video/<id> page whose flashvars block was removed or renamed (Valve changed the player), a video entry that is not actually a YouTube embed, or an empty/age-gated page where neither the flashvars JSON nor the movieFrame modal markup is present.
Common situations: Valve ships a new store video player; the video requires login/age verification so the anonymous page lacks the embed data; the trailer was delisted leaving a stub page.
Related errors
- This article does not have any videos
- Video {video_id} is no longer available
- MEDIA_NOT_FOUND: {message}
- This video is currently unavailable. It may still be uploadi
- Model is in a private show
AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22).
Data as JSON: /api/errors/1562ac7ff777c892.
Report an issue: GitHub.