版本 v1.2.20
Merge pull request #14 from Shinokawa/main
feat: 集成 Jellyfin 媒体服务器
此PR为NIPAPLAY引入了全面的 Jellyfin 媒体服务器集成。用户现在可以连接到他们的 Jellyfin 服务器,浏览他们的媒体库(特别是动画(tvshow)),查看详细信息,直接播放内容,并将 Jellyfin 媒体与现有的弹弹play弹幕系统进行匹配以获取弹幕。
主要功能和变更点:
Jellyfin 服务层 (JellyfinService):
实现了与 Jellyfin API 的所有通信,包括:
服务器连接、身份验证和会话管理(凭据使用 shared_preferences 持久化)。
获取用户可用的媒体库(当前专注于“电视剧”类型)。
获取媒体项目列表(例如,电视剧系列)。
检索详细的媒体信息,包括元数据、海报、演员表、剧集和季节信息。
为媒体播放生成流 URL 和图像 URL。
管理选定的媒体库 ID。
数据模型 (jellyfin_model.dart):
定义了与 Jellyfin API 响应相对应的 Dart 数据模型,例如 JellyfinLibrary、JellyfinMediaItem、JellyfinMediaItemDetail、JellyfinSeasonInfo、JellyfinEpisodeInfo 和 JellyfinPerson。
包含将 JellyfinEpisodeInfo 转换为应用程序内部 WatchHistoryItem 对象的逻辑,使用 jellyfin:// URI 方案作为 Jellyfin 媒体的唯一标识符,以便与现有的播放和历史记录系统兼容。
状态管理 (JellyfinProvider):
引入 JellyfinProvider (jellyfin_provider.dart) 来集中管理 Jellyfin 相关的状态,包括:
连接状态(已连接/未连接)。
数据加载状态(加载中/错误)。
缓存的媒体项目和媒体详情。
用户选择的媒体库。
在状态更改时使用 ChangeNotifier 通知 UI 组件。
UI 集成和用户体验:
Jellyfin 服务器设置:
在设置中添加了“远程媒体库”部分 (remote_media_library_page.dart),允许用户配置 Jellyfin 连接。
JellyfinServerDialog (jellyfin_server_dialog.dart): 一个模态对话框,用户可以在其中输入其 Jellyfin 服务器地址、用户名和密码以建立连接,并选择他们希望在应用程序中访问的媒体库。
在设置页面和对话框中显示当前的连接状态和服务器信息。
媒体浏览 (AnimePage 和 JellyfinMediaLibraryView):
AnimePage (anime_page.dart) 中的媒体库部分现在动态包含一个“Jellyfin”选项卡(通过 _MediaLibraryTabs 实现),该选项卡在 Jellyfin 连接时可见。
JellyfinMediaLibraryView (jellyfin_media_library_view.dart): 一个专用的小部件,用于异步加载和显示来自用户选定 Jellyfin 媒体库的电视剧集网格。支持导航到媒体详情页面。
媒体详情页面 (JellyfinDetailPage):
jellyfin_detail_page.dart: 一个新页面,用于显示所选 Jellyfin 电视剧的详细信息,包括海报、背景图片、标题、年份、剧情简介、演员表、工作室和类型。
剧集列表按季节组织,允许用户选择特定剧集进行播放。
播放流程:
AnimePage 中的 _onWatchHistoryItemTap 方法已更新,以处理 jellyfin:// 协议的媒体项目。它从 JellyfinService 获取实际的 HTTP 流 URL,然后初始化视频播放器。
从 JellyfinDetailPage 播放剧集时,会首先尝试使用 JellyfinDandanplayMatcher 匹配弹弹play的弹幕信息,然后构建一个 WatchHistoryItem 并启动播放。
Jellyfin 与弹弹play集成 (JellyfinDandanplayMatcher):
jellyfin_dandanplay_matcher.dart: 一个核心服务,负责将 Jellyfin 媒体信息(如剧集标题、文件名、文件哈希)与弹弹play的数据库进行匹配,以检索和显示弹幕。
包括在播放前预计算视频哈希和预匹配弹幕 ID 的功能,以减少播放开始时的延迟。
提供一个 AnimeMatchDialog,允许用户在自动匹配不确定时手动选择正确的弹幕匹配。
模型和工具更新:
WatchHistoryItem (watch_history_model.dart): filePath 字段现在可以处理 jellyfin:// URI,并添加了 videoHash 字段以帮助进行弹幕匹配。
VideoPlayerState (video_player_state.dart): 调整以支持通过 actualPlayUrl 参数播放来自 Jellyfin 的流媒体 URL,同时使用 jellyfin:// 路径作为历史记录中的标识符。
文档:
在 jellyfin_integration.md 中创建了 Jellyfin 集成方案的初始文档。
此次集成显著扩展了应用程序的内容源,为用户提供了访问其个人 Jellyfin 媒体收藏的无缝体验。
构建信息
- 提交: ebd277e
- 分支: main