10
10
from ..utils .core import (
11
11
time_to_seconds ,
12
12
regex_search ,
13
- ensure_seconds
13
+ ensure_seconds ,
14
+ multi_get ,
14
15
)
15
16
from ..errors import (
16
17
SiteError ,
@@ -34,6 +35,7 @@ class ZoomChatDownloader(BaseChatDownloader):
34
35
35
36
_ZOOM_HOMEPAGE = 'https://zoom.us/'
36
37
_ZOOM_PATH_TEMPLATE = 'rec/play/{id}'
38
+ _ZOOM_API_TEMPLATE = 'nws/recording/1.0/play/info/{file_id}'
37
39
38
40
_INITIAL_INFO_REGEX = r'(?s)window\.__data__\s*=\s*({.+?});'
39
41
_CHAT_MESSAGES_REGEX = r'window\.__data__\.chatList\.push\((\{[\s\S]+?\})\)'
@@ -43,7 +45,7 @@ class ZoomChatDownloader(BaseChatDownloader):
43
45
}
44
46
45
47
_REMAPPING = {
46
- 'username ' : 'author_name' ,
48
+ 'userName ' : 'author_name' ,
47
49
'time' : 'time_text' ,
48
50
'content' : 'message' ,
49
51
}
@@ -116,16 +118,34 @@ def get_chat_by_video_id(self, video_id, params, base_url=_ZOOM_HOMEPAGE):
116
118
raise ParsingError ('Error parsing video' )
117
119
118
120
initial_info = self ._parse_js_dict (json_string )
119
-
120
121
video_type = 'video' if initial_info .get ('isVideo' ) else 'not_video'
121
122
122
- return Chat (
123
- self ._get_chat_messages (page_data , params ),
123
+ file_id = initial_info .get ('fileId' )
124
+ if not file_id :
125
+ raise ParsingError ('Error parsing video. Unable to find file ID.' )
126
+
127
+ api_url = base_url + self ._ZOOM_API_TEMPLATE .format (file_id = file_id )
128
+
129
+ api_data = self ._session_get_json (api_url )
124
130
125
- title = initial_info .get ('topic' ),
131
+ if api_data .get ('errorCode' ) != 0 :
132
+ raise ZoomError (
133
+ f'An error occured: { api_data .get ("errorMessage" )} ({ api_data .get ("errorCode" )} )' )
134
+
135
+ result = api_data .get ('result' )
136
+ if not result :
137
+ raise ZoomError (
138
+ f'Unable to find chat messages for video { video_id } ' )
139
+
140
+ chat_messages = result .get ('meetingChatList' ) or []
141
+ title = multi_get (result , 'meet' , 'topic' )
142
+ return Chat (
143
+ self ._get_chat_messages (chat_messages , params ),
144
+ title = title ,
126
145
video_type = video_type ,
127
- start_time = initial_info .get ('fileStartTime' ),
128
- id = initial_info .get ('recordingId' ),
146
+ start_time = result .get ('fileStartTime' ),
147
+ id = video_id ,
148
+ duration = result .get ('duration' ),
129
149
)
130
150
131
151
def _parse_js_dict (self , json_string ):
@@ -136,12 +156,11 @@ def _parse_js_dict(self, json_string):
136
156
result = re .sub (r":\s+'(.*)'" , ": \" \\ g<1>\" " , result , 0 , re .MULTILINE )
137
157
return json .loads (result )
138
158
139
- def _get_chat_messages (self , page_data , params ):
159
+ def _get_chat_messages (self , messages , params ):
140
160
start_time = ensure_seconds (params .get ('start_time' ), 0 )
141
161
end_time = ensure_seconds (params .get ('end_time' ), float ('inf' ))
142
162
143
- for item in re .findall (self ._CHAT_MESSAGES_REGEX , page_data ):
144
- data = self ._parse_js_dict (item )
163
+ for data in messages :
145
164
data = r .remap_dict (data , self ._REMAPPING )
146
165
147
166
# Process time inforamtion
0 commit comments