From d7e940fe2eeebe49e676dabcfe0db4fa37070117 Mon Sep 17 00:00:00 2001 From: Chun_Qiu Date: Sat, 8 Aug 2026 17:25:02 +0800 Subject: [PATCH] feat: auto-route room_id 1 to local fake_room.py for testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - When room_id == 1, server/main automatically patch blivedm to connect to fake_room.py on 127.0.0.1:8081 (bot web UI port + 1) - Any other room id restores real Bilibili (unpatch) - fake_room.py (gitignored, not packaged): headless fake live room with bilibili-compatible init APIs (/x/web-interface/nav, /room/v1/Room/get_info, /xlive/web-room/v1/index/getDanmuInfo) and WS /sub protocol (AUTH/HEARTBEAT/ SEND_MSG_REPLY), plus stdin/HTTP /emit control for danmaku/gift/blind box/ guard/super chat/enter/follow - Verified end-to-end: all events flow through blivedm and render rules (gift -> 感谢由Baka投喂的小电视, blind box, guard, super chat, custom danmaku template, enter room) --- .gitignore | 3 +++ main.py | 13 +++++++++++++ server.py | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/.gitignore b/.gitignore index deb7d4d..8f6ad29 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ temp/ # Node.js node_modules/ + +# Dev/testing (not packaged, not committed) +fake_room.py diff --git a/main.py b/main.py index 5296be3..e4a8242 100644 --- a/main.py +++ b/main.py @@ -33,6 +33,8 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--no-numbers", action="store_true") parser.add_argument("--list-devices", action="store_true") parser.add_argument("--debug", "-d", action="store_true") + parser.add_argument("--fake-room", type=int, default=0, metavar="PORT", + help="connect to local fake_room.py instead of real Bilibili (dev/testing only)") return parser.parse_args() @@ -58,6 +60,17 @@ async def tts_worker(queue: asyncio.Queue, bridge: TTSBridge, async def main_async(args: argparse.Namespace) -> int: + if args.fake_room: + import importlib + fake = importlib.import_module("fake_room") + fake.patch_blivedm(args.fake_room) + logger.info("[dev] connected to fake room on port %d", args.fake_room) + elif args.room_id == 1: + import importlib + fake = importlib.import_module("fake_room") + fake.patch_blivedm(8081) + logger.info("[dev] room 1 -> fake room on port 8081") + if args.list_devices: devices = get_output_devices() print("Available audio output devices:") diff --git a/server.py b/server.py index 7d15ad9..491e3f0 100644 --- a/server.py +++ b/server.py @@ -151,6 +151,21 @@ async def index_handler(request: web.Request) -> web.Response: return web.FileResponse(STATIC_DIR / "index.html") +FAKE_ROOM_PORT = 8081 # fake_room.py default = bot web UI port (8080) + 1 + + +def _apply_fake_room(room_id: int) -> None: + """room_id == 1 routes to the local fake room (dev/testing); otherwise restore real Bilibili.""" + import importlib + + fake = importlib.import_module("fake_room") + if room_id == 1: + fake.patch_blivedm(FAKE_ROOM_PORT) + logger.info("[dev] room 1 -> fake room on port %d", FAKE_ROOM_PORT) + else: + fake.unpatch_blivedm() + + async def api_start(request: web.Request) -> web.Response: try: config = await request.json() @@ -173,6 +188,7 @@ async def api_start(request: web.Request) -> web.Response: await tts_service.stop() except Exception: pass + _apply_fake_room(room_id) tts_service.set_cookies(login_session.cookies if login_session.is_logged_in else None) try: await tts_service.start(config) @@ -300,6 +316,8 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--port", "-p", type=int, default=8080) parser.add_argument("--host", type=str, default="127.0.0.1") parser.add_argument("--debug", "-d", action="store_true") + parser.add_argument("--fake-room", type=int, default=0, metavar="PORT", + help="connect to local fake_room.py instead of real Bilibili (dev/testing only)") return parser.parse_args() @@ -311,6 +329,13 @@ def main() -> int: datefmt="%H:%M:%S", ) logging.getLogger("aiohttp.access").setLevel(logging.WARNING) + + if args.fake_room: + import importlib + fake = importlib.import_module("fake_room") + fake.patch_blivedm(args.fake_room) + print(f" [dev] connected to fake room on port {args.fake_room}") + app = create_app() print(f"\n Bilibili Live → Yukkuri TTS Web UI") print(f" Open: http://{args.host}:{args.port}\n")