{"record":{"id":"93e1e96695722d07","repo":"ytdl-org/youtube-dl","slug":"details-dynamic-from-authorize-xml-response-xml","errorCode":null,"errorMessage":"details (dynamic from authorize XML response, xml_text(authorize, 'details'))","messagePattern":"details \\(dynamic from authorize XML response, xml_text\\(authorize, 'details'\\)\\)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/adobepass.py","lineNumber":1550,"sourceCode":"            authz_token = requestor_info.get(guid)\n            if authz_token and is_expired(authz_token, 'simpleTokenTTL'):\n                authz_token = None\n            if not authz_token:\n                authorize = self._download_webpage(\n                    self._SERVICE_PROVIDER_TEMPLATE % 'authorize', video_id,\n                    'Retrieving Authorization Token', data=urlencode_postdata({\n                        'resource_id': resource,\n                        'requestor_id': requestor_id,\n                        'authentication_token': authn_token,\n                        'mso_id': xml_text(authn_token, 'simpleTokenMsoID'),\n                        'userMeta': '1',\n                    }), headers=mvpd_headers)\n                if '<pendingLogout' in authorize:\n                    self._downloader.cache.store(self._MVPD_CACHE, requestor_id, {})\n                    count += 1\n                    continue\n                if '<error' in authorize:\n                    raise ExtractorError(xml_text(authorize, 'details'), expected=True)\n                authz_token = unescapeHTML(xml_text(authorize, 'authzToken'))\n                requestor_info[guid] = authz_token\n                self._downloader.cache.store(self._MVPD_CACHE, requestor_id, requestor_info)\n\n            mvpd_headers.update({\n                'ap_19': xml_text(authn_token, 'simpleSamlNameID'),\n                'ap_23': xml_text(authn_token, 'simpleSamlSessionIndex'),\n            })\n\n            short_authorize = self._download_webpage(\n                self._SERVICE_PROVIDER_TEMPLATE % 'shortAuthorize',\n                video_id, 'Retrieving Media Token', data=urlencode_postdata({\n                    'authz_token': authz_token,\n                    'requestor_id': requestor_id,\n                    'session_guid': xml_text(authn_token, 'simpleTokenAuthenticationGuid'),\n                    'hashed_guid': 'false',\n                }), headers=mvpd_headers)\n            if '<pendingLogout' in short_authorize:","sourceCodeStart":1532,"sourceCodeEnd":1568,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/adobepass.py#L1532-L1568","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    # e.msg is the dynamic <details> text from the authorize XML\n    log_mvpd_authorize_failure(url, str(e))\n    if 'authentication' in str(e).lower():\n        clear_adobepass_cache_and_requeue(url)","preventionTips":["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"],"tags":["adobe-pass","authorization","drm","server-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}