Commit Graph
43 Commits
Author SHA1 Message Date
lxh2875931338 abe960cf58 style(ui): 播放页指示器改为"当前页长条"样式 + 补齐底部安全区
指示器(按设计稿):
- 三段:左点 / 中条 / 右点
- 当前页对应的段展开为 30x7 长条并高亮白色,
  另外两段收起为 7x7 小点(暗)
- 主页=中间长条,信息页=左长条,歌词页=右长条,220ms 动画过渡
- 点击任一段可直接跳到对应页

安全区:
- PageView 外层包 SafeArea(top: false),
  控制按钮不再贴着 mback 手势区
2026-10-31 22:59:27 +08:00
lxh2875931338 7cd1e13a82 feat(ui): 播放页改为三页横向切换(信息 / 主页 / 歌词)
- PageView 三页:左=文件信息,中=播放主页,右=歌词
- 顶部指示器:两点+连线,左点亮=信息页,右点亮=歌词页,
  中间都暗=主页;点圆点可直接跳转
- 文件信息页:标题/歌手/专辑/文件夹/文件名/格式/路径,
  优先用 DB 元数据,路径与文件名做解码
- 歌词页:占位(暂无歌词 + 歌名)

真机验证:慢速左右滑动切换正常,指示器跟随。
2026-10-31 22:55:16 +08:00
lxh2875931338 70227afea5 feat(playlist): 歌单数据层 + 加入歌单入口
数据层:
- PlaylistSummary(歌单名/歌曲数/封面),DB 用一条 SQL 取摘要,
  封面取歌单内第一首有封面的歌
- PlaylistRepository.getSummaries() / addSongs()(批量加入并去重)
- 修复 AudioService.playPlaylist:之前把文件路径直接当 URL,
  歌单播放必然失败;现在用 WebDAVService.getFileUrl 构造

入口(视觉为临时实现,等设计稿替换):
- 文件列表长按 -> "加入歌单" 底部弹层
- 可在弹层里新建歌单并直接加入

真机验证:长按歌曲 -> 新建 "TL" -> 数据库 playlists/playlist_songs 均有记录。
测试:新增 playlist_summary 4 个用例,累计 29 个全绿。
2026-10-31 22:43:55 +08:00
lxh2875931338 e010a9c0d3 style(ui): 去掉进度条滑块圆点
圆点是别的播放器的常见元素,我们的设计里不需要。
进度条保持"细线 + 时间在两侧"的纯净形态。
2026-10-31 22:32:47 +08:00
lxh2875931338 1604f296c8 feat(ui): 播放页改为大封面 + 左对齐信息 + 底部控制骨架
按设计稿重排(背景色保持 #0E1211 不变):
- 接近全宽的圆角封面(1:1,24 圆角)
- 标题/艺术家左对齐,下面补专辑名与所在目录
- 进度条改为"时间 + 滑块 + 时间"同一行,滑块加可见圆点
- 控制行:上一首 / 播放(68 圆) / 下一首 / 收藏 / 播放队列
- 收藏按钮接 favorites 表,状态随当前歌刷新
- 更多菜单:切换播放模式、播放队列、清除缓存
2026-10-31 22:32:10 +08:00
lxh2875931338 888ea3fd54 style(ui): 列表行距收紧 + 收藏项显示封面
- 收藏列表:vertical padding 6 -> 2,ListTile 用 compact,
  标题 17->16、副标题 14->13,行高明显变紧凑
- 收藏项 leading 从音符图标换成 SongArtwork(复用 songs.artwork_path)
- WebDAV 文件列表:contentPadding 去掉 vertical 2,加 compact

真机截图确认:行距更接近设计稿,有元数据的歌显示封面。
2026-10-31 22:05:44 +08:00
lxh2875931338 ca4546871c fix(playback): 位置回退保护 + 恢复用最后已知位置 + 缓冲感知重试
对应 10/24 日志里的"播到一半中断后从头重播":
  23:05:26 ffurl_read -> 从 77s 重连成功
  23:05:33 再断 -> position 归 0 -> 看门狗"从 0s 继续",听感就是重新开始

- 新增 _lastKnownPosition:位置流累积,切歌归零;
  所有恢复路径(看门狗 / 网络切换 / 打开失败)都用它续播
- 位置回退保护(抽成 utils/position_guard.dart):
  已播 >10s 且新位置 <5s 时忽略回退,除非用户 seek / 切歌 / 正在恢复
- _scheduleOpenRetry 改为缓冲感知:
  缓冲余量 >=12s 时延迟 4s 重试(不打断),否则 1.2s;
  重试前若位置已推进超过 1s,判定 mpv 自愈,取消重连
- 收藏列表点击改为整队入队(setQueue,从点击项开始)

测试:新增 position_guard 6 个用例,累计 25 个全绿。
真机验证:收藏整队日志 "17 首,从第 16 首开始",播放正常。
2026-10-31 21:22:56 +08:00
lxh2875931338 672a545c38 feat(ui): 收藏项无元数据时,副标题显示上级文件夹名(带括号)
之前无标签时副标题固定写"收藏",和"歌手"语义混在一起。
现在取 path 的上一级目录(解码后)显示为 "(B-未分类)" 这种形式:
- 括号清楚表明是目录,不是艺术家
- 有标签时仍优先显示艺术家
- 目录层级不足或解码失败时回退为空(displaySubtitle 兜底"未知艺术家")

真机验证:收藏项显示 "13楼的大笨象 - 郑融" / "(B-未分类)"。
2026-10-24 21:44:14 +08:00
lxh2875931338 d3ed871626 fix(ui): 收藏列表文件名解码,避免显示成百分号编码串
收藏项没有元数据时回退文件名,但 path 是百分号编码的播放路径,
直接截取会显示 "13%E6%A5%BC%E7%9A%84..." 这种不可读内容。
- 展示前对文件名做 Uri.decodeComponent,解码失败才用原串
- 播放仍使用编码后的原 path,不受影响

验证:收藏 "13楼的大笨象 - 郑融" 在首页正常显示中文歌名。
2026-10-24 21:42:01 +08:00
lxh2875931338 c1e720311e feat(ui): 文件列表收藏红心 + 首页收藏绑定 favorites 表
交互调整(按讨论):
- WebDAV 文件列表:整行点击 = 播放(原来的行为),右侧播放按钮改成收藏红心
  已收藏实心红,未收藏空心;点击即写/删 favorites 表
- 首页"我的收藏"改为读 favorites 表 + songs 元数据;
  从文件列表返回时自动刷新
- 收藏项右侧红心改为真正删除(原来只是内存 removeAt)

修复:
- 收藏列表项透明度绑定 _listReveal,首屏为 0 导致条目完全透明
  (收藏成功但看不到)。收藏项改为固定 opacity 1.0。

验证(真机):
  列表点红心 -> favorites 表 +1 -> 返回首页 -> 收藏区出现该条目
2026-10-24 21:38:36 +08:00
lxh2875931338 4a8b1f28db feat(ui): 设置页第一版(缓存管理 / 诊断导出 / 连接状态 / 关于)
设置页此前没有任何入口,且内容全是占位。现在:
- 首页右上角菜单按钮 → 设置页
- 缓存:标签条数、封面数量/占用、临时探测文件占用,一键清理(保留歌单与收藏)
- 诊断:导出 版本/连接/缓存/当前播放/最近错误 到 txt,经 FileProvider 走系统分享
- 连接:显示 WebDAV 地址与用户,支持测试连接、退出登录
- 关于:版本、构建号、播放内核与 UI 许可说明
- 删除未被引用的 FullPlayerPage(与 player_page 重复)

真机验证:设置页正常打开,诊断导出成功调起系统分享面板。
2026-10-24 21:28:22 +08:00
lxh2875931338 d07086aaa0 feat(ui): 歌曲列表改用封面图,替代统一的小图标
- 新增 SongArtwork 组件:内存字节 > 本地封面文件 > 图标兜底,圆角裁剪
- WebDAV 文件列表:前导图标换成封面(来自 songs.artwork_path)
- 播放列表页:批量查封面路径(getSongsByPaths),正在播放的歌优先用内存里的封面字节;
  切歌后重新拉一次,保证新补全的封面能显示
- 没有封面的歌仍回退为音符/播放图标,不影响列表结构
2026-10-24 20:47:12 +08:00
lxh2875931338 0a1ebfa5df feat(ui): WebDAV 文件列表改用元数据标题/艺术家显示
之前列表只显示文件名,即使 DB 里已经有标签。
- SongDatabase 新增 getSongsByPaths():一次批量按路径查(分块 400,避开变量上限)
- WebDAVFileListPage:
  * 加载目录后批量取元数据,title/artist 有值就替换文件名
  * 副标题显示 "艺术家 · 大小",没有标签时仍显示大小
  * 监听 AudioService,正在播放的歌补全元数据后立即刷新对应行
  * 没有标签的新歌自然回退文件名,不影响使用
2026-10-24 20:41:21 +08:00
lxh2875931338 9e58d52678 fix(playback): 修复切歌永久假死,并让元数据抓取不再抢播放带宽
问题(后台播一段时间后无法缓冲,点下一首也没反应,只能重启):
1. _isChangingTrack 是没有超时的锁:_playCurrent() 置 true 后,
   只有走完 finally 才会清。mpv 的 open() 在弱网下可能挂很久,
   锁就一直不释放,之后 next()/previous() 全被静默拒绝。
2. 元数据用 dio.download 整文件下载,和 mpv 流式播放抢带宽,
   20Mbps FRP 下播放流只剩一两百 K/s,缓冲长期为 0。
3. 没有订阅 mpv 的 error/buffering,失败无感知、无法自愈。

改动:
- playback_service: open 20s / 控制命令 5s 超时;失败时 stop 回空闲并上抛异常
- audio_service:
  * 去掉「正在切歌就拒绝」的逻辑,改为 latest-wins(epoch 校验,
    旧请求自行放弃,只有最新请求解锁)
  * 播放失败不再吞掉:记录 lastPlaybackError 并 notifyListeners
  * 订阅 stream.error / stream.buffering
  * 缓冲超过 30s 自动重连当前歌曲并 seek 回原位置(2 分钟内最多一次)
- file_provider: 元数据改为 Range 只取头部 2MB,流式写入并在切歌时取消上一请求
- home_page: 去掉重复的 PlaybackService().play()(同一首歌会被 open 两次),
  登录校验提前

验证:dart analyze 无 error;gradlew assembleDebug BUILD SUCCESSFUL。
真机验证待设备重新连接后进行。
2026-10-23 21:04:45 +08:00
lxh2875931338 86b1d0df42 正在播放的自滑动刹车动画动作优化完成,同时调整播放页进入动作 2026-08-28 22:45:14 +08:00
lxh2875931338 2e55f94df2 优化正在播放的自滑动刹车动画动作中 2026-08-28 22:27:44 +08:00
lxh2875931338 fa396ce681 播放列表持久化设计、播放列表点击显示当前播放歌曲的列表内位置 2026-08-28 22:16:55 +08:00
lxh2875931338 9fec9b98c5 现在正在修复首次启动点击跳曲问题与顺序播放的跳曲问题 2026-08-27 22:54:18 +08:00
lxh2875931338 e58be9c17f 引入播放列表库,同时引入全新的播放控制器,以控制读库与播放模式的动作,但是功能仍在完善,需要确认部分边界问题 2026-08-27 22:29:20 +08:00
lxh2875931338 ad6617592e 修复webdav重新登录后,userID位置错位与页面跳转逻辑错误的重大bug 2026-08-27 22:04:59 +08:00
lxh2875931338 bca1288bd1 追加webdav重新登录的button,还在测试边界情况 2026-08-27 21:52:45 +08:00
lxh2875931338 90aa7d10e9 现在列表底部的信息显示正常了 2026-08-27 21:42:04 +08:00
lxh2875931338 f2b4d1f46d 通知中心封面图显示
部分界面的信息更新
缓存系统初步引入
即将进入播放列表更新
2026-08-25 23:09:17 +08:00
lxh2875931338 0e8921742c 引入部分缓存机制
引入封面图信息

正在进入测试阶段
2026-08-25 22:13:36 +08:00
lxh2875931338 f6eb1b108a 现在播放页的实时效果有了 2026-08-23 21:42:37 +08:00
lxh2875931338 d593ce05a1 现在的问题比较大,因为metadata的引入导致原有的部分播放进度信息推送错误 2026-08-23 20:29:31 +08:00
lxh2875931338 d49349f7a7 准备尝试metadata设计 2026-08-23 19:08:08 +08:00
lxh2875931338 f94cda4234 权限配置暂时到此,后台播放问题并入生命周期管理同步开发 2026-08-20 22:07:59 +08:00
lxh2875931338 81990385f4 页面层级与返回逻辑实现完成,并且去掉web相关代码支持 2026-08-19 23:27:47 +08:00
lxh2875931338 d116814bb6 界面优先级存在部分问题,先锁定到这个版本,进行后续优化 2026-08-19 21:32:54 +08:00
lxh2875931338 85463c3716 播放页部分调整,完整播放链路层级已打通 2026-08-18 23:39:22 +08:00
lxh2875931338 74a15ca7af 部分界面逻辑调整:播放界面默认最高优先级,其次是独立的miniplayerbar 2026-08-18 23:08:52 +08:00
lxh2875931338 c05398d76f 部分界面调整,把底部的播放控件完整前置 2026-08-18 22:57:29 +08:00
lxh2875931338 e96da3fb04 播放页部分调整,播放链路已打通 2026-08-17 23:29:19 +08:00
lxh2875931338 7566700bed 现阶段基础播放能力已经实现,接下来将尽全力往UI方向再调整一下 2026-08-17 23:10:24 +08:00
lxh2875931338 725116760a 还在尝试跑通播放状态 2026-08-17 23:00:30 +08:00
lxh2875931338 a6056c7f1a webdav存在自引用问题,现版本修复完成 2026-08-17 22:24:56 +08:00
lxh2875931338 457a9bf1e5 界面部分阶段性达成效果 2026-08-16 21:58:18 +08:00
lxh2875931338 1dd669287c 现在webdav链接跑通了,准备优化界面逻辑 2026-08-16 21:21:22 +08:00
lxh2875931338 699ab7ce86 暂时把bug先处理掉了,准备尝试实现最小播放目标 2026-08-15 23:20:54 +08:00
lxh2875931338 902788c736 目前调通了120全局,准备开始介入播放层,在修bug 2026-08-15 23:06:55 +08:00
lxh2875931338 15683d0bab 初步确定基础外观 2026-08-14 23:30:00 +08:00
lxh2875931338 b997391500 只保留Android支持 2026-08-14 21:39:39 +08:00