ytdl-org/youtube-dl · error · ExtractorError

Cannot find player ID

Error message

Cannot find player ID

What it means

Thrown by the legacy Brightcove (BrightcoveLegacyIE) extractor when it cannot find a 'playerID' in the embedded Flash player markup. The extractor looks the value up in three places (flashvars, <param name="playerID"> nodes via XPath, and query parameters of the data URL); if all return None it raises this ExtractorError. It almost always means the page no longer contains a legacy Brightcove player that youtube-dl knows how to drive.

Source

Thrown at youtube_dl/extractor/brightcove.py:194

        else:
            flashvars = {}

        data_url = object_doc.attrib.get('data', '')
        data_url_params = compat_parse_qs(compat_urllib_parse_urlparse(data_url).query)

        def find_param(name):
            if name in flashvars:
                return flashvars[name]
            node = find_xpath_attr(object_doc, './param', 'name', name)
            if node is not None:
                return node.attrib['value']
            return data_url_params.get(name)

        params = {}

        playerID = find_param('playerID') or find_param('playerId')
        if playerID is None:
            raise ExtractorError('Cannot find player ID')
        params['playerID'] = playerID

        playerKey = find_param('playerKey')
        # Not all pages define this value
        if playerKey is not None:
            params['playerKey'] = playerKey
        # These fields hold the id of the video
        videoPlayer = find_param('@videoPlayer') or find_param('videoId') or find_param('videoID') or find_param('@videoList')
        if videoPlayer is not None:
            if isinstance(videoPlayer, list):
                videoPlayer = videoPlayer[0]
            videoPlayer = videoPlayer.strip()
            # UUID is also possible for videoPlayer (e.g.
            # http://www.popcornflix.com/hoodies-vs-hooligans/7f2d2b87-bbf2-4623-acfb-ea942b4f01dd
            # or http://www8.hp.com/cn/zh/home.html)
            if not (re.match(
                    r'^(?:\d+|[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12})$',
                    videoPlayer) or videoPlayer.startswith('ref:')):

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Get the direct new-player URL from the page (e.g. via browser devtools: https://players.brightcove.net/<account>/<player>_default/index.html?videoId=<id>) and pass that to youtube-dl instead of the embed page.
  2. Update to a maintained fork (yt-dlp) whose BrightcoveLegacy extractor and generic embed detection handle modern pages.
  3. If you control the calling code, catch ExtractorError from this URL and fall back to searching the raw page HTML for 'players.brightcove.net' links yourself.
  4. Check the page in a browser: if the video is served by any other platform now, extract with that platform's URL.

Example fix

# before
youtube_dl.extract('http://example.com/page_with_old_brightcove_embed')

# after
# find the real player URL in the page/source:
youtube_dl.extract('https://players.brightcove.net/1234567890/abcdef_default/index.html?videoId=987654321')
Defensive patterns

Strategy: try-catch

Validate before calling

# Pre-check: does the page contain a legacy Brightcove player at all?
import re
html = fetch(url)
if not re.search(r'class="BrightcoveExperience"|bcove\.com', html):
    raise Skip('no legacy brightcove embed; use players.brightcove.net URL')
if not re.search(r'playerID|playerId', html):
    raise Skip('embed has no playerID')

Try / catch

from youtube_dl.utils import ExtractorError
try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'Cannot find player ID' in str(e):
        # page no longer uses the legacy player; find new-style URL yourself
        m = re.search(r'https?://players\.brightcove\.net/[^"\']+', html)
        if m:
            ydl.extract_info(m.group(0))
        else:
            raise

Prevention

When it happens

Trigger: Extracting a page whose <object class="BrightcoveExperience"> embed lacks playerID/playerId in flashvars, lacks a <param name="playerID"> node, and whose data@ URL query has no playerID parameter; or a page that has replaced the legacy player with the new players.brightcove.net iframe, which this code path does not handle.

Common situations: Sites migrated from the old Brightcove Experience player to Brightcove New (players.brightcove.net) — extremely common because Adobe Flash was retired. Also pages where the embed is injected dynamically by JavaScript after initial HTML load, so the param/flashvars never appear in the downloaded source.

Related errors


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