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

  1. Get a fresh launch URL from the LMS/email and run yt-dlp on it immediately - launch tokens are short-lived.
  2. 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.
  3. Check the JWT payload (e.g. on jwt.io) to confirm the exp claim has not already passed.
  4. 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

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


AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22). Data as JSON: /api/errors/46235d760e9cee44. Report an issue: GitHub.