产品概述 一个中枢,替代一堆分散的客户端
1.1 一句话定义
mygod 是运行在用户自己设备上的音乐中枢:它同时对接多个在线曲库来源和一个本地音乐库, 向上提供统一的检索、播放、歌词、评论、推荐与音效能力,并以两种形态对外开放—— 一种是可脚本化的命令行,一种是可被智能助手直接调用的开放接入协议。
1.2 背景与问题
音乐内容被拆散在多个平台,用户的真实听歌行为因此断成三截:
| 断点 | 用户实际遭遇 | 产品回应 |
|---|---|---|
| 内容分散 | 一首歌只在一个平台有版权;想听的专辑被切成三份,各自打开一个客户端。 | 把多个曲库来源聚合成同一份检索结果,一次搜索看到全部可用版本。 |
| 播放割裂 | 每个客户端各自维护队列与进度;切换入口就从头开始,音效与音量也要重设。 | 本机只有一份播放会话,任何入口接入都接管同一个队列与同一条进度。 |
| 助手缺席 | 智能助手能写文档、能查资料,却无法真的把一首歌放出来。 | 把音乐能力拆成一组可被助手调用的动作,一句自然语言即可完成检索到播放。 |
1.3 目标
目标以用户可观察的结果表述,不以百分比承诺:
- 用户只在一个入口检索,就能看到同一首歌在多个来源中的可用情况与可播状态;
- 用户从任意一个接入端发起播放,本机正在播放的内容随之切换,其余接入端看到的快照同步更新;
- 用户在不可播、网络中断、来源失效的情况下,不需要手动干预就能继续听下一首;
- 用户把本地音乐目录登记一次,之后可以像在线内容一样搜索与播放。
目标用户与使用场景 三类人,一个中枢
| 用户 | 典型场景 | 触发动作 | 完成证据 |
|---|---|---|---|
| 日常听众 主力用户 |
在家用电脑听歌,歌单跨几个平台,还要兼顾本地下载的老歌。 | 说出或输入歌名/歌手/歌单名。 | 目标曲目开始播放,进度条前进,歌词与当前行同步。 |
| 智能助手用户 | 在对话里让助手"放一首适合通勤的歌""把刚才那首加到队列后面"。 | 一句自然语言请求。 | 助手调用成功并回读快照,确认状态由暂停变为播放。 |
| 脚本与自动化用户 | 用脚本定时播放、把播放状态接入自己的面板或快捷键工具。 | 执行一条命令或调用一次接口。 | 命令返回结构化快照,脚本据此判断下一步。 |
核心用户旅程(最短闭环)
完成条件:用户听到目标曲目,且下一次打开时能从上一次的队列与进度继续。
产品范围 已交付、规划中、明确不做
3.1 本期已交付(P0)
- 四个在线曲库来源的检索、详情、歌单、专辑与流播放;
- 本地音乐库的目录登记、索引、增量扫描、搜索与播放;
- 完整播放控制:队列、上一首/下一首、暂停/继续、进度跳转、音量、随机、循环;
- 歌词(时间轴歌词、翻译、逐字歌词)、评论分页、发现页与电台;
- 音质档位与音效(均衡器预设、夜间模式、增强、响度均衡);
- 双形态接入:命令行与智能助手开放接入;
- 多接入端共享单一播放器;会话落盘与自动恢复。
3.2 规划中(P1)
- 本地库目录变更的实时感知(文件新增/移动/删除后无需手动重扫);
- 本地库规模到十万级后的存储与检索优化;
- 更多本地音频封装格式与内嵌封面、内嵌歌词读取;
- 场景化模式(按情境自动调整音效与推荐策略)。
3.3 明确不做
- 不提供任何内容下载与再分发能力,播放始终为在线取流或读取用户本机已有文件;
- 不替用户保存平台账号密码,不代理平台登录以外的任何账户操作;
- 不修改、不上传用户本地音频文件。
产品模型与术语 先统一语言,再定义行为
| 术语 | 定义 | 唯一性规则 |
|---|---|---|
| 内容来源 | 提供曲目检索与在线取流的一方,或用户本机文件目录。 | 在线来源与本地库各算一方;每条来源可独立登录、独立可用。 |
| 曲目 | 一条可被检索、可被加入队列的音乐条目。 | 由"来源 + 来源内编号"唯一定位;不同来源的同名曲目视为不同曲目。 |
| 播放队列 | 当前参与播放的有序曲目集合,含播放位置与当前条目。 | 本机同一时刻只有一个活动队列;队列允许跨来源混排。 |
| 播放会话 | 队列 + 循环模式 + 随机开关 + 音量 + 音效偏好的集合。 | 会话可落盘;重新启动后按上次状态恢复,恢复后处于暂停。 |
| 播放快照 | 一次读取得到的播放状态:状态、当前曲目、进度、当前歌词行、队列、音量、随机、循环、错误信息。 | 所有接入端读到的都是同一份快照;进度随时间自行推进。 |
| 本地索引 | 用户登记目录下音频文件的元数据与文件位置清单。 | 仅由用户显式登记的目录产生;搜索仅覆盖索引内条目。 |
| 可播性 | 曲目在当前来源与当前登录状态下能否取到流。 | 检索阶段即可判定并标注;播放阶段若判定失败则自动跳过。 |
功能需求 每条需求都写清触发、规则、结果与状态变化
5.1 内容来源与检索
触发:用户输入关键词,并指定内容来源(默认首个在线曲库)与结果类型。
- 处理规则
- 按来源各自检索,来源间不做合并去重;结果按来源计数分页返回;分页偏移量对多来源按整页对齐。
- 结果
- 返回该页条目,每条带可播状态、时长、艺人、专辑;专辑与歌单结果额外带条目数。
- 状态变化
- 检索本身不改变播放状态;若当前有播放,快照保持不变。
- 异常
- 未登录导致该来源不可用:返回空页并说明需要登录;某来源超时:返回其余来源结果,不整体失败。
触发:用户点开艺人、专辑、歌单或用户主页。
- 处理规则
- 艺人页提供热门曲目与专辑列表切换;专辑/歌单页返回完整曲目,单次最多 1000 条;除主来源外,其余来源只保证专辑与歌单。
- 结果
- 页面含名称、封面、简介与曲目集合;曲目集合可直接作为播放队列来源。
- 异常
- 资源已下架:返回明确的不可用提示,不返回半截列表。
触发:调用方持有一组曲目编号,需要补齐名称、时长与可播状态。
- 处理规则
- 按传入顺序返回,逐条判定可播性;任一编号失效不影响其余条目。
- 结果
- 返回顺序与输入一致的曲目列表,缺失条目以不可用标注。
触发:接入端首次连接,或用户想确认当前可用能力。
- 处理规则
- 逐来源报告登录状态;未登录来源给出"游客可用范围"说明;已登录来源附带账号资料。
- 结果
- 调用方据此决定后续动作:可直接播放、需要登录,或该来源当前不可用。
5.2 播放与队列
触发:用户指定曲目集合、歌单、专辑或电台中的恰好一种,并可指定从第几条开始。
- 处理规则
- 四种来源互斥,一次只能指定一种;指定起始位置时,队列保留完整集合,从该位置开始播;心跳式电台允许同时附带其歌曲来源的歌单编号。
- 结果
- 新队列覆盖旧队列并立即进入加载;返回建立后快照。
- 状态变化
- 状态由空闲/暂停变为加载,再变为播放;失败的条目按 6.1 跳过。
- 异常
- 一次指定多种来源:拒绝并说明只能指定一种;本机无音频输出:明确提示可在无输出设备的环境下不可播。
触发:用户执行暂停、继续、上一首、下一首、跳转到指定条目、跳转到指定时间点或设置音量。
- 处理规则
- 跳转时间点在已加载范围内即时生效;超出范围的跳转以可播边界为准;音量取值 0–100,跨接入端共享同一音量。
- 结果
- 返回操作完成后的快照,调用方无需再次查询。
- 状态变化
- 暂停与继续在同一队列位置往返;切歌重置进度为 0 并重新进入加载。
- 异常
- 队列为空时所有控制返回空操作提示,不报错、不崩溃。
- 处理规则
- 循环三档:关闭(播完队列末条即停)、列表(末条回到首条)、单曲(当前曲目重复)。随机为独立开关,与循环叠加生效:随机顺序在队列建立时确定并保持,不回退到未随机前的顺序。
- 持久化
- 循环与随机随会话落盘,重启后保持上次选择。
触发:任意接入端请求当前播放状态,可重复轮询。
- 结果字段
- 状态(空闲/加载/播放/暂停/停止)、当前曲目及其来源与可播标记、进度与总时长、当前歌词行、队列与当前序号、电台名、音量、随机、循环、音效开关、错误说明。
- 处理规则
- 进度随时间自行推进,每次读取都是最新值;加载中的曲目进度停在起点并置为加载状态;出错但未跳过时错误说明随快照返回。
触发:队列播完,或用户给出"不喜欢"。
- 处理规则
- 电台模式下队列耗尽时,按模式补充新曲目并继续;补充时过滤掉当前不可播的曲目,避免插队即卡。
- 结果
- 队列自动延长,播放不中断;"不喜欢"记录到该来源的偏好,并影响后续挑选。
- 异常
- 补充连续失败:保持当前队列并置为停止,附错误说明,不进入无限重试。
队列条目各自携带来源,同一队列内可同时包含多个在线来源与本地库曲目;某一条目不可播时,仅跳过该条目,不改变其余条目的顺序。
5.3 歌词与评论
- 处理规则
- 提供时间轴歌词、翻译歌词与逐字歌词;调用方可任选其一或全部;本地曲目优先读取同目录同名歌词文件。
- 结果
- 快照同时给出"当前歌词行",供接入端直接展示;无歌词时返回空而不报错。
- 异常
- 来源暂无该曲目歌词:返回空集合,不编造内容。
- 处理规则
- 首屏按热度排序,其后按时间排序;可按曲目、节目、歌单或话题检索;分页返回。
- 异常
- 目标无评论:返回空页并给出零计数。
5.4 发现与推荐
| 卡片 | 内容 | 前置条件 |
|---|---|---|
| 每日推荐 | 按日期生成的曲目集合 | 需登录 |
| 推荐歌单 | 与口味相关的歌单集合 | 需登录 |
| 精选 | 编辑精选的歌单集合 | 无需登录 |
| 榜单 | 按热度排序的榜单元数据 | 无需登录 |
| 最近播放 | 最近播放曲目 | 需登录 |
未满足前置条件的卡片返回空集合并说明原因,不隐藏入口。
- 档位
- 默认(按整体口味)、熟悉(贴近常听)、探索(扩大尝试范围)。
- 规则
- 一次返回若干曲目,作为队列或续播补充;连续两次拿不到可播曲目时停止补充并说明。
以用户收藏歌单为种子、以当前曲目为起点生成连续曲目;种子歌单编号随会话保存,重启后仍可续播。
当前版本对收藏与歌单写入返回"尚未开放"的明确说明;读取路径已具备,写入将在后续版本提供。
5.5 音质与音效
- 档位
- 标准、较高、极高、无损,按来源实际提供的最高档向下兼容。
- 规则
- 请求档位高于来源能力时自动降到该来源最高档;本地曲目按文件本身规格播放,不做转码。
- 结果
- 快照显示实际生效档位,调用方可判断是否降级。
| 能力 | 作用 | 默认 |
|---|---|---|
| 均衡器预设 | 按预设曲线调整频段增益,可保存、可删除、同名覆盖 | 未启用 |
| 夜间模式 | 压低低频与峰值,适合安静环境 | 关闭 |
| 增强 | 提升细节与临场感 | 关闭 |
| 响度均衡 | 让不同曲目的听感音量趋于一致 | 开启 |
| 增益 | 整体升降电平 | 0 |
音效偏好随会话保存,切换曲目与重启后保持;任一音效关闭时,对应处理立即停止而不影响播放连续性。
5.6 本地音乐库
触发:用户把某个绝对路径目录交给中枢,或要求移除、查看、重扫。
- 处理规则
- 登记后立即遍历该目录;仅收录受支持的音频文件;同一目录重复登记视为重扫;移除时连同其曲目一并从索引清除。
- 结果
- 返回登记后的曲目总数与目录清单(含每个目录当前贡献的曲目数)。
- 状态变化
- 索引写入本机;此后该来源的检索立即可命中。
- 异常
- 路径不存在或不可读:拒绝登记并说明;目录内个别文件读取失败:跳过该文件,不中断整体扫描;单目录无权限:跳过该目录,其余继续。
- 增量规则
- 重扫时以文件大小与修改时间判定是否变化;未变化的文件跳过元数据读取,只保留原条目。
- 删除规则
- 重扫后不再存在的文件,其条目从索引移除,检索不再命中。
- 结果
- 一次重扫完成后返回最终曲目数,调用方可直接用于校验。
- 检索规则
- 在曲名、艺人、专辑与文件路径上做子串匹配,大小写不敏感;曲名命中的排序优先于只在路径命中。
- 播放规则
- 直接读取本机文件播放,不复制、不转码、不发起网络请求;同目录同名歌词文件自动加载。
- 异常
- 播放期间文件被移动或删除:本次播放按 6.1 失败处理,队列继续前进。
5.7 接入形态与多端共享
| 形态 | 适用 | 能力边界 |
|---|---|---|
| 智能助手接入 | 在对话中完成检索、播放、调音效、看状态。 | 一次性暴露全部能力动作,助手按需调用;每次调用返回结构化结果。 |
| 命令行 | 脚本、快捷键、自动化流程。 | 子命令 + 交互模式;输出可直接被其他程序解析。 |
两种形态共用同一套能力定义与同一份播放会话,行为一致,不出现"命令行能播、助手不能播"的差异。
背景:多个助手或终端可能同时连接,若各自启动播放器,会出现两路音频互相覆盖、队列互相清空。
- 处理规则
- 本机只允许一个进程持有播放引擎;后到者以客户端身份接入同一引擎,读写同一会话。
- 结果
- 任一端播放,其他端立即看到同一快照;不存在两个队列、两个音量。
- 异常
- 持有引擎的一方异常退出:下一次接入自动重新建立引擎,并从落盘会话恢复。
- 登录方式
- 扫码登录:先取二维码内容与轮询标识,再轮询登录进度,确认后会话保存到本机。
- 状态语义
- 过期 / 等待扫码 / 已扫码待确认 / 已确认,四种状态可区分。
- 游客模式
- 不登录也能使用部分来源的检索与播放;受限能力在检索阶段即标注,不等到播放才失败。
- 异常
- 会话过期:相关调用返回"需要重新登录"并指明下一步动作。
5.8 缓存与恢复
- 规则
- 在线曲目边取流边播放,同时写入本机缓存;完整取回后保留,下次直接播放。
- 容量
- 缓存设总容量上限,超出时按最近播放时间由远及近淘汰;超过上限四分之一的单曲不入缓存。
- 隐私
- 缓存仅存于本机;本地库文件不复制进缓存。
- 异常
- 磁盘写入失败:本次播放改为纯内存进行,播放不中断,仅失去缓存收益。
- 落盘时机
- 播放状态发生变化后延迟数秒合并写入,避免频繁写盘;退出时再写一次。
- 恢复结果
- 下次启动按上次的队列、序号、循环、随机、音量、电台与种子歌单恢复,处于暂停状态,等待用户继续。
- 异常
- 恢复时某曲目已不可用:该条目标记为不可播,播放时自动跳过,不影响其余曲目。
停止播放保留队列与序号,仅结束发声;清空队列后快照回到空闲。用户主动清理缓存不影响队列与索引。
共享规则与异常处理 只在这里定义一次,各功能引用
6.1 可播性与自动跳过
该规则覆盖在线取流与本地文件两种来源,是"播放不中断"的唯一依据。
6.2 无响应阈值
6.3 队列与序号
6.4 会话一致性
6.5 失败与恢复对照
| 情形 | 用户可见表现 | 系统行为 | 恢复方式 |
|---|---|---|---|
| 曲目不可播 | 当前曲目短暂显示加载后切到下一首 | 记录原因并跳过(R1) | 无需操作 |
| 取流长时间无数据 | 加载状态在约 15 秒内结束 | 判定失败并跳过(R2) | 无需操作 |
| 整条队列都不可播 | 停止并显示原因 | 停止补充,不重试 | 换队列或稍后重试 |
| 来源未登录 | 检索结果为空或受限项标注 | 不发起需要登录的请求 | 完成扫码登录 |
| 登录会话过期 | 调用返回"需要重新登录" | 保留其余来源可用 | 重新扫码 |
| 本地文件被移动或删除 | 播放中断后自动下一首 | 索引在下次重扫时剔除 | 重扫或重新登记目录 |
| 引擎进程异常退出 | 下次连接从暂停态恢复 | 按落盘会话重建 | 继续播放即可 |
| 磁盘写入失败 | 播放继续,无缓存收益 | 转为内存播放(FR-25) | 释放磁盘空间后自动恢复缓存 |
非功能需求 可感受的体验下限,不含实现细节
| 维度 | 要求 |
|---|---|
| 响应 | 检索、详情与播放控制类操作返回时间不随本地库规模线性恶化;本地库一千条量级时,一次检索在可感知的即时范围内返回。 |
| 启动 | 接入端首次连接即可用,无需额外服务端账号;无播放任务时保持空闲不占音频设备。 |
| 稳定性 | 单条曲目失败不影响队列其余条目;任一控制命令可在队列为空、加载中、停止等状态下安全返回。 |
| 数据归属 | 播放会话、索引、缓存、音效偏好全部保存在用户本机;除向用户指定的内容来源请求内容外,不向第三方传输播放数据。 |
| 隐私 | 不在本机长期保存平台密码;登录凭据仅在用户主动登录后按来源保存,可随时清除。 |
| 兼容 | 同一份能力定义在两种接入形态下语义一致;返回结构稳定,新增字段不影响既有调用方。 |
| 可维护 | 每个能力有稳定名称与明确输入输出;错误信息包含可执行的动作提示(如"需要登录""换一个来源")。 |
| 合规 | 产品仅做在线取流播放与本机文件读取,不提供内容下载、转存或再分发能力;内容版权由各来源自身提供与授权。 |
待定事项 对外发布前需要明确,不影响当前能力使用
| 编号 | 事项 | 影响 |
|---|---|---|
| Q1 | 本地库规模上限与推荐存储策略(当前以文件式索引为主,十万条以上是否切换存储方式) | 大规模用户的检索速度 |
| Q2 | 目录变更是否提供实时感知,还是维持"手动重扫"语义 | 本地库使用成本 |
| Q3 | 收藏、歌单写入、场景模式的上线节奏 | 完整度与用户预期 |
| Q4 | 除现有格式外,本地库还需支持哪些音频封装 | 本地库覆盖范围 |
| Q5 | 对外发布版是否需要附带可交互演示页 | 宣传材料形态 |