ytdl-org/youtube-dl · error · ExtractorError
media_info['status']['message']
Error message
media_info['status']['message']
What it means
Voot API error: after querying wapi.voot.com/ws/ott/getMediaInfo.json, the response's status.code (extracted via try_get as int) is anything other than 0, and status.message is raised verbatim with expected=True. The placeholder in the report stands for the server-supplied message text.
Source
Thrown at youtube_dl/extractor/voot.py:58
}, {
'url': 'https://www.voot.com/movies/pandavas-5/424627',
'only_matching': True,
}]
def _real_extract(self, url):
video_id = self._match_id(url)
media_info = self._download_json(
'https://wapi.voot.com/ws/ott/getMediaInfo.json', video_id,
query={
'platform': 'Web',
'pId': 2,
'mediaId': video_id,
})
status_code = try_get(media_info, lambda x: x['status']['code'], int)
if status_code != 0:
raise ExtractorError(media_info['status']['message'], expected=True)
media = media_info['assets']
entry_id = media['EntryId']
title = media['MediaName']
formats = self._extract_m3u8_formats(
'https://cdnapisec.kaltura.com/p/1982551/playManifest/pt/https/f/applehttp/t/web/e/' + entry_id,
video_id, 'mp4', m3u8_id='hls')
self._sort_formats(formats)
description, series, season_number, episode, episode_number = [None] * 5
for meta in try_get(media, lambda x: x['Metas'], list) or []:
key, value = meta.get('Key'), meta.get('Value')
if not key or not value:
continue
if key == 'ContentSynopsis':
description = valueView on GitHub (pinned to 956b8c5855)
Solutions
- Read the server message — it names the actual cause (geo, invalid id, expired)
- Use an Indian IP address for Voot content
- Verify the mediaId resolves on voot.com in the same region
Defensive patterns
Strategy: try-catch
Validate before calling
# Pre-flight: query the status without full extraction
import requests
r = requests.get('https://wapi.voot.com/ws/ott/getMediaInfo.json',
params={'platform': 'Web', 'pId': 2, 'mediaId': video_id},
timeout=10).json()
if r.get('status', {}).get('code') != 0:
skip('%s: %s' % (video_id, r['status']['message'])) Try / catch
from youtube_dl.utils import ExtractorError
try:
ydl.extract_info(url)
except ExtractorError as e:
msg = str(e)
if 'geo' in msg.lower() or 'region' in msg.lower():
retry_with_indian_exit(url)
else:
log('Voot: %s' % msg) Prevention
- Route Voot requests through Indian IPs — the service is region-locked
- Pre-check getMediaInfo.json status codes for batch lists
- Some titles are app/DRM-only; no IP change will help those
When it happens
Trigger: Requesting getMediaInfo.json with a mediaId that is geo-blocked, removed, or invalid; the platform/pId query params ('Web'/2) mismatch the content type; DRM-only titles.
Common situations: Voot is India-only — requests from outside India commonly return a non-zero status; expired content; titles exclusive to Voot Select/Kids apps.
Related errors
- Unable to load data. Error code: %s
- %s said: %s
- Video %s is not available
- error['error_description']
- %s returned error: %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/cc1560ff373f683b.
Report an issue: GitHub.