ytdl-org/youtube-dl · error · ExtractorError

No suitable stream found

Error message

No suitable stream found

What it means

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.

Source

Thrown at youtube_dl/extractor/playtvak.py:131

        qs.update({
            'reklama': ['0'],
            'type': ['js'],
        })

        info_url = compat_urlparse.urlunparse(
            parsed_url._replace(query=compat_urllib_parse_urlencode(qs, True)))

        json_info = self._download_json(
            info_url, video_id,
            transform_source=lambda s: s[s.index('{'):s.rindex('}') + 1])

        item = None
        for i in json_info['items']:
            if i.get('type') == 'video' or i.get('type') == 'stream':
                item = i
                break
        if not item:
            raise ExtractorError('No suitable stream found')

        quality = qualities(('low', 'middle', 'high'))

        formats = []
        for fmt in item['video']:
            video_url = fmt.get('file')
            if not video_url:
                continue

            format_ = fmt['format']
            format_id = '%s_%s' % (format_, fmt['quality'])
            preference = None

            if format_ in ('mp4', 'webm'):
                ext = format_
            elif format_ == 'rtmp':
                ext = 'flv'
            elif format_ == 'apple':

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Open the URL in a browser and confirm it actually contains a video player
  2. Use the direct video page URL (usually containing the video id) rather than article wrappers
  3. Skip non-video links when batch downloading playtvak.cz content
Defensive patterns

Strategy: validation

Validate before calling

import requests, re
html = requests.get(url).text
if not re.search(r'jwplayer|<video\b|data-video', html):
    print('Page has no video player; skip this URL')

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if 'No suitable stream found' in str(e):
        continue  # non-video playtvak item; skip in batch mode

Prevention

When it happens

Trigger: 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.

Common situations: Grabbing a whole playtvak section page where some links are non-video content; Playtvak restructuring item types so 'video'/'stream' labels change.

Related errors


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