添加用于实用方法的实用类,包括文件大小格式化和缓存机制。更新主函数以利用新功能,并打印带有执行时间的文件列表。

This commit is contained in:
2025-07-14 12:14:44 +08:00
parent ca7a642c4f
commit dc5e8b4bfc
2 changed files with 221 additions and 12 deletions

View File

@@ -1,13 +1,15 @@
import re
from typing import Dict, List, Optional, Any
from _api import API
from _logger import logger
from _utils import async_to_sync
from _utils import async_to_sync, Utils
class Driver:
def __init__(self, client_id: str, client_secret: str, base_url: str = "https://open-api.123pan.com"):
self.utils = Utils()
self.api = API(client_id=client_id, client_secret=client_secret, base_url=base_url)
self.api.check_access_token()
logger.info("Driver initialized.")
@@ -33,16 +35,40 @@ class Driver:
logger.info(f"Calling list_dir(dir={dir}, page={page}, limit={limit})")
parentFileId = 0
dir_list = dir.split('/')
files = await self.api.list_files_v2(parentFileId=parentFileId, limit=limit)
files = await self._list_dir_fetch_or_cache(parentFileId=parentFileId, page=page, limit=limit)
for i in dir_list:
logger.debug(f"Processing dir segment: '{i}' with parentFileId={parentFileId}")
if i:
parentFileId = await self._list_dir_fetch_parentFileId(parentFileId, files, i, limit)
logger.debug(f"Updated parentFileId: {parentFileId}")
files = await self.api.list_files_v2(parentFileId=parentFileId, limit=limit)
files = await self._list_dir_fetch_or_cache(parentFileId=parentFileId, page=page, limit=limit)
logger.info(f"Returning file list for dir={dir}")
return files['data']['fileList']
async def _list_dir_fetch_or_cache(
self,
parentFileId: int,
page: int = 1,
limit: int = 100,
lastFileId: Optional[int] = None,
) -> Dict[str, Any]:
"""从缓存中获取目录下的文件列表如果缓存中没有则从API获取"""
files_list = []
pages = self.utils.computing_page(page=page, limit=limit)
for p in pages:
logger.debug(f"_list_dir_fetch_or_cache(parentFileId={parentFileId}, page={p}.")
files = self.utils.get_cached_files(parentFileId=parentFileId, page=p)
if not files:
logger.debug(f"No cached files found for parentFileId={parentFileId}, fetching from API.")
files = await self.api.list_files_v2(parentFileId=parentFileId, limit=limit, lastFileId=lastFileId)
self.utils.cache_files(files=files, parentFileId=parentFileId, page=p)
return files
else:
logger.debug(f"Cached files found for parentFileId={parentFileId}, returning from cache.")
files = self.utils.get_cached_files(parentFileId=parentFileId, page=p)
files_list.append(files)
return self.utils.merge_files(files_list)
async def _list_dir_fetch_parentFileId(
self,
parentFileId: int,
@@ -52,21 +78,21 @@ class Driver:
lastFileId: Optional[int] = None,
) -> int:
logger.info(f"_list_dir_fetch_parentFileId(parentFileId={parentFileId}, filename={filename}, limit={limit}, lastFileId={lastFileId})")
if await self._list_dir_in_files(files, filename) and lastFileId != -1:
if await self._list_dir_in_files(files, filename) and lastFileId != -1: # 文件名在文件列表中直接返回parentFileId
logger.debug(f"Found {filename} in files, getting parentFileId.")
return await self._list_dir_get_parentFileId(files, filename)
elif lastFileId != -1:
elif lastFileId != -1: # 文件名不在文件列表中但有lastFileId继续搜索
logger.debug(f"Fetching more files for parentFileId={parentFileId} with lastFileId={lastFileId}")
files = await self.api.list_files_v2(parentFileId=parentFileId, limit=limit, lastFileId=lastFileId)
return await self._list_dir_fetch_parentFileId(parentFileId, files, filename, limit, files['lastFileId'])
else:
return await self._list_dir_fetch_parentFileId(parentFileId, files, filename, limit, files['data']['lastFileId'])
else: # 文件名不在文件列表中且lastFileId等于-1说明文件列表已经遍历完毕没有找到返回0
if await self._list_dir_in_files(files, filename):
logger.debug(f"Found {filename} in files after lastFileId exhausted.")
return await self._list_dir_get_parentFileId(files, filename)
else:
logger.error(f"Error: {filename} not found in {files['data']['fileList']}")
return 0
async def _list_dir_get_parentFileId(
self,
files: Dict[str, Any],
@@ -98,11 +124,14 @@ class Driver:
@async_to_sync
async def main() -> None:
from privacy import client_id, client_secret
from _utils import Utils, time
utils = Utils()
logger.info("Starting main()")
driver = Driver(client_id=client_id, client_secret=client_secret)
dirs = await driver.list_dir(dir='/')
for dir in dirs:
print(dir)
start_time = time.time()
dirs = await driver.list_dir(dir='/nas/Documents')
utils.print_file_list(dirs)
print(utils.computing_time(start_time))
if __name__ == '__main__':