perf(download.py): 优化代码逻辑

1. 更新英语翻译
2. 修复代码逻辑错误
3. 优化代码变量名
4. 优化代码格式
This commit is contained in:
JoeanAmier
2024-09-08 12:06:50 +08:00
parent 2359cf93a4
commit 5b85379d49
7 changed files with 40 additions and 45 deletions

Binary file not shown.

View File

@@ -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}"

View File

@@ -297,3 +297,6 @@ msgstr ""
msgid "作品下载记录开关" msgid "作品下载记录开关"
msgstr "" msgstr ""
msgid "文件 {0} 格式判断失败,错误信息:{1}"
msgstr ""

View File

@@ -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}")

View File

@@ -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,

View File

@@ -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)

View File

@@ -2,6 +2,8 @@
1. 优化文件后缀处理逻辑 1. 优化文件后缀处理逻辑
<p><strong>旧版本升级后首次运行请删除配置文件 <code>settings.json</code>,删除后重新运行程序会自动生成新的默认配置文件!</strong></p>
<hr> <hr>
**用户脚本更新内容:** **用户脚本更新内容:**