Skip to content

feat: 新增流媒体支持#753

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

feat: 新增流媒体支持#753
imsyy merged 7 commits into
devfrom
dev-stream

Conversation

@imsyy
Copy link
Copy Markdown
Member

@imsyy imsyy commented Jan 21, 2026

支持 Jellyfin / Navidrome 流媒体服务

Comment thread src/api/streaming/subsonic.ts Dismissed
@imsyy
Copy link
Copy Markdown
Member Author

imsyy commented Jan 21, 2026

/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
    • 新增 StreamingServerConfigStreamingSetting 组件类型声明。
  • docs/.vitepress/config.ts
    • 导航栏新增“流媒体服务”链接。
  • docs/guide.md
    • 更新了 NeteaseCloudMusicApi 的链接。
  • docs/streaming.md
    • 新增文件:流媒体服务支持的文档,包含功能特性和配置指南。
  • src/api/streaming/index.ts
    • 新增文件:统一导出 subsonicjellyfin 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?.opensongListMenuRef.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 函数更新,优先处理流媒体歌曲的歌词。
    • adoptTTMLadoptLRC 函数中新增了对 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 类型、streamUrloriginalIdserverTypeserverIdsource 属性。
    • CoverTypeid 属性现在支持 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 样式更新,使用 typebordered 属性代替 class="choose"
  • src/views/Discover/new.vue
    • n-tag 样式更新,使用 typebordered 属性代替 class="choose"
  • src/views/Discover/playlists.vue
    • n-tag 样式更新,使用 typebordered 属性代替 class="choose"
  • src/views/Like/playlists.vue
    • n-tag 样式更新,使用 typebordered 属性代替 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
Copy link
Copy Markdown
Member Author

imsyy commented Jan 21, 2026

/gemini review

Copy link
Copy Markdown
Contributor

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

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 join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants