{"record":{"id":"96a93f385b513c41","repo":"ytdl-org/youtube-dl","slug":"this-video-is-only-available-for-users-of-particip","errorCode":null,"errorMessage":"This video is only available for users of participating TV providers. Use --ap-mso to specify Adobe Pass Multiple-system operator Identifier and --ap-username and --ap-password or --netrc to provide account credentials.","messagePattern":"This video is only available for users of participating TV providers\\. Use --ap-mso to specify Adobe Pass Multiple-system operator Identifier and --ap-username and --ap-password or --netrc to provide account credentials\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/adobepass.py","lineNumber":1376,"sourceCode":"\n        def is_expired(token, date_ele):\n            token_expires = unified_timestamp(re.sub(r'[_ ]GMT', '', xml_text(token, date_ele)))\n            return token_expires and token_expires <= int(time.time())\n\n        def post_form(form_page_res, note, data={}):\n            form_page, urlh = form_page_res\n            post_url = self._html_search_regex(r'<form[^>]+action=([\"\\'])(?P<url>.+?)\\1', form_page, 'post url', group='url')\n            if not re.match(r'https?://', post_url):\n                post_url = compat_urlparse.urljoin(urlh.geturl(), post_url)\n            form_data = self._hidden_inputs(form_page)\n            form_data.update(data)\n            return self._download_webpage_handle(\n                post_url, video_id, note, data=urlencode_postdata(form_data), headers={\n                    'Content-Type': 'application/x-www-form-urlencoded',\n                })\n\n        def raise_mvpd_required():\n            raise ExtractorError(\n                'This video is only available for users of participating TV providers. '\n                'Use --ap-mso to specify Adobe Pass Multiple-system operator Identifier '\n                'and --ap-username and --ap-password or --netrc to provide account credentials.', expected=True)\n\n        def extract_redirect_url(html, url=None, fatal=False):\n            # TODO: eliminate code duplication with generic extractor and move\n            # redirection code into _download_webpage_handle\n            REDIRECT_REGEX = r'[0-9]{,2};\\s*(?:URL|url)=\\'?([^\\'\"]+)'\n            redirect_url = self._search_regex(\n                r'(?i)<meta\\s+(?=(?:[a-z-]+=\"[^\"]+\"\\s+)*http-equiv=\"refresh\")'\n                r'(?:[a-z-]+=\"[^\"]+\"\\s+)*?content=\"%s' % REDIRECT_REGEX,\n                html, 'meta refresh redirect',\n                default=NO_DEFAULT if fatal else None, fatal=fatal)\n            if not redirect_url:\n                return None\n            if url:\n                redirect_url = compat_urlparse.urljoin(url, unescapeHTML(redirect_url))\n            return redirect_url","sourceCodeStart":1358,"sourceCodeEnd":1394,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/adobepass.py#L1358-L1394","documentation":"Raised by the Adobe Pass MVPD helper when the target video is locked behind TV-provider (cable/satellite) authentication. The extractor reached the provider-selection stage and no valid MVPD session exists, so raise_mvpd_required() fires instead of proceeding. It is marked expected=True, so youtube-dl reports it as an expected extraction error rather than a bug.","triggerScenarios":"Extracting a site whose theplatform/AETN metadata has an MVPD wall while no --ap-mso was given; calling an extractor that internally invokes _extract_mvpd_info() without credentials; Adobe Pass session cache empty or expired.","commonSituations":"Running youtube-dl on locked episodes of participating networks (A&E, History, etc.) without provider credentials; misconfigured .netrc missing the 'adobepass' or site entry; switching MSOs without clearing the MVPD cache.","solutions":["Add --ap-mso <MSO_ID> with a provider from `youtube-dl --ap-list-mso` plus --ap-username and --ap-password","Alternatively store credentials in ~/.netrc (machine <mso or site> login <user> password <pass>) and pass --netrc","Verify the MSO identifier is exactly the one listed by --ap-list-mso for your TV provider","If credentials were already supplied, clear the stale Adobe Pass cache (~/.cache/youtube-dl/adobepass) and retry"],"exampleFix":"# before\nyoutube-dl 'https://www.history.com/video/locked-episode'\n\n# after\nyoutube-dl --ap-mso 'Comcast_SSO' --ap-username user@example.com --ap-password 'secret' 'https://www.history.com/video/locked-episode'","handlingStrategy":"validation","validationCode":"# Before extraction, check credentials/MSO availability\nimport subprocess\nmsos = subprocess.run(['youtube-dl', '--ap-list-mso'], capture_output=True, text=True).stdout\nhas_creds = bool(args.ap_username and args.ap_password and args.ap_mso)\nif not has_creds:\n    print('Skipping %s: TV-provider (MVPD) credentials required' % url)","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url, download=True)\nexcept YoutubeDLError as e:\n    if 'only available for users of participating TV providers' in str(e):\n        queue_for_mvpd_retry(url)  # collect and process later with --ap-* credentials\n    else:\n        raise","preventionTips":["Pre-configure --ap-mso/--ap-username/--ap-password or a netrc entry before batch jobs touching MVPD-walled sites","Cache MVPD session state so repeated runs reuse the Adobe Pass token instead of re-triggering the wall","Maintain a per-domain capability list marking which sites need provider auth, and skip them when credentials are absent"],"tags":["authentication","adobe-pass","mvpd","drm","credentials"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}