hs-m3u8 0.1.5__py3-none-any.whl → 0.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hs_m3u8/__init__.py
CHANGED
hs_m3u8/main.py
CHANGED
|
@@ -16,6 +16,7 @@ from zipfile import ZipFile
|
|
|
16
16
|
|
|
17
17
|
import m3u8
|
|
18
18
|
from hssp import Net
|
|
19
|
+
from hssp.models.net import RequestModel
|
|
19
20
|
from hssp.utils import crypto
|
|
20
21
|
from loguru import logger
|
|
21
22
|
|
|
@@ -80,6 +81,9 @@ class M3u8Downloader:
|
|
|
80
81
|
headers=None,
|
|
81
82
|
key: M3u8Key = None,
|
|
82
83
|
get_m3u8_func: Callable = None,
|
|
84
|
+
m3u8_request_before: Callable[[RequestModel], RequestModel] = None,
|
|
85
|
+
key_request_before: Callable[[RequestModel], RequestModel] = None,
|
|
86
|
+
ts_request_before: Callable[[RequestModel], RequestModel] = None,
|
|
83
87
|
):
|
|
84
88
|
"""
|
|
85
89
|
|
|
@@ -91,11 +95,29 @@ class M3u8Downloader:
|
|
|
91
95
|
headers: 情求头
|
|
92
96
|
get_m3u8_func: 处理m3u8情求的回调函数。适用于m3u8地址不是真正的地址,
|
|
93
97
|
而是包含m3u8内容的情求,会把m3u8_url的响应传递给get_m3u8_func,要求返回真正的m3u8内容
|
|
98
|
+
m3u8_request_before: m3u8请求前的回调函数
|
|
99
|
+
key_request_before: key请求前的回调函数
|
|
100
|
+
ts_request_before: ts 请求前的回调函数
|
|
94
101
|
"""
|
|
95
102
|
|
|
96
103
|
sem = asyncio.Semaphore(max_workers) if max_workers else None
|
|
97
104
|
self.headers = headers
|
|
98
|
-
|
|
105
|
+
|
|
106
|
+
# m3u8 内容的请求器
|
|
107
|
+
self.m3u8_net = Net(sem=sem)
|
|
108
|
+
if m3u8_request_before:
|
|
109
|
+
self.m3u8_net.request_before_signal.connect(m3u8_request_before)
|
|
110
|
+
|
|
111
|
+
# 加密key的请求器
|
|
112
|
+
self.key_net = Net()
|
|
113
|
+
if key_request_before:
|
|
114
|
+
self.key_net.request_before_signal.connect(key_request_before)
|
|
115
|
+
|
|
116
|
+
# ts内容的请求器
|
|
117
|
+
self.ts_net = Net()
|
|
118
|
+
if ts_request_before:
|
|
119
|
+
self.ts_net.request_before_signal.connect(ts_request_before)
|
|
120
|
+
|
|
99
121
|
self.decrypt = decrypt
|
|
100
122
|
self.m3u8_url = urlparse(m3u8_url)
|
|
101
123
|
self.get_m3u8_func = get_m3u8_func
|
|
@@ -112,7 +134,9 @@ class M3u8Downloader:
|
|
|
112
134
|
|
|
113
135
|
async def run(self, merge=True, del_hls=False):
|
|
114
136
|
await self.start(merge, del_hls)
|
|
115
|
-
await self.
|
|
137
|
+
await self.m3u8_net.close()
|
|
138
|
+
await self.key_net.close()
|
|
139
|
+
await self.ts_net.close()
|
|
116
140
|
|
|
117
141
|
async def start(self, merge=True, del_hls=False):
|
|
118
142
|
"""
|
|
@@ -182,7 +206,7 @@ class M3u8Downloader:
|
|
|
182
206
|
:param url:
|
|
183
207
|
:return:
|
|
184
208
|
"""
|
|
185
|
-
resp = await self.
|
|
209
|
+
resp = await self.m3u8_net.get(url.geturl(), headers=self.headers)
|
|
186
210
|
m3u8_text = self.get_m3u8_func(resp.text) if self.get_m3u8_func else resp.text
|
|
187
211
|
m3u8_obj = m3u8.loads(m3u8_text)
|
|
188
212
|
prefix = f"{url.scheme}://{url.netloc}"
|
|
@@ -220,7 +244,7 @@ class M3u8Downloader:
|
|
|
220
244
|
if len(m3u8_obj.keys) > 0 and m3u8_obj.keys[0]:
|
|
221
245
|
iv = m3u8_obj.keys[0].iv
|
|
222
246
|
if not self.custom_key:
|
|
223
|
-
resp = await self.
|
|
247
|
+
resp = await self.key_net.get(m3u8_obj.keys[0].absolute_uri, headers=self.headers)
|
|
224
248
|
key_data = resp.content
|
|
225
249
|
else:
|
|
226
250
|
key_data = self.custom_key.key
|
|
@@ -252,7 +276,7 @@ class M3u8Downloader:
|
|
|
252
276
|
if Path(ts_path).exists():
|
|
253
277
|
self.ts_path_list[index] = str(ts_path)
|
|
254
278
|
return
|
|
255
|
-
resp = await self.
|
|
279
|
+
resp = await self.ts_net.get(ts_item["uri"], self.headers)
|
|
256
280
|
ts_content = resp.content
|
|
257
281
|
if ts_content is None:
|
|
258
282
|
return
|
|
@@ -282,10 +306,10 @@ class M3u8Downloader:
|
|
|
282
306
|
# mp4路径
|
|
283
307
|
mp4_path = self.save_dir.parent / f"{self.save_name}.mp4"
|
|
284
308
|
|
|
285
|
-
#
|
|
309
|
+
# 如果有mp4的头,则把ts放到后面
|
|
286
310
|
mp4_head_data = b""
|
|
287
311
|
if self.mp4_head_hrl:
|
|
288
|
-
resp = await self.
|
|
312
|
+
resp = await self.ts_net.get(self.mp4_head_hrl)
|
|
289
313
|
mp4_head_data = resp.content
|
|
290
314
|
mp4_head_file = self.save_dir / "head.mp4"
|
|
291
315
|
mp4_head_file.write_bytes(mp4_head_data)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
hs_m3u8/__init__.py,sha256=_AhYioHAgwPXE10FXGZ3ZKj1urwFYR0L9xzBn8pQPJw,72
|
|
2
|
+
hs_m3u8/main.py,sha256=dickli-bmyAoNB7N3pmx2UU_VUDGSISU913BB-VwMbk,12620
|
|
3
|
+
hs_m3u8/res/ffmpeg_win.exe.zip,sha256=x_7Fa9N3hzN1d7Ph9ZwOiwpuRfLEVnhNL8tPjuZZMe0,60131319
|
|
4
|
+
hs_m3u8-0.1.6.dist-info/METADATA,sha256=ujcGSSJnM5o_uWCgXDnfmweC0t4iWwqqCaMNvticSzI,2204
|
|
5
|
+
hs_m3u8-0.1.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
6
|
+
hs_m3u8-0.1.6.dist-info/RECORD,,
|
hs_m3u8-0.1.5.dist-info/RECORD
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
hs_m3u8/__init__.py,sha256=HINaNDvyRMsgqg9VY_AsV9ierd8KhdtNyJRdQ8BcFg8,72
|
|
2
|
-
hs_m3u8/main.py,sha256=jZ0650qosfrhiS1r3-UGhjp8shx6TvcElXAEls7f3jQ,11609
|
|
3
|
-
hs_m3u8/res/ffmpeg_win.exe.zip,sha256=x_7Fa9N3hzN1d7Ph9ZwOiwpuRfLEVnhNL8tPjuZZMe0,60131319
|
|
4
|
-
hs_m3u8-0.1.5.dist-info/METADATA,sha256=3htPtN-CKSxXaS3o9oootUP4RMdS_tQSIyn4vBT0B4I,2204
|
|
5
|
-
hs_m3u8-0.1.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
6
|
-
hs_m3u8-0.1.5.dist-info/RECORD,,
|
|
File without changes
|