Commit Graph

67 Commits

Author SHA1 Message Date
Fam Zheng ccb5ad05ce music(inspire): 加「💡 今天练什么」灵感推荐 modal
deploy music / build-and-deploy (push) Failing after 1m50s
- 后端 POST /api/inspire 流式 SSE:随机 keyword 池(23 个)+ 用户曲库画像(recent/top/least)+ Tavily 热点搜索 → gemma stream(temperature=1.0)
- Tavily key 走 k8s Secret tavily-creds(复用 mochi config 同一 token)
- 每次按按钮:keyword 随机 + 用户可输 hint("想练快歌" / "陪儿子" / "新东西")
- 输出强制格式:4 首歌('补回来' 2 + '试试新' 2),每首歌名-歌手 + 一句理由
- 前端 topbar 加 💡 按钮,modal 流式渲染(极简 md:**bold** + 列表)
2026-05-10 15:52:00 +01:00
Fam Zheng f7fac352a5 music(player): 加音量条 + 静音按钮(localStorage 持久化)
deploy music / build-and-deploy (push) Successful in 1m48s
2026-05-10 15:39:30 +01:00
Fam Zheng fd80116168 music(chord): 拆两个 tab + 抓两种 (letters/functional)
deploy music / build-and-deploy (push) Successful in 1m54s
- yopu 切 /song?title=&artist= 搜索(避免歌手词被搜糊)
- 抓的版本按搜索结果 nier-snippet svg <text> 数区分:
  >0 = 字母谱 (G/Em7/C 弹唱谱);==0 = 功能谱 (1/4/5/6m 数字级数)
- sidecar fetch/status/state/image 都走 (id, mode) 维度,文件落 /data/chord-fetch/{id}-{mode}.png
- backend chord_fetch / chord_status 接 ?mode=letters|functional,import 时 role 分别为 chord_letters / chord_functional
- 前端 chord tab 拆「吉他谱」+「功能谱」,state/error/poll 各自独立;旧 role='chord' 显示在「吉他谱」兼容历史 import
- verified 标记探测:匿名访问 yopu HTML 里 0 hits(要登录可见),暂时只能按 svg_text 区分
2026-05-10 15:10:03 +01:00
Fam Zheng f836c8dab7 music: 乐谱图点击全屏(再点 / ESC 退出)
deploy music / build-and-deploy (push) Successful in 1m48s
2026-05-10 14:59:07 +01:00
Fam Zheng eed5e88dc0 music(chat): 去掉麻薯人格 prompt,只注入曲目 context
deploy music / build-and-deploy (push) Successful in 1m44s
2026-05-10 14:57:36 +01:00
Fam Zheng c0d6e37325 music: 加 LLM chat、笔记 tab 化、歌单/标签
deploy cube / build-and-deploy (push) Successful in 1m8s
deploy music / build-and-deploy (push) Successful in 2m15s
deploy simpleasm / build-and-deploy (push) Successful in 1m25s
chat(右边栏):
- chat_messages 表 per piece,OpenAI 兼容 /v1/chat/completions stream:true
- backend SSE forward delta,结束时落库 user + assistant
- system prompt 注入曲目 (title/artist/category/notes/lyrics 截 4KB)
- 网关同 mochi/config.yaml: gemma-4-31b-it on 3.135.65.204:8848,token 走 k8s Secret chat-creds
- reqwest client 去掉全局 timeout(chat 流可能跑很久),chord sidecar 调用改 per-request timeout

笔记: 从右 sidebar 移到独立 tab "笔记"

歌单 + tag:
- playlists / playlist_pieces / tags / piece_tags 表,CRUD API
- PATCH piece 接 tags 数组(按名字 upsert)
- list pieces 加 ?tag/?playlist 过滤 + 返回 tags 列表
- 顶 bar filterbar:歌单 + 标签 chip 切换;"+ 新歌单" prompt 创建
- EditView 加 tag 编辑(chip + 自动补全)+ 加入/移除歌单
2026-05-10 14:51:53 +01:00
Fam Zheng 9623e298b7 music(chord): 关掉 row 切换的 dump + 噪音 log,搜索阶段选功能谱已经够
deploy music / build-and-deploy (push) Successful in 1m57s
2026-05-09 23:19:16 +01:00
Fam Zheng ceaa2cc839 music(chord): 选搜索结果里的功能谱(数字级数版本),不要字母谱
deploy music / build-and-deploy (push) Successful in 1m50s
yopu 搜索结果同一首歌通常有多个版本,区分方式:
- 字母谱:nier-snippet 里 SVG <text> 渲染 chord 字母(G/Em7/C 等)
- 功能谱:nier-snippet 里没 SVG <text>,直接 HTML/CSS 显示 1/4/5/6m

按 svgTextCount === 0 优先选第一个功能谱,没功能谱才 fallback 到字母谱。
view 页里没有「谱面样式」「和弦样式」row(要登录 APP 才有),所以这是唯一可行路径。

实测 独家记忆/倔强/Casablanca 三首都拿到正确的功能谱截图。
2026-05-09 23:15:41 +01:00
Fam Zheng 05df371435 music(chord): yopu UI 升级修 selector + 加 PVC override 与调试 dump
deploy music / build-and-deploy (push) Successful in 1m59s
- yopu 现在搜索结果默认全是和弦谱(不再标「和弦谱」字样),改成直接取第一个 a.post-main
- chord_server 启动时把 /data/chord-overrides/ 加到 sys.path 优先级最高,方便后续不 rebuild image 直接 cp yopu.py 热修
- 失败路径 dump HTML + 截图到 /data/chord-debug,view 页 selector 失败也能事后看
2026-05-09 23:02:34 +01:00
Fam Zheng e111398157 music(chord): 加 yopu.co 吉他谱自动抓取(sidecar 模式)
deploy cube / build-and-deploy (push) Successful in 1m15s
deploy simpleasm / build-and-deploy (push) Successful in 1m19s
deploy music / build-and-deploy (push) Successful in 4m38s
复刻 ../guitar 的功能:
- 新加 chord-fetcher sidecar(python 3.11 + chromium + selenium),跟 main 同 pod 共享 PVC
- yopu.py v2:搜「和弦谱」→ 进 view → 选 谱面样式=功能谱 + 和弦样式=级数名 → 截 sheet-container → PIL 裁白边
- music backend 加 POST /api/pieces/:id/chord/fetch + GET /chord/status,转发 sidecar 并把 png import 成 image attachment role=chord
- 前端 chord tab 在没图时显示「自动抓取」按钮,点了 polling 状态、完成后刷新
- CI build 两个 image(music + music-chord),rollout 同步切版本
2026-05-09 22:52:09 +01:00
Fam Zheng 1a8f297302 music: 新建 music app,替换 piano-sheet
deploy cube / build-and-deploy (push) Successful in 1m10s
deploy music / build-and-deploy (push) Successful in 1m47s
deploy simpleasm / build-and-deploy (push) Successful in 1m20s
听歌 + 练琴曲目管理:
- 数据:piece (title/artist/category/lyrics/play_count/notes) + attachments (audio/video/pdf/image; image 带 role=chord/numbered/staff)
- 后端 axum + sqlite,附件流式落 PVC,ServeFile 支持 Range(视频拖动)
- 前端 guitar 风格 player:左 sidebar + tabs(歌词/吉他谱/简谱/五线谱/PDF/视频),LRC 同步、快捷键、笔记自动保存
- ns cube-music + music.famzheng.me + bodylimit 5GiB
- scripts/import_guitar.py 用于把 oci /data/guitar/ 旧曲库导入
2026-05-09 22:36:14 +01:00
Fam Zheng 58f344db85 piano-sheet(upload): mobile/pad first,主入口直调后置摄像头
deploy piano-sheet / build-and-deploy (push) Successful in 1m17s
- 主 CTA「拍下一页」+ capture=environment,副 CTA「从相册」multiple
- 底部 sticky 上传按钮,iOS safe area 兜住刘海/Home indicator
- 客户端压缩 1800px JPEG 0.85(createImageBitmap + EXIF 自动旋转)
- 页码 ↑↓ 移动 + ✕ 删除替代旧拖拽
2026-05-05 10:57:38 +01:00
Fam Zheng 1e04655003 ci: 统一 k8s manifest 为 apps/*/k8s/all.yaml
deploy cube / build-and-deploy (push) Successful in 1m11s
deploy piano-sheet / build-and-deploy (push) Successful in 1m44s
deploy simpleasm / build-and-deploy (push) Successful in 1m22s
- 三个 app 的 5 个独立 yaml 合成单文件 all.yaml,多 doc 内显式排序,apply 不再受目录字母序影响(这是 piano-sheet run #49 NotFound 的根因)
- simpleasm/cube workflow 补 Initialize K8s resources 步骤,跟 piano-sheet 对齐;今后 manifest 改动 CI 自动 apply
- cube 的 _registry-ingress.yaml 不再需要前缀绕排序,去掉 _
2026-05-05 10:38:38 +01:00
Fam Zheng 538bbb7ecd piano-sheet: ns cube-piano-sheet → cube-piano
ns 跟 app 名解耦,workflow 加 NS env 不再 cube-$APP 拼。
2026-05-05 10:03:38 +01:00
Fam Zheng 28713e489f app #2 piano-sheet: 钢琴谱管理 / 阅读,piano.famzheng.me
deploy cube / build-and-deploy (push) Successful in 1m8s
deploy piano-sheet / build-and-deploy (push) Failing after 1m38s
deploy simpleasm / build-and-deploy (push) Successful in 1m22s
后端 axum + sqlite,图片直接 BLOB 存进 pages 表(单张 ≤ 10MB / 单
谱 ≤ 64 页),5 个 endpoint:multipart upload、列表、详情、单页图片
(带 immutable cache header)+ healthz。

前端 vue3 + pinia + vue-router,3 个视图:列表(卡片网格 + 首页缩
略)、上传(拖拽 + 顺序预览)、阅读(全屏,左右点按 / 键盘 / 拖
拽进度条翻页,2.5s 自动隐藏 chrome)。视图状态走 URL(reader 的
当前页是 ?page=N)。

部署:cube-piano-sheet ns + 10Gi PVC + traefik ingress + 一条
buffering middleware 把 body 上限抬到 700MB。镜像 < 20MB(scratch
+ musl 静态)。
2026-05-05 09:29:02 +01:00
Fam Zheng 388b505e0b app #1 simpleasm: 从 oci 迁过来,asm.famzheng.me 已上线
deploy cube / build-and-deploy (push) Successful in 1m18s
deploy simpleasm / build-and-deploy (push) Successful in 1m45s
- 后端 FastAPI 重写为 axum + rusqlite (musl static, 2.8MB)
- 前端原样搬运 (Vue3 + Vite + Pinia + vue-router + vite-plugin-yaml)
- k8s: cube-simpleasm ns + 1Gi PVC (k3s local-path) + Recreate strategy
- CI: 复刻 deploy-cube.yml,按 apps/simpleasm/** 触发
- cube 门户里 simpleasm 状态从 pending 改成 live
- 数据冷启 (Fam 拍板不带历史进度)
2026-05-04 15:12:22 +01:00
Fam Zheng 93b6fa3061 app #0: cube.famzheng.me 入口门户 + 平台脚手架
deploy cube / build-and-deploy (push) Has been cancelled
monorepo 第一刀:
- workspace + crates/cube-core(base router / healthz / ServeDir SPA fallback / JSON tracing / SIGTERM shutdown)
- apps/cube:axum 主程序 + Vite + Vue 3 + TS 门户(暗色调 + 渐变 logo + app 卡片网格)
- Dockerfile:scratch + musl 静态二进制,镜像 2.6MB
- k8s/:cube-cube ns + Deployment + Service + Ingress(cube.famzheng.me,traefik LE 自动签)
- registry:新增 registry.famzheng.me ingress 反代到 gitea 内置 container registry,
  自动化身份用 mochi(registry.famzheng.me/mochi/cube)
- CI:.gitea/workflows/deploy-cube.yml,host shell runner(gnoc),
  build → push → kubectl rollout 五步流水
- README:把宪法段改成 monorepo 模式 + monorepo 目录结构
- 新增宪法条款:前端视图状态走 URL(path + query)保证可 bookmark
2026-05-04 11:22:59 +01:00