{"record":{"id":"67b3111651613903","repo":"yt-dlp/yt-dlp","slug":"unable-to-find-provider-video-id","errorCode":null,"errorMessage":"Unable to find provider video id","messagePattern":"Unable to find provider video id","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/voxmedia.py","lineNumber":68,"sourceCode":"            info['formats'] = formats\n            info['duration'] = int_or_none(asset.get('duration'))\n            return info\n\n        for provider_video_type in ('youtube', 'brightcove'):\n            provider_video_id = video_data.get(f'{provider_video_type}_id')\n            if not provider_video_id:\n                continue\n            if provider_video_type == 'brightcove':\n                # TODO: Find embed example or confirm that Vox has stopped using Brightcove\n                raise ExtractorError('Vox Brightcove embeds are currently unsupported')\n            else:\n                info.update({\n                    '_type': 'url_transparent',\n                    'url': provider_video_id if provider_video_type == 'youtube' else f'{provider_video_type}:{provider_video_id}',\n                    'ie_key': provider_video_type.capitalize(),\n                })\n            return info\n        raise ExtractorError('Unable to find provider video id')\n\n\nclass VoxMediaIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?(?:(?:theverge|vox|sbnation|eater|polygon|curbed|racked|funnyordie)\\.com|recode\\.net)/(?:[^/]+/)*(?P<id>[^/?]+)'\n    _EMBED_REGEX = [r'<iframe[^>]+?src=\"(?P<url>https?://(?:www\\.)?funnyordie\\.com/embed/[^\"]+)\"']\n    _TESTS = [{\n        # FIXME: Unsupported iframe embed\n        # Volume embed, Youtube\n        'url': 'http://www.theverge.com/2014/6/27/5849272/material-world-how-google-discovered-what-software-is-made-of',\n        'info_dict': {\n            'id': 'j4mLW6x17VM',\n            'ext': 'mp4',\n            'title': 'Material world: how Google discovered what software is made of',\n            'description': 'md5:dfc17e7715e3b542d66e33a109861382',\n            'upload_date': '20190710',\n            'uploader_id': 'TheVerge',\n            'uploader': 'The Verge',\n        },","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/voxmedia.py#L50-L86","documentation":"VoxMediaIE's _VALID_URL is very broad and matches nearly any page on the Vox Media domains. When the page's video_data JSON has neither a youtube_id nor a brightcove_id and no direct formats were extracted, there is no provider to hand off to, so the extractor gives up with this generic message.","triggerScenarios":"Passing a Vox Media URL that matches the regex but whose init JSON contains no youtube_id/brightcove_id and no formats: photo galleries, text-only articles, hub/index pages, or pages whose video is embedded via an iframe type the extractor does not parse.","commonSituations":"Non-video articles (the URL regex matches any slug ending a path); embeds via unsupported iframe providers; renamed or redirected URLs that still match the pattern.","solutions":["Confirm the URL actually contains a video by opening it in a browser","Find the real embed (iframe src or YouTube link) in the page HTML and pass that URL to yt-dlp directly","If the video plays in a browser but yt-dlp fails, run with --verbose to see which JSON was parsed and report the missed embed pattern upstream"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import json, re, urllib.request\n\npage = urllib.request.urlopen(article_url).read().decode()\nm = re.search(r'Chorus\\.VideoContext\\.prepare\\((\\{.*?\\})\\);?\\s*$', page, re.M)\nvideo_data = json.loads(m.group(1))['video'] if m else {}\nif not any(video_data.get(k) for k in ('youtube_id', 'brightcove_id')) and not video_data.get('video_files'):\n    print('no provider video on this page, skip yt-dlp call')","typeGuard":"def is_no_provider_video(exc: Exception) -> bool:\n    return isinstance(exc, ExtractorError) and 'Unable to find provider video id' in str(exc)","tryCatchPattern":"try:\n    info = ydl.extract_info(url, download=False)\nexcept DownloadError as e:\n    if 'Unable to find provider video id' in str(e):\n        continue  # non-video article, skip in batch runs\n    raise","preventionTips":["Filter article URLs to ones that actually reference a video before batch processing","When scraping link lists, extract embedded player URLs (iframe src) instead of article URLs","Treat this message as 'page has no video' rather than a transient failure - do not retry"],"tags":["vox-media","no-video","provider-missing","content-not-found"],"backgroundTag":"no-media-found","analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}