ytdl-org/youtube-dl · error · ExtractorError
details (dynamic from authorize XML response, xml_text(autho
Error message
details (dynamic from authorize XML response, xml_text(authorize, 'details'))
What it means
Raised when the Adobe Pass 'authorize' endpoint response XML contains an '<error' element. The message text is taken dynamically from the XML's <details> node, so the exact wording comes from Adobe's server. Expected=True marks it as a server-side authorization refusal (e.g. not entitled, session invalid) rather than an extractor bug.
Source
Thrown at youtube_dl/extractor/adobepass.py:1550
authz_token = requestor_info.get(guid)
if authz_token and is_expired(authz_token, 'simpleTokenTTL'):
authz_token = None
if not authz_token:
authorize = self._download_webpage(
self._SERVICE_PROVIDER_TEMPLATE % 'authorize', video_id,
'Retrieving Authorization Token', data=urlencode_postdata({
'resource_id': resource,
'requestor_id': requestor_id,
'authentication_token': authn_token,
'mso_id': xml_text(authn_token, 'simpleTokenMsoID'),
'userMeta': '1',
}), headers=mvpd_headers)
if '<pendingLogout' in authorize:
self._downloader.cache.store(self._MVPD_CACHE, requestor_id, {})
count += 1
continue
if '<error' in authorize:
raise ExtractorError(xml_text(authorize, 'details'), expected=True)
authz_token = unescapeHTML(xml_text(authorize, 'authzToken'))
requestor_info[guid] = authz_token
self._downloader.cache.store(self._MVPD_CACHE, requestor_id, requestor_info)
mvpd_headers.update({
'ap_19': xml_text(authn_token, 'simpleSamlNameID'),
'ap_23': xml_text(authn_token, 'simpleSamlSessionIndex'),
})
short_authorize = self._download_webpage(
self._SERVICE_PROVIDER_TEMPLATE % 'shortAuthorize',
video_id, 'Retrieving Media Token', data=urlencode_postdata({
'authz_token': authz_token,
'requestor_id': requestor_id,
'session_guid': xml_text(authn_token, 'simpleTokenAuthenticationGuid'),
'hashed_guid': 'false',
}), headers=mvpd_headers)
if '<pendingLogout' in short_authorize:View on GitHub (pinned to 956b8c5855)
Solutions
- Treat the dynamic <details> text as authoritative: it usually states 'not authorized' or 'authentication expired' — act on that first
- If it mentions authentication, clear the Adobe Pass cache and re-authenticate fresh (--ap-* credentials)
- Verify the MVPD subscription actually includes the channel of the requested video
- Report the exact details string upstream if it persists with a fully entitled account, since it may indicate a changed Adobe Pass contract
Defensive patterns
Strategy: try-catch
Try / catch
try:
info = ydl.extract_info(url)
except ExtractorError as e:
# e.msg is the dynamic <details> text from the authorize XML
log_mvpd_authorize_failure(url, str(e))
if 'authentication' in str(e).lower():
clear_adobepass_cache_and_requeue(url) Prevention
- Log the dynamic details text verbatim — it distinguishes entitlement vs session problems
- Refresh Adobe Pass authentication before long batch runs so tokens do not expire mid-authorize
- Verify the MVPD subscription covers the target channel before automating bulk extraction
When it happens
Trigger: POSTing resource_id/requestor_id/authentication_token to the authorize endpoint and receiving '<error' in the XML; the MVPD account is not subscribed to the channel carrying the video; authentication token expired between authn and authz; requestor_id not provisioned for the resource.
Common situations: Cable subscription tier lacks the requested network; token staleness after long-running batch jobs; the network's requestor_id changed server-side; geolocation mismatch between the IP and the MVPD account region.
Related errors
- This video is only available for users of participating TV p
- We're sorry, but either the User ID or Password entered is n
- %s said: %s
- %s said: %s
- This video is DRM protected.
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/93e1e96695722d07.
Report an issue: GitHub.