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 = value

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the server message — it names the actual cause (geo, invalid id, expired)
  2. Use an Indian IP address for Voot content
  3. 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

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


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/cc1560ff373f683b. Report an issue: GitHub.