ytdl-org/youtube-dl · error · ExtractorError

This video is private.

Error message

This video is private.

What it means

Raised by TriluliluExtractor when the media JSON's 'errors' map contains a truthy 'friends' key — Trilulilu's marker that the media is visible only to the uploader's friends. Expected=True, so it is a definitive access error.

Source

Thrown at youtube_dl/extractor/trilulilu.py:55

            'description': 'pop music',
            'uploader_id': 'VEVOmixt',
            'upload_date': '20151204',
            'uploader': 'VEVOmixt',
            'timestamp': 1449187937,
            'view_count': int,
            'like_count': int,
            'comment_count': int,
        },
    }]

    def _real_extract(self, url):
        display_id = self._match_id(url)
        media_info = self._download_json('http://m.trilulilu.ro/%s?format=json' % display_id, display_id)

        age_limit = 0
        errors = media_info.get('errors', {})
        if errors.get('friends'):
            raise ExtractorError('This video is private.', expected=True)
        elif errors.get('geoblock'):
            raise ExtractorError('This video is not available in your country.', expected=True)
        elif errors.get('xxx_unlogged'):
            age_limit = 18

        media_class = media_info.get('class')
        if media_class not in ('video', 'audio'):
            raise ExtractorError('not a video or an audio')

        user = media_info.get('user', {})

        thumbnail = media_info.get('cover_url')
        if thumbnail:
            thumbnail.format(width='1600', height='1200')

        # TODO: get correct ext for audio files
        stream_type = media_info.get('stream_type')
        formats = [{

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Open the URL in an incognito browser to confirm it is friends-only
  2. If you own the media, change visibility to public
  3. Log in and pass cookies if the extractor supports it — otherwise the content is inaccessible to tools
  4. For archival lists, mark trilulilu URLs as likely dead/restricted and skip
Defensive patterns

Strategy: try-catch

Validate before calling

import json, urllib.request
info = json.load(urllib.request.urlopen('http://m.trilulilu.ro/%s?format=json' % display_id))
if info.get('errors', {}).get('friends'):
    skip(display_id)  # friends-only; extractor will refuse

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if e.expected and 'private' in str(e):
        skip(url)

Prevention

When it happens

Trigger: Extracting a trilulilu.ro URL for a friends-only upload; m.trilulilu.ro/<id>?format=json returns errors.friends and no stream data.

Common situations: Old Romanian media links where the uploader later restricted visibility; anonymous access attempted where only friend accounts may view. Note trilulilu.ro has been largely defunct, so many URLs now fail regardless.

Related errors


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