Files

3.6 KiB
Raw Permalink Blame History

Jellyfin 音源(主音源化)实施计划

目标:自建 Jellyfin 服务器成为默认且主要的音源;现有 NetEase / QQ / Bilibili / YouTube / Kugou 继续编译但默认停用(enabledProviders 配置门控,本次不删除)。约束:src/audio/*、 src/ts-protocol/* 不改(唯一例外:queue.ts 中 QueuedSong.platform 联合类型加一个成员, 纯类型加宽,无任何逻辑改动,否则无法编译)。

触点地图

后端:

  • src/music/provider.ts — platform 联合类型加 "jellyfin"(Song/Playlist/Album/MusicProvider)
  • src/audio/queue.ts — 同上(仅类型,一个词)
  • src/data/database.ts — PlayHistoryRecord.platform 加 "jellyfin"
  • src/music/auth.ts — CookieStore 平台加 "jellyfin"(token JSON 与 cookie 同路径持久化)
  • src/data/config.ts — 新增 JellyfinConfig(serverUrl / authMode / username / password / apiKey / userId)+ enabledProviders(默认 ["jellyfin"])+ 载入清洗 + isProviderEnabled / defaultPlatform 助手。spotify 仍由 spotify.enabled 门控、local 仍由 localAudioEnabled 门控
  • src/music/jellyfin.ts — 新 Provider:认证(userpass=AuthenticateByName + MediaBrowser 头, 401 重登一次;apikey=X-Emby-Token)、搜索(Audio/MusicAlbum/Playlist, StartIndex 翻页)、 懒解析播放 URL(direct=/Audio/{id}/stream?static=true;320/192/128=/Audio/{id}/universal 转码)、歌单/专辑/歌词(ticks→秒,404=无歌词)、收藏→InstantMix 电台链(收藏→最近播放→随机曲目)、 最近添加/最多播放/流派、播放上报(Sessions/Playing[/Progress|/Stopped],全部吞错)、 音质档(direct 原始直传 / 320k / 192k / 128k)
  • src/music/api-server.ts — 按 provider 开关决定是否绑定 3001/3200
  • src/index.ts — 构造 JellyfinProvider、加载持久化 token、穿线
  • src/bot/manager.ts — 穿线 jellyfinProvider(与 spotifyProvider 同模式)
  • src/bot/instance.ts — jellyfin 分支(getProviderFor / getProvider,新 flag -j/-n)、 默认平台=jellyfin、停用音源友好报错、歌单/专辑命令识别 GUID、播放上报挂钩、帮助文本
  • src/web/api/music.ts — provider 选择 + 门控、/providers、jellyfin 首页数据端点、音质路由
  • src/web/api/auth.ts — jellyfin 状态 + 测试连接(/System/Info);无 QR
  • src/web/api/player.ts — 平台白名单 + platformFlag(netease 显式 -n)
  • src/web/api/bot.ts — settings 读写 jellyfin 配置块(密码/APIKey 写入不回显)+ 热更新 provider

前端(Vue 3,保持 YesPlayMusic 风格;新增文案 zh+en):

  • stores/player.ts — Source 加 jellyfin、enabledProviders 状态、jellyfin 首页数据
  • views/Search.vue — 音源条只显示启用的 provider、Jellyfin 徽标
  • views/Home.vue — 最近添加 / 播放最多 / 我的歌单 / 收藏 / 流派 区块 + jellyfin FM 卡片
  • views/Settings.vue — Jellyfin 连接卡(地址/认证模式/凭据/测试连接)、隐藏停用 provider 的 登录卡、jellyfin 音质档
  • views/Setup.vue — 向导第 3 步换成 Jellyfin 连接卡
  • views/Playlist.vue 等 — ID 均按 string 处理,审计通过(GUID 无数字假设)

文档:README 增加「Jellyfin 音源」章节 + fork 出处与 MIT 归属(上游 ZHANGTIANYAO1/teamspeak-music-bot)。

阶段与验证

  1. 类型 + 配置 → npx tsc --noEmit
  2. JellyfinProvider + 单测 → tsc + vitest
  3. 门控 + bot 穿线 → tsc + vitest
  4. REST → tsc + vitest
  5. WebUI → cd web && npm run build
  6. README + 全量构建/测试