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
    • 新增 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),这可能导致密码不安全,建议审查并加强密码处理机制。