{"record":{"id":"2474bd4344b88810","repo":"ytdl-org/youtube-dl","slug":"playlist-item-was-not-found","errorCode":null,"errorMessage":"Playlist item was not found","messagePattern":"Playlist item was not found","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/turbo.py","lineNumber":41,"sourceCode":"            'id': '454443',\n            'ext': 'mp4',\n            'duration': 3715,\n            'title': 'Turbo du 07/09/2014 : Renault Twingo 3, Bentley Continental GT Speed, CES, Guide Achat Dacia... ',\n            'description': 'Turbo du 07/09/2014 : Renault Twingo 3, Bentley Continental GT Speed, CES, Guide Achat Dacia...',\n            'thumbnail': r're:^https?://.*\\.jpg$',\n        }\n    }\n\n    def _real_extract(self, url):\n        mobj = re.match(self._VALID_URL, url)\n        video_id = mobj.group('id')\n\n        webpage = self._download_webpage(url, video_id)\n\n        playlist = self._download_xml(self._API_URL.format(video_id), video_id)\n        item = playlist.find('./channel/item')\n        if item is None:\n            raise ExtractorError('Playlist item was not found', expected=True)\n\n        title = xpath_text(item, './title', 'title')\n        duration = int_or_none(xpath_text(item, './durate', 'duration'))\n        thumbnail = xpath_text(item, './visuel_clip', 'thumbnail')\n        description = self._html_search_meta('description', webpage)\n\n        formats = []\n        get_quality = qualities(['3g', 'sd', 'hq'])\n        for child in item:\n            m = re.search(r'url_video_(?P<quality>.+)', child.tag)\n            if m:\n                quality = compat_str(m.group('quality'))\n                formats.append({\n                    'format_id': quality,\n                    'url': child.text,\n                    'quality': get_quality(quality),\n                })\n        self._sort_formats(formats)","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/turbo.py#L23-L59","documentation":"Raised by TurboIE (French M6 group clip site) when the playlist XML returned by the API has no ./channel/item element: the video id exists in the URL but the API has no corresponding media item. Expected=True.","triggerScenarios":"Downloading a turbo.fr clip URL (e.g. from a M6 programme page) where api.turbo.fr returns an XML without a channel/item node — clip removed, or the whole service (turbo.fr video section) discontinued.","commonSituations":"Old French TV clip links after the site was retired; expired broadcast-window clips. The site's video offering was shut down, so most historical URLs now hit this branch.","solutions":["Check turbo.fr in a browser; if the clip page is gone, the media is unavailable","Search the M6 group's current platform (6play/m6replay successor) for the same clip","Filter turbo.fr URLs out of archival download lists","Catch expected ExtractorError and skip in bulk jobs"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from urllib.parse import urlparse\nif urlparse(url).netloc.endswith('turbo.fr'):\n    check_page_alive(url)  # site's video service retired; most ids return empty XML","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'Playlist item was not found' in str(e):\n        mark_unavailable(url)","preventionTips":["Pre-filter turbo.fr links from archival queues","Look for the same clips on the M6 group's current platform"],"tags":["extractor","dead-site","content-unavailable","expected"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}