{"record":{"id":"ae4e12c0b7415884","repo":"ytdl-org/youtube-dl","slug":"no-downloadable-videos-found","errorCode":null,"errorMessage":"No downloadable videos found","messagePattern":"No downloadable videos found","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/toggle.py","lineNumber":161,"sourceCode":"            elif ext == 'ism':\n                formats.extend(self._extract_ism_formats(\n                    video_url, video_id, ism_id=vid_format,\n                    note='Downloading %s ISM manifest' % vid_format,\n                    errnote='Failed to download %s ISM manifest' % vid_format,\n                    fatal=False))\n            elif ext == 'mp4':\n                formats.append({\n                    'ext': ext,\n                    'url': video_url,\n                    'format_id': vid_format,\n                })\n        if not formats:\n            for meta in (info.get('Metas') or []):\n                if meta.get('Key') == 'Encryption' and meta.get('Value') == '1':\n                    raise ExtractorError(\n                        'This video is DRM protected.', expected=True)\n            # Most likely because geo-blocked\n            raise ExtractorError('No downloadable videos found', expected=True)\n        self._sort_formats(formats)\n\n        thumbnails = []\n        for picture in info.get('Pictures', []):\n            if not isinstance(picture, dict):\n                continue\n            pic_url = picture.get('URL')\n            if not pic_url:\n                continue\n            thumbnail = {\n                'url': pic_url,\n            }\n            pic_size = picture.get('PicSize', '')\n            m = re.search(r'(?P<width>\\d+)[xX](?P<height>\\d+)', pic_size)\n            if m:\n                thumbnail.update({\n                    'width': int(m.group('width')),\n                    'height': int(m.group('height')),","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/toggle.py#L143-L179","documentation":"Raised by ToggleIE when zero usable formats were collected and no DRM flag was found. The code comment says this is most likely geo-blocking: Toggle restricts streams to Singapore, and the API returns metadata but strips stream URLs for foreign IPs. Marked expected=True.","triggerScenarios":"Extracting toggle.sg/mewatch.sg content from outside Singapore; the format loop adds nothing (no ISM, no mp4), Metas lacks an Encryption flag, so the extractor concludes 'No downloadable videos found'.","commonSituations":"Running downloads from non-SG IPs without a VPN; region-locked live channels; some content restricted even for logged-out SG users.","solutions":["Use a Singapore VPN/exit and retry","Log in with a Singapore account via cookies if the content needs auth","Confirm in an SG-IP browser that the video actually streams","Catch this expected error in bulk jobs and tag the URL as geo-blocked"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(toggle_url)\nexcept ExtractorError as e:\n    if e.expected and 'No downloadable videos found' in str(e):\n        retry_with_sg_exit(url)  # likely geo-block; retry via SG IP once","preventionTips":["Route Toggle/mewatch extraction through a Singapore IP from the start","Distinguish geo (no formats) from DRM (Encryption meta) by the message","Re-check availability in an SG browser before assuming permanent loss"],"tags":["extractor","geo-restriction","expected","formats-empty"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}