parsehub 2.0.9__tar.gz → 2.0.11__tar.gz
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.
- {parsehub-2.0.9/src/parsehub.egg-info → parsehub-2.0.11}/PKG-INFO +1 -1
- {parsehub-2.0.9 → parsehub-2.0.11}/pyproject.toml +1 -1
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/base/ytdlp.py +41 -14
- {parsehub-2.0.9 → parsehub-2.0.11/src/parsehub.egg-info}/PKG-INFO +1 -1
- {parsehub-2.0.9 → parsehub-2.0.11}/LICENSE +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/README.md +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/setup.cfg +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/config/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/config/config.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/errors.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/base/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/base/base.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/bilibili.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/coolapk.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/douyin.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/facebook.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/instagram.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/kuaishou.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/pipix.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/threads.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/tieba.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/twitter.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/weibo.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/weixin.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/xhs.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/xiaoheihe.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/youtube.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/parsers/parser/zuiyou.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/bilibili.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/coolapk.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/instagram.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/kuaishou.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/pipix.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/threads.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/tieba.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/twitter.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/weibo.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/weixin.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/xhs.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/xiaoheihe.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/provider_api/zuiyou.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/__init__.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/callback.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/media_file.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/media_ref.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/platform.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/post.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/types/result.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/utils/downloader.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/utils/media_info.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub/utils/utils.py +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub.egg-info/SOURCES.txt +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub.egg-info/dependency_links.txt +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub.egg-info/requires.txt +0 -0
- {parsehub-2.0.9 → parsehub-2.0.11}/src/parsehub.egg-info/top_level.txt +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from concurrent.futures import ProcessPoolExecutor
|
|
3
2
|
from dataclasses import dataclass
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import Union
|
|
@@ -17,8 +16,6 @@ from ...types import (
|
|
|
17
16
|
)
|
|
18
17
|
from .base import BaseParser
|
|
19
18
|
|
|
20
|
-
EXC = ProcessPoolExecutor()
|
|
21
|
-
|
|
22
19
|
|
|
23
20
|
def download_video(yto_params: dict, urls: list[str]) -> None:
|
|
24
21
|
"""在独立进程中下载视频"""
|
|
@@ -30,6 +27,15 @@ def download_video(yto_params: dict, urls: list[str]) -> None:
|
|
|
30
27
|
raise RuntimeError(error_msg) from None
|
|
31
28
|
|
|
32
29
|
|
|
30
|
+
def progress_hook(d: dict):
|
|
31
|
+
if d["status"] == "downloading":
|
|
32
|
+
downloaded = d.get("downloaded_bytes", 0)
|
|
33
|
+
total = d.get("total_bytes") or d.get("total_bytes_estimate") or 0
|
|
34
|
+
print(f"{downloaded}/{total}")
|
|
35
|
+
elif d["status"] == "finished":
|
|
36
|
+
print("下载完成,准备处理文件")
|
|
37
|
+
|
|
38
|
+
|
|
33
39
|
class YtParser(BaseParser, register=False):
|
|
34
40
|
"""yt-dlp解析器"""
|
|
35
41
|
|
|
@@ -103,6 +109,7 @@ class YtParser(BaseParser, register=False):
|
|
|
103
109
|
# }
|
|
104
110
|
# ],
|
|
105
111
|
"playlist_items": "1", # 分p列表默认解析第一个
|
|
112
|
+
# "progress_hooks": [progress_hook],
|
|
106
113
|
}
|
|
107
114
|
return params
|
|
108
115
|
|
|
@@ -143,9 +150,35 @@ class YtVideoParseResult(VideoParseResult):
|
|
|
143
150
|
# paramss["format"] = "worstvideo* + worstaudio / worst"
|
|
144
151
|
|
|
145
152
|
if callback:
|
|
153
|
+
# 已知问题: yt-dlp 返回的总进度不统一, 暂使用 count 进度
|
|
146
154
|
await callback(0, 1, "count", *callback_args, **callback_kwargs)
|
|
147
|
-
|
|
148
|
-
|
|
155
|
+
# loop = asyncio.get_running_loop()
|
|
156
|
+
# progress_mode = "bytes"
|
|
157
|
+
# def _progress_hook(d):
|
|
158
|
+
# nonlocal progress_mode
|
|
159
|
+
# if d["status"] == "downloading":
|
|
160
|
+
# downloaded = int(d.get("downloaded_bytes", 0))
|
|
161
|
+
# total = int(d.get("total_bytes") or d.get("total_bytes_estimate") or 0)
|
|
162
|
+
# if total and progress_mode == "bytes":
|
|
163
|
+
# asyncio.run_coroutine_threadsafe(
|
|
164
|
+
# callback(downloaded, total, "bytes", *callback_args, **callback_kwargs),
|
|
165
|
+
# loop,
|
|
166
|
+
# )
|
|
167
|
+
# else:
|
|
168
|
+
# progress_mode = "count"
|
|
169
|
+
# asyncio.run_coroutine_threadsafe(
|
|
170
|
+
# callback(0, 1, "count", *callback_args, **callback_kwargs),
|
|
171
|
+
# loop,
|
|
172
|
+
# )
|
|
173
|
+
# elif d["status"] == "finished" and progress_mode == "count":
|
|
174
|
+
# asyncio.run_coroutine_threadsafe(
|
|
175
|
+
# callback(1, 1, "count", *callback_args, **callback_kwargs),
|
|
176
|
+
# loop,
|
|
177
|
+
# )
|
|
178
|
+
#
|
|
179
|
+
# paramss["progress_hooks"] = [_progress_hook]
|
|
180
|
+
|
|
181
|
+
await self._run_download(paramss)
|
|
149
182
|
|
|
150
183
|
v = list(output_dir.glob("*.mp4")) or list(output_dir.glob("*.mkv")) or list(output_dir.glob("*.webm"))
|
|
151
184
|
if not v:
|
|
@@ -165,18 +198,12 @@ class YtVideoParseResult(VideoParseResult):
|
|
|
165
198
|
output_dir,
|
|
166
199
|
)
|
|
167
200
|
|
|
168
|
-
async def
|
|
201
|
+
async def _run_download(self, paramss: dict, count: int = 0) -> None:
|
|
169
202
|
if count > 2:
|
|
170
203
|
raise DownloadError("下载失败 -2")
|
|
171
204
|
|
|
172
|
-
loop = asyncio.get_running_loop()
|
|
173
205
|
try:
|
|
174
|
-
await asyncio.
|
|
175
|
-
loop.run_in_executor(EXC, download_video, paramss, [self.dl.url]),
|
|
176
|
-
timeout=300,
|
|
177
|
-
)
|
|
178
|
-
except TimeoutError as e:
|
|
179
|
-
raise DownloadError("下载超时") from e
|
|
206
|
+
await asyncio.to_thread(download_video, paramss, [self.dl.url])
|
|
180
207
|
except RuntimeError as e:
|
|
181
208
|
error = str(e)
|
|
182
209
|
if any(
|
|
@@ -187,7 +214,7 @@ class YtVideoParseResult(VideoParseResult):
|
|
|
187
214
|
)
|
|
188
215
|
):
|
|
189
216
|
paramss.pop("writeautomaticsub", None)
|
|
190
|
-
await self.
|
|
217
|
+
await self._run_download(paramss, count + 1)
|
|
191
218
|
|
|
192
219
|
except Exception as e:
|
|
193
220
|
raise DownloadError(f"下载失败: {str(e)}") from e
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|