ytdl-org/youtube-dl · error · ExtractorError
Could not find video information.
Error message
Could not find video information.
What it means
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.
Source
Thrown at youtube_dl/extractor/medaltv.py:64
'url': 'https://medal.tv/clips/37rMeFpryCC-9',
'only_matching': True,
}, {
'url': 'https://medal.tv/clips/2WRj40tpY_EU9',
'only_matching': True,
}]
def _real_extract(self, url):
video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id)
hydration_data = self._parse_json(self._search_regex(
r'<script[^>]*>\s*(?:var\s*)?hydrationData\s*=\s*({.+?})\s*</script>',
webpage, 'hydration data', default='{}'), video_id)
clip = try_get(
hydration_data, lambda x: x['clips'][video_id], dict) or {}
if not clip:
raise ExtractorError(
'Could not find video information.', video_id=video_id)
title = clip['contentTitle']
source_width = int_or_none(clip.get('sourceWidth'))
source_height = int_or_none(clip.get('sourceHeight'))
aspect_ratio = source_width / source_height if source_width and source_height else 16 / 9
def add_item(container, item_url, height, id_key='format_id', item_id=None):
item_id = item_id or '%dp' % height
if item_id not in item_url:
return
width = int(round(aspect_ratio * height))
container.append({
'url': item_url,
id_key: item_id,
'width': width,View on GitHub (pinned to 956b8c5855)
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.
Example fix
// before
clip = try_get(hydration_data, lambda x: x['clips'][video_id], dict) or {}
if not clip:
raise ExtractorError('Could not find video information.', video_id=video_id)
// after (expected=True distinguishes a dead clip from a broken parser)
if not clip:
raise ExtractorError('Could not find video information.', expected=True, video_id=video_id) Defensive patterns
Strategy: validation
Validate before calling
# Pre-check that the clip id appears in the page's hydration payload
import re, json, urllib.request
html = urllib.request.urlopen(clip_url).read().decode('utf-8', 'replace')
m = re.search(r'hydrationData\s*=\s*({.+?})\s*</script>', html)
assert m and clip_id in m.group(1), 'Clip missing from hydration data' Type guard
def medal_clip_present(hydration_data, video_id):
return isinstance(hydration_data, dict) and isinstance(hydration_data.get('clips'), dict) and video_id in hydration_data['clips'] Try / catch
try:
info = ydl.extract_info(url, download=False)
except ExtractorError as e:
if 'Could not find video information' in str(e):
flag_for_manual_review(url) # could be deleted clip OR site redesign
else:
raise Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/9d2884828a546972.
Report an issue: GitHub.