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
- 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.
- Update to a maintained fork (yt-dlp) whose BrightcoveLegacy extractor and generic embed detection handle modern pages.
- 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.
- 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
- Prefer direct players.brightcove.net URLs over third-party embed pages.
- Detect the legacy <object class="BrightcoveExperience"> markup before invoking extraction.
- Pin a maintained fork (yt-dlp) when targeting Brightcove-hosted sites.
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.