ytdl-org/youtube-dl · error · ExtractorError

This video is currently unavailable. It may still be uploadi

Error message

This video is currently unavailable. It may still be uploading or processing.

What it means

Raised by StreamableIE when the AJAX endpoint ajax.streamable.com/videos/<id> returns a status code other than 2. Status 0 = still uploading, 1 = still processing, 3 = error/unavailable; only 2 (at least one file ready) proceeds. Marked expected=True because it is a normal transient or terminal site state.

Source

Thrown at youtube_dl/extractor/streamable.py:81

            return mobj.group('src')

    def _real_extract(self, url):
        video_id = self._match_id(url)

        # Note: Using the ajax API, as the public Streamable API doesn't seem
        # to return video info like the title properly sometimes, and doesn't
        # include info like the video duration
        video = self._download_json(
            'https://ajax.streamable.com/videos/%s' % video_id, video_id)

        # Format IDs:
        # 0 The video is being uploaded
        # 1 The video is being processed
        # 2 The video has at least one file ready
        # 3 The video is unavailable due to an error
        status = video.get('status')
        if status != 2:
            raise ExtractorError(
                'This video is currently unavailable. It may still be uploading or processing.',
                expected=True)

        title = video.get('reddit_title') or video['title']

        formats = []
        for key, info in video['files'].items():
            if not info.get('url'):
                continue
            formats.append({
                'format_id': key,
                'url': self._proto_relative_url(info['url']),
                'width': int_or_none(info.get('width')),
                'height': int_or_none(info.get('height')),
                'filesize': int_or_none(info.get('size')),
                'fps': int_or_none(info.get('framerate')),
                'vbr': float_or_none(info.get('bitrate'), 1000)
            })

View on GitHub (pinned to 956b8c5855)

Solutions

  1. If the video was just uploaded, wait for transcoding to finish (typically seconds to a few minutes) and retry the extraction.
  2. Check https://streamable.com/<id> in a browser: if the page says deleted/expired, the video is gone — re-upload or find a mirror.
  3. For pipelines, poll with a bounded retry/backoff on this specific expected error rather than failing on the first attempt.

Example fix

# before: single-shot extraction
info = ydl.extract_info(url, download=True)
# after: bounded retry while Streamable processes the upload
import time
for attempt in range(10):
    try:
        info = ydl.extract_info(url, download=True)
        break
    except ExtractorError as e:
        if not (e.expected and 'unavailable' in str(e)):
            raise
        if attempt == 9:
            raise
        time.sleep(15)
Defensive patterns

Strategy: retry

Validate before calling

# Check readiness via the same AJAX endpoint the extractor uses
import json, urllib.request
v = json.load(urllib.request.urlopen('https://ajax.streamable.com/videos/%s' % vid))
if v.get('status') != 2:
    print('not ready: status=%s (0=uploading 1=processing 3=error)' % v.get('status'))

Type guard

def streamable_ready(v):
    """True when the Streamable video has at least one ready file."""
    return isinstance(v, dict) and v.get('status') == 2 and bool(v.get('files'))

Try / catch

for _ in range(MAX_TRIES):
    try:
        info = ydl.extract_info(url, download=True)
        break
    except ExtractorError as e:
        if not (e.expected and 'currently unavailable' in str(e)):
            raise
        time.sleep(BACKOFF)
else:
    raise RuntimeError('streamable never became ready: %s' % url)

Prevention

When it happens

Trigger: Extracting a streamable.com video immediately after upload (status 0/1), or extracting one whose encode failed or was removed (status 3).

Common situations: Automated pipelines that download a video seconds after it is created on streamable.com; clips deleted by the uploader or by moderation; clips expired from free accounts (Streamable deletes old free uploads).

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/44d05f42959a8b4e. Report an issue: GitHub.