Merge pull request #49 from itouakirai/v2
Some checks failed
/ Build Windows (push) Has been cancelled

type and feat
This commit is contained in:
世界观察日志
2025-08-28 06:59:51 +08:00
committed by GitHub

View File

@@ -5,11 +5,12 @@ import sys
from creart import it from creart import it
from prompt_toolkit import PromptSession from prompt_toolkit import PromptSession
from prompt_toolkit.patch_stdout import patch_stdout from prompt_toolkit.patch_stdout import patch_stdout
from prompt_toolkit.completion import WordCompleter
from src.api import WebAPI from src.api import WebAPI
from src.config import Config from src.config import Config
from src.flags import Flags from src.flags import Flags
from src.grpc.manager import WrapperManager from src.grpc.manager import WrapperManager, WrapperManagerException
from src.logger import GlobalLogger from src.logger import GlobalLogger
from src.measurer import SpeedMeasurer from src.measurer import SpeedMeasurer
from src.rip import on_decrypt_success, on_decrypt_failed, rip_song, rip_album, rip_artist, rip_playlist from src.rip import on_decrypt_success, on_decrypt_failed, rip_song, rip_album, rip_artist, rip_playlist
@@ -49,6 +50,8 @@ class InteractiveShell:
download_parser.add_argument("--include-participate-songs", default=False, dest="include", action="store_true") download_parser.add_argument("--include-participate-songs", default=False, dest="include", action="store_true")
subparser.add_parser("status") subparser.add_parser("status")
subparser.add_parser("login")
subparser.add_parser("logout")
subparser.add_parser("exit") subparser.add_parser("exit")
async def show_status(self): async def show_status(self):
@@ -96,18 +99,57 @@ class InteractiveShell:
return return
def bottom_toolbar(self): def bottom_toolbar(self):
return f"Download Speed: {it(SpeedMeasurer).download_speed()}, Decrypt Speed: {it(SpeedMeasurer).decrypt_speed()}, Tasks: {get_tasks_num()}" return f"Download Speed: {it(SpeedMeasurer).download_speed()}, Decrypt Speed: {it(SpeedMeasurer).decrypt_speed()}, Tasks: {get_tasks_num()-2}"
def completer(self):
mycompleter = ['dl', 'status', 'login', 'logout', 'exit']
return WordCompleter(mycompleter)
async def handle_command(self): async def handle_command(self):
session = PromptSession("> ", bottom_toolbar=self.bottom_toolbar, refresh_interval=1) session = PromptSession("> ", bottom_toolbar=self.bottom_toolbar, completer=self.completer(), refresh_interval=1)
while True: while True:
try: try:
command = await session.prompt_async() command = await session.prompt_async()
await self.command_parser(command) if command.lower() == 'login':
await self.login_flow()
if command.lower() == 'logout':
await self.logout_flow()
elif command.strip() == '':
continue
else: await self.command_parser(command)
except (EOFError, KeyboardInterrupt): except (EOFError, KeyboardInterrupt):
return return
async def on_2fa(self, username: str, password: str):
session = PromptSession()
two_step_code = await session.prompt_async("2FA code: ")
return two_step_code
async def login_flow(self):
await it(WrapperManager).init(it(Config).instance.url, it(Config).instance.secure)
session = PromptSession()
username = await session.prompt_async("Username: ")
password = await session.prompt_async("Password: ", is_password=True)
try:
await it(WrapperManager).login(username, password, self.on_2fa)
except WrapperManagerException as e:
it(GlobalLogger).logger.error("Login Failed!")
return
it(GlobalLogger).logger.info("Login Success!")
async def logout_flow(self):
await it(WrapperManager).init(it(Config).instance.url, it(Config).instance.secure)
session = PromptSession()
username = await session.prompt_async("Username: ")
try:
await it(WrapperManager).logout(username)
except WrapperManagerException as e:
it(GlobalLogger).logger.error("Logout Failed!")
return
it(GlobalLogger).logger.info("Logout Success!")
async def start(self): async def start(self):
with patch_stdout(): with patch_stdout():
try: try: