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.

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.

Appendix: 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)