mirror of
https://github.com/JoeanAmier/XHS-Downloader.git
synced 2026-03-22 06:57:16 +08:00
perf(download.py): 优化代码逻辑
1. 更新英语翻译 2. 修复代码逻辑错误 3. 优化代码变量名 4. 优化代码格式
This commit is contained in:
Binary file not shown.
@@ -297,3 +297,6 @@ msgstr "Browser name or serial number input error!"
|
|||||||
|
|
||||||
msgid "作品下载记录开关"
|
msgid "作品下载记录开关"
|
||||||
msgstr "Works download record switch"
|
msgstr "Works download record switch"
|
||||||
|
|
||||||
|
msgid "文件 {0} 格式判断失败,错误信息:{1}"
|
||||||
|
msgstr "Format recognition failed for file {0}, error message: {1}"
|
||||||
|
|||||||
@@ -297,3 +297,6 @@ msgstr ""
|
|||||||
|
|
||||||
msgid "作品下载记录开关"
|
msgid "作品下载记录开关"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "文件 {0} 格式判断失败,错误信息:{1}"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from asyncio import Semaphore
|
from asyncio import Semaphore
|
||||||
from asyncio import gather
|
from asyncio import gather
|
||||||
from os import path
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
@@ -8,12 +7,15 @@ from aiofiles import open
|
|||||||
from httpx import HTTPError
|
from httpx import HTTPError
|
||||||
|
|
||||||
from source.module import ERROR
|
from source.module import ERROR
|
||||||
|
from source.module import (
|
||||||
|
FILE_SIGNATURES_LENGTH,
|
||||||
|
FILE_SIGNATURES,
|
||||||
|
)
|
||||||
# from source.module import WARNING
|
# from source.module import WARNING
|
||||||
from source.module import Manager
|
from source.module import Manager
|
||||||
from source.module import logging
|
from source.module import logging
|
||||||
from source.module import retry as re_download
|
from source.module import retry as re_download
|
||||||
from source.module import sleep_time
|
from source.module import sleep_time
|
||||||
from source.module.static import FILE_HEADER_MAX_LENGTH, MAGIC_DICT
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from httpx import AsyncClient
|
from httpx import AsyncClient
|
||||||
@@ -179,7 +181,13 @@ class Download:
|
|||||||
async for chunk in response.aiter_bytes(self.chunk):
|
async for chunk in response.aiter_bytes(self.chunk):
|
||||||
await f.write(chunk)
|
await f.write(chunk)
|
||||||
# self.__update_progress(bar, len(chunk))
|
# self.__update_progress(bar, len(chunk))
|
||||||
real = await self.__fix_suffix(temp, path, name, suffix, log)
|
real = await self.__suffix_with_file(
|
||||||
|
temp,
|
||||||
|
path,
|
||||||
|
name,
|
||||||
|
suffix,
|
||||||
|
log,
|
||||||
|
)
|
||||||
self.manager.move(temp, real)
|
self.manager.move(temp, real)
|
||||||
# self.__create_progress(bar, None)
|
# self.__create_progress(bar, None)
|
||||||
logging(log, self.message("文件 {0} 下载成功").format(real.name))
|
logging(log, self.message("文件 {0} 下载成功").format(real.name))
|
||||||
@@ -245,25 +253,24 @@ class Download:
|
|||||||
headers["Range"] = f"bytes={(p := self.__get_resume_byte_position(file))}-"
|
headers["Range"] = f"bytes={(p := self.__get_resume_byte_position(file))}-"
|
||||||
return p
|
return p
|
||||||
|
|
||||||
@staticmethod
|
async def __suffix_with_file(
|
||||||
async def __fix_suffix(
|
self,
|
||||||
temp: Path,
|
temp: Path,
|
||||||
path: Path,
|
path: Path,
|
||||||
name: str,
|
name: str,
|
||||||
suffix: str,
|
default_suffix: str,
|
||||||
log
|
log,
|
||||||
) -> Path:
|
) -> Path:
|
||||||
try:
|
try:
|
||||||
async with open(temp, "rb") as f:
|
async with open(temp, "rb") as f:
|
||||||
file_start = await f.read(FILE_HEADER_MAX_LENGTH)
|
file_start = await f.read(FILE_SIGNATURES_LENGTH)
|
||||||
for offset, magic, suffix in MAGIC_DICT:
|
for offset, signature, suffix in FILE_SIGNATURES:
|
||||||
if file_start[offset:offset + len(magic)] == magic:
|
if file_start[offset:offset + len(signature)] == signature:
|
||||||
return path.joinpath(f"{name}.{suffix}")
|
return path.joinpath(f"{name}.{suffix}")
|
||||||
return path.joinpath(f"{name}.{suffix}")
|
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
logging(
|
logging(
|
||||||
log,
|
log,
|
||||||
f"文件 {temp.name} 后缀修复失败,错误信息: {repr(error)}",
|
self.message("文件 {0} 格式判断失败,错误信息:{1}").format(temp.name, repr(error)),
|
||||||
ERROR,
|
ERROR,
|
||||||
)
|
)
|
||||||
return path.joinpath(f"{name}.{suffix}")
|
return path.joinpath(f"{name}.{default_suffix}")
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ from .static import (
|
|||||||
USERAGENT,
|
USERAGENT,
|
||||||
SEC_CH_UA,
|
SEC_CH_UA,
|
||||||
SEC_CH_UA_PLATFORM,
|
SEC_CH_UA_PLATFORM,
|
||||||
|
FILE_SIGNATURES,
|
||||||
|
FILE_SIGNATURES_LENGTH,
|
||||||
)
|
)
|
||||||
from .tools import (
|
from .tools import (
|
||||||
retry,
|
retry,
|
||||||
|
|||||||
@@ -1,31 +1,8 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"VERSION_MAJOR",
|
|
||||||
"VERSION_MINOR",
|
|
||||||
"VERSION_BETA",
|
|
||||||
"ROOT",
|
|
||||||
"REPOSITORY",
|
|
||||||
"LICENCE",
|
|
||||||
"RELEASES",
|
|
||||||
"MASTER",
|
|
||||||
"PROMPT",
|
|
||||||
"GENERAL",
|
|
||||||
"PROGRESS",
|
|
||||||
"ERROR",
|
|
||||||
"WARNING",
|
|
||||||
"INFO",
|
|
||||||
"USERSCRIPT",
|
|
||||||
"HEADERS",
|
|
||||||
"PROJECT",
|
|
||||||
"USERAGENT",
|
|
||||||
"SEC_CH_UA",
|
|
||||||
"SEC_CH_UA_PLATFORM",
|
|
||||||
]
|
|
||||||
|
|
||||||
VERSION_MAJOR = 2
|
VERSION_MAJOR = 2
|
||||||
VERSION_MINOR = 2
|
VERSION_MINOR = 3
|
||||||
VERSION_BETA = False
|
VERSION_BETA = True
|
||||||
ROOT = Path(__file__).resolve().parent.parent.parent
|
ROOT = Path(__file__).resolve().parent.parent.parent
|
||||||
PROJECT = f"XHS-Downloader V{VERSION_MAJOR}.{
|
PROJECT = f"XHS-Downloader V{VERSION_MAJOR}.{
|
||||||
VERSION_MINOR}{" Beta" if VERSION_BETA else ""}"
|
VERSION_MINOR}{" Beta" if VERSION_BETA else ""}"
|
||||||
@@ -67,13 +44,14 @@ ERROR = "b bright_red"
|
|||||||
WARNING = "b bright_yellow"
|
WARNING = "b bright_yellow"
|
||||||
INFO = "b bright_green"
|
INFO = "b bright_green"
|
||||||
|
|
||||||
MAGIC_DICT = {
|
FILE_SIGNATURES: tuple[tuple[int, bytes, str,], ...] = (
|
||||||
# 分别为偏移量(字节)、魔数、后缀名
|
# 分别为偏移量(字节)、十六进制签名、后缀
|
||||||
# 参考:https://en.wikipedia.org/wiki/List_of_file_signatures
|
# 参考:https://en.wikipedia.org/wiki/List_of_file_signatures
|
||||||
|
# 参考:https://www.garykessler.net/library/file_sigs.html
|
||||||
(0, b"\xFF\xD8\xFF", "jpg"),
|
(0, b"\xFF\xD8\xFF", "jpg"),
|
||||||
(0, b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", "png"),
|
(0, b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", "png"),
|
||||||
(0, b"\x00\x00\x00", "avif"),
|
(0, b"\x00\x00\x00", "avif"),
|
||||||
(4, b"\x66\x74\x79\x70\x68\x65\x69\x63", "heic"),
|
(4, b"\x66\x74\x79\x70\x68\x65\x69\x63", "heic"),
|
||||||
(8, b"\x57\x45\x42\x50", "webp"),
|
(8, b"\x57\x45\x42\x50", "webp"),
|
||||||
}
|
)
|
||||||
FILE_HEADER_MAX_LENGTH = max(offset + len(magic) for offset, magic, _ in MAGIC_DICT)
|
FILE_SIGNATURES_LENGTH = max(offset + len(signature) for offset, signature, _ in FILE_SIGNATURES)
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
1. 优化文件后缀处理逻辑
|
1. 优化文件后缀处理逻辑
|
||||||
|
|
||||||
|
<p><strong>旧版本升级后首次运行请删除配置文件 <code>settings.json</code>,删除后重新运行程序会自动生成新的默认配置文件!</strong></p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
**用户脚本更新内容:**
|
**用户脚本更新内容:**
|
||||||
|
|||||||
Reference in New Issue
Block a user