Skip to content
This repository was archived by the owner on Jul 17, 2026. It is now read-only.

feat: 新增流媒体支持 - #753

Merged
imsyy merged 7 commits into
devfrom
dev-stream
Jan 21, 2026
Merged

imsyy merged 7 commits into
devfrom
dev-stream

Conversation

@imsyy

@imsyy imsyy commented Jan 21, 2026 •

Copy link
Copy Markdown
Member

支持 Jellyfin / Navidrome 流媒体服务

Comment thread src/api/streaming/subsonic.ts Dismissed
@imsyy

imsyy commented Jan 21, 2026

Copy link
Copy Markdown
Member Author

/gemini summary

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

此拉取请求为应用程序带来了流媒体服务的全面集成,使用户能够连接到他们的个人媒体服务器,如 Jellyfin 和 Navidrome。通过此功能,用户可以直接在播放器中浏览、播放其音乐库(包括歌曲、艺术家、专辑和歌单)。本次更新包括用于管理流媒体服务器的新用户界面、与 Jellyfin 和 Subsonic 兼容服务器交互的 API 客户端,以及为处理流媒体音频和歌词而修改的核心播放器逻辑。

Highlights

  • 新增流媒体支持: 应用程序现在全面支持 Jellyfin 和 Navidrome 等流媒体服务,允许用户连接个人媒体服务器并播放音乐。
  • 核心播放器逻辑更新: 播放器已修改以处理流媒体歌曲的播放、歌词获取和错误处理,包括对本地文件和流媒体的特定错误恢复机制。
  • 新增流媒体管理界面和路由: 引入了新的设置页面和专门的路由,用于配置、管理流媒体服务器,并浏览流媒体内容(歌曲、艺术家、专辑、歌单)。
  • API 客户端集成: 集成了 Jellyfin 和 Subsonic 兼容服务的 API 客户端,负责与流媒体服务器进行数据交互和认证。
  • 文档和 UI 改进: 更新了 README 文档,新增了流媒体功能说明,并对部分 UI 组件(如标签样式、歌曲卡片)进行了优化,以适应新功能。
Changelog
  • README.md
    • 功能列表中新增“🌐 支持 Subsonic / Navidrome 流媒体服务(多服务器支持、自动连接)”。
    • 划掉了“📅 自动进行每日签到及云贝签到”功能。
    • 更新了 NeteaseCloudMusicApi 的链接。
  • components.d.ts
    • 新增 StreamingServerConfig 和 StreamingSetting 组件类型声明。
  • docs/.vitepress/config.ts
    • 导航栏新增“流媒体服务”链接。
  • docs/guide.md
    • 更新了 NeteaseCloudMusicApi 的链接。
  • docs/streaming.md
    • 新增文件:流媒体服务支持的文档,包含功能特性和配置指南。
  • src/api/streaming/index.ts
    • 新增文件:统一导出 subsonic 和 jellyfin API 客户端。
  • src/api/streaming/jellyfin.ts
    • 新增文件:Jellyfin API 客户端,用于认证、连接测试、获取艺术家、专辑、歌曲、歌单、搜索和歌词。
  • src/api/streaming/subsonic.ts
    • 新增文件:Subsonic API 客户端(兼容 Navidrome/OpenSubsonic),用于连接测试、获取艺术家、专辑、歌曲、歌单、搜索和歌词。
  • src/assets/icons/Disconnect.svg
    • 新增文件:断开连接图标。
  • src/assets/icons/Edit.svg
    • 新增文件:编辑图标。
  • src/assets/icons/Stream.svg
    • 新增文件:流媒体图标。
  • src/components/Card/SongCard.vue
    • 歌曲大小显示条件调整,以适应流媒体歌曲。
    • 修复了流媒体歌曲不应处理本地封面的问题。
  • src/components/Layout/Menu.vue
    • 侧边栏新增“流媒体”菜单项,并根据设置控制其显示。
    • 菜单项检查逻辑中新增 streaming- 前缀。
  • src/components/List/CoverList.vue
    • 为 n-empty 组件新增 emptyDescription 属性。
    • 新增 isStreaming 属性,用于处理流媒体歌单的导航。
    • isPlaying 函数现在支持 string 类型的 ID。
    • getListData 函数更新,以支持 string 类型的 ID 并处理流媒体专辑/歌单数据。
  • src/components/List/SongList.vue
    • 从 mobileSongMenuRef?.open 和 songListMenuRef.value?.openDropdown 调用中移除了 type 参数。
  • src/components/Menu/MobileSongMenu.vue
    • 从 open 函数签名中移除了 type 参数。
  • src/components/Menu/SongListMenu.vue
    • 从 openDropdown 函数签名中移除了 type 参数。
  • src/components/Modal/Setting/StreamingServerConfig.vue
    • 新增文件:用于添加/编辑流媒体服务器配置的 Vue 组件。
  • src/components/Player/PlayerMeta/PlayerData.vue
    • 为流媒体歌曲新增“STREAMING”状态显示。
  • src/components/Setting/AboutSetting.vue
    • 更新了 NeteaseCloudMusicApi 的链接。
  • src/components/Setting/MainSetting.vue
    • 设置页面新增 StreamingSetting 组件。
    • 设置菜单中新增“流媒体设置”选项。
  • src/components/Setting/StreamingSetting.vue
    • 新增文件:用于管理流媒体服务器的 Vue 组件,包括启用/禁用流媒体功能、添加、编辑、删除和连接服务器。
  • src/composables/useSongMenu.ts
    • getMenuOptions 函数现在从 song.type 属性获取歌曲类型。
    • “添加到歌单”菜单项在流媒体歌曲时不显示。
    • “复制歌曲/节目名称”和“复制歌曲/节目 ID”的标签更新,以包含“流媒体”。
    • “分享歌曲/节目链接”菜单项在流媒体歌曲时不显示。
  • src/core/player/LyricManager.ts
    • 引入 useStreamingStore。
    • handleOnlineLyric 函数现在接受 number | string 类型的 ID。
    • 新增 handleStreamingLyric 函数,用于获取和解析流媒体歌曲的歌词。
    • handleLyric 函数更新,优先处理流媒体歌曲的歌词。
    • adoptTTML 和 adoptLRC 函数中新增了对 id 类型的检查。
  • src/core/player/PlayModeManager.ts
    • 移除了歌曲的 isRecommendation 属性及其相关逻辑。
    • 移除了 cleanRecommendations 函数。
  • src/core/player/PlayerController.ts
    • 引入 sleep 工具函数。
    • 新增 lastErrorTime 属性,用于防止错误处理的重复触发。
    • handleLyric 调用现在传递完整的 song 对象。
    • handlePlaybackError 错误处理逻辑重构,增强了对本地文件、流媒体歌曲的特定处理,并改进了重试机制和延迟。
    • 新增 skipToNextWithDelay 函数,用于在播放错误时进行带延迟的跳过。
    • afterPlaySetup 更新,以处理流媒体歌曲的封面颜色。
    • parseLocalMusicInfo 中新增了对流媒体歌曲的检查。
    • onTimeUpdate 中在成功播放一段距离后重置 failSkipCount。
  • src/core/player/SongManager.ts
    • 引入 useStreamingStore。
    • 新增流媒体歌曲的预取逻辑。
    • getAudioSource 函数更新,以处理流媒体歌曲并返回其 streamUrl。
    • 在处理本地文件路径时,新增了对流媒体歌曲的类型检查。
  • src/router/routes.ts
    • 新增流媒体相关路由:/streaming、/streaming/songs、/streaming/artists、/streaming/albums、/streaming/playlists 和 /streaming-playlist(详情页)。
  • src/stores/index.ts
    • 导出了 useStreamingStore。
  • src/stores/setting.ts
    • 新增 streamingEnabled 布尔型设置项。
  • src/stores/streaming.ts
    • 新增文件:Pinia 状态管理模块,用于管理流媒体服务器配置、连接状态和缓存流媒体数据(歌曲、艺术家、专辑、歌单)。包含添加、更新、删除、连接和从 Jellyfin/Subsonic 服务器获取数据的方法。
  • src/style/main.scss
    • 注释掉了自定义的 .n-tag 样式,可能转为使用 Naive UI 默认样式或组件内样式。
  • src/types/main.ts
    • SongType 扩展,新增 streaming 类型、streamUrl、originalId、serverType、serverId 和 source 属性。
    • CoverType 的 id 属性现在支持 number | string 类型。
    • SettingType 中新增 streaming 类型。
  • src/types/streaming.ts
    • 新增文件:定义了流媒体服务器配置、Subsonic 和 Jellyfin API 响应以及统一的流媒体数据类型(专辑、艺术家、歌单)的类型。
  • src/utils/auth.ts
    • toLikeSong 函数更新,对流媒体歌曲显示“该类型歌曲暂未实现”的警告。
  • src/utils/modal.ts
    • 新增 openStreamingServerConfig 函数,用于打开流媒体服务器配置弹窗。
  • src/views/Discover/artists.vue
    • n-tag 样式更新,使用 type 和 bordered 属性代替 class="choose"。
  • src/views/Discover/new.vue
    • n-tag 样式更新,使用 type 和 bordered 属性代替 class="choose"。
  • src/views/Discover/playlists.vue
    • n-tag 样式更新,使用 type 和 bordered 属性代替 class="choose"。
  • src/views/Like/playlists.vue
    • n-tag 样式更新,使用 type 和 bordered 属性代替 class="choose"。
  • src/views/List/streaming-playlist.vue
    • 新增文件:Vue 组件,用于显示流媒体歌单详情。
  • src/views/Local/playlists.vue
    • CoverList 组件新增 empty-description 属性。
  • src/views/Streaming/albums.vue
    • 新增文件:Vue 组件,用于浏览流媒体专辑。
  • src/views/Streaming/artists.vue
    • 新增文件:Vue 组件,用于浏览流媒体艺术家。
  • src/views/Streaming/layout.vue
    • 新增文件:流媒体视图的布局组件,包含服务器连接状态、服务器选择和导航标签。
  • src/views/Streaming/playlists.vue
    • 新增文件:Vue 组件,用于显示流媒体歌单。
  • src/views/Streaming/song.vue
    • 新增文件:Vue 组件,用于显示流媒体歌曲列表。
Activity
  • 作者 imsyy 请求了总结。
  • github-advanced-security[bot] 机器人报告了一个潜在的安全问题,指出在 src/api/streaming/subsonic.ts 中使用了计算强度不足的密码哈希(MD5),这可能导致密码不安全,建议审查并加强密码处理机制。
@imsyy

imsyy commented Jan 21, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

这个 Pull Request 成功地为播放器引入了对 Jellyfin 和 Navidrome 流媒体服务的支持,这是一个很棒的新功能。代码实现非常全面,包括了新的 API 客户端、专门的 Vue 组件和 Store 来管理流媒体状态,以及对播放器核心逻辑的相应调整。

代码结构清晰,特别是 streaming.ts 这个 Store 的设计,很好地封装了与流媒体服务交互的复杂逻辑。同时,对 PlayerController 中错误处理的重构,以及 LyricManager 对不同来源歌词的处理,都显著提升了代码的健壮性和可维护性。

我发现一个潜在的关键问题,在 CoverList.vue 中,将流媒体的字符串 ID 强制转换为数字,这可能会在播放流媒体歌单时引发错误。建议将相关的 ID 类型统一为 number | string 以确保类型安全。

总体而言,这是一次高质量的提交,功能实现完整,代码质量很高。

Comment thread src/components/List/CoverList.vue
@imsyy
imsyy marked this pull request as ready for review January 21, 2026 09:08
@imsyy
imsyy merged commit 6db103a into dev Jan 21, 2026
4 checks passed
@apoint123
apoint123 deleted the dev-stream branch February 8, 2026 08:34
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

2 participants