{"record":{"id":"cafe69793ee5eddb","repo":"ytdl-org/youtube-dl","slug":"no-suitable-stream-found","errorCode":null,"errorMessage":"No suitable stream found","messagePattern":"No suitable stream found","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/playtvak.py","lineNumber":131,"sourceCode":"        qs.update({\n            'reklama': ['0'],\n            'type': ['js'],\n        })\n\n        info_url = compat_urlparse.urlunparse(\n            parsed_url._replace(query=compat_urllib_parse_urlencode(qs, True)))\n\n        json_info = self._download_json(\n            info_url, video_id,\n            transform_source=lambda s: s[s.index('{'):s.rindex('}') + 1])\n\n        item = None\n        for i in json_info['items']:\n            if i.get('type') == 'video' or i.get('type') == 'stream':\n                item = i\n                break\n        if not item:\n            raise ExtractorError('No suitable stream found')\n\n        quality = qualities(('low', 'middle', 'high'))\n\n        formats = []\n        for fmt in item['video']:\n            video_url = fmt.get('file')\n            if not video_url:\n                continue\n\n            format_ = fmt['format']\n            format_id = '%s_%s' % (format_, fmt['quality'])\n            preference = None\n\n            if format_ in ('mp4', 'webm'):\n                ext = format_\n            elif format_ == 'rtmp':\n                ext = 'flv'\n            elif format_ == 'apple':","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/playtvak.py#L113-L149","documentation":"Raised by PlaytvakIE when the downloaded JSON info's 'items' array contains no entry with type 'video' or 'stream'. It means the URL is valid and the API responded, but the content has no playable media (e.g. it is an article, photo gallery, or quiz). Not marked expected, since it usually indicates a URL category the extractor was not meant to handle.","triggerScenarios":"Pointing the extractor at playtvak.cz content whose items are only 'photo'/'article'/other types; or media pulled so items becomes empty. The loop over json_info['items'] never sets item, triggering the raise.","commonSituations":"Grabbing a whole playtvak section page where some links are non-video content; Playtvak restructuring item types so 'video'/'stream' labels change.","solutions":["Open the URL in a browser and confirm it actually contains a video player","Use the direct video page URL (usually containing the video id) rather than article wrappers","Skip non-video links when batch downloading playtvak.cz content"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import requests, re\nhtml = requests.get(url).text\nif not re.search(r'jwplayer|<video\\b|data-video', html):\n    print('Page has no video player; skip this URL')","typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'No suitable stream found' in str(e):\n        continue  # non-video playtvak item; skip in batch mode","preventionTips":["Filter URLs to actual video pages before batch downloads","Skip-and-log this error in crawlers rather than aborting the batch","Report persistent occurrences — item 'type' labels may have changed"],"tags":["playtvak","no-stream","content-type","extractor-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}