feat: 新增流媒体支持 by imsyy · Pull Request #753 · imsyy/SPlayer
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和jellyfinAPI 客户端。
- 新增文件:统一导出
- 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),这可能导致密码不安全,建议审查并加强密码处理机制。