{"record":{"id":"cc1560ff373f683b","repo":"ytdl-org/youtube-dl","slug":"media-info-status-message","errorCode":null,"errorMessage":"media_info['status']['message']","messagePattern":"media_info\\['status'\\]\\['message'\\]","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/voot.py","lineNumber":58,"sourceCode":"    }, {\n        'url': 'https://www.voot.com/movies/pandavas-5/424627',\n        'only_matching': True,\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        media_info = self._download_json(\n            'https://wapi.voot.com/ws/ott/getMediaInfo.json', video_id,\n            query={\n                'platform': 'Web',\n                'pId': 2,\n                'mediaId': video_id,\n            })\n\n        status_code = try_get(media_info, lambda x: x['status']['code'], int)\n        if status_code != 0:\n            raise ExtractorError(media_info['status']['message'], expected=True)\n\n        media = media_info['assets']\n\n        entry_id = media['EntryId']\n        title = media['MediaName']\n        formats = self._extract_m3u8_formats(\n            'https://cdnapisec.kaltura.com/p/1982551/playManifest/pt/https/f/applehttp/t/web/e/' + entry_id,\n            video_id, 'mp4', m3u8_id='hls')\n        self._sort_formats(formats)\n\n        description, series, season_number, episode, episode_number = [None] * 5\n\n        for meta in try_get(media, lambda x: x['Metas'], list) or []:\n            key, value = meta.get('Key'), meta.get('Value')\n            if not key or not value:\n                continue\n            if key == 'ContentSynopsis':\n                description = value","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/voot.py#L40-L76","documentation":"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.","triggerScenarios":"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.","commonSituations":"Voot is India-only — requests from outside India commonly return a non-zero status; expired content; titles exclusive to Voot Select/Kids apps.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"# Pre-flight: query the status without full extraction\nimport requests\nr = requests.get('https://wapi.voot.com/ws/ott/getMediaInfo.json',\n                 params={'platform': 'Web', 'pId': 2, 'mediaId': video_id},\n                 timeout=10).json()\nif r.get('status', {}).get('code') != 0:\n    skip('%s: %s' % (video_id, r['status']['message']))","typeGuard":null,"tryCatchPattern":"from youtube_dl.utils import ExtractorError\ntry:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    msg = str(e)\n    if 'geo' in msg.lower() or 'region' in msg.lower():\n        retry_with_indian_exit(url)\n    else:\n        log('Voot: %s' % msg)","preventionTips":["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"],"tags":["voot","api","geo-restriction","status-code"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}