- _on_danmaku renders via event_text(rules, 'danmaku', ...) like all other
events; hardcoded {uname}说、 {msg} format removed
- Drop message_format param from DanmakuHandler/DanmakuClient/server/main
- api_rules_post mutates the shared rules dict in place (clear+update)
instead of rebinding, so running handlers pick up new templates
immediately without restarting TTS
- UI save toast: '规则已保存并即时生效'
- Verified: custom template 卧槽!、是{uname}!、他说、 {msg} works;
save-then-next-danmaku uses new template without restart
- TTSBridge.synthesize wraps stdin/stdout request-response in asyncio.Lock;
concurrent calls previously caused 'readuntil() called while another
coroutine is already waiting' and ENOENT (temp dir deleted while bridge
still reading input.txt)
- TTSService.start/stop guarded by lifecycle lock to prevent race from
rapid Start clicks creating duplicate bridge/worker/danmaku connections
- Verified: 20 concurrent synthesize calls all succeed with correct WAV
- Rebuild portable zip (83.8 MB)