ytdl-org/youtube-dl · error · ExtractorError

No media entries found

Error message

No media entries found

What it means

Raised by BRIE._extract_media (the Bayerischer Rundfunk extractor) after parsing the media XML: it iterated the XML but the medias list is empty — no media nodes matched — so nothing can be returned. A len>1 case only logs a warning asking for a bug report; len==0 is a hard failure. It means the XML document lacked parseable media entries (not merely formats), e.g. the asset list was empty or the node names changed.

Source

Thrown at youtube_dl/extractor/br.py:121

                'formats': self._extract_formats(xpath_element(
                    xml_media, 'assets'), media_id),
                'thumbnails': self._extract_thumbnails(xpath_element(
                    xml_media, 'teaserImage/variants'), base_url),
                'description': xpath_text(xml_media, 'desc'),
                'webpage_url': xpath_text(xml_media, 'permalink'),
                'uploader': xpath_text(xml_media, 'author'),
            }
            broadcast_date = xpath_text(xml_media, 'broadcastDate')
            if broadcast_date:
                media['upload_date'] = ''.join(reversed(broadcast_date.split('.')))
            medias.append(media)

        if len(medias) > 1:
            self._downloader.report_warning(
                'found multiple medias; please '
                'report this with the video URL to http://yt-dl.org/bug')
        if not medias:
            raise ExtractorError('No media entries found')
        return medias[0]

    def _extract_formats(self, assets, media_id):
        formats = []
        for asset in assets.findall('asset'):
            format_url = xpath_text(asset, ['downloadUrl', 'url'])
            asset_type = asset.get('type')
            if asset_type.startswith('HDS'):
                formats.extend(self._extract_f4m_formats(
                    format_url + '?hdcore=3.2.0', media_id, f4m_id='hds', fatal=False))
            elif asset_type.startswith('HLS'):
                formats.extend(self._extract_m3u8_formats(
                    format_url, media_id, 'mp4', 'm3u8_native', m3u8_id='hds', fatal=False))
            else:
                format_info = {
                    'ext': xpath_text(asset, 'mediaType'),
                    'width': int_or_none(xpath_text(asset, 'frameWidth')),
                    'height': int_or_none(xpath_text(asset, 'frameHeight')),

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Open the BR page in a browser and confirm the item is still playable; expired items legitimately produce empty media lists.
  2. If it plays, fetch the media XML URL manually and inspect the node names; if renamed, update the collection logic feeding the medias list (br.py:121).
  3. Check the extracted id — a mis-parsed id yields a valid-but-empty XML document.
  4. For batch jobs, treat this as expected for archived items and skip.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(br_url)
except ExtractorError as e:
    if str(e) == 'No media entries found':
        mark_expired(br_url)  # empty media XML: expired or schema change; don't retry immediately
    else:
        raise

Prevention

When it happens

Trigger: Extracting a BR URL whose media XML (the per-media document the extractor fetches) contains no media nodes: expired/removed broadcasts, ids whose XML returns an empty container, or a schema change renaming the media node so findall-based collection yields nothing.

Common situations: Deep links to broadcasts past their availability; BR reworking their XML API node names; batch jobs over archive pages where many entries have no media; proxy/middleware mangling the XML into an empty document.

Related errors


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