diff --git a/xiaomusic/cli.py b/xiaomusic/cli.py index dca42a0..f34d842 100644 --- a/xiaomusic/cli.py +++ b/xiaomusic/cli.py @@ -153,39 +153,15 @@ def main(): log_config=LOGGING_CONFIG, ) - process = None - - def run_gate(): - command = [ - "uvicorn", - "xiaomusic.gate:app", - "--workers", - "4", - "--host", - "0.0.0.0", - "--port", - str(config.port), - ] - global process - process = subprocess.Popen(command) - def signal_handler(sig, frame): print("主进程收到退出信号,准备退出...") - if process is not None: - process.terminate() # 终止子进程 - process.wait() # 等待子进程退出 - print("子进程已退出") os._exit(0) # 退出主进程 # 捕获主进程的退出信号 signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) port = int(config.port) - if config.enable_gate: - run_gate() - run_server(port + 1) - else: - run_server(port) + run_server(port) if __name__ == "__main__": diff --git a/xiaomusic/config.py b/xiaomusic/config.py index 775d90a..126278b 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -137,7 +137,6 @@ class Config: os.getenv("XIAOMUSIC_REMOVE_ID3TAG", "false").lower() == "true" ) delay_sec: int = int(os.getenv("XIAOMUSIC_DELAY_SEC", 3)) # 下一首歌延迟播放秒数 - enable_gate: bool = os.getenv("XIAOMUSIC_ENABLE_GATE", "false").lower() == "true" def append_keyword(self, keys, action): for key in keys.split(","): diff --git a/xiaomusic/gate.py b/xiaomusic/gate.py deleted file mode 100644 index 2f2adcb..0000000 --- a/xiaomusic/gate.py +++ /dev/null @@ -1,124 +0,0 @@ -import json -import logging -import mimetypes -import os -import re -from contextlib import asynccontextmanager - -import aiofiles -import httpx -from fastapi import FastAPI, HTTPException, Request -from fastapi.responses import Response, StreamingResponse -from fastapi.staticfiles import StaticFiles - -from xiaomusic import __version__ -from xiaomusic.config import Config - -config = Config() -logging.basicConfig(level=logging.INFO) -log = logging.getLogger(__name__) - - -@asynccontextmanager -async def app_lifespan(app): - global config - try: - filename = config.getsettingfile() - with open(filename) as f: - data = json.loads(f.read()) - config.update_config(data) - except Exception as e: - log.exception(f"Execption {e}") - yield - - -app = FastAPI( - lifespan=app_lifespan, - version=__version__, -) - - -folder = os.path.dirname(__file__) -app.mount("/static", StaticFiles(directory=f"{folder}/static"), name="static") - - -async def file_iterator(file_path, start, end): - async with aiofiles.open(file_path, mode="rb") as file: - await file.seek(start) - chunk_size = 1024 - while start <= end: - read_size = min(chunk_size, end - start + 1) - data = await file.read(read_size) - if not data: - break - start += len(data) - yield data - - -range_pattern = re.compile(r"bytes=(\d+)-(\d*)") - - -@app.get("/music/{file_path:path}") -async def music_file(request: Request, file_path: str): - absolute_path = os.path.abspath(config.music_path) - absolute_file_path = os.path.normpath(os.path.join(absolute_path, file_path)) - if not absolute_file_path.startswith(absolute_path): - raise HTTPException(status_code=404, detail="File not found") - if not os.path.exists(absolute_file_path): - raise HTTPException(status_code=404, detail="File not found") - - file_size = os.path.getsize(absolute_file_path) - range_start, range_end = 0, file_size - 1 - - range_header = request.headers.get("Range") - log.info(f"music_file range_header {range_header}") - if range_header: - range_match = range_pattern.match(range_header) - if range_match: - range_start = int(range_match.group(1)) - if range_match.group(2): - range_end = int(range_match.group(2)) - - log.info(f"music_file in range {absolute_file_path}") - - log.info(f"music_file {range_start} {range_end} {absolute_file_path}") - headers = { - "Content-Range": f"bytes {range_start}-{range_end}/{file_size}", - "Accept-Ranges": "bytes", - } - mime_type, _ = mimetypes.guess_type(file_path) - if mime_type is None: - mime_type = "application/octet-stream" - return StreamingResponse( - file_iterator(absolute_file_path, range_start, range_end), - headers=headers, - status_code=206 if range_header else 200, - media_type=mime_type, - ) - - -@app.options("/music/{file_path:path}") -async def music_options(): - headers = { - "Accept-Ranges": "bytes", - } - return Response(headers=headers) - - -@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) -async def proxy(path: str, request: Request): - async with httpx.AsyncClient() as client: - port = config.port + 1 - url = f"http://127.0.0.1:{port}/{path}" - response = await client.request( - method=request.method, - url=url, - headers=request.headers, - params=request.query_params, - content=await request.body() if request.method in ["POST", "PUT"] else None, - ) - return Response( - content=response.content, - status_code=response.status_code, - headers=dict(response.headers), - ) diff --git a/xiaomusic/static/setting.html b/xiaomusic/static/setting.html index dec311d..b3e896b 100644 --- a/xiaomusic/static/setting.html +++ b/xiaomusic/static/setting.html @@ -127,12 +127,6 @@ var vConsole = new window.VConsole(); - - -