]>
jfr.im git - yt-dlp.git/blob - youtube_dlc/downloader/youtube_live_chat.py
1 from __future__
import division
, unicode_literals
6 from .fragment
import FragmentFD
9 class YoutubeLiveChatReplayFD(FragmentFD
):
10 """ Downloads YouTube live chat replays fragment by fragment """
12 FD_NAME
= 'youtube_live_chat_replay'
14 def real_download(self
, filename
, info_dict
):
15 video_id
= info_dict
['video_id']
16 self
.to_screen('[%s] Downloading live chat' % self
.FD_NAME
)
18 test
= self
.params
.get('test', False)
27 headers
= info_dict
.get('http_headers', {})
28 return self
._download
_fragment
(ctx
, url
, info_dict
, headers
)
30 def parse_yt_initial_data(data
):
31 window_patt
= b
'window\\["ytInitialData"\\]\\s*=\\s*(.*?)(?<=});'
32 var_patt
= b
'var\\s+ytInitialData\\s*=\\s*(.*?)(?<=});'
33 for patt
in window_patt
, var_patt
:
35 raw_json
= re
.search(patt
, data
).group(1)
36 return json
.loads(raw_json
)
37 except AttributeError:
40 self
._prepare
_and
_start
_frag
_download
(ctx
)
42 success
, raw_fragment
= dl_fragment(
43 'https://www.youtube.com/watch?v={}'.format(video_id
))
46 data
= parse_yt_initial_data(raw_fragment
)
47 continuation_id
= data
['contents']['twoColumnWatchNextResults']['conversationBar']['liveChatRenderer']['continuations'][0]['reloadContinuationData']['continuation']
48 # no data yet but required to call _append_fragment
49 self
._append
_fragment
(ctx
, b
'')
53 while continuation_id
is not None:
56 url
= 'https://www.youtube.com/live_chat_replay?continuation={}'.format(continuation_id
)
57 success
, raw_fragment
= dl_fragment(url
)
60 data
= parse_yt_initial_data(raw_fragment
)
62 url
= ('https://www.youtube.com/live_chat_replay/get_live_chat_replay'
63 + '?continuation={}'.format(continuation_id
)
64 + '&playerOffsetMs={}'.format(offset
- 5000)
67 success
, raw_fragment
= dl_fragment(url
)
70 data
= json
.loads(raw_fragment
)['response']
73 continuation_id
= None
75 live_chat_continuation
= data
['continuationContents']['liveChatContinuation']
77 processed_fragment
= bytearray()
78 if 'actions' in live_chat_continuation
:
79 for action
in live_chat_continuation
['actions']:
80 if 'replayChatItemAction' in action
:
81 replay_chat_item_action
= action
['replayChatItemAction']
82 offset
= int(replay_chat_item_action
['videoOffsetTimeMsec'])
83 processed_fragment
.extend(
84 json
.dumps(action
, ensure_ascii
=False).encode('utf-8') + b
'\n')
85 continuation_id
= live_chat_continuation
['continuations'][0]['liveChatReplayContinuationData']['continuation']
87 self
._append
_fragment
(ctx
, processed_fragment
)
89 if test
or offset
is None:
92 self
._finish
_frag
_download
(ctx
)