{"record":{"id":"0210fd2ca2b29af5","repo":"ytdl-org/youtube-dl","slug":"video-s-is-not-available","errorCode":null,"errorMessage":"Video %s is not available","messagePattern":"Video (.+?) is not available","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/arte.py","lineNumber":69,"sourceCode":"\n    def _real_extract(self, url):\n        mobj = re.match(self._VALID_URL, url)\n        video_id = mobj.group('id')\n        lang = mobj.group('lang') or mobj.group('lang_2')\n\n        info = self._download_json(\n            '%s/config/%s/%s' % (self._API_BASE, lang, video_id), video_id)\n        player_info = info['videoJsonPlayer']\n\n        vsr = try_get(player_info, lambda x: x['VSR'], dict)\n        if not vsr:\n            error = None\n            if try_get(player_info, lambda x: x['custom_msg']['type']) == 'error':\n                error = try_get(\n                    player_info, lambda x: x['custom_msg']['msg'], compat_str)\n            if not error:\n                error = 'Video %s is not available' % player_info.get('VID') or video_id\n            raise ExtractorError(error, expected=True)\n\n        upload_date_str = player_info.get('shootingDate')\n        if not upload_date_str:\n            upload_date_str = (player_info.get('VRA') or player_info.get('VDA') or '').split(' ')[0]\n\n        title = (player_info.get('VTI') or player_info['VID']).strip()\n        subtitle = player_info.get('VSU', '').strip()\n        if subtitle:\n            title += ' - %s' % subtitle\n\n        qfunc = qualities(['MQ', 'HQ', 'EQ', 'SQ'])\n\n        LANGS = {\n            'fr': 'F',\n            'de': 'A',\n            'en': 'E[ANG]',\n            'es': 'E[ESP]',\n            'it': 'E[ITA]',","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/arte.py#L51-L87","documentation":"Raised by the Arte extractor when the player config JSON (videoJsonPlayer) contains no VSR (Video Source References) entry. If the API supplied custom_msg with type 'error', that message is used instead; otherwise the generic 'Video %s is not available' is raised with the VID. Marked expected=True.","triggerScenarios":"GET <API_BASE>/config/<lang>/<video_id> returns videoJsonPlayer without VSR; geo-restricted arte content viewed from outside allowed regions; content past its streaming window; custom_msg type 'error' carrying the site's reason.","commonSituations":"Extracting arte+7 content after its 7-day expiry; watching French/German-locked items from other countries; lang parameter (de/fr) mismatch for a language-exclusive item.","solutions":["If custom_msg was shown, follow its text (usually expiry or geo reason)","Retry from a DE/FR IP for geo-restricted items","Try the other language variant of the URL (arte.fr vs arte.de) which can have different availability","For expired content, look for a rebroadcast with a fresh video id"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"# Optional: probe the Arte config for VSR before full extraction\nimport requests\ncfg = requests.get('https://api.arte.tv/api/player/v1/config/de/%s' % video_id).json()\nplayer = cfg.get('videoJsonPlayer', {})\nif not player.get('VSR'):\n    reason = (player.get('custom_msg') or {}).get('msg', 'no VSR')\n    skip(url, reason=reason)","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    msg = str(e)\n    if 'not available' in msg:\n        if is_geo_reason(msg):\n            requeue_with_region(url, 'DE')  # or 'FR'\n        else:\n            mark_url_dead(url)  # expired arte+7 content","preventionTips":["Download arte content within its availability window (often 7 days after broadcast)","Match the URL's language variant (arte.de vs arte.fr) — availability can differ per language","Route through a DE/FR IP when content is geo-locked"],"tags":["arte","geo-restriction","expired","content-missing"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}