-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
113 lines (99 loc) · 4.15 KB
/
app.py
File metadata and controls
113 lines (99 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""SplazMatte — 启动入口
日志配置、目录初始化、静态文件挂载、服务启动。
"""
import os
os.environ.setdefault("PYTORCH_ENABLE_MPS_FALLBACK", "1")
os.environ.setdefault("no_proxy", "localhost,127.0.0.1,0.0.0.0")
import asyncio
import logging
from logging.handlers import RotatingFileHandler
from nicegui import app, ui
from config import (
LOGS_DIR,
MATTING_SESSIONS_DIR,
PROCESSING_LOG_FILE,
SERVER_PORT,
STORAGE_SECRET,
TRACKING_SESSIONS_DIR,
WORKSPACE_DIR,
)
from utils.feishu_notify import send_feishu_startup
from utils.user_context import UserEmailFilter
# ---------------------------------------------------------------------------
# Logging
# ---------------------------------------------------------------------------
_LOG_FMT = "%(asctime)s [%(levelname)s] [%(user_email)s] %(name)s: %(message)s"
_LOG_DATEFMT = "%Y-%m-%d %H:%M:%S"
logging.basicConfig(
level=logging.INFO,
format=_LOG_FMT,
datefmt=_LOG_DATEFMT,
)
_user_filter = UserEmailFilter()
# 把 filter 加到每个 handler 上,确保所有 record 在格式化前都注入 user_email
for _h in logging.getLogger().handlers:
_h.addFilter(_user_filter)
PROCESSING_LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
PROCESSING_LOG_FILE.touch()
_file_handler = logging.FileHandler(str(PROCESSING_LOG_FILE), mode="w")
_file_handler.setFormatter(logging.Formatter(_LOG_FMT, datefmt=_LOG_DATEFMT))
_file_handler.addFilter(_user_filter)
logging.getLogger().addHandler(_file_handler)
LOGS_DIR.mkdir(parents=True, exist_ok=True)
_persistent_handler = RotatingFileHandler(
str(LOGS_DIR / "splazmatte.log"),
maxBytes=5_000_000, backupCount=5, encoding="utf-8",
)
_persistent_handler.setFormatter(logging.Formatter(_LOG_FMT, datefmt=_LOG_DATEFMT))
_persistent_handler.addFilter(_user_filter)
logging.getLogger().addHandler(_persistent_handler)
log = logging.getLogger(__name__)
# ---------------------------------------------------------------------------
# Directory init
# ---------------------------------------------------------------------------
WORKSPACE_DIR.mkdir(parents=True, exist_ok=True)
MATTING_SESSIONS_DIR.mkdir(parents=True, exist_ok=True)
TRACKING_SESSIONS_DIR.mkdir(parents=True, exist_ok=True)
preview_dir = WORKSPACE_DIR / "preview"
preview_dir.mkdir(exist_ok=True)
tracking_preview_dir = WORKSPACE_DIR / "tracking_preview"
tracking_preview_dir.mkdir(exist_ok=True)
tracking_results_dir = WORKSPACE_DIR / "tracking_results"
tracking_results_dir.mkdir(exist_ok=True)
# ---------------------------------------------------------------------------
# Static file mounts
# ---------------------------------------------------------------------------
app.add_static_files("/sessions", str(MATTING_SESSIONS_DIR))
app.add_static_files("/preview", str(preview_dir))
app.add_static_files("/workspace", str(WORKSPACE_DIR))
app.add_static_files("/tracking_preview", str(tracking_preview_dir))
app.add_static_files("/tracking_results", str(tracking_results_dir))
# ---------------------------------------------------------------------------
# Page registration (importing the modules registers @ui.page routes)
# ---------------------------------------------------------------------------
from pages.matting_page import matting_page # noqa: F401, E402 @ui.page("/")
from pages.tracking_page import tracking_page # noqa: F401, E402 @ui.page("/tracking")
# ---------------------------------------------------------------------------
# Startup notification
# ---------------------------------------------------------------------------
async def _notify_startup():
await asyncio.sleep(1)
try:
import urllib.request
urllib.request.urlopen(f"http://127.0.0.1:{SERVER_PORT}", timeout=2)
send_feishu_startup(f"http://127.0.0.1:{SERVER_PORT}")
except Exception:
pass
if __name__ == "__main__":
log.info("SplazMatte 已启动,等待操作...")
app.on_startup(_notify_startup)
log.info("Launching NiceGUI (port=%s)...", SERVER_PORT)
ui.run(
host="0.0.0.0",
port=SERVER_PORT,
title="SplazMatte",
reload=False,
show=False,
storage_secret=STORAGE_SECRET,
reconnect_timeout=60,
)