lxh2875931338
|
708ab91ccb
|
fix(playback): 播放页/迷你播放器立即显示已有封面,不再等元数据流程
原因有两层:
1) Song 模型没有封面路径,播放时只带 url/title/artist,
播放页只能等元数据服务返回 artwork 字节后才显示;
2) 元数据回来后用新 Song 覆盖当前歌曲时丢了 artworkPath,
即使带上了也会被冲掉。
- Song 增加 artworkPath 字段
- PlaybackController / 首页收藏 / playPlaylist 构造 Song 时带上
- 播放页:artwork 字节优先,其次直接读 artwork_path 文件
- 迷你播放器同样加 FileImage 兜底
- 元数据更新重建 Song 时保留 artworkPath
真机验证:点击播放后封面立即出现,不再先显示音符占位。
|
2026-11-01 16:15:49 +08:00 |
|
lxh2875931338
|
a927e3dd44
|
fix(favorite): 收藏状态变化时主页实时刷新
之前主页收藏列表只在启动或从文件列表返回时重查,
在播放页/文件列表点红心,主页不会变。
- 新增 FavoriteEvents(songPath 事件)
- 文件列表、播放页收藏/取消后 publish
- 主页订阅后重新拉取收藏列表
|
2026-11-01 15:24:28 +08:00 |
|
lxh2875931338
|
b6e2340aae
|
style(ui): 收藏行高恢复至原版尺寸
封面 38->44、标题 14->16、副标题 12->13、行内边距回到 2。
媒体库区间的收紧(12 / 16)保持不变。
|
2026-11-01 15:12:13 +08:00 |
|
lxh2875931338
|
eea8e46a90
|
style(ui): 收藏行高回调一档
封面 32->38、标题 13->14、副标题 11->12,
行高从 ~71dp 回到 ~81dp,介于"过松"和"过小"之间。
|
2026-11-01 15:09:56 +08:00 |
|
lxh2875931338
|
fc9a630dd0
|
style(ui): 收紧媒体库内部间距
- WebDAV 卡片与"本地音乐/最近播放"之间:24 -> 12
- 按钮行与"我的收藏"标题之间:32 -> 16
|
2026-11-01 15:08:15 +08:00 |
|
lxh2875931338
|
dbbf215ba8
|
style(ui): 主页列表尺寸按设计稿收紧
- 清听 28->24、媒体库 22->20、我的收藏标题 22->20
- 本地音乐/最近播放按钮文字 14->13
- 收藏项:封面 44->32、标题 16->13、副标题 13->11,
padding 2->0,minVerticalPadding 0
- 行高约 90dp -> 71dp,更接近设计稿的密度
|
2026-11-01 15:06:57 +08:00 |
|
lxh2875931338
|
83ab47d8fc
|
fix(metadata): 补上事件订阅,缓存命中也推送一次
上一条只加了字段和回调,listen 没插进去(列表不会刷新)。
另外歌曲元数据在 SQLite 命中时直接 return,也不会发事件——
导致"标签其实早就在库里、列表却还显示文件名"。
- HomePage / WebDAVFileListPage 补上 stream.listen 与 cancel
- MetadataService 的 SQLite 命中分支也 publish 一次(幂等,按 path 覆盖)
验证方式:播放一首收藏里显示文件名的歌 -> 返回主页 -> 该行应变为标签标题。
|
2026-11-01 12:22:46 +08:00 |
|
lxh2875931338
|
6ca31c37ba
|
feat(metadata): 元数据补全后主动推送界面刷新
之前标签补全后,收藏/文件列表要退出重进才显示新信息。
- 新增 MetadataEvents 事件总线(MetadataUpdate: path + songs 行)
- MetadataService 写库成功后 publish
- 首页收藏列表订阅:按 path 替换对应 SongItem(标题/艺术家/封面)
- WebDAV 文件列表订阅:按 path 更新 _metaByPath
效果:歌曲播完标签抓取完成后,列表里的那一行自动变成标签信息,
不需要返回重进。
|
2026-11-01 12:18:21 +08:00 |
|
lxh2875931338
|
632713d133
|
feat(ui): 主页收藏/歌单改为跟手 PageView
之前是"横向手势 + 淡入切换",与播放页的跟手滑动不一致。
- 列表区改为 SliverFillRemaining + PageView,直接跟手左右滑
- 媒体库/按钮保持固定,外层 CustomScrollView 不再滚动
- 收藏/歌单各自是独立 ListView,可正常纵向滚动
- 去掉原来的 GestureDetector 和淡入动画
- 标题行指示器继续跟随当前页
真机验证:左右滑动切换正常,指示器跟随。
|
2026-11-01 12:15:44 +08:00 |
|
lxh2875931338
|
432e3b1260
|
fix(webdav): 重新登录成功后回到主页,而不是停在文件列表
原因:_connect() 成功后用 pushReplacement(WebDAVFileListPage),
把 Setup 页替换成文件列表,所以看起来"登录完不返回"。
- 改为 Navigator.popUntil(isFirst):无论首次配置还是重新登录,都回主页
- 首页"重新登录"入口改为 await push,返回后重新加载 WebDAV 状态并刷新
- 清理两个未使用的 import
|
2026-11-01 11:55:38 +08:00 |
|
lxh2875931338
|
7bf8d18f18
|
fix(ui): 加入歌单弹层不再被迷你播放器遮挡
原因:迷你播放器挂在 Navigator overlay 上,层级高于底部弹层,
弹层里的歌单列表被它盖住,看起来像"没读到歌单"。
(日志确认查询正常:读到 1 个歌单)
- RouteManager 抽到 services/route_manager.dart,新增临时隐藏开关
- 打开"加入歌单"弹层时隐藏迷你播放器,关闭后恢复
- main.dart 的 shouldShow 改用 showMiniPlayer(原来直接读路由,开关不生效)
- 弹层底部加 SafeArea minimum + 16px 余量,不再贴着手势区
真机验证:弹层正常显示 "TL / 1 首",底部留出安全距离。
|
2026-11-01 00:09:27 +08:00 |
|
lxh2875931338
|
f793223311
|
feat(ui): 主页收藏/歌单左右滑动切换
- 媒体库下方按钮由三个减为两个(本地音乐 / 最近播放),对称排列
- 收藏区改为双页:我的收藏 / 歌单列表,左右滑动切换
- 标题行随页变化(图标 + 文案),右侧加两点指示器(当前页长条)
- 歌单项左侧改为歌单图标(不再是歌曲封面),显示名称与歌曲数
- 点击歌单进入详情页,返回后自动刷新
- 手势挂在 CustomScrollView 外层,纵向滚动不受影响
真机验证:左右滑动切换正常,指示器跟随,歌单列表显示 TL / 1 首。
|
2026-10-31 23:55:02 +08:00 |
|
lxh2875931338
|
e89bd6381a
|
feat(playlist): 歌单集合页 + 歌单详情页 + 首页入口
style(ui): 播放页红心与标题居中对齐、标题单行
- playlists_page:歌单列表(封面/名称/歌曲数)、新建、重命名、删除
- playlist_detail_page:歌单内歌曲、播放全部、单曲播放、移除
- 首页"歌单列表"按钮接入 PlaylistsPage
- 播放页:标题行改为 center 对齐、标题限制单行,
收藏按钮压到 36x36,红心与标题不再错位
|
2026-10-31 23:37:47 +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
|
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
|
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
|
81990385f4
|
页面层级与返回逻辑实现完成,并且去掉web相关代码支持
|
2026-08-19 23:27:47 +08:00 |
|
lxh2875931338
|
74a15ca7af
|
部分界面逻辑调整:播放界面默认最高优先级,其次是独立的miniplayerbar
|
2026-08-18 23:08:52 +08:00 |
|
lxh2875931338
|
c05398d76f
|
部分界面调整,把底部的播放控件完整前置
|
2026-08-18 22:57:29 +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
|
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 |
|