ytdl-org/youtube-dl · error · ExtractorError

No entry in site's table of contents for this URL. Is the fr

Error message

No entry in site's table of contents for this URL. Is the fragment part of the URL (after the #) correct?

What it means

Raised by the WDR Maus extractor when the display_id from the URL fragment is not a key in the tableOfContentsJS.php5 JSON. Die Maus pages address videos via the #fragment of the URL, so a missing or mistyped fragment means the site's table of contents has no entry for it.

Source

Thrown at youtube_dl/extractor/wdr.py:323

        'info_dict': {
            'title': 'Wippe',
            'id': 'mdb-1198320',
            'ext': 'mp4',
            'age_limit': None,
            'upload_date': '20071003'
        },
    }

    def _real_extract(self, url):
        display_id = self._match_id(url)

        # Table of Contents seems to always be at this address, so fetch it directly.
        # The website fetches configurationJS.php5, which links to tableOfContentsJS.php5.
        table_of_contents = self._download_json(
            'https://www.wdrmaus.de/elefantenseite/data/tableOfContentsJS.php5',
            display_id)
        if display_id not in table_of_contents:
            raise ExtractorError(
                'No entry in site\'s table of contents for this URL. '
                'Is the fragment part of the URL (after the #) correct?',
                expected=True)
        xml_metadata_path = table_of_contents[display_id]['xmlPath']
        xml_metadata = self._download_xml(
            'https://www.wdrmaus.de/elefantenseite/' + xml_metadata_path,
            display_id)
        zmdb_url_element = xml_metadata.find('./movie/zmdb_url')
        if zmdb_url_element is None:
            raise ExtractorError(
                '%s is not a video' % display_id, expected=True)
        return self.url_result(zmdb_url_element.text, ie=WDRIE.ie_key())


class WDRMobileIE(InfoExtractor):
    _VALID_URL = r'''(?x)
        https?://mobile-ondemand\.wdr\.de/
        .*?/fsk(?P<age_limit>[0-9]+)

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Re-copy the full URL including everything after the # from the site.
  2. Open the page in a browser and confirm the fragment matches the current entry.
  3. Browse the site to find the current URL for the same episode.
Defensive patterns

Strategy: validation

Validate before calling

toc = fetch_json('https://www.wdrmaus.de/elefantenseite/data/tableOfContentsJS.php5')
display_id = url.split('#', 1)[1] if '#' in url else None
if display_id not in toc:
    print('fragment missing or wrong — copy full URL with #')

Type guard

def has_toc_entry(display_id: str, toc: dict) -> bool:
    return display_id in toc and 'xmlPath' in toc[display_id]

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if 'table of contents' in str(e):
        flag_broken_fragment(url)
    else:
        raise

Prevention

When it happens

Trigger: Extracting a wdrmaus.de/elefantenseite URL whose fragment-derived display_id is absent from https://www.wdrmaus.de/elefantenseite/data/tableOfContentsJS.php5 — wrong, stale, or truncated fragment.

Common situations: Copying the URL without the #fragment part; renaming on the site that changed fragment identifiers; old links after WDR reorganized the Elefantenseite.

Related errors


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