yt-dlp/yt-dlp · error · UnsupportedError
Unsupported URL: {redirect_url}
Error message
Unsupported URL: {redirect_url} What it means
BlackboardCollaborateLaunchIE handles bbcollab.com/launch/<jwt> links by decoding the JWT for the resourceId and following the redirect; a healthy link redirects to a collab/ui/session/playback URL handled by BlackboardCollaborateIE. When the redirect target AGAIN matches the launch pattern (the server bounced it back to another launch/gate page), it raises UnsupportedError(redirect_url) - yt-dlp's standard 'this URL cannot be processed' signal, surfaced as 'Unsupported URL: <redirect_url>'.
Source
Thrown at yt_dlp/extractor/blackboardcollaborate.py:178
'only_matching': True,
},
{
'url': 'https://us.bbcollab.com/launch/eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJiYkNvbGxhYkFwaSIsInN1YiI6ImJiQ29sbGFiQXBpIiwiZXhwIjoxNjk0NDgxOTc3LCJpYXQiOjE2OTQ0ODE2NzcsInJlc291cmNlQWNjZXNzVGlja2V0Ijp7InJlc291cmNlSWQiOiI3YWU0MTFhNTU3NjU0OWFiOTZlYjVmMTM1YmY3MWU5MCIsImNvbnN1bWVySWQiOiJBRUU2MEI4MDI2QzM3ODU2RjMwMzNEN0ZEOTQzMTFFNSIsInR5cGUiOiJSRUNPUkRJTkciLCJyZXN0cmljdGlvbiI6eyJ0eXBlIjoiVElNRSIsImV4cGlyYXRpb25Ib3VycyI6MCwiZXhwaXJhdGlvbk1pbnV0ZXMiOjUsIm1heFJlcXVlc3RzIjotMX0sImRpc3Bvc2l0aW9uIjoiTEFVTkNIIiwibGF1bmNoVHlwZSI6bnVsbCwibGF1bmNoQ29tcG9uZW50IjpudWxsLCJsYXVuY2hQYXJhbUtleSI6bnVsbH19.yOhRZNaIjXYoMYMpcTzgjZJCnIFaYf2cAzbco8OAxlY',
'only_matching': True,
},
{
'url': 'https://eu.bbcollab.com/launch/eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJiYkNvbGxhYkFwaSIsInN1YiI6ImJiQ29sbGFiQXBpIiwiZXhwIjoxNzUyNjgyODYwLCJpYXQiOjE3NTI2ODI1NjAsInJlc291cmNlQWNjZXNzVGlja2V0Ijp7InJlc291cmNlSWQiOiI4MjQzYjFiODg2Nzk0NTZkYjkwN2NmNDZmZmE1MmFhZiIsImNvbnN1bWVySWQiOiI5ZTY4NzYwZWJiNzM0MzRiYWY3NTQyZjA1YmJkOTMzMCIsInR5cGUiOiJSRUNPUkRJTkciLCJyZXN0cmljdGlvbiI6eyJ0eXBlIjoiVElNRSIsImV4cGlyYXRpb25Ib3VycyI6MCwiZXhwaXJhdGlvbk1pbnV0ZXMiOjUsIm1heFJlcXVlc3RzIjotMX0sImRpc3Bvc2l0aW9uIjoiTEFVTkNIIiwibGF1bmNoVHlwZSI6bnVsbCwibGF1bmNoQ29tcG9uZW50IjpudWxsLCJsYXVuY2hQYXJhbUtleSI6bnVsbH19.Xj4ymojYLwZ1vKPKZ-KxjpqQvFXoJekjRaG0npngwWs',
'only_matching': True,
},
]
def _real_extract(self, url):
token = self._match_id(url)
video_id = jwt_decode_hs256(token)['resourceAccessTicket']['resourceId']
redirect_url = self._request_webpage(url, video_id).url
if self.suitable(redirect_url):
raise UnsupportedError(redirect_url)
return self.url_result(redirect_url, BlackboardCollaborateIE, video_id)
View on GitHub (pinned to 81ecd58b13)
Solutions
- Get a fresh launch URL from the LMS/email and run yt-dlp on it immediately - launch tokens are short-lived.
- Open the link in a browser, authenticate if asked, then copy the final https://<region>.bbcollab.com/collab/ui/session/playback/load/<id> URL from the address bar and give THAT to yt-dlp.
- Check the JWT payload (e.g. on jwt.io) to confirm the exp claim has not already passed.
- If the recording requires your institution's login, browser + copied playback URL is the reliable path.
Example fix
# before yt-dlp 'https://eu.bbcollab.com/launch/<stale-jwt>' # Unsupported URL: https://eu.bbcollab.com/launch/... # after (open launch link in a browser, log in, copy final URL) yt-dlp 'https://eu.bbcollab.com/collab/ui/session/playback/load/<recording-id>'
Defensive patterns
Strategy: fallback
Validate before calling
import base64, json, time
def launch_token_still_valid(launch_url):
token = launch_url.rsplit('/', 1)[-1].split('.')[0]
payload = token + '=' * (-len(token) % 4)
claims = json.loads(base64.urlsafe_b64decode(payload))
return claims.get('exp', 0) > time.time()
if not launch_token_still_valid(url):
get_fresh_link_from_lms() # do not bother yt-dlp with an expired token Try / catch
from yt_dlp.utils import DownloadError, UnsupportedError
try:
info = ydl.extract_info(launch_url, download=False)
except UnsupportedError:
# token bounced back to another /launch page: fall back to the manual path
info = ydl.extract_info(manually_copied_playback_url, download=False) Prevention
- Run yt-dlp on launch links immediately after obtaining them - the JWT exp is often minutes away.
- For protected sessions, always keep the browser-open-then-copy-playback-URL fallback handy.
- Decode the JWT and compare exp with current time before scripting downloads of shared launch links.
When it happens
Trigger: The launch token is expired (the JWT exp / expirationMinutes restriction passed), the session requires authenticated SSO rather than guest access, or the recording is not yet available - so the server never hands over the playback URL.
Common situations: Reusing launch links copied from LMS pages or emails minutes-to-hours later; institutional recordings behind login; retrying old saved links after the token lifetime elapsed.
Related errors
- Unsupported URL: {url}
- The fetched token is already expired
- Redirect failed
- Copy the link from the button below the video description/pl
- canonical URL not found
AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22).
Data as JSON: /api/errors/46235d760e9cee44.
Report an issue: GitHub.