ytdl-org/youtube-dl · error · ExtractorError
No videos found
Error message
No videos found
What it means
Raised by BioBioChileTVIE._real_extract when the article page HTML contains no iframe whose src points at rudo.video/vod/... — the embedded player BioBioChile articles use. The regex search returns None (the search was non-fatal), and the extractor converts that into 'No videos found'. It means the URL matched the extractor but the article genuinely has (or appears to have) no video.
Solutions
- Open the article in a browser and confirm a video player actually exists; many articles are text-only.
- If a player exists, view source and check the iframe src — if Rudo's URL format changed, update the regex (host/path pattern).
- If the iframe is JS-injected, the extractor would need to parse the embed URL from a script variable instead; report upstream.
- For the direct video case, extract the Rudo URL yourself (rudo.video/vod/<id>) and pass it to the Rudo extractor.
Example fix
// before - caller feeds any biobiochile article URL to youtube-dl
YoutubeDL().extract_info('https://www.biobiochile.cl/noticias/...', download=True)
// after - pre-check the page for a rudo embed before invoking the extractor
import re, requests
html = requests.get(article_url).text
m = re.search(r'<iframe[^>]+src=["\'](https?:)?//rudo\.video/vod/[0-9a-zA-Z]+["\']', html)
if not m:
print('article has no embedded video; skip')
else:
YoutubeDL().extract_info(m.group(0).split('src=')[1].strip('"\''), download=True) Defensive patterns
Strategy: validation
Validate before calling
import re, requests
def biobio_article_has_video(url):
html = requests.get(url).text
return bool(re.search(r'<iframe[^>]+src=["\'](?:https?:)?//rudo\.video/vod/[0-9a-zA-Z]+["\']', html)) Try / catch
try:
ydl.extract_info(article_url)
except ExtractorError as e:
if str(e) == 'No videos found':
skip_article(article_url) # text-only article or embed format change; not transient
else:
raise Prevention
- Pre-filter article URLs for a rudo.video/vod iframe before extraction.
- For feeds, extract the rudo URL directly and hand it to the Rudo extractor.
- If the article visibly plays video, suspect an iframe-format change and patch the regex.
When it happens
Trigger: Extracting a BioBioChile article URL that embeds no Rudo video (text-only or photo article), or one whose player iframe uses a different host/format (rudo URL pattern changed, lazy-loaded src, or a new player domain) so the regex at biobiochiletv.py:70 fails to match.
Common situations: Article links shared from news feeds where only some articles contain video; Rudo changing embed URL shape (e.g. rudo.video/vod vs new path); iframes injected by JavaScript after initial HTML so the downloaded source lacks them; ad/tracking iframes confusing manual inspection.
Related errors
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/49ae5cf82e026062.
Report an issue: GitHub.
Appendix: source
Thrown at youtube_dl/extractor/biobiochiletv.py:70
},
}, {
'url': 'http://tv.biobiochile.cl/notas/2015/10/22/ninos-transexuales-de-quien-es-la-decision.shtml',
'only_matching': True,
}, {
'url': 'http://tv.biobiochile.cl/notas/2015/10/21/exclusivo-hector-pinto-formador-de-chupete-revela-version-del-ex-delantero-albo.shtml',
'only_matching': True,
}]
def _real_extract(self, url):
video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id)
rudo_url = self._search_regex(
r'<iframe[^>]+src=(?P<q1>[\'"])(?P<url>(?:https?:)?//rudo\.video/vod/[0-9a-zA-Z]+)(?P=q1)',
webpage, 'embed URL', None, group='url')
if not rudo_url:
raise ExtractorError('No videos found')
title = remove_end(self._og_search_title(webpage), ' - BioBioChile TV')
thumbnail = self._og_search_thumbnail(webpage)
uploader = self._html_search_regex(
r'<a[^>]+href=["\'](?:https?://(?:busca|www)\.biobiochile\.cl)?/(?:lista/)?(?:author|autor)[^>]+>(.+?)</a>',
webpage, 'uploader', fatal=False)
return {
'_type': 'url_transparent',
'url': rudo_url,
'id': video_id,
'title': title,
'thumbnail': thumbnail,
'uploader': uploader,
}
View on GitHub (pinned to 956b8c5855)