diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 4d193c74..f3309a23 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -3,7 +3,7 @@ import shutil from typing import Annotated, Any, List, Optional import aiofiles -from aiopath import AsyncPath +from anyio import Path as AsyncPath from fastapi import APIRouter, Depends, Header, HTTPException from fastapi.concurrency import run_in_threadpool from starlette import status diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 73962eea..5e75ab19 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -9,7 +9,7 @@ from typing import Optional, Union, Annotated import aiofiles import pillow_avif # noqa 用于自动注册AVIF支持 from PIL import Image -from aiopath import AsyncPath +from anyio import Path as AsyncPath from app.helper.sites import SitesHelper # noqa # noqa from fastapi import APIRouter, Body, Depends, HTTPException, Header, Request, Response from fastapi.responses import StreamingResponse @@ -84,7 +84,7 @@ async def fetch_image( # 目前暂不考虑磁盘缓存文件是否过期,后续通过缓存清理机制处理 if cache_path and await cache_path.exists(): try: - async with cache_path.open('rb') as f: + async with aiofiles.open(cache_path, 'rb') as f: content = await f.read() etag = HashUtils.md5(content) headers = RequestUtils.generate_cache_headers(etag, max_age=86400 * 7) @@ -381,7 +381,7 @@ async def get_logging(request: Request, length: Optional[int] = 50, logfile: Opt file_size = file_stat.st_size # 读取历史日志 - async with log_path.open(mode="r", encoding="utf-8", errors="ignore") as f: + async with aiofiles.open(log_path, mode="r", encoding="utf-8", errors="ignore") as f: # 优化大文件读取策略 if file_size > 100 * 1024: # 只读取最后100KB的内容 @@ -408,7 +408,7 @@ async def get_logging(request: Request, length: Optional[int] = 50, logfile: Opt yield f"data: {line}\n\n" # 实时监听新日志 - async with log_path.open(mode="r", encoding="utf-8", errors="ignore") as f: + async with aiofiles.open(log_path, mode="r", encoding="utf-8", errors="ignore") as f: # 移动文件指针到文件末尾,继续监听新增内容 await f.seek(0, 2) # 记录初始文件大小 @@ -445,7 +445,7 @@ async def get_logging(request: Request, length: Optional[int] = 50, logfile: Opt return Response(content="日志文件不存在!", media_type="text/plain") try: # 使用 aiofiles 异步读取文件 - async with log_path.open(mode="r", encoding="utf-8", errors="ignore") as file: + async with aiofiles.open(log_path, mode="r", encoding="utf-8", errors="ignore") as file: text = await file.read() # 倒序输出 text = "\n".join(text.split("\n")[::-1]) diff --git a/app/api/servcookie.py b/app/api/servcookie.py index cbd394a8..fbd6535b 100644 --- a/app/api/servcookie.py +++ b/app/api/servcookie.py @@ -2,7 +2,8 @@ import gzip import json from typing import Annotated, Callable, Any, Dict, Optional -from aiopath import AsyncPath +import aiofiles +from anyio import Path as AsyncPath from fastapi import APIRouter, Depends, HTTPException, Path, Request, Response from fastapi.responses import PlainTextResponse from fastapi.routing import APIRoute @@ -67,9 +68,9 @@ async def update_cookie(req: schemas.CookieData): """ file_path = AsyncPath(settings.COOKIE_PATH) / f"{req.uuid}.json" content = json.dumps({"encrypted": req.encrypted}) - async with file_path.open(encoding="utf-8", mode="w") as file: + async with aiofiles.open(file_path, encoding="utf-8", mode="w") as file: await file.write(content) - async with file_path.open(encoding="utf-8", mode="r") as file: + async with aiofiles.open(file_path, encoding="utf-8", mode="r") as file: read_content = await file.read() if read_content == content: return {"action": "done"} @@ -88,7 +89,7 @@ async def load_encrypt_data(uuid: str) -> Dict[str, Any]: raise HTTPException(status_code=404, detail="Item not found") # 读取文件 - async with file_path.open(encoding="utf-8", mode="r") as file: + async with aiofiles.open(file_path, encoding="utf-8", mode="r") as file: read_content = await file.read() data = json.loads(read_content.encode("utf-8")) return data diff --git a/app/chain/__init__.py b/app/chain/__init__.py index d508b498..0d88437c 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -10,7 +10,7 @@ from typing import Optional, Any, Tuple, List, Set, Union, Dict from fastapi.concurrency import run_in_threadpool import aiofiles -from aiopath import AsyncPath +from anyio import Path as AsyncPath from qbittorrentapi import TorrentFilesList from transmission_rpc import File diff --git a/app/chain/recommend.py b/app/chain/recommend.py index cf6514c5..6646b935 100644 --- a/app/chain/recommend.py +++ b/app/chain/recommend.py @@ -5,7 +5,7 @@ from typing import List, Optional import aiofiles import pillow_avif # noqa 用于自动注册AVIF支持 from PIL import Image -from aiopath import AsyncPath +from anyio import Path as AsyncPath from app.chain import ChainBase from app.chain.bangumi import BangumiChain diff --git a/app/helper/plugin.py b/app/helper/plugin.py index 06f86a47..6f9455f1 100644 --- a/app/helper/plugin.py +++ b/app/helper/plugin.py @@ -12,7 +12,7 @@ import io import aiofiles import aioshutil import httpx -from aiopath import AsyncPath +from anyio import Path as AsyncPath from packaging.specifiers import SpecifierSet, InvalidSpecifier from packaging.version import Version, InvalidVersion from pkg_resources import Requirement, working_set diff --git a/app/utils/security.py b/app/utils/security.py index 93e8f640..025fc5f3 100644 --- a/app/utils/security.py +++ b/app/utils/security.py @@ -3,7 +3,7 @@ from pathlib import Path from typing import List, Optional, Set, Union from urllib.parse import quote, urlparse -from aiopath import AsyncPath +from anyio import Path as AsyncPath from app.log import logger diff --git a/requirements.in b/requirements.in index 1864fe14..c9a5db0d 100644 --- a/requirements.in +++ b/requirements.in @@ -62,7 +62,7 @@ Pinyin2Hanzi~=0.1.1 pywebpush~=2.0.3 python-cookietools==0.0.4 aiofiles~=24.1.0 -aiopath~=0.7.7 +aiopathlib~=0.6.0 asynctempfile~=0.5.0 aiosqlite~=0.21.0 jieba~=0.42.1