ytdl-org/youtube-dl · error · ExtractorError

error_desc

Error message

error_desc

What it means

Raised by the Wat (wat.tv / TF1) extractor when the mediainfo.tf1.fr JSON contains a non-empty error_desc in video_info. If error_code is 'GEOBLOCKED' it first calls raise_geo_restricted with the allowed geoList; otherwise it raises with the service's own error text.

Source

Thrown at youtube_dl/extractor/wat.py:67

    def _real_extract(self, url):
        video_id = self._match_id(url)
        video_id = video_id if video_id.isdigit() and len(video_id) > 6 else compat_str(int(video_id, 36))

        # 'contentv4' is used in the website, but it also returns the related
        # videos, we don't need them
        # video_data = self._download_json(
        #     'http://www.wat.tv/interface/contentv4s/' + video_id, video_id)
        video_data = self._download_json(
            'https://mediainfo.tf1.fr/mediainfocombo/' + video_id,
            video_id, query={'context': 'MYTF1', 'pver': '4001000'})
        video_info = video_data['media']

        error_desc = video_info.get('error_desc')
        if error_desc:
            if video_info.get('error_code') == 'GEOBLOCKED':
                self.raise_geo_restricted(error_desc, video_info.get('geoList'))
            raise ExtractorError(error_desc, expected=True)

        title = video_info['title']

        formats = []

        def extract_formats(manifest_urls):
            for f, f_url in manifest_urls.items():
                if not f_url:
                    continue
                if f in ('dash', 'mpd'):
                    formats.extend(self._extract_mpd_formats(
                        f_url.replace('://das-q1.tf1.fr/', '://das-q1-ssl.tf1.fr/'),
                        video_id, mpd_id='dash', fatal=False))
                elif f == 'hls':
                    formats.extend(self._extract_m3u8_formats(
                        f_url, video_id, 'mp4',
                        'm3u8_native', m3u8_id='hls', fatal=False))

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read error_desc — it is TF1's own message and states the exact reason.
  2. For GEOBLOCKED, use a French IP or the geoList countries the response permits.
  3. If the video was removed, find the content on another service.
  4. Verify the video ID is current by opening the page on the MYTF1 site.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except GeoRestrictedError:
    mark_geo_blocked(url, countries=['FR'])
except ExtractorError as e:
    log_skip(url, str(e))

Prevention

When it happens

Trigger: Requesting https://mediainfo.tf1.fr/mediainfocombo/<video_id> with context=MYTF1 and pver=4001000 where the returned media object has error_desc set (geoblocking, removed video, unpublished content).

Common situations: Watching TF1/wat.tv content from outside France; videos delisted after broadcast rights expired; IDs from old URLs that no longer resolve in the MYTF1 catalog.

Related errors


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