From 7922c9d89a7c2d86f57871ad12027b1c81498d5c Mon Sep 17 00:00:00 2001 From: limil Date: Sun, 27 Oct 2024 22:06:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BA=BF=E7=A8=8B=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 48 +++++++++++++++++++++++++++++++++++++++--------- pikpakFs.py | 2 +- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index bede3ee..abeea2e 100644 --- a/main.py +++ b/main.py @@ -7,11 +7,21 @@ import colorlog from pikpakFs import VirtFsNode, DirNode, FileNode, PKVirtFs import os -def RunSync(func): - @wraps(func) - def decorated(*args, **kwargs): - return asyncio.get_event_loop().run_until_complete(func(*args, **kwargs)) - return decorated +def RunSyncInLoop(loop): + def decorator(func): + @wraps(func) + def decorated(*args, **kwargs): + currentLoop = None + try: + currentLoop = asyncio.get_running_loop() + except RuntimeError: + pass + if currentLoop is loop: + return loop.run_until_complete(func(*args, **kwargs)) + else: + return asyncio.run_coroutine_threadsafe(func(*args, **kwargs), loop).result() + return decorated + return decorator def ProvideDecoratorSelfArgs(decorator, argsProvider): def wrapper(func): @@ -51,7 +61,13 @@ class PikpakConsole(cmd2.Cmd): self._SetupLogging() self.client = PKVirtFs("token.json", proxy="http://127.0.0.1:7897") - async def Run(self): + async def Run(self): + import signal + def signal_handler(sig, frame): + pass + signal.signal(signal.SIGINT, signal_handler) + self.loop = asyncio.get_running_loop() + saved_readline_settings = None try: # Get sigint protection while we set up readline for cmd2 @@ -84,6 +100,12 @@ class PikpakConsole(cmd2.Cmd): logging.getLogger().setLevel(logging.INFO) logging.info("Debug mode disabled") + + def LoopProvider(self): + return self.loop + + RunSync = ProvideDecoratorSelfArgs(RunSyncInLoop, LoopProvider) + login_parser = cmd2.Cmd2ArgumentParser() login_parser.add_argument("username", help="username", nargs="?") login_parser.add_argument("password", help="password", nargs="?") @@ -98,7 +120,7 @@ class PikpakConsole(cmd2.Cmd): await aprint("Logged in successfully") def PathParserProvider(self): - @RunSync + @RunSyncInLoop(self.loop) async def PathToNode(path): path = await self.client.PathToNode(path) if path is None: @@ -184,8 +206,16 @@ class PikpakConsole(cmd2.Cmd): """ os.system('cls' if os.name == 'nt' else 'clear') + def complete_rm(self, text, line, begidx, endidx): + return self.PathCompleter(text, line, begidx, endidx, filterFiles = False) -if __name__ == "__main__": + @RunSync + @WithPathParser + async def do_rm(self, args): + await self.client.Delete(args.path) + + +if __name__ == "__main__": nest_asyncio.apply() prog = PikpakConsole() - asyncio.run(prog.Run()) + asyncio.run(prog.Run()) \ No newline at end of file diff --git a/pikpakFs.py b/pikpakFs.py index 677f803..30ec37d 100644 --- a/pikpakFs.py +++ b/pikpakFs.py @@ -240,7 +240,7 @@ class PKVirtFs: result = await self.client.get_download_url(file.id) file.url = result["web_content_link"] - async def Download(self, url : str, dirNode : DirNode = None) -> None : + async def Download(self, url : str, dirNode : DirNode) -> None : # 默认创建在当前目录下 # todo: 完善离线下载task相关 if dirNode is None: