{"record":{"id":"5d82e7dd230cc45c","repo":"yt-dlp/yt-dlp","slug":"login-failed-invalid-username-password","errorCode":null,"errorMessage":"Login failed (invalid username/password)","messagePattern":"Login failed \\(invalid username/password\\)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/tubitv.py","lineNumber":97,"sourceCode":"    }]\n\n    # DRM formats are included only to raise appropriate error\n    _UNPLAYABLE_FORMATS = ('hlsv6_widevine', 'hlsv6_widevine_nonclearlead', 'hlsv6_playready_psshv0',\n                           'hlsv6_fairplay', 'dash_widevine', 'dash_widevine_nonclearlead')\n\n    def _perform_login(self, username, password):\n        self.report_login()\n        form_data = {\n            'username': username,\n            'password': password,\n        }\n        payload = urlencode_postdata(form_data)\n        request = Request(self._LOGIN_URL, payload)\n        request.headers['Content-Type'] = 'application/x-www-form-urlencoded'\n        login_page = self._download_webpage(\n            request, None, False, 'Wrong login info')\n        if not re.search(r'id=\"tubi-logout\"', login_page):\n            raise ExtractorError(\n                'Login failed (invalid username/password)', expected=True)\n\n    def _real_extract(self, url):\n        video_id, video_type = self._match_valid_url(url).group('id', 'type')\n        webpage = self._download_webpage(f'https://tubitv.com/{video_type}/{video_id}/', video_id)\n        video_data = self._search_json(\n            r'window\\.__data\\s*=', webpage, 'data', video_id,\n            transform_source=js_to_json)['video']['byId'][video_id]\n\n        formats = []\n        drm_formats = False\n\n        for resource in traverse_obj(video_data, ('video_resources', lambda _, v: url_or_none(v['manifest']['url']))):\n            resource_type = resource.get('type')\n            manifest_url = resource['manifest']['url']\n            if resource_type == 'dash':\n                formats.extend(self._extract_mpd_formats(manifest_url, video_id, mpd_id=resource_type, fatal=False))\n            elif resource_type in ('hlsv3', 'hlsv6'):","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/tubitv.py#L79-L115","documentation":"Error \"Login failed (invalid username/password)\" thrown in yt-dlp/yt-dlp.","triggerScenarios":"Thrown at yt_dlp/extractor/tubitv.py:97 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check username and password"],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}