mirror of
https://github.com/JoeanAmier/XHS-Downloader.git
synced 2025-12-25 20:36:47 +08:00
217 lines
5.4 KiB
Python
217 lines
5.4 KiB
Python
from pathlib import Path
|
|
from typing import TYPE_CHECKING
|
|
|
|
from ..translation import _
|
|
from .static import ERROR
|
|
from .tools import logging
|
|
|
|
if TYPE_CHECKING:
|
|
from manager import Manager
|
|
from recorder import MapRecorder
|
|
|
|
|
|
__all__ = ["Mapping"]
|
|
|
|
|
|
class Mapping:
|
|
def __init__(
|
|
self,
|
|
manager: "Manager",
|
|
mapping: "MapRecorder",
|
|
):
|
|
self.root = manager.folder
|
|
self.folder_mode = manager.folder_mode
|
|
self.database = mapping
|
|
self.switch = manager.author_archive
|
|
self.print = manager.print
|
|
|
|
async def update_cache(
|
|
self,
|
|
id_: str,
|
|
alias: str,
|
|
):
|
|
if not self.switch:
|
|
return
|
|
if (a := await self.has_mapping(id_)) and a != alias:
|
|
self.__check_file(
|
|
id_,
|
|
alias,
|
|
a,
|
|
)
|
|
await self.database.add(id_, alias)
|
|
|
|
async def has_mapping(self, id_: str) -> str:
|
|
return d[0] if (d := await self.database.select(id_)) else ""
|
|
|
|
def __check_file(
|
|
self,
|
|
id_: str,
|
|
alias: str,
|
|
old_alias: str,
|
|
):
|
|
if not (old_folder := self.root.joinpath(f"{id_}_{old_alias}")).is_dir():
|
|
logging(
|
|
self.print,
|
|
_("{old_folder} 文件夹不存在,跳过处理").format(
|
|
old_folder=old_folder.name
|
|
),
|
|
)
|
|
return
|
|
self.__rename_folder(
|
|
old_folder,
|
|
id_,
|
|
alias,
|
|
)
|
|
self.__scan_file(
|
|
id_,
|
|
alias,
|
|
old_alias,
|
|
)
|
|
|
|
def __rename_folder(
|
|
self,
|
|
old_folder: Path,
|
|
id_: str,
|
|
alias: str,
|
|
):
|
|
new_folder = self.root.joinpath(f"{id_}_{alias}")
|
|
self.__rename(
|
|
old_folder,
|
|
new_folder,
|
|
_("文件夹"),
|
|
)
|
|
logging(
|
|
self.print,
|
|
_("文件夹 {old_folder} 已重命名为 {new_folder}").format(
|
|
old_folder=old_folder.name, new_folder=new_folder.name
|
|
),
|
|
)
|
|
|
|
def __rename_works_folder(
|
|
self,
|
|
old_: Path,
|
|
alias: str,
|
|
old_alias: str,
|
|
) -> Path:
|
|
if old_alias in old_.name:
|
|
new_ = old_.parent / old_.name.replace(old_alias, alias, 1)
|
|
self.__rename(
|
|
old_,
|
|
new_,
|
|
_("文件夹"),
|
|
)
|
|
logging(
|
|
self.print,
|
|
_("文件夹 {old_} 重命名为 {new_}").format(
|
|
old_=old_.name, new_=new_.name
|
|
),
|
|
)
|
|
return new_
|
|
return old_
|
|
|
|
def __scan_file(
|
|
self,
|
|
id_: str,
|
|
alias: str,
|
|
old_alias: str,
|
|
):
|
|
root = self.root.joinpath(f"{id_}_{alias}")
|
|
item_list = root.iterdir()
|
|
if self.folder_mode:
|
|
for f in item_list:
|
|
if f.is_dir():
|
|
f = self.__rename_works_folder(
|
|
f,
|
|
alias,
|
|
old_alias,
|
|
)
|
|
files = f.iterdir()
|
|
self.__batch_rename(
|
|
f,
|
|
files,
|
|
alias,
|
|
old_alias,
|
|
)
|
|
else:
|
|
self.__batch_rename(
|
|
root,
|
|
item_list,
|
|
alias,
|
|
old_alias,
|
|
)
|
|
|
|
def __batch_rename(
|
|
self,
|
|
root: Path,
|
|
files,
|
|
alias: str,
|
|
old_alias: str,
|
|
):
|
|
for old_file in files:
|
|
if old_alias not in old_file.name:
|
|
break
|
|
self.__rename_file(
|
|
root,
|
|
old_file,
|
|
alias,
|
|
old_alias,
|
|
)
|
|
|
|
def __rename_file(
|
|
self,
|
|
root: Path,
|
|
old_file: Path,
|
|
alias: str,
|
|
old_alias: str,
|
|
):
|
|
new_file = root.joinpath(old_file.name.replace(old_alias, alias, 1))
|
|
self.__rename(
|
|
old_file,
|
|
new_file,
|
|
_("文件"),
|
|
)
|
|
logging(
|
|
self.print,
|
|
_("文件 {old_file} 重命名为 {new_file}").format(
|
|
old_file=old_file.name, new_file=new_file.name
|
|
),
|
|
)
|
|
return True
|
|
|
|
def __rename(
|
|
self,
|
|
old_: Path,
|
|
new_: Path,
|
|
type_=_("文件"),
|
|
) -> bool:
|
|
try:
|
|
old_.rename(new_)
|
|
return True
|
|
except PermissionError as e:
|
|
logging(
|
|
self.print,
|
|
_("{type} {old}被占用,重命名失败: {error}").format(
|
|
type=type_, old=old_.name, error=e
|
|
),
|
|
ERROR,
|
|
)
|
|
return False
|
|
except FileExistsError as e:
|
|
logging(
|
|
self.print,
|
|
_("{type} {new}名称重复,重命名失败: {error}").format(
|
|
type=type_, new=new_.name, error=e
|
|
),
|
|
ERROR,
|
|
)
|
|
return False
|
|
except OSError as e:
|
|
logging(
|
|
self.print,
|
|
_("处理{type} {old}时发生预期之外的错误: {error}").format(
|
|
type=type_, old=old_.name, error=e
|
|
),
|
|
ERROR,
|
|
)
|
|
return True
|