{"record":{"id":"935dcee7415b7651","repo":"ytdl-org/youtube-dl","slug":"s-said-s-935dce","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/go.py","lineNumber":252,"sourceCode":"                        url, video_id, requestor_id, resource)\n                    data.update({\n                        'token': auth,\n                        'token_type': 'ap',\n                        'adobe_requestor_id': requestor_id,\n                    })\n                else:\n                    self._initialize_geo_bypass({'countries': ['US']})\n                entitlement = self._download_json(\n                    'https://api.entitlement.watchabc.go.com/vp2/ws-secure/entitlement/2020/authorize.json',\n                    video_id, data=urlencode_postdata(data))\n                errors = entitlement.get('errors', {}).get('errors', [])\n                if errors:\n                    for error in errors:\n                        if error.get('code') == 1002:\n                            self.raise_geo_restricted(\n                                error['message'], countries=['US'])\n                    error_message = ', '.join([error['message'] for error in errors])\n                    raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True)\n                asset_url += '?' + entitlement['uplynkData']['sessionKey']\n                formats.extend(self._extract_m3u8_formats(\n                    asset_url, video_id, 'mp4', m3u8_id=format_id or 'hls', fatal=False))\n            else:\n                f = {\n                    'format_id': format_id,\n                    'url': asset_url,\n                    'ext': ext,\n                }\n                if re.search(r'(?:/mp4/source/|_source\\.mp4)', asset_url):\n                    f.update({\n                        'format_id': ('%s-' % format_id if format_id else '') + 'SOURCE',\n                        'preference': 1,\n                    })\n                else:\n                    mobj = re.search(r'/(\\d+)x(\\d+)/', asset_url)\n                    if mobj:\n                        height = int(mobj.group(2))","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/go.py#L234-L270","documentation":"Raised by the Disney/ABC GO extractor when the entitlement API (api.entitlement.watchabc.go.com .../authorize.json) returns a non-empty errors list. Error code 1002 is first mapped to raise_geo_restricted; any remaining errors are joined into this ExtractorError. Marked expected=True.","triggerScenarios":"Authorizing playback of a go.com/freeform/abc video where the API returns errors other than (or after handling) code 1002 — e.g. auth/token errors, content no longer available, or non-geo entitlement failures.","commonSituations":"Outside-US access without geo bypass (though 1002 usually short-circuits to geo-restricted first), expired page tokens, removed episodes, or changes to the entitlement endpoint in older youtube-dl builds.","solutions":["Read the joined message: geo messages need a US exit; auth errors need fresh page tokens","Update youtube-dl/yt-dlp for current go.com/Freeform endpoints","Confirm the episode is still listed on the site","If US-based and still failing, retry after clearing cookies so fresh tokens are fetched"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import requests\nent = requests.post('https://api.entitlement.watchabc.go.com/vp2/ws-secure/entitlement/2020/authorize.json', data=payload).json()\nerrs = ent.get('errors', {}).get('errors', [])\nif errs:\n    codes = [e.get('code') for e in errs]\n    print('Entitlement errors:', codes, [e.get('message') for e in errs])","typeGuard":"def entitlement_ok(ent):\n    return not ent.get('errors', {}).get('errors') and 'uplynkData' in ent","tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept DownloadError as e:\n    msg = str(e)\n    if 'said:' in msg and ('go.com' in msg.lower() or 'freeform' in msg.lower()):\n        handle_entitlement_failure(url, msg)\n    else:\n        raise","preventionTips":["Handle geo-restriction (code 1002) separately from other entitlement errors","Ensure fresh page tokens by not caching go.com pages","Update the tool when Disney/ABC rotates entitlement endpoints"],"tags":["go","disney","entitlement","geo-restriction","api-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}