Skip to content

自动匹配中重复点选当前播放资源,无法将其设为优先 Web 源 #3646

Open

Description

@SXP-Simon

问题描述

建议分类:Bug(现有手动选源交互无法记录当前资源的偏好)。

在播放页的「自动匹配」列表里,手动点击当前正在播放的同一条线路,无法把该源记录为本条目的优先 Web 源(源行背景高亮)。

实测有两种情况:

  • 当前没有优先源,资源 C 由自动选择选中:点击正在播放的 C,C 不会变成高亮优先源。
  • 已记忆的优先源是 A,但当前实际播放的是 C:点击正在播放的 C,优先源仍是 A,不能通过这次点击更新成 C。

先手动切到其他资源,再切回 C,才可以把 C 记为优先源。这要求用户为了记录偏好而额外切换播放资源。

这里区分两个 UI 状态:线路按钮的选中态表示当前正在播放的资源;源行背景高亮表示本条目已记忆的优先 Web 源。问题是前者已经选中时,无法通过手动点选更新后者。

期望行为

手动点击当前正在播放的资源时,也能够完成正式手动选择所包含的偏好记录,使该源成为本条目的优先 Web 源。资源没有变化时应保持当前播放和进度,不需要为记录偏好重新加载媒体。

代码定位与调用链

以下核对了发布标签 v6.4.0-beta01,并对照了当前上游提交 2acc43bb84e079353b9d435e0a65422b39d4d559,相关提前返回和偏好写入逻辑一致。下面是静态代码分析;未为本报告另行运行自动化测试。

  1. AutoMatchPage.kt 的线路 onSelect 取 channel.original 调用 onClickItem。播放页宿主随后调用 mediaSelectorState.select(it)。

  2. MediaSelectorState.select 调用 mediaSelector.select(candidate)。

  3. DefaultMediaSelector.select 以 updatePreference = true 进入 selectImpl,但 force 使用默认值 false。selectImpl 的提前返回 位于所有偏好处理之前:

    val previous = selected.value
    if (!force && previous == candidate) return false
  4. 因此,重复点选相同资源不会执行后面的 alliance/resolution/mediaSourceId/subtitleLanguageId 偏好更新,也不会调用 broadcastChangePreference() 或 broadcastWebSourcePreference(candidate.mediaSourceId)。

  5. ObserveWebMediaSourcePreferenceExtension 依赖上述 Web 偏好事件,才会调用 setPreferredWebMediaSource(subjectId, mediaSourceId)。事件没有发出,已保存的优先源就保持为空或原来的 A。

  6. MediaSelectorState.createWebSourceFlow 根据 source.mediaSourceId == preferred 生成 isPreferred;MediaSelectorWebSourcesColumn 根据它绘制源行背景,所以界面上不会出现期望的高亮变化。

自动选择通过 selectAutomatically 更新 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 使用时观察到的现象和对应版本的代码分析;未附实机录屏。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    • Status
      Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions