08 · 宿主界面
本章说明界面层因插件化而发生的变更。界面不包含任何数据源知识:它只调用宿主命令, 把插件返回的数据按 05 内容模型 渲染。
1. 导航结构
首页 沉浸式播放器 / 从设置中选定的片源随机播放
分类 顶部按片源分栏 / 分类横向预览 / 全部与筛选
搜索 单选、多选或综合搜索
我的 收藏 / 来自片源 / 历史(追更收在收藏内)
插件 导入、开关、插件生成的表单、线路、日志、自检
设置 应用设置 + 插件相关设置
桌面侧栏上半部为首页、分类、插件中心、设置;搜索框单独放在顶部;下半部仅一个“我的片库”入口。 移动端复用旧版 40px 纯文字窄底栏:首页、搜索、分类、我的。插件中心放在“我的”的内容顶部,进入二级页面后隐藏底栏,返回后恢复。
排行榜页面删除。 上游的榜单不再有独立页面:插件用 catalog 的排序项(sorts)
或 home 里的一个分区表达(见 06 §6)。已有的榜单入口从导航中移除。
2. 插件页(新增)
插件中心在同一页面内提供“已安装”和“导入与订阅”两个分栏。前者管理数据源、解析器、账号、配置、状态及日志;后者处理文件、地址、代码、列表预览、订阅及更新。切换分栏保留正在填写的导入内容。
2.1 列表
按 meta.kind 分成两组:数据源与解析器。每行显示:
| 元素 | 说明 |
|---|---|
| 名称与版本 | meta.name、meta.version;面向旧版协议时加标记 |
| 来源 | 导入时的本地路径或 URL;来自插件列表时显示列表名称 |
| 开关 | 启用 / 停用。停用后不再加载,也不出现在首页、分类、搜索的选择里 |
| 状态 | 停用 / 初始化中 / 就绪 / 初始化失败 / 缺少必需能力 / 运行时连续故障停用 / 有更新 |
| 操作 | 更新检查、移除(清除其数据)、进入详情 |
mature 为 true 的插件默认隐藏,在设置里开启"显示成人内容"后才出现。
2.2 导入
| 方式 | 界面 |
|---|---|
| 本地文件 | 文件选择器,支持一次选多个 .js |
| 本地插件列表 | 选 manifest.json,展示条目列表供勾选 |
| URL | 输入地址;下载后识别 JS 插件或 JSON 列表,不要求扩展名 |
| 粘贴代码 | 文本框粘贴插件源码并导入(便于从聊天、论坛复制) |
插件列表导入时,先展示条目(名称、版本、简介、是否已安装、已安装版本),默认全选,用户确认后逐个下载导入; 单个失败不影响其余,结束后汇总结果。已保存为订阅的列表,可在插件页顶部一键刷新。 默认启用并初始化新插件,也可选择仅安装。导入成功与初始化成功分别显示,不能把初始化失败伪装成文件未安装。 初始化中的插件不参与业务来源选择;需要人工处理时可直接进入详情页,不要求先搜索来触发加载。
2.3 插件详情
| 区块 | 内容 |
|---|---|
| 概况 | 名称、版本、简介、作者、主页、来源、protocol、声明的特性 |
| 插件生成的表单 | §2.4 |
| 站点线路 | 实现 endpoints 时显示:线路列表、可达性探测(手动触发)、刷新、切换 |
| 设置 | meta.settings 渲染表单;提交后宿主取消该插件调用、结束相关媒体会话并重新初始化 |
| 状态与数据 | 存储占用、清除缓存、清除数据(含登录态) |
| 日志 | 最近日志,可复制导出 |
| 自检 | 按能力运行点播、直播或解析器链路;必要时用户提供条目 ID/播放页;分别显示通过、失败、跳过与缺少输入 |
| 更新 | 检查更新、更新到新版本(有新版本时) |
2.4 插件生成的表单
插件声明表单,宿主渲染,用户在插件页里使用。 这是插件唯一能影响界面的方式。
两类来源,渲染方式一致:
| 来源 | 内容 |
|---|---|
auth 能力(06 §12) |
登录方式:账号密码、验证码、网页登录等 |
ui 能力(06 §15) |
插件自定义的动作:切换账号、自定义参数、选择线路等 |
渲染规则:
- 每个登录方式或动作是一个按钮(
label为按钮文字,description为下方说明)。 - 点击后展开表单:字段按
FormField.type渲染(文本框、密码框、下拉、数字、验证码图片等),required字段未填时禁用提交按钮。 - 提交后调用对应的
submit:{ status: "ok" }:收起表单,在插件页顶部提示一句话(message或"已完成")。{ status: "next", form }:把新表单渲染出来,之前各步填过的值保留并合并提交。- 抛
AUTH_INVALID:在表单内显示错误消息,保留已填内容。 - 抛
AUTH_REQUIRED:提示先登录。
- 已登录时,登录区块显示当前账号(
getProfile的结果)与"退出登录"。 - 无
form的登录方式(如网页登录)点击后直接调用submit,由插件决定是否打开网页视图。 - 表单只出现在插件页;界面其他位置不弹插件表单。
3. 首页
首页是打开即可播放的沉浸式舞台,不展示推荐卡片瀑布流、页面标题或宣传副标题。
3.1 片源选择
入口位于 设置 → 首页播放片源,首页不放换源入口。提供单选、多选、全选三种模式,选择在本机记忆,与搜索范围互不影响。只有已启用且具有播放及内容获取能力的片源参与;解析器不作为内容片源。
3.2 随机播放
- 优先调用片源的 feed.list;没有 feed 时从 home.getSections 取作品;只有 catalog 时随机选一个分类取样。
- 内容按片源与作品打乱,从多个片源构建播放队列。各源独立到达,失败不会阻塞其他源播放。
- 使用 entryEpisodeId 或详情中的真实播放列表 / 分集 ID 开播,支持分页分集;不猜测分集 ID。
- 上下键、滚轮或移动端纵向滑动切换作品;支持上一条、下一条。重复条目去重,重复游标终止,分页失败可重试且保留当前作品。
- 结束后是否切换下一条遵循应用设置;观看进度和收藏保存到本地。
- 没有片源、空选择、加载失败提供相应的空态和可执行入口。
3.3 播放交互
复用 Git 5f88442 的 Feed、PlayerControls、PlaybackLock、useSeekInput、底部 Sheet 与设置分组结构;VideoSurface 改接宿主准备的媒体会话,保留同一播放控制接口。
首页、搜索、分类、收藏和历史共用同一个播放器,不再使用独立作品详情页面。桌面详情、选集、评论从右侧伸出并让出视频空间,移动端使用底部抽屉。插件版不提供分享按钮。
移动端沿用单击清屏、双击暂停/播放、长按 2 倍速、长按上滑锁定倍速、横拖定位、双指缩放平移与纵向换片;清屏和全屏时隐藏底栏。
播放器提供播放 / 暂停、可拖动进度、音量与静音、倍速、字幕、全屏、平台支持时的画中画,以及触摸锁定。桌面支持 Space 播放、左右键跳转、M 静音、F 全屏。 控制栏闲置时淡出,鼠标移动、触碰或键盘焦点恢复显示。锁定时停止手势与快捷键换片。作品信息和播放线路设置保持次级层级;分集、更多信息和本地收藏从画面内操作。
4. 分类页
- 顶部固定的片源栏按插件切换,即使只有一个片源也保留。
- 每个分类按“图标 / 分类名 / 简介 — 横向封面预览 — 全部”组织;条目可横向滚动,末尾提供“查看更多”。
- 点“全部”进入该分类完整网格,保留子分类、筛选器、排序和游标分页;提供“全部分类”返回总览。
- 各分类预览独立加载、独立重试;片源切换取消过期请求,避免混入其他来源。
- 原有推荐分区、直播、图文与单源信息流入口放在对应片源下,继续按能力显示;不内置任何单平台知识。
5. 搜索页
- 复用历史版本
5f88442的搜索栏与海报卡片布局,不再显示额外的页面大标题。搜索栏右侧按钮展开范围与筛选:单选某个插件、多选若干插件、或"综合"(全部已启用且实现search的插件)。 - 未搜索时显示本地搜索历史(最多 20 条、去重置顶、点击重搜、可清空);清除输入可返回历史。热搜只展示插件实际返回的词,不内置题材或榜单。
- 范围选择与首页的来源选择相互独立,各自记忆。
- 输入过程中的联想(
suggest)只针对当前单选的那个插件;综合模式下不请求联想。 - 热搜词(
trending)按插件分栏展示。
结果展示:
单源与聚合结果都使用旧版比例的海报卡片:封面、更新标记、标题、作者或片源,以及插件实际提供的播放/点赞数。合并卡片优先使用有封面的来源,通过该来源的宿主图片会话加载;桌面三至四列、移动端两列,保留紧凑间距。
| 模式 | 展示 |
|---|---|
| 单选 | 直接展示该插件的分页结果 |
| 多选 | 每个插件一个分栏(顶部标签),各自分页 |
| 综合 | 第一个分栏是"全部",按 06 §17.1 的规则把同一作品合并成一张卡片,卡片上标注来源数量;后续分栏是各插件的原始结果 |
- 合并卡片点击后进入"来源选择":列出各来源的条目,用户选定一个后直接进入统一播放器,仅增加返回按钮。 这就是换源的入口之一。
- 各插件的结果独立到达、独立渲染;某个插件失败只影响它自己的分栏。
6. 我的
片库提供三个互斥分栏:收藏、来自片源、历史。收藏中提供“只看追更”和更新检查。封面卡片展示片源、观看进度或来源不可用状态。“来自片源”才加载账号和云端列表,需要登录的来源在登录后加载;登录操作仍前往插件中心。
- 本地片库:收藏、历史、进度。数据在本地,键为"插件 ID + 条目 ID",不依赖登录。 条目所属插件被移除时保留并标记"来源不可用"。
- 追更:片库里标记为追更的作品,用
updates.check批量检查,有更新时显示角标(latestLabel)。 - 各插件的账号区块:实现
auth的插件各占一块,显示登录态(getProfile)与云端列表 (library:收藏 / 点赞 / 历史 / 关注),并提供"导入到本地片库"。 - 换源建立来源关联,保留旧收藏与旧进度;优先按明确季集编号对齐,有歧义时选集,播放秒数由用户确认是否沿用。
- 0.0.1 作为全新插件播放器从空片库开始,不读取或迁移旧平台片库。
7. 统一播放器与详情抽屉
- 分集列表:
playlists多于一项时提供切换(如"线路 1""国语""花絮"),按真实季集编号尝试保持位置,歧义时选集。 分集带season时按季分组。 - 播放线路:
PlaybackInfo.servers多于一项时,在播放器内提供切换;切换即带上serverId重新解析。源线路与解析器线路分开显示、分别保存选择;故障后的有限重试遵循 09 §5,不无限轮询。 - 需要解析器的流:
Stream.kind为page且没有可用解析器时,提示"该来源需要安装解析器", 并提供入口跳到插件页;有多个可用解析器时让用户选,可勾选"记住这个站点的选择"。 - 外部播放:
Stream.kind为external时,询问用户后用系统或其他应用打开。 - 换源:播放器的“播放设置”抽屉提供"换源"入口,走 06 §17.2 的流程。
- 字幕:
subtitles多于一条时提供选择;default为true的默认开启。 - 收藏:本地收藏始终可用,不依赖
interact;云端收藏、点赞、关注分别按对应方法是否存在展示,未登录时引导到插件页。 - 纯直播源:从频道列表进入播放,不调用不存在的 media 方法;频道线路、解析器、刷新共用媒体会话机制。
- 会话变更:更新、停用、移除插件或修改其设置/站点线路会停止相关播放并提示重新播放;自动更新在播放结束后执行。
8. 设置页
| 分类 | 项 |
|---|---|
| 外观与播放 | 首页播放片源(单选 / 多选 / 全选)、主题、启动静音、音量记忆、默认清晰度偏好、自动播放下一条 |
| 网络 | 严格安全模式(说明作用于插件 API 与宿主媒体请求,网页视图使用独立平台网络栈)、网络诊断 |
| 插件 | 显示成人内容(mature)、启动时自动检查插件更新、默认参与综合搜索的插件、解析器偏好(按站点记住的选择,可清空) |
| 存储 | 缓存清理(含插件缓存)、数据占用 |
| 关于 | 版本、更新检查、开源许可、日志导出 |
调整:
- 移除与单一数据源绑定的项:线路选择(移到插件页)、账号信息(移到"我的"与插件页)。
- 原有的“网络”与“安全”项保留,措辞明确其对插件 API、媒体和网页视图的实际作用范围。
9. 界面用到的宿主命令
界面只通过这些命令与宿主交互,不直接接触插件对象。
| 命令 | 用途 |
|---|---|
plugin_call(pluginId, method, params, requestId) |
调用已发布的能力方法,requestId 由界面预生成用于取消与日志关联 |
plugin_list() |
插件清单:元信息、启用状态、初始化状态、来源、可用能力及具体方法、缺少的必需能力 |
plugin_import(source) |
导入:本地路径、URL、粘贴的源码、插件列表 |
plugin_set_enabled(id, enabled) / plugin_remove(id) |
开关与移除 |
plugin_check_update(id?) / plugin_apply_update(id) |
检查与执行更新 |
plugin_form_actions(id) / plugin_form_submit(id, target, values) |
插件页表单:target 为 auth 的方法 id 或 ui 的动作 id |
plugin_settings_get(id) / plugin_settings_set(id, key, value) |
插件设置 |
plugin_logs(id) / plugin_self_test(id) |
日志与自检 |
plugin_retry_init(id) |
重试初始化或在补齐必需能力后重新检查 |
endpoint_list(id, refresh?) / endpoint_set(id, endpointId) / endpoint_probe(id) |
站点线路 |
resolver_preference_get() / resolver_preference_set(host, pluginId) |
解析器偏好 |
library_* / history_* / progress_* |
本地片库与进度 |
media_session_register(...) |
内部:把 ImageRef / Stream 登记为本地媒体地址,供 <img> 与播放器使用 |
plugin_call_cancel(requestId) |
通用调用取消;搜索改词、离开页面等使用同一机制 |
media_session_release(sessionId) |
释放媒体会话,取消无人使用的资源请求 |
聚合搜索与首页播放队列由界面并行发起多个 plugin_call 实现,各来源的结果独立渲染;
宿主侧的限速与去重对界面透明(见 03 §3)。
plugin_call 接受界面预生成的 requestId,并在同一调用的日志、取消与返回中使用它;
只允许已发布的能力方法,不允许通过任意对象路径访问工厂、dispose 或宿主内部对象。