{"record":{"id":"5709aae8f0974e8c","repo":"ytdl-org/youtube-dl","slug":"this-video-is-private-5709aa","errorCode":null,"errorMessage":"This video is private.","messagePattern":"This video is private\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/trilulilu.py","lineNumber":55,"sourceCode":"            'description': 'pop music',\n            'uploader_id': 'VEVOmixt',\n            'upload_date': '20151204',\n            'uploader': 'VEVOmixt',\n            'timestamp': 1449187937,\n            'view_count': int,\n            'like_count': int,\n            'comment_count': int,\n        },\n    }]\n\n    def _real_extract(self, url):\n        display_id = self._match_id(url)\n        media_info = self._download_json('http://m.trilulilu.ro/%s?format=json' % display_id, display_id)\n\n        age_limit = 0\n        errors = media_info.get('errors', {})\n        if errors.get('friends'):\n            raise ExtractorError('This video is private.', expected=True)\n        elif errors.get('geoblock'):\n            raise ExtractorError('This video is not available in your country.', expected=True)\n        elif errors.get('xxx_unlogged'):\n            age_limit = 18\n\n        media_class = media_info.get('class')\n        if media_class not in ('video', 'audio'):\n            raise ExtractorError('not a video or an audio')\n\n        user = media_info.get('user', {})\n\n        thumbnail = media_info.get('cover_url')\n        if thumbnail:\n            thumbnail.format(width='1600', height='1200')\n\n        # TODO: get correct ext for audio files\n        stream_type = media_info.get('stream_type')\n        formats = [{","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/trilulilu.py#L37-L73","documentation":"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.","triggerScenarios":"Extracting a trilulilu.ro URL for a friends-only upload; m.trilulilu.ro/<id>?format=json returns errors.friends and no stream data.","commonSituations":"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.","solutions":["Open the URL in an incognito browser to confirm it is friends-only","If you own the media, change visibility to public","Log in and pass cookies if the extractor supports it — otherwise the content is inaccessible to tools","For archival lists, mark trilulilu URLs as likely dead/restricted and skip"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import json, urllib.request\ninfo = json.load(urllib.request.urlopen('http://m.trilulilu.ro/%s?format=json' % display_id))\nif info.get('errors', {}).get('friends'):\n    skip(display_id)  # friends-only; extractor will refuse","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'private' in str(e):\n        skip(url)","preventionTips":["Check media visibility anonymously in a browser before queueing","Trilulilu is largely defunct — pre-check the domain before bulk runs"],"tags":["extractor","private-video","expected","access-restricted"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}