### 问题描述 建议分类:**Bug**(现有手动选源交互无法记录当前资源的偏好)。 在播放页的「自动匹配」列表里,手动点击当前正在播放的同一条线路,无法把该源记录为本条目的优先 Web 源(源行背景高亮)。 实测有两种情况: - 当前没有优先源,资源 C 由自动选择选中:点击正在播放的 C,C 不会变成高亮优先源。 - 已记忆的优先源是 A,但当前实际播放的是 C:点击正在播放的 C,优先源仍是 A,不能通过这次点击更新成 C。 先手动切到其他资源,再切回 C,才可以把 C 记为优先源。这要求用户为了记录偏好而额外切换播放资源。 这里区分两个 UI 状态:线路按钮的选中态表示当前正在播放的资源;源行背景高亮表示本条目已记忆的优先 Web 源。问题是前者已经选中时,无法通过手动点选更新后者。 **期望行为** 手动点击当前正在播放的资源时,也能够完成正式手动选择所包含的偏好记录,使该源成为本条目的优先 Web 源。资源没有变化时应保持当前播放和进度,不需要为记录偏好重新加载媒体。 #### 代码定位与调用链 以下核对了发布标签 `v6.4.0-beta01`,并对照了当前上游提交 `2acc43bb84e079353b9d435e0a65422b39d4d559`,相关提前返回和偏好写入逻辑一致。下面是静态代码分析;未为本报告另行运行自动化测试。 1. [AutoMatchPage.kt](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/ui-mediaselect/src/commonMain/kotlin/ui/mediaselect/auto/AutoMatchPage.kt#L57) 的线路 `onSelect` 取 `channel.original` 调用 `onClickItem`。播放页宿主随后调用 `mediaSelectorState.select(it)`。 2. [MediaSelectorState.select](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/ui-mediaselect/src/commonMain/kotlin/ui/mediafetch/MediaSelectorState.kt#L382) 调用 `mediaSelector.select(candidate)`。 3. [DefaultMediaSelector.select](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/app-data/src/commonMain/kotlin/domain/media/selector/MediaSelector.kt#L527) 以 `updatePreference = true` 进入 `selectImpl`,但 `force` 使用默认值 `false`。[selectImpl 的提前返回](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/app-data/src/commonMain/kotlin/domain/media/selector/MediaSelector.kt#L549) 位于所有偏好处理之前: ```kotlin val previous = selected.value if (!force && previous == candidate) return false ``` 4. 因此,重复点选相同资源不会执行后面的 `alliance/resolution/mediaSourceId/subtitleLanguageId` 偏好更新,也不会调用 `broadcastChangePreference()` 或 `broadcastWebSourcePreference(candidate.mediaSourceId)`。 5. [ObserveWebMediaSourcePreferenceExtension](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/app-data/src/commonMain/kotlin/domain/player/extension/ObserveWebMediaSourcePreferenceExtension.kt#L53) 依赖上述 Web 偏好事件,才会调用 `setPreferredWebMediaSource(subjectId, mediaSourceId)`。事件没有发出,已保存的优先源就保持为空或原来的 A。 6. [MediaSelectorState.createWebSourceFlow](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/ui-mediaselect/src/commonMain/kotlin/ui/mediafetch/MediaSelectorState.kt#L335) 根据 `source.mediaSourceId == preferred` 生成 `isPreferred`;[MediaSelectorWebSourcesColumn](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/ui-mediaselect/src/commonMain/kotlin/ui/mediaselect/selector/MediaSelectorWebColumn.kt#L134) 根据它绘制源行背景,所以界面上不会出现期望的高亮变化。 自动选择通过 [selectAutomatically](https://github.com/open-ani/animeko/blob/v6.4.0-beta01/app/shared/app-data/src/commonMain/kotlin/domain/media/selector/MediaSelector.kt#L516) 更新 `selected`,本身不发出偏好更新事件,所以「当前正在播放」与「已记为优先源」可以不同;重复手动点击正好被相同资源判断挡住。 处理时需要区分「播放资源是否变化」与「用户是否明确要求记录选择偏好」,避免为了触发偏好写入而强制广播资源切换事件、重新加载视频。 ### 复现步骤 1. 在 Android 6.4.0-beta01 打开一部番剧的一集,让自动选源选到可播放资源 C。 2. 打开播放页的数据源面板,保持「自动匹配」模式。确认 C 正在播放,但 C 源整行没有被标为优先源(可能没有任何优先源,也可能高亮的是另一个源 A)。 3. 点击 C 源下当前已经选中的同一条线路按钮。 4. 重新打开面板,C 仍没有成为高亮优先源。 5. 对照:先手动切到另一资源,再手动切回 C,此时 C 可以成为高亮优先源。 ### Ani 版本号 6.4.0-beta01(Pre-release) ### 操作系统 Android 手机/平板 ### 应用日志 暂未附日志。以上包含 Android 使用时观察到的现象和对应版本的代码分析;未附实机录屏。
Activity