Fam Zheng
|
83418c198f
|
music(player): 收藏功能 — title 旁 ★/☆,收藏的曲目置顶
deploy music / build-and-deploy (push) Successful in 1m58s
|
2026-05-26 10:04:21 +01:00 |
|
Fam Zheng
|
0756362d14
|
music(player): sidebar 双击切歌并播放(单击只切换不打扰)
deploy music / build-and-deploy (push) Successful in 2m10s
|
2026-05-26 09:58:22 +01:00 |
|
Fam Zheng
|
adbd259a32
|
music(perf): 切歌延迟修 — getAudioUrl 同步短路 + SW install 并发
deploy music / build-and-deploy (push) Successful in 2m4s
诊断:之前 loadPiece 链上加了 `audio.src = await getAudioUrl(...)`,await IDB
即使 cache disabled 也排队个 microtask;叠加 SW install 串行 23 个 fetch
让首次部署后明显卡。
修法:
- getAudioUrl 改同步:内存 blob 命中 / cache 关 → 立返;启用 cache 时内存没
→ 仍返网络 URL,后台 warm IDB 下次用
- audio.src = getAudioUrl(id) 不再 await,零等待
- SW install 改 cache.addAll 并发(HTTP/2 多路),失败回退串行
|
2026-05-26 09:37:24 +01:00 |
|
Fam Zheng
|
8991033f70
|
music(pwa): PWA + 可选离线缓存全库(IndexedDB),默认关
deploy music / build-and-deploy (push) Successful in 2m1s
- vite-plugin-pwa injectManifest 模式,自定义 sw.js precache app shell
- manifest 支持加桌面 + standalone(icon 暂借 werewolf 紫色调,后续换)
- src/lib/cache.js IDB 缓存层:audio + 谱面 PNG 单 attachment id 存放,blob URL 复用
- 启动 initCache 按 localStorage 'music.cache.enabled' 决定是否后台开始下载
- 后台 worker:串行 concurrency=2 + 80ms 间隔,仅 WiFi 时跑(默认)
- audio src 优先走 IDB blob URL,没缓存才走网络
- /settings 配置页:开关 + 仅 WiFi 切换 + 进度条 + 用量/quota + 清空缓存
- topbar 加 ⚙ 按钮
默认关,首次明确 prompt-by-checkbox 才开。整库 ~1.5GB。
|
2026-05-25 22:09:54 +01:00 |
|
Fam Zheng
|
1a62ec6658
|
music(player): 切歌不打扰 — 暂停状态切别的不自动开播 + tab 保持
deploy music / build-and-deploy (push) Successful in 2m0s
- loadPiece 进来先 snapshot wasPlaying / stickyTab
- 新 piece 也有同样 tab 就保持(chord/notes/简谱…),否则才回第一个
- 只有切歌前 audio 正在播才 .play();暂停 / 第一次进入 → 只 set src 等用户点 ▶
- 整理 notes / 看和弦谱的场景从此不会被切歌打断
|
2026-05-25 10:39:49 +01:00 |
|
Fam Zheng
|
cdbf8308d1
|
music(player): 变速播放 + AB Loop
deploy articulate / build-and-deploy (push) Failing after 1m42s
deploy cube / build-and-deploy (push) Successful in 2m5s
deploy karaoke / build-and-deploy (push) Failing after 2m2s
deploy simpleasm / build-and-deploy (push) Successful in 2m21s
deploy music / build-and-deploy (push) Successful in 4m2s
deploy werewolf / build-and-deploy (push) Failing after 58s
- 变速:底部 1× 圆形按钮循环切 0.5/0.75/1/1.25/1.5;preservesPitch=true(浏览器 native 保音高);localStorage 持久化全局
- AB Loop:A B 两按钮在当前位置打点,🔁 开关;进度条上绿色高亮 A↔B 区段;timeupdate 触发 ≥B 跳回 A;切歌自动清 A/B
|
2026-05-10 21:40:19 +01:00 |
|
Fam Zheng
|
5674be1cfd
|
music(ui): 简化只留「和弦谱」一个抓取 tab,简谱/字母版废弃
deploy music / build-and-deploy (push) Successful in 1m54s
|
2026-05-10 21:32:49 +01:00 |
|
Fam Zheng
|
e5f3a95aa9
|
music(ui): 统一命名 — 和弦谱(字母版) / 简谱(级数版)
deploy music / build-and-deploy (push) Successful in 1m54s
|
2026-05-10 16:09:56 +01:00 |
|
Fam Zheng
|
26b99d7405
|
fix(inspire): placeholder 里的中文弯引号会被 vue parser 当 attribute 边界
deploy music / build-and-deploy (push) Successful in 1m54s
|
2026-05-10 15:52:34 +01:00 |
|
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 |
|