{"record":{"id":"5b17e3a33955b026","repo":"yt-dlp/yt-dlp","slug":"failed-to-get-m3u8-playlist","errorCode":null,"errorMessage":"Failed to get m3u8 playlist","messagePattern":"Failed to get m3u8 playlist","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/twitcasting.py","lineNumber":218,"sourceCode":"                    formats.append({\n                        'url': update_url_query(ws_url, password_params),\n                        'format_id': f'ws-{mode}',\n                        'ext': 'mp4',\n                        'quality': qq(mode),\n                        'source_preference': -10,\n                        # TwitCasting simply sends moof atom directly over WS\n                        'protocol': 'websocket_frag',\n                    })\n\n            if not formats:\n                self.raise_login_required()\n\n            infodict = {\n                'formats': formats,\n                '_format_sort_fields': ('source', ),\n            }\n        elif not m3u8_urls:\n            raise ExtractorError('Failed to get m3u8 playlist')\n        elif len(m3u8_urls) == 1:\n            formats = self._extract_m3u8_formats(\n                m3u8_urls[0], video_id, 'mp4', headers=self._M3U8_HEADERS)\n            infodict = {\n                # No problem here since there's only one manifest\n                'formats': formats,\n                'http_headers': self._M3U8_HEADERS,\n            }\n        else:\n            infodict = {\n                '_type': 'multi_video',\n                'entries': [{\n                    'id': f'{video_id}-{num}',\n                    'url': m3u8_url,\n                    'ext': 'mp4',\n                    # Requesting the manifests here will cause download to fail.\n                    # So use ffmpeg instead. See: https://github.com/yt-dlp/yt-dlp/issues/382\n                    'protocol': 'm3u8',","sourceCodeStart":200,"sourceCodeEnd":236,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/twitcasting.py#L200-L236","documentation":"Raised by TwitCastingIE when the movie playlist yields no m3u8 URLs and the websocket-fragment path produced no formats either (that path raises a login error first when empty). It means no playable HLS manifest could be located for the movie, typically because the stream data is not exposed anonymously. Raised without expected=True, so it is treated as an extraction failure.","triggerScenarios":"data-movie-playlist JSON contains no HLS bitrates (empty m3u8_urls) and the WebSocket pass yields nothing because the video is members-only or the playlist shape changed, falling into the 'elif not m3u8_urls' branch.","commonSituations":"Members-only (paid community) streams without login, deleted videos whose playlist is emptied, recordings still processing, or a TwitCasting markup change that hides the playlist attribute.","solutions":["If the stream is members-only, log in via --username/--password or --cookies and retry.","Confirm the movie page shows a playable recording in a browser.","Update yt-dlp; playlist parsing was adjusted several times after TwitCasting markup changes.","For recent recordings, retry once processing finishes."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"def is_login_or_no_formats(e: Exception) -> bool:\n    return isinstance(e, LoginRequired) or (isinstance(e, ExtractorError) and 'm3u8 playlist' in str(e))","tryCatchPattern":"from yt_dlp.utils import ExtractorError, LoginRequired\n\ntry:\n    info = ydl.extract_info(url, download=False)\nexcept LoginRequired:\n    ...  # websocket path found nothing; members-only content\nexcept ExtractorError as e:\n    if 'Failed to get m3u8 playlist' in str(e):\n        ...  # no anonymous HLS; retry with credentials or skip","preventionTips":["Use --cookies-from-browser for members-only TwitCasting recordings.","Retry recent recordings later; HLS appears once processing finishes.","Update yt-dlp after TwitCasting markup changes."],"tags":["yt-dlp","extractor","twitcasting","no-formats","m3u8"],"backgroundTag":"no-playable-formats","analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}