From 2bbfb9972c8f514740a5fcfdff38374d08e9c15c Mon Sep 17 00:00:00 2001 From: doe1080 <98906116+doe1080@users.noreply.github.com> Date: Thu, 20 Aug 2026 08:20:13 +0900 Subject: [PATCH] [ie/twitter:broadcast] Fix events handling (#17323) Authored by: doe1080 --- yt_dlp/extractor/twitter.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/twitter.py b/yt_dlp/extractor/twitter.py index 0002ef67a9..ebac006e5a 100644 --- a/yt_dlp/extractor/twitter.py +++ b/yt_dlp/extractor/twitter.py @@ -1529,6 +1529,13 @@ class TwitterBroadcastIE(TwitterBaseIE, PeriscopeBaseIE): 'uploader_url': 'https://twitter.com/DisneyPlusJP', 'view_count': int, }, + }, { + 'url': 'https://x.com/i/events/2018869372748472320', + 'info_dict': { + 'id': '2018869372748472320', + 'title': '#カワラボ4周年おめでとう 記念キャンペーン', + }, + 'playlist_count': 18, }] def _real_extract(self, url): @@ -1537,8 +1544,19 @@ class TwitterBroadcastIE(TwitterBaseIE, PeriscopeBaseIE): if broadcast_type == 'events': timeline = self._call_api( f'live_event/1/{display_id}/timeline.json', display_id) - broadcast_id = traverse_obj(timeline, ( - 'twitter_objects', 'broadcasts', ..., ('id', 'broadcast_id'), + twitter_objects = traverse_obj(timeline, ('twitter_objects', {dict})) + if tweet_ids := traverse_obj(twitter_objects, ( + 'tweets', ..., 'id_str', {str}, + )): + event_title = traverse_obj(twitter_objects, ( + 'live_events', display_id, 'title', {clean_html}, filter)) + + return self.playlist_result([self.url_result( + f'https://twitter.com/i/web/status/{tweet_id}', TwitterIE, + ) for tweet_id in tweet_ids], display_id, event_title) + + broadcast_id = traverse_obj(twitter_objects, ( + 'broadcasts', ..., ('id', 'broadcast_id'), {str}, any, {require('broadcast ID')})) else: broadcast_id = display_id