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

  1. Update yt-dlp (yt-dlp -U / pip install -U yt-dlp) in case the extractor was already patched for new markup.
  2. 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>.
  3. If the page shows a login/age gate, provide cookies (--cookies-from-browser) and retry.
  4. 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

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


AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22). Data as JSON: /api/errors/1562ac7ff777c892. Report an issue: GitHub.