{"record":{"id":"9d2884828a546972","repo":"ytdl-org/youtube-dl","slug":"could-not-find-video-information","errorCode":null,"errorMessage":"Could not find video information.","messagePattern":"Could not find video information\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/medaltv.py","lineNumber":64,"sourceCode":"        'url': 'https://medal.tv/clips/37rMeFpryCC-9',\n        'only_matching': True,\n    }, {\n        'url': 'https://medal.tv/clips/2WRj40tpY_EU9',\n        'only_matching': True,\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n\n        hydration_data = self._parse_json(self._search_regex(\n            r'<script[^>]*>\\s*(?:var\\s*)?hydrationData\\s*=\\s*({.+?})\\s*</script>',\n            webpage, 'hydration data', default='{}'), video_id)\n\n        clip = try_get(\n            hydration_data, lambda x: x['clips'][video_id], dict) or {}\n        if not clip:\n            raise ExtractorError(\n                'Could not find video information.', video_id=video_id)\n\n        title = clip['contentTitle']\n\n        source_width = int_or_none(clip.get('sourceWidth'))\n        source_height = int_or_none(clip.get('sourceHeight'))\n\n        aspect_ratio = source_width / source_height if source_width and source_height else 16 / 9\n\n        def add_item(container, item_url, height, id_key='format_id', item_id=None):\n            item_id = item_id or '%dp' % height\n            if item_id not in item_url:\n                return\n            width = int(round(aspect_ratio * height))\n            container.append({\n                'url': item_url,\n                id_key: item_id,\n                'width': width,","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/medaltv.py#L46-L82","documentation":"Raised by the Medal.tv extractor when the page's hydrationData JSON either has no 'clips' mapping or has no entry keyed by the video id parsed from the URL. The clip dict ends up empty ({} after the try_get fallback), so the extractor cannot proceed. Unlike the sibling 404 error at line 106, this one is NOT expected=True, so youtube-dl treats it as a potential extractor bug.","triggerScenarios":"The regex for hydrationData matches (or defaults to '{}') but hydration_data['clips'][video_id] is absent — e.g. the page rendered a generic shell, the clip JSON moved to another key, or the id in the URL does not appear in the hydration payload.","commonSituations":"Clip deleted or made private so the SPA shell ships without clip data; Medal.tv shipping a new front-end where hydrationData is renamed or embedded differently; server-side A/B variant of the page; the URL id being a redirect to a different canonical clip id.","solutions":["Open the clip URL in a browser to verify it still exists and is public.","Run with -v to dump the hydration-data parse step and confirm whether the script tag was found at all.","Update youtube-dl to the latest version; Medal.tv's front end changes often and the extractor is patched accordingly.","If the clip exists but the error persists, capture the page source and report it to the youtube-dl issue tracker with the URL."],"exampleFix":"// before\nclip = try_get(hydration_data, lambda x: x['clips'][video_id], dict) or {}\nif not clip:\n    raise ExtractorError('Could not find video information.', video_id=video_id)\n\n// after (expected=True distinguishes a dead clip from a broken parser)\nif not clip:\n    raise ExtractorError('Could not find video information.', expected=True, video_id=video_id)","handlingStrategy":"validation","validationCode":"# Pre-check that the clip id appears in the page's hydration payload\nimport re, json, urllib.request\nhtml = urllib.request.urlopen(clip_url).read().decode('utf-8', 'replace')\nm = re.search(r'hydrationData\\s*=\\s*({.+?})\\s*</script>', html)\nassert m and clip_id in m.group(1), 'Clip missing from hydration data'","typeGuard":"def medal_clip_present(hydration_data, video_id):\n    return isinstance(hydration_data, dict) and isinstance(hydration_data.get('clips'), dict) and video_id in hydration_data['clips']","tryCatchPattern":"try:\n    info = ydl.extract_info(url, download=False)\nexcept ExtractorError as e:\n    if 'Could not find video information' in str(e):\n        flag_for_manual_review(url)  # could be deleted clip OR site redesign\n    else:\n        raise","preventionTips":["Verify clip URLs resolve in a browser before adding them to a download queue.","Pin a recent youtube-dl/yt-dlp version, since Medal.tv's SPA markup changes frequently."],"tags":["spa","json-embedded","extractor-bug","clip"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}