lookatstudy-mobile 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.txt +19 -0
- package/install-termux.sh +327 -0
- package/package.json +10 -0
- package/seed-course.json +679 -0
- package/server.cjs +495218 -0
- package/sql-wasm.wasm +0 -0
- package/web/assets/abnfDiagram-N423BO3Z-BFNTWI49.js +1 -0
- package/web/assets/api-web-BSU76jU3.js +1 -0
- package/web/assets/app-height-D5bf5z0g.js +1 -0
- package/web/assets/arc-Ci0WYiAH.js +1 -0
- package/web/assets/architectureDiagram-T3A2C74G-DX5jRTha.js +36 -0
- package/web/assets/blockDiagram-VBNYF7ZC-DjzKFpxY.js +132 -0
- package/web/assets/c4Diagram-5PPSVZJV-CIG-Sdcg.js +10 -0
- package/web/assets/channel-BmMZwizg.js +1 -0
- package/web/assets/chunk-2GRJ4B5K-D1h0uIyK.js +1 -0
- package/web/assets/chunk-2Q5K7J3B-cLoZ93yC.js +1 -0
- package/web/assets/chunk-5RXB4S5H-CSaMcbxs.js +231 -0
- package/web/assets/chunk-5VM5RSS4-JLvS-B89.js +15 -0
- package/web/assets/chunk-6Q2QTUOP-DXM7xtsH.js +88 -0
- package/web/assets/chunk-GF5L2VYU-BMXbp2Lo.js +206 -0
- package/web/assets/chunk-JWPE2WC7-DPQPMhNL.js +1 -0
- package/web/assets/chunk-KBJHAD2P-Bh3aU5gZ.js +1 -0
- package/web/assets/chunk-RYQCIY6F-wL-LEvWn.js +1 -0
- package/web/assets/chunk-XXDRQBXY-BPEP-05C.js +1 -0
- package/web/assets/classDiagram-JCYQIIEL-vXvWKIQn.js +1 -0
- package/web/assets/classDiagram-v2-OCEON4UE-vXvWKIQn.js +1 -0
- package/web/assets/cose-bilkent-JH36ORCC-CIy59RcY.js +1 -0
- package/web/assets/cynefin-VYW2F7L2-jbV2BJ_V.js +178 -0
- package/web/assets/cynefinDiagram-MW4NZA55-Cc7aMDYj.js +62 -0
- package/web/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
- package/web/assets/dagre-VZM6K2ZE-Dsdu5Zt7.js +4 -0
- package/web/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/web/assets/diagram-7IWD3JNH-DJ4Yft6o.js +30 -0
- package/web/assets/diagram-B4RE2ZJO-CBh3xkIP.js +3 -0
- package/web/assets/diagram-LBJQPF4R-C-Iljnoj.js +24 -0
- package/web/assets/diagram-Q27KOJAE-8HHiRyk2.js +24 -0
- package/web/assets/diagram-UB23O5K3-C3K2kFAQ.js +41 -0
- package/web/assets/ebnfDiagram-BXEA7PRR-r1mdnIKj.js +1 -0
- package/web/assets/erDiagram-JOGREHBK-dYLNtxz3.js +85 -0
- package/web/assets/flowDiagram-UKHOOZJN-BYDIRoMm.js +156 -0
- package/web/assets/ganttDiagram-PKOTCBZU-CnCtvDzl.js +292 -0
- package/web/assets/gitGraphDiagram-DS77QQ5N-rG8kwFmL.js +106 -0
- package/web/assets/graph-C9eacEi8.js +1 -0
- package/web/assets/index-132uBtFQ.css +1 -0
- package/web/assets/index-CG9cZjNC.js +548 -0
- package/web/assets/infoDiagram-6WML65LV-BTcUhfqr.js +2 -0
- package/web/assets/init-Gi6I4Gst.js +1 -0
- package/web/assets/ishikawaDiagram-WSZJBQD7-CJviqcY8.js +70 -0
- package/web/assets/journeyDiagram-NVQOT4AX-8JWo64Wa.js +139 -0
- package/web/assets/kanban-definition-27J2QSJJ-BHD0yFL_.js +89 -0
- package/web/assets/katex-C5jXJg4s.js +257 -0
- package/web/assets/layout-DEXfKzaS.js +1 -0
- package/web/assets/linear-CT2ADXOb.js +1 -0
- package/web/assets/map-Czzmt4hB.js +1 -0
- package/web/assets/mermaid.core-DntY_Zhl.js +314 -0
- package/web/assets/mindmap-definition-FAOFIHXS-B_yUIQHi.js +96 -0
- package/web/assets/ordinal-Cboi1Yqb.js +1 -0
- package/web/assets/pegDiagram-VL7TDLO6-BopqqStm.js +1 -0
- package/web/assets/pieDiagram-7S7Q4E2Y-Com2ypw6.js +39 -0
- package/web/assets/quadrantDiagram-CIZ2JOQS-G0dlgjbr.js +7 -0
- package/web/assets/railroadDiagram-AXF67PYL-ChpuDwPP.js +1 -0
- package/web/assets/requirementDiagram-LRYGKXZP-CDD5pE1Z.js +84 -0
- package/web/assets/sankeyDiagram-W5VNT64P-DO-0GGh4.js +40 -0
- package/web/assets/sequenceDiagram-SI44F4Z6-__Qnpiz7.js +162 -0
- package/web/assets/sizeCapture-X5ZJPWSS-BxPWVmpa.js +1 -0
- package/web/assets/stateDiagram-OKZ733FA-DD0m6rt6.js +1 -0
- package/web/assets/stateDiagram-v2-UEYNNEHI-BHOUKhEe.js +1 -0
- package/web/assets/swimlanes-SLNWSIFB-m5XzOcas.js +2 -0
- package/web/assets/swimlanesDiagram-ULZ7WXOC-Bs3hfWP0.js +8 -0
- package/web/assets/timeline-definition-Z64GVDOM-D19Nd7I_.js +120 -0
- package/web/assets/vennDiagram-T6HMQDX7-DqFIJV1L.js +34 -0
- package/web/assets/wardleyDiagram-T6FBY63Y-CKVK_9QD.js +78 -0
- package/web/assets/xychartDiagram-ELKLHX3M-B85Rr0Fa.js +7 -0
- package/web/icon-192.png +0 -0
- package/web/icon-512.png +0 -0
- package/web/index.html +53 -0
- package/web/manifest.webmanifest +31 -0
package/README.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
LookatStudy mobile bundle
|
|
2
|
+
|
|
3
|
+
Requirements: Node.js >= 20 (Termux: bash install-termux.sh does everything)
|
|
4
|
+
|
|
5
|
+
Termux one-shot install (China-mirror aware, autostart + battery setup):
|
|
6
|
+
bash install-termux.sh
|
|
7
|
+
|
|
8
|
+
After install, helper scripts live in ~/lookatstudy:
|
|
9
|
+
start.sh / stop.sh / status.sh / update.sh
|
|
10
|
+
|
|
11
|
+
Manual start (any platform): node server.cjs
|
|
12
|
+
(defaults: port 17890, data ~/.lookatstudy, web ./web)
|
|
13
|
+
Open: the URL printed on startup (contains the auth token)
|
|
14
|
+
|
|
15
|
+
Files:
|
|
16
|
+
server.cjs headless server (bundled, zero npm install)
|
|
17
|
+
sql-wasm.wasm SQLite WASM
|
|
18
|
+
web/ renderer static build
|
|
19
|
+
install-termux.sh Termux installer (mirror/dep/keepalive optimizations)
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
2
|
+
# LookatStudy Termux 一键安装/运行(安装优化照搬 KaijiBot 实测经验):
|
|
3
|
+
# bash install-termux.sh # 首次安装(镜像/依赖/下载/保活配置)+ 启动
|
|
4
|
+
# bash ~/lookatstudy/start.sh # 之后启动(也可直接开 Termux,bashrc 会自动拉起)
|
|
5
|
+
# bash ~/lookatstudy/stop.sh # 停止
|
|
6
|
+
# bash ~/lookatstudy/status.sh # 状态 + 访问链接
|
|
7
|
+
# bash ~/lookatstudy/update.sh # 更新便携包并重启
|
|
8
|
+
# 无 npm 依赖:便携包(server.cjs 单文件)从 GitHub Release 下载,中国网络走 ghproxy 回退链。
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
PORT="${LOOKATSTUDY_PORT:-17890}"
|
|
12
|
+
APP_DIR="$HOME/lookatstudy"
|
|
13
|
+
DATA_DIR="$HOME/.lookatstudy"
|
|
14
|
+
GH_ASSET="https://github.com/Kaiji-Z/LookatStudy/releases/latest/download/lookatstudy-mobile.zip"
|
|
15
|
+
GH_VOICE="https://github.com/Kaiji-Z/LookatStudy/releases/latest/download/lookatstudy-termux-voice.tar.gz"
|
|
16
|
+
# 直连优先,失败再走代理前缀(镜像只做回退:KaijiBot 教训是镜像同步延迟会坏事,大头收益在 apt 的 TUNA)
|
|
17
|
+
DL_PREFIXES=("" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.top/")
|
|
18
|
+
|
|
19
|
+
# npmmirror(阿里,自动同步 npm)解析包的 latest tarball 地址;空输出=未同步/网络失败
|
|
20
|
+
npm_tarball() {
|
|
21
|
+
curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmmirror.com/$1/latest" | sed -n 's/.*"tarball":"\([^"]*\)".*//p'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
info() { printf '\033[1m[*]\033[0m %s\n' "$*"; }
|
|
25
|
+
ok() { printf '\033[38;2;0;229;204m[✓]\033[0m %s\n' "$*"; }
|
|
26
|
+
warn() { printf '\033[33m[!]\033[0m %s\n' "$*"; }
|
|
27
|
+
|
|
28
|
+
# ── Termux 环境守卫 ──────────────────────────────────────────
|
|
29
|
+
[ -d /data/data/com.termux ] || { echo "此脚本必须在 Termux 里运行。"; exit 1; }
|
|
30
|
+
|
|
31
|
+
is_cn() {
|
|
32
|
+
case "$(getprop persist.sys.timezone 2>/dev/null || echo "")" in
|
|
33
|
+
Asia/Shanghai|Asia/Chongqing|Asia/Harbin|Asia/Urumqi|Asia/Kashgar|PRC|CTT) return 0 ;;
|
|
34
|
+
esac
|
|
35
|
+
return 1
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
39
|
+
|
|
40
|
+
node_major() {
|
|
41
|
+
node --version 2>/dev/null | sed 's/^v//' | cut -d. -f1 || echo 0
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
serve_pid() { pgrep -f "server.cjs --port $PORT" 2>/dev/null || true; }
|
|
45
|
+
|
|
46
|
+
refresh_url_file() {
|
|
47
|
+
# serve-token 首启落盘后长期复用;url.txt 给「显示访问链接」命令用
|
|
48
|
+
if [ -f "$DATA_DIR/serve-token" ]; then
|
|
49
|
+
echo "http://127.0.0.1:$PORT/?token=$(cat "$DATA_DIR/serve-token")" > "$APP_DIR/url.txt"
|
|
50
|
+
cat "$APP_DIR/url.txt"
|
|
51
|
+
fi
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
start_service() {
|
|
55
|
+
# pkill 无匹配返回非零,set -e 下会误杀脚本 —— 必须挂 || true(KaijiBot 踩坑)
|
|
56
|
+
pkill -f "server.cjs --port $PORT" 2>/dev/null || true
|
|
57
|
+
sleep 1
|
|
58
|
+
termux-wake-lock 2>/dev/null || true
|
|
59
|
+
# 语音引擎 .so 就位后由 $ORIGIN/LD_LIBRARY_PATH 双保险解析(路 3)
|
|
60
|
+
export LD_LIBRARY_PATH="$APP_DIR/node_modules/sherpa-onnx-node${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
61
|
+
nohup node "$APP_DIR/server.cjs" --port "$PORT" --web "$APP_DIR/web" --data "$DATA_DIR" \
|
|
62
|
+
>> "$APP_DIR/server.log" 2>&1 &
|
|
63
|
+
sleep 3
|
|
64
|
+
if [ -n "$(serve_pid)" ]; then
|
|
65
|
+
ok "LookatStudy 已启动(端口 $PORT)"
|
|
66
|
+
refresh_url_file
|
|
67
|
+
info "浏览器打开上面的链接即可(带 token,只需这一次;之后直接开 Termux 或启动器即可)"
|
|
68
|
+
else
|
|
69
|
+
warn "服务可能没起来,查看日志: tail -20 $APP_DIR/server.log"
|
|
70
|
+
fi
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
download_bundle() {
|
|
74
|
+
mkdir -p "$APP_DIR"
|
|
75
|
+
cd "$APP_DIR"
|
|
76
|
+
info "下载便携包(约 5MB)..."
|
|
77
|
+
# 主源:npm 镜像(npmmirror 同步 npm 发布,国内直连快;tgz 需剥 package/ 前缀)
|
|
78
|
+
local tb
|
|
79
|
+
tb=$(npm_tarball lookatstudy-mobile)
|
|
80
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
|
|
81
|
+
tar -xzf mobile.tgz --strip-components=1
|
|
82
|
+
rm -f mobile.tgz
|
|
83
|
+
ok "便携包就位(npm 镜像): $APP_DIR"
|
|
84
|
+
return 0
|
|
85
|
+
fi
|
|
86
|
+
info "npm 镜像未命中,回退 GitHub 直连+代理链..."
|
|
87
|
+
local dl_ok=0 p=""
|
|
88
|
+
for p in "${DL_PREFIXES[@]}"; do
|
|
89
|
+
if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "${p}${GH_ASSET}"; then
|
|
90
|
+
dl_ok=1
|
|
91
|
+
break
|
|
92
|
+
fi
|
|
93
|
+
info "${p:-GitHub 直连}失败,尝试下一个下载源..."
|
|
94
|
+
done
|
|
95
|
+
if [ "$dl_ok" != 1 ]; then
|
|
96
|
+
echo "下载失败。请手动下载 $GH_ASSET 放到 $APP_DIR/ls.zip 后重跑本脚本。"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
unzip -o ls.zip
|
|
100
|
+
rm -f ls.zip
|
|
101
|
+
ok "便携包就位: $APP_DIR"
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
install_voice() {
|
|
105
|
+
mkdir -p "$APP_DIR/node_modules"
|
|
106
|
+
info "下载 Termux 语音引擎包(约 12MB)..."
|
|
107
|
+
# 主源:npm 镜像(tgz 剥 package/ 前缀,解出 sherpa-onnx-node/ 目录)
|
|
108
|
+
local tb
|
|
109
|
+
tb=$(npm_tarball lookatstudy-termux-voice)
|
|
110
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o voice.tgz "$tb"; then
|
|
111
|
+
tar -xzf voice.tgz --strip-components=1 -C "$APP_DIR/node_modules"
|
|
112
|
+
rm -f voice.tgz
|
|
113
|
+
ok "语音引擎就位(npm 镜像): $APP_DIR/node_modules/sherpa-onnx-node"
|
|
114
|
+
info "语音模型(朗读约 430MB + 听写约 200MB)在应用内下载: 设置 → 语音能力"
|
|
115
|
+
info "装完模型重启服务生效: bash ~/lookatstudy/start.sh"
|
|
116
|
+
return 0
|
|
117
|
+
fi
|
|
118
|
+
info "npm 镜像未命中,回退 GitHub 直连+代理链..."
|
|
119
|
+
local dl_ok=0 p=""
|
|
120
|
+
for p in "${DL_PREFIXES[@]}"; do
|
|
121
|
+
if curl -fL --connect-timeout 10 --retry 2 -o voice.tar.gz "${p}${GH_VOICE}"; then
|
|
122
|
+
dl_ok=1
|
|
123
|
+
break
|
|
124
|
+
fi
|
|
125
|
+
info "${p:-GitHub 直连}失败,尝试下一个下载源..."
|
|
126
|
+
done
|
|
127
|
+
if [ "$dl_ok" != 1 ]; then
|
|
128
|
+
echo "语音引擎包下载失败(可稍后重跑本脚本,或跳过语音功能)。"
|
|
129
|
+
rm -f voice.tar.gz
|
|
130
|
+
return 1
|
|
131
|
+
fi
|
|
132
|
+
tar -xzf voice.tar.gz -C "$APP_DIR/node_modules"
|
|
133
|
+
rm -f voice.tar.gz
|
|
134
|
+
ok "语音引擎就位: $APP_DIR/node_modules/sherpa-onnx-node"
|
|
135
|
+
info "语音模型(朗读约 430MB + 听写约 200MB)在应用内下载: 设置 → 语音能力"
|
|
136
|
+
info "装完模型重启服务生效: bash ~/lookatstudy/start.sh"
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# ── 1. 中国时区 → TUNA apt 镜像(默认源在中国极慢/不可达) ─────
|
|
140
|
+
# 用 apt-get 而非 pkg:pkg 包装器每次跑 select_mirror 全球测速 60+ 镜像,更慢
|
|
141
|
+
if is_cn; then
|
|
142
|
+
echo "deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main/ stable main" \
|
|
143
|
+
> "$PREFIX/etc/apt/sources.list"
|
|
144
|
+
info "检测到中国时区,apt 源切换到 TUNA 镜像"
|
|
145
|
+
else
|
|
146
|
+
info "非中国时区,保持 Termux 默认源"
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
# ── 2. 升级 + 依赖 ───────────────────────────────────────────
|
|
150
|
+
# 全新 Termux 不先 upgrade 直接装 Node 会 OpenSSL 链接错误(KaijiBot 实测 CRITICAL 坑)
|
|
151
|
+
export DEBIAN_FRONTEND=noninteractive
|
|
152
|
+
APT_OPTS="-y -o Dpkg::Options::=--force-confold"
|
|
153
|
+
info "升级 Termux 基础包(首次可能需要几分钟)..."
|
|
154
|
+
apt-get update $APT_OPTS || true
|
|
155
|
+
apt-get upgrade $APT_OPTS || true
|
|
156
|
+
|
|
157
|
+
info "安装 Node.js 与工具(已装的跳过)..."
|
|
158
|
+
have node || apt-get install $APT_OPTS nodejs-lts
|
|
159
|
+
have curl || apt-get install $APT_OPTS curl
|
|
160
|
+
have unzip || apt-get install $APT_OPTS unzip
|
|
161
|
+
|
|
162
|
+
MAJOR="$(node_major)"
|
|
163
|
+
if [ "${MAJOR:-0}" -lt 20 ]; then
|
|
164
|
+
info "Node v${MAJOR} 过旧,升级 nodejs-lts..."
|
|
165
|
+
apt-get install $APT_OPTS nodejs-lts
|
|
166
|
+
MAJOR="$(node_major)"
|
|
167
|
+
if [ "${MAJOR:-0}" -lt 20 ]; then
|
|
168
|
+
echo "Node >= 20 安装失败,请手动执行: pkg install nodejs-lts"
|
|
169
|
+
exit 1
|
|
170
|
+
fi
|
|
171
|
+
fi
|
|
172
|
+
ok "Node v${MAJOR}(要求 >= 20)"
|
|
173
|
+
|
|
174
|
+
# ── 3. 便携包(已存在则跳过,更新走 update.sh) ────────────────
|
|
175
|
+
if [ -f "$APP_DIR/server.cjs" ]; then
|
|
176
|
+
ok "便携包已存在(更新请运行: bash ~/lookatstudy/update.sh)"
|
|
177
|
+
else
|
|
178
|
+
download_bundle
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# ── 4. 常用命令脚本 ──────────────────────────────────────────
|
|
182
|
+
cat > "$APP_DIR/start.sh" <<EOS
|
|
183
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
184
|
+
# 启动 LookatStudy(前台输出状态,服务本体后台常驻)
|
|
185
|
+
set -u
|
|
186
|
+
PORT="${PORT}"
|
|
187
|
+
APP_DIR="${APP_DIR}"
|
|
188
|
+
termux-wake-lock 2>/dev/null
|
|
189
|
+
pkill -f "server.cjs --port \$PORT" 2>/dev/null; sleep 1
|
|
190
|
+
export LD_LIBRARY_PATH="\$APP_DIR/node_modules/sherpa-onnx-node\${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH}"
|
|
191
|
+
nohup node "\$APP_DIR/server.cjs" --port "\$PORT" --web "\$APP_DIR/web" --data "${DATA_DIR}" >> "\$APP_DIR/server.log" 2>&1 &
|
|
192
|
+
sleep 3
|
|
193
|
+
if pgrep -f "server.cjs --port \$PORT" >/dev/null 2>&1; then
|
|
194
|
+
echo "[✓] 已启动(端口 \$PORT)"
|
|
195
|
+
[ -f "${DATA_DIR}/serve-token" ] && echo "http://127.0.0.1:\$PORT/?token=\$(cat ${DATA_DIR}/serve-token)" | tee "\$APP_DIR/url.txt"
|
|
196
|
+
else
|
|
197
|
+
echo "[!] 没起来,看日志: tail -20 \$APP_DIR/server.log"
|
|
198
|
+
fi
|
|
199
|
+
EOS
|
|
200
|
+
|
|
201
|
+
cat > "$APP_DIR/stop.sh" <<EOS
|
|
202
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
203
|
+
# 停止 LookatStudy
|
|
204
|
+
pkill -f "server.cjs --port ${PORT}" 2>/dev/null && echo "[✓] 已停止" || echo "服务本来就没在运行"
|
|
205
|
+
termux-wake-unlock 2>/dev/null
|
|
206
|
+
exit 0
|
|
207
|
+
EOS
|
|
208
|
+
|
|
209
|
+
cat > "$APP_DIR/status.sh" <<EOS
|
|
210
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
211
|
+
# 状态 + 访问链接
|
|
212
|
+
PORT="${PORT}"
|
|
213
|
+
if pgrep -f "server.cjs --port \$PORT" >/dev/null 2>&1; then
|
|
214
|
+
echo "[✓] 运行中(端口 \$PORT,PID \$(pgrep -f "server.cjs --port \$PORT" | tr '\n' ' '))"
|
|
215
|
+
code=\$(curl -s -o /dev/null -w '%{http_code}' --max-time 5 "http://127.0.0.1:\$PORT/" 2>/dev/null || echo 000)
|
|
216
|
+
echo " HTTP \$code"
|
|
217
|
+
else
|
|
218
|
+
echo "[✗] 未运行。启动: bash ~/lookatstudy/start.sh"
|
|
219
|
+
fi
|
|
220
|
+
[ -f "${DATA_DIR}/serve-token" ] && echo "访问链接: http://127.0.0.1:\$PORT/?token=\$(cat ${DATA_DIR}/serve-token)"
|
|
221
|
+
exit 0
|
|
222
|
+
EOS
|
|
223
|
+
|
|
224
|
+
cat > "$APP_DIR/update.sh" <<EOS
|
|
225
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
226
|
+
# 更新便携包并重启(下载源带回退链,与 install-termux.sh 同款)
|
|
227
|
+
set -euo pipefail
|
|
228
|
+
APP_DIR="${APP_DIR}"
|
|
229
|
+
GH_ASSET="${GH_ASSET}"
|
|
230
|
+
cd "\$APP_DIR"
|
|
231
|
+
echo "==> 停止旧服务..."
|
|
232
|
+
pkill -f "server.cjs --port ${PORT}" 2>/dev/null || true
|
|
233
|
+
sleep 1
|
|
234
|
+
echo "==> 下载最新便携包..."
|
|
235
|
+
dl_ok=0
|
|
236
|
+
for p in "" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.top/"; do
|
|
237
|
+
if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "\${p}\${GH_ASSET}"; then dl_ok=1; break; fi
|
|
238
|
+
echo " \${p:-直连}失败,换下一个源..."
|
|
239
|
+
done
|
|
240
|
+
[ "\$dl_ok" = 1 ] || { echo "下载失败,保持原版本。"; exit 1; }
|
|
241
|
+
unzip -o ls.zip && rm -f ls.zip
|
|
242
|
+
echo "==> 重启..."
|
|
243
|
+
exec bash "\$APP_DIR/start.sh"
|
|
244
|
+
EOS
|
|
245
|
+
|
|
246
|
+
chmod 755 "$APP_DIR"/{start,stop,status,update}.sh
|
|
247
|
+
ok "常用脚本就位: ~/lookatstudy/{start,stop,status,update}.sh"
|
|
248
|
+
|
|
249
|
+
# ── 5. 自启双保险:Termux:Boot(开机)+ .bashrc(开 Termux 即拉起) ──
|
|
250
|
+
mkdir -p "$HOME/.termux/boot"
|
|
251
|
+
cat > "$HOME/.termux/boot/start-lookatstudy.sh" <<EOS
|
|
252
|
+
#!/data/data/com.termux/files/usr/bin/bash
|
|
253
|
+
termux-wake-lock 2>/dev/null
|
|
254
|
+
LD_LIBRARY_PATH="${APP_DIR}/node_modules/sherpa-onnx-node:${LD_LIBRARY_PATH:-}" nohup node ${APP_DIR}/server.cjs --port ${PORT} --web ${APP_DIR}/web --data ${DATA_DIR} >> ${APP_DIR}/server.log 2>&1 &
|
|
255
|
+
EOS
|
|
256
|
+
chmod 755 "$HOME/.termux/boot/start-lookatstudy.sh"
|
|
257
|
+
|
|
258
|
+
BASHRC_MARKER="# >>> lookatstudy autostart >>>"
|
|
259
|
+
if ! grep -q "$BASHRC_MARKER" "$HOME/.bashrc" 2>/dev/null; then
|
|
260
|
+
cat >> "$HOME/.bashrc" <<EOS
|
|
261
|
+
${BASHRC_MARKER}
|
|
262
|
+
if ! pgrep -f "server.cjs --port ${PORT}" >/dev/null 2>&1; then
|
|
263
|
+
termux-wake-lock 2>/dev/null
|
|
264
|
+
LD_LIBRARY_PATH="${APP_DIR}/node_modules/sherpa-onnx-node:${LD_LIBRARY_PATH:-}" nohup node ${APP_DIR}/server.cjs --port ${PORT} --web ${APP_DIR}/web --data ${DATA_DIR} >> ${APP_DIR}/server.log 2>&1 &
|
|
265
|
+
echo "LookatStudy 已自动启动 (http://127.0.0.1:${PORT})"
|
|
266
|
+
fi
|
|
267
|
+
# <<< lookatstudy autostart <<<
|
|
268
|
+
EOS
|
|
269
|
+
ok ".bashrc 自启已配置(以后打开 Termux = 服务自动拉起)"
|
|
270
|
+
else
|
|
271
|
+
ok ".bashrc 自启已存在"
|
|
272
|
+
fi
|
|
273
|
+
|
|
274
|
+
if pm list packages 2>/dev/null | grep -q "com.termux.boot"; then
|
|
275
|
+
ok "Termux:Boot 已安装(手机重启后会自动启动)"
|
|
276
|
+
else
|
|
277
|
+
warn "未装 Termux:Boot —— 手机重启后不会自动启动(打开 Termux 才会启动)。"
|
|
278
|
+
warn "安装(可选): https://f-droid.org/packages/com.termux.boot/ 装完打开一次授权"
|
|
279
|
+
fi
|
|
280
|
+
|
|
281
|
+
# ── 6. 电池优化:自动弹系统白名单对话框 + 按厂商给手动路径 ────
|
|
282
|
+
am start -a android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -d package:com.termux >/dev/null 2>&1 \
|
|
283
|
+
&& ok "已打开电池优化设置,请点「允许」" \
|
|
284
|
+
|| warn "无法自动打开电池设置,请按下面厂商指引手动设置"
|
|
285
|
+
|
|
286
|
+
case "$(getprop ro.product.manufacturer 2>/dev/null | tr '[:upper:]' '[:lower:]')" in
|
|
287
|
+
xiaomi|redmi)
|
|
288
|
+
echo " 设置 → 应用管理 → Termux → 省电策略 → 无限制;并给 Termux 开自启动权限"
|
|
289
|
+
;;
|
|
290
|
+
samsung)
|
|
291
|
+
echo " 设置 → 应用程序 → Termux → 电池 → 不受限制;关闭「使未使用的应用进入休眠」"
|
|
292
|
+
;;
|
|
293
|
+
huawei|honor)
|
|
294
|
+
echo " 设置 → 电池 → 应用启动管理 → Termux → 手动管理,三个开关全开"
|
|
295
|
+
;;
|
|
296
|
+
vivo)
|
|
297
|
+
echo " i 管家 → 应用管理 → 自启动 → 允许 Termux;后台高耗电允许 Termux"
|
|
298
|
+
;;
|
|
299
|
+
oppo|oneplus|realme)
|
|
300
|
+
echo " 设置 → 电池 → Termux → 允许自启动与后台运行"
|
|
301
|
+
;;
|
|
302
|
+
*)
|
|
303
|
+
echo " 设置 → 应用 → Termux → 电池 → 不受限制/不优化"
|
|
304
|
+
;;
|
|
305
|
+
esac
|
|
306
|
+
|
|
307
|
+
# ── 6.5 语音引擎(Termux 专属交叉编译包,可选) ────────────────
|
|
308
|
+
# 引擎包 ~12MB 一次性下载;语音模型(约 630MB)由用户在应用内按需下载。
|
|
309
|
+
if [ "$1" = "--voice" ] || [ -d "$APP_DIR/node_modules/sherpa-onnx-node" ]; then
|
|
310
|
+
install_voice || true
|
|
311
|
+
else
|
|
312
|
+
echo ''
|
|
313
|
+
info "可选:Termux 语音朗读/听写(引擎包约 12MB,语音模型在应用内另下)。"
|
|
314
|
+
read -r -p "[*] 现在安装吗?[y/N] " ans </dev/tty 2>/dev/null || ans="n"
|
|
315
|
+
case "$ans" in
|
|
316
|
+
y|Y) install_voice || true ;;
|
|
317
|
+
*) info "跳过(以后可: bash install-termux.sh --voice)" ;;
|
|
318
|
+
esac
|
|
319
|
+
fi
|
|
320
|
+
|
|
321
|
+
# ── 7. 启动 + 打印访问链接 ───────────────────────────────────
|
|
322
|
+
info "启动 LookatStudy..."
|
|
323
|
+
start_service
|
|
324
|
+
ok "完成。日常使用:打开启动器点「打开 LookatStudy」,或浏览器访问 http://127.0.0.1:$PORT"
|
|
325
|
+
echo ''
|
|
326
|
+
info '语音朗读/语音输入(v0.12):桌面端功能。Termux 是 bionic libc,sherpa-onnx 原生引擎暂无'
|
|
327
|
+
info '预编译包,手机端自动优雅降级(界面不显示语音入口或提示平台不支持),不影响其他功能。'
|
package/package.json
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lookatstudy-mobile",
|
|
3
|
+
"version": "0.12.1",
|
|
4
|
+
"description": "LookatStudy Termux portable bundle (server.cjs + web frontend)",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/Kaiji-Z/LookatStudy.git"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT"
|
|
10
|
+
}
|