Skip to content

Video selection should pass AUDIO_SELECT_POLICY to plugins (for separated audio/video streams like Bilibili) #1015

Description

@cosven

Problem Statement

在当前实现中,视频选流链路只传递 VIDEO_SELECT_POLICY。对于 B 站这类音视频分离流(video + audio 独立轨道)的插件场景,插件无法从主流程拿到“音频音质策略”,因此无法基于用户的 AUDIO_SELECT_POLICY 选择音轨。

这会导致:

  • 视频清晰度可按策略选;
  • 但音频轨通常只能按插件内部固定逻辑选(例如默认最高或默认某一档);
  • 用户设置的 AUDIO_SELECT_POLICY 在视频播放场景中不生效(或无法显式生效)。

Current Behavior (Code Path)

关键路径如下:

  1. feeluown/player/playlist.py

    • _prepare_mv_media -> library.song_prepare_mv_media(song, self._app.config.VIDEO_SELECT_POLICY)
    • a_set_current_model -> library.video_prepare_media(video, self._app.config.VIDEO_SELECT_POLICY)
  2. feeluown/library/library.py

    • song_prepare_mv_media(song, policy) -> video_prepare_media(mv, policy)
    • video_prepare_media(video, policy)
      • provider 分支:provider.video_select_media(video, policy)
      • ytdl 分支:self.ytdl.select_video(video_web_url, policy, source=video.source)
  3. feeluown/library/provider_protocol.py

    • SupportsVideoMultiQuality.video_select_media(self, video, policy=None) 只有单一 policy 参数
  4. feeluown/app/config.py

    • 已存在 AUDIO_SELECT_POLICY(默认 hq<>
    • 已存在 VIDEO_SELECT_POLICY(默认 hd<>

Why This Matters

对“单流视频”问题不明显,但对“分离流视频”(尤其 B 站)影响直接:

  • 插件需要同时决策 video track 和 audio track;
  • 但框架只给到视频策略,没有统一入口传音频策略;
  • 插件作者若想遵循用户音质偏好,只能用私有约定或硬编码,难以通用。

Expected Behavior

视频选流接口可同时接收:

  • video_policy(来自 VIDEO_SELECT_POLICY
  • audio_policy(来自 AUDIO_SELECT_POLICY

从而让插件在返回 Media(VideoAudioManifest(...)) 时可以按“双策略”选流。

Backward Compatibility Requirements

希望采用“兼容旧插件”的渐进方案:

  • 旧插件(只实现旧签名)不需要立即修改,继续可用;
  • 新插件可选择实现新参数并利用 audio_policy
  • 未提供 audio_policy 时,行为与当前保持一致。

Suggested Direction (One Practical Option)

仅供讨论,目标是最小侵入:

  1. 在调用层引入双策略参数

    • playlist/library 调用 video_prepare_media(...) 时同时传:
      • video_policy=config.VIDEO_SELECT_POLICY
      • audio_policy=config.AUDIO_SELECT_POLICY
  2. 在 library/provider 层支持新参数

    • video_prepare_media(video, policy) 演进为可表达双策略(例如 video_policy + audio_policy
    • provider 侧 video_select_media(...) 增加可选 audio_policy
  3. 兼容分发

    • 框架层对旧签名 provider 做兼容调用(避免一次性破坏生态)

Acceptance Criteria

若有人愿意修复,建议至少满足:

  • 在视频播放链路里可以观测到 AUDIO_SELECT_POLICY 被传入插件层;
  • 对旧插件无崩溃、无行为回退;
  • 对支持新参数的插件,可根据 audio_policy 选择音轨;
  • 有最小测试/示例覆盖(尤其分离流场景)。

Notes

这个 issue 主要是把“问题定义 + 修复方向”说清楚,方便社区按意愿接手实现,不预设具体实现细节。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions