{"record":{"id":"fa61ec64e51059b0","repo":"ytdl-org/youtube-dl","slug":"this-album-is-protected-by-a-password-use-the-v","errorCode":null,"errorMessage":"This album is protected by a password, use the --video-password option","messagePattern":"This album is protected by a password, use the --video-password option","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vimeo.py","lineNumber":997,"sourceCode":"    def _real_extract(self, url):\n        album_id = self._match_id(url)\n        viewer = self._download_json(\n            'https://vimeo.com/_rv/viewer', album_id, fatal=False)\n        if not viewer:\n            webpage = self._download_webpage(url, album_id)\n            viewer = self._parse_json(self._search_regex(\n                r'bootstrap_data\\s*=\\s*({.+?})</script>',\n                webpage, 'bootstrap data'), album_id)['viewer']\n        jwt = viewer['jwt']\n        album = self._download_json(\n            'https://api.vimeo.com/albums/' + album_id,\n            album_id, headers={'Authorization': 'jwt ' + jwt},\n            query={'fields': 'description,name,privacy'})\n        hashed_pass = None\n        if try_get(album, lambda x: x['privacy']['view']) == 'password':\n            password = self._downloader.params.get('videopassword')\n            if not password:\n                raise ExtractorError(\n                    'This album is protected by a password, use the --video-password option',\n                    expected=True)\n            self._set_vimeo_cookie('vuid', viewer['vuid'])\n            try:\n                hashed_pass = self._download_json(\n                    'https://vimeo.com/showcase/%s/auth' % album_id,\n                    album_id, 'Verifying the password', data=urlencode_postdata({\n                        'password': password,\n                        'token': viewer['xsrft'],\n                    }), headers={\n                        'X-Requested-With': 'XMLHttpRequest',\n                    })['hashed_pass']\n            except ExtractorError as e:\n                if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:\n                    raise ExtractorError('Wrong password', expected=True)\n                raise\n        entries = OnDemandPagedList(functools.partial(\n            self._fetch_page, album_id, jwt, hashed_pass), self._PAGE_SIZE)","sourceCodeStart":979,"sourceCodeEnd":1015,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vimeo.py#L979-L1015","documentation":"Thrown by VimeoAlbumIE when the target album's API metadata reports privacy.view == 'password' but no password was supplied. The extractor queries api.vimeo.com/albums/<id> with a JWT from the page's bootstrap_data and refuses to proceed without credentials. It is marked expected=True, so youtube-dl treats it as a user-facing extraction error, not a bug.","triggerScenarios":"Extracting any https://vimeo.com/album/<id> or /showcase/<id> URL whose album JSON has privacy.view == 'password' while the --video-password option (downloader param 'videopassword') is unset.","commonSituations":"Running youtube-dl/yt-dlp on a password-protected Vimeo showcase without passing credentials; scripts that enumerate album URLs where some are private; migrations where the password was previously cached.","solutions":["Pass the album password: youtube-dl --video-password <pass> <album_url>","If the password is correct but the error persists, verify the album is a showcase whose auth endpoint (vimeo.com/showcase/<id>/auth) still accepts it","Ensure you are not extracting the album through a wrapper tool that drops the videopassword parameter"],"exampleFix":"# before\nyoutube-dl https://vimeo.com/album/12345\n# after\nyoutube-dl --video-password SECRET https://vimeo.com/album/12345","handlingStrategy":"validation","validationCode":"import youtube_dl\n\nopts = {'videopassword': 'SECRET'}\nif not opts.get('videopassword'):\n    raise SystemExit('Password required for this album')\nydl = youtube_dl.YoutubeDL(opts)","typeGuard":null,"tryCatchPattern":"from youtube_dl.utils import ExtractorError\ntry:\n    ydl.extract_info('https://vimeo.com/album/12345')\nexcept ExtractorError as e:\n    if 'protected by a password' in str(e):\n        opts['videopassword'] = getpass('Vimeo password: ')\n        ydl.extract_info(url)  # retry once\n    else:\n        raise","preventionTips":["Prompt for --video-password whenever the target URL is a Vimeo album/showcase","Check album privacy via the API before batch jobs and skip password-protected entries","Cache verified passwords per album id to avoid repeated 401 rounds"],"tags":["vimeo","password","authentication","extractor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}