{"record":{"id":"2358158f46b74d87","repo":"ytdl-org/youtube-dl","slug":"this-video-is-unavailable","errorCode":null,"errorMessage":"This video is unavailable","messagePattern":"This video is unavailable","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/prosiebensat1.py","lineNumber":116,"sourceCode":"                    return None\n                return (bitrate // 1000) if bitrate % 1000 == 0 else bitrate\n\n            for source_id in source_ids:\n                client_id = self._SALT[:2] + sha1(''.join([self._SALT, clip_id, self._TOKEN, server_id, client_location, source_id, self._SALT, self._CLIENT_NAME]).encode('utf-8')).hexdigest()\n                urls = self._download_json(\n                    'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources/url' % clip_id,\n                    clip_id, 'Downloading urls JSON', fatal=False, query={\n                        'access_token': self._TOKEN,\n                        'client_id': client_id,\n                        'client_location': client_location,\n                        'client_name': self._CLIENT_NAME,\n                        'server_id': server_id,\n                        'source_ids': source_id,\n                    })\n                if not urls:\n                    continue\n                if urls.get('status_code') != 0:\n                    raise ExtractorError('This video is unavailable', expected=True)\n                urls_sources = urls['sources']\n                if isinstance(urls_sources, dict):\n                    urls_sources = urls_sources.values()\n                for source in urls_sources:\n                    source_url = source.get('url')\n                    if not source_url:\n                        continue\n                    protocol = source.get('protocol')\n                    mimetype = source.get('mimetype')\n                    if mimetype == 'application/f4m+xml' or 'f4mgenerator' in source_url or determine_ext(source_url) == 'f4m':\n                        formats.extend(self._extract_f4m_formats(\n                            source_url, clip_id, f4m_id='hds', fatal=False))\n                    elif mimetype == 'application/x-mpegURL':\n                        formats.extend(self._extract_m3u8_formats(\n                            source_url, clip_id, 'mp4', 'm3u8_native',\n                            m3u8_id='hls', fatal=False))\n                    elif mimetype == 'application/dash+xml':\n                        formats.extend(self._extract_mpd_formats(","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/prosiebensat1.py#L98-L134","documentation":"ProSiebenSat1BaseIE raises ExtractorError('This video is unavailable', expected=True) when the per-source URL request to vas.sim-technik.de .../videos/{clip_id}/sources/url returns a JSON whose status_code is not 0. Status 0 means success for this endpoint; any other code means the VAS backend refuses to serve stream URLs for that source (expired, offline, or blocked).","triggerScenarios":"For each source_id/client_id combo, the extractor fetches the sources/url JSON; if urls exists but urls['status_code'] != 0, it raises immediately (does not try the next source). Typical for clips whose streaming rights lapsed, deleted VOD entries, or sources disabled for the requesting client_location.","commonSituations":"Old embed/clip URLs after the broadcaster took content offline; time-limited catch-up TV expiring; API client/server id mismatch in the extractor after backend changes; regionally disabled sources.","solutions":["Verify the clip still plays on the broadcaster's website; if not, the URL is dead — remove it.","Update youtube-dl — VAS client_id/server_id parameters drift over time and are patched frequently.","If the content is catch-up TV, note it may simply have expired; find the current episode URL.","Retry later if the clip is part of a pre-broadcast placeholder (availability not yet started)."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'This video is unavailable' in str(e):\n        mark_expired(url)  # schedule no retry","preventionTips":["Check clip availability on the broadcaster site before queueing old URLs.","Update youtube-dl when VAS parameter drift is suspected.","Treat non-zero status_code as permanent for that URL; retrying rarely helps."],"tags":["prosiebensat1","api-status","content-offline","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}