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.
Files changed (77) hide show
  1. package/README.txt +19 -0
  2. package/install-termux.sh +327 -0
  3. package/package.json +10 -0
  4. package/seed-course.json +679 -0
  5. package/server.cjs +495218 -0
  6. package/sql-wasm.wasm +0 -0
  7. package/web/assets/abnfDiagram-N423BO3Z-BFNTWI49.js +1 -0
  8. package/web/assets/api-web-BSU76jU3.js +1 -0
  9. package/web/assets/app-height-D5bf5z0g.js +1 -0
  10. package/web/assets/arc-Ci0WYiAH.js +1 -0
  11. package/web/assets/architectureDiagram-T3A2C74G-DX5jRTha.js +36 -0
  12. package/web/assets/blockDiagram-VBNYF7ZC-DjzKFpxY.js +132 -0
  13. package/web/assets/c4Diagram-5PPSVZJV-CIG-Sdcg.js +10 -0
  14. package/web/assets/channel-BmMZwizg.js +1 -0
  15. package/web/assets/chunk-2GRJ4B5K-D1h0uIyK.js +1 -0
  16. package/web/assets/chunk-2Q5K7J3B-cLoZ93yC.js +1 -0
  17. package/web/assets/chunk-5RXB4S5H-CSaMcbxs.js +231 -0
  18. package/web/assets/chunk-5VM5RSS4-JLvS-B89.js +15 -0
  19. package/web/assets/chunk-6Q2QTUOP-DXM7xtsH.js +88 -0
  20. package/web/assets/chunk-GF5L2VYU-BMXbp2Lo.js +206 -0
  21. package/web/assets/chunk-JWPE2WC7-DPQPMhNL.js +1 -0
  22. package/web/assets/chunk-KBJHAD2P-Bh3aU5gZ.js +1 -0
  23. package/web/assets/chunk-RYQCIY6F-wL-LEvWn.js +1 -0
  24. package/web/assets/chunk-XXDRQBXY-BPEP-05C.js +1 -0
  25. package/web/assets/classDiagram-JCYQIIEL-vXvWKIQn.js +1 -0
  26. package/web/assets/classDiagram-v2-OCEON4UE-vXvWKIQn.js +1 -0
  27. package/web/assets/cose-bilkent-JH36ORCC-CIy59RcY.js +1 -0
  28. package/web/assets/cynefin-VYW2F7L2-jbV2BJ_V.js +178 -0
  29. package/web/assets/cynefinDiagram-MW4NZA55-Cc7aMDYj.js +62 -0
  30. package/web/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  31. package/web/assets/dagre-VZM6K2ZE-Dsdu5Zt7.js +4 -0
  32. package/web/assets/defaultLocale-DX6XiGOO.js +1 -0
  33. package/web/assets/diagram-7IWD3JNH-DJ4Yft6o.js +30 -0
  34. package/web/assets/diagram-B4RE2ZJO-CBh3xkIP.js +3 -0
  35. package/web/assets/diagram-LBJQPF4R-C-Iljnoj.js +24 -0
  36. package/web/assets/diagram-Q27KOJAE-8HHiRyk2.js +24 -0
  37. package/web/assets/diagram-UB23O5K3-C3K2kFAQ.js +41 -0
  38. package/web/assets/ebnfDiagram-BXEA7PRR-r1mdnIKj.js +1 -0
  39. package/web/assets/erDiagram-JOGREHBK-dYLNtxz3.js +85 -0
  40. package/web/assets/flowDiagram-UKHOOZJN-BYDIRoMm.js +156 -0
  41. package/web/assets/ganttDiagram-PKOTCBZU-CnCtvDzl.js +292 -0
  42. package/web/assets/gitGraphDiagram-DS77QQ5N-rG8kwFmL.js +106 -0
  43. package/web/assets/graph-C9eacEi8.js +1 -0
  44. package/web/assets/index-132uBtFQ.css +1 -0
  45. package/web/assets/index-CG9cZjNC.js +548 -0
  46. package/web/assets/infoDiagram-6WML65LV-BTcUhfqr.js +2 -0
  47. package/web/assets/init-Gi6I4Gst.js +1 -0
  48. package/web/assets/ishikawaDiagram-WSZJBQD7-CJviqcY8.js +70 -0
  49. package/web/assets/journeyDiagram-NVQOT4AX-8JWo64Wa.js +139 -0
  50. package/web/assets/kanban-definition-27J2QSJJ-BHD0yFL_.js +89 -0
  51. package/web/assets/katex-C5jXJg4s.js +257 -0
  52. package/web/assets/layout-DEXfKzaS.js +1 -0
  53. package/web/assets/linear-CT2ADXOb.js +1 -0
  54. package/web/assets/map-Czzmt4hB.js +1 -0
  55. package/web/assets/mermaid.core-DntY_Zhl.js +314 -0
  56. package/web/assets/mindmap-definition-FAOFIHXS-B_yUIQHi.js +96 -0
  57. package/web/assets/ordinal-Cboi1Yqb.js +1 -0
  58. package/web/assets/pegDiagram-VL7TDLO6-BopqqStm.js +1 -0
  59. package/web/assets/pieDiagram-7S7Q4E2Y-Com2ypw6.js +39 -0
  60. package/web/assets/quadrantDiagram-CIZ2JOQS-G0dlgjbr.js +7 -0
  61. package/web/assets/railroadDiagram-AXF67PYL-ChpuDwPP.js +1 -0
  62. package/web/assets/requirementDiagram-LRYGKXZP-CDD5pE1Z.js +84 -0
  63. package/web/assets/sankeyDiagram-W5VNT64P-DO-0GGh4.js +40 -0
  64. package/web/assets/sequenceDiagram-SI44F4Z6-__Qnpiz7.js +162 -0
  65. package/web/assets/sizeCapture-X5ZJPWSS-BxPWVmpa.js +1 -0
  66. package/web/assets/stateDiagram-OKZ733FA-DD0m6rt6.js +1 -0
  67. package/web/assets/stateDiagram-v2-UEYNNEHI-BHOUKhEe.js +1 -0
  68. package/web/assets/swimlanes-SLNWSIFB-m5XzOcas.js +2 -0
  69. package/web/assets/swimlanesDiagram-ULZ7WXOC-Bs3hfWP0.js +8 -0
  70. package/web/assets/timeline-definition-Z64GVDOM-D19Nd7I_.js +120 -0
  71. package/web/assets/vennDiagram-T6HMQDX7-DqFIJV1L.js +34 -0
  72. package/web/assets/wardleyDiagram-T6FBY63Y-CKVK_9QD.js +78 -0
  73. package/web/assets/xychartDiagram-ELKLHX3M-B85Rr0Fa.js +7 -0
  74. package/web/icon-192.png +0 -0
  75. package/web/icon-512.png +0 -0
  76. package/web/index.html +53 -0
  77. 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
+ }