{"record":{"id":"ee13ebe26c95f335","repo":"yt-dlp/yt-dlp","slug":"error-desc","errorCode":null,"errorMessage":"{error_desc}","messagePattern":"\\{error_desc\\}","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/wat.py","lineNumber":83,"sourceCode":"        # videos, we don't need them\n        # video_data = self._download_json(\n        #     'http://www.wat.tv/interface/contentv4s/' + video_id, video_id)\n        video_data = self._download_json(\n            'https://mediainfo.tf1.fr/mediainfocombo/' + video_id,\n            video_id, query={'pver': '5010000'})\n        video_info = video_data['media']\n\n        error_desc = video_info.get('error_desc')\n        if error_desc:\n            error_code = video_info.get('error_code')\n            if error_code == 'GEOBLOCKED':\n                self.raise_geo_restricted(error_desc, video_info.get('geoList'))\n            elif error_code == 'DELIVERY_ERROR':\n                if traverse_obj(video_data, ('delivery', 'code')) in (403, 500):\n                    self.report_drm(video_id)\n                error_desc = join_nonempty(\n                    error_desc, traverse_obj(video_data, ('delivery', 'error', {str})), delim=': ')\n            raise ExtractorError(error_desc, expected=True)\n\n        title = video_info['title']\n\n        formats = []\n        subtitles = {}\n\n        def extract_formats(manifest_urls):\n            for f, f_url in manifest_urls.items():\n                if not f_url:\n                    continue\n                if f in ('dash', 'mpd'):\n                    fmts, subs = self._extract_mpd_formats_and_subtitles(\n                        f_url.replace('://das-q1.tf1.fr/', '://das-q1-ssl.tf1.fr/'),\n                        video_id, mpd_id='dash', fatal=False)\n                elif f == 'hls':\n                    fmts, subs = self._extract_m3u8_formats_and_subtitles(\n                        f_url, video_id, 'mp4',\n                        'm3u8_native', m3u8_id='hls', fatal=False)","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/wat.py#L65-L101","documentation":"The wat.tv (TVA) extractor reads the media object from the delivery API; any error_desc there is a playback refusal. GEOBLOCKED is mapped to raise_geo_restricted, DELIVERY_ERROR with delivery code 403/500 to a DRM report, and every other error surfaces its text verbatim as an expected ExtractorError.","triggerScenarios":"Extracting a wat.tv/video URL whose media JSON contains error_desc: geoblocking outside authorized regions, DRM-protected delivery (delivery.code 403 or 500), removed videos, or platform-specific delivery errors.","commonSituations":"Watching French-Canadian content from outside Canada; DRM'd TVA+ simulcast content; dead or expired links.","solutions":["Read the surfaced error text: geo errors require an authorized (Canadian) network or a different source","If the cause was DRM (delivery code 403/500 reported as DRM), yt-dlp cannot download it - there is no workaround","Confirm the video still plays on wat.tv in a browser; dead links legitimately produce this","Update yt-dlp in case the error mapping improved"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"from yt_dlp.utils import GeoRestrictedError\n\ndef classify_wat_error(exc: Exception) -> str:\n    if isinstance(exc, GeoRestrictedError):\n        return 'geo'\n    if isinstance(exc, ExtractorError) and 'DRM' in str(exc):\n        return 'drm'\n    if isinstance(exc, ExtractorError) and exc.expected:\n        return 'api'\n    return 'unknown'","tryCatchPattern":"try:\n    info = ydl.extract_info(wat_url, download=False)\nexcept DownloadError as e:\n    if isinstance(getattr(e, 'exc_info', (None, None))[1], GeoRestrictedError) or 'geo' in str(e).lower():\n        route_via_canadian_proxy()\n    elif 'DRM' in str(e):\n        skip_permanently(wat_url)  # no workaround exists\n    else:\n        check_if_link_is_dead(wat_url)","preventionTips":["Classify wat.tv failures by text: geo, DRM, and dead links need different handling","Do not retry DRM or geoblocked items without changing network conditions","Verify wat.tv links still play in a browser before queueing them"],"tags":["wat-tv","tva","geo-restricted","drm","api-error"],"backgroundTag":"streaming-api-error","analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}