Streamyfin:基于 Expo 的现代 Jellyfin 视频客户端——核心功能、实验特性与开发环境搭建全指南 音视频移动开发【免费下载链接】streamyfinA modern Jellyfin client built with Expo项目地址https://gitcode.com/gh_mirrors/st/streamyfin点击查看免费下载Streamyfin 是一个使用 Expo 构建的 Jellyfin 视频流媒体客户端定位为现有 Jellyfin 官方及其他第三方客户端的替代方案目标是提供流畅、可靠的流媒体播放体验。本文以仓库 README.md 为主体结合仓库源码hooks/useMediaSegments.ts、utils/segments.ts、utils/trickplay.ts、hooks/useSessions.ts 等深入展开帮助你系统掌握 Streamyfin 的功能全貌、实验特性原理以及如何在本机搭建开发环境、运行移动端与 TV 端应用。项目定位与设计目标README 开篇即明确Streamyfin 是一个用户友好的 Jellyfin 视频流媒体客户端使用 Expo 构建作为其他 Jellyfin 客户端的替代方案旨在提供流畅可靠的流媒体体验。它并非从零实现 Jellyfin 协议而是基于 jellyfin/sdkJellyfin 官方 TypeScript SDK对接服务器 API并用 React Native Expo 实现跨平台 UI。从 package.json 可以看出项目的技术底座运行时Expo 57、React 19.2、React Nativereact-native-tvos0.86.0-2同时支持手机与 TV状态管理jotai原子状态见 utils/atoms tanstack/react-query服务端数据缓存样式NativeWindTailwindCSS for React Native导航expo-router react-navigation/native本地存储react-native-mmkv 与 expo-secure-store密钥等敏感数据。这些依赖直接支撑了 README 中宣称的「平滑可靠的流媒体体验」——例如本地缓存、离线下载、会话管理等能力都建立在上述基础设施之上。核心功能一览README 的 Features 部分列出了 Streamyfin 的核心能力每项都可以在源码中找到对应实现跳过片头 / 片尾Skip Intro / Credits播放中可快速跳过片头和片尾。实现上并非简单写死按钮而是完整的「分段」segments编排体系数据来源优先走 Jellyfin 10.11 的 MediaSegments APIgetMediaSegmentsApi仅在服务器不具备该端点时404/501回退到第三方 intro-skipper 插件的GET /Episode/{id}/Timestamps旧接口见 utils/segments.ts统一编排hooks/useMediaSegments.ts 将 Intro、Outro、Recap、Commercial、Preview 五类分段按「Commercial Recap Intro Preview Outro」的优先级合并为一个活动分段并驱动唯一的自动跳过逻辑避免重叠分段触发竞争性 seek自动跳过细节首次自动跳过会等待播放稳定 1.5 秒AUTO_SKIP_ARM_DELAY_MS再执行以规避转码流开播瞬间不可 seek 导致的卡死片尾结束后 5 秒内CONTENT_AFTER_CREDITS_BUFFER_SECONDS视为播完交由下一集倒计时接管。Trickplay 缩略图预览README 称其为「拖动进度条时章节预览的新黄金标准」。源码 utils/trickplay.ts 展示了其核心机制解析 Jellyfin 返回的Trickplay元数据Interval、TileWidth、TileHeight、分辨率等按媒体源 ID 取对应缩略图不同版本各有一套;通过 hooks/useTrickplay.ts 中的calculateTrickplayTile把当前播放时间换算成「第几张雪碧图 图内 X/Y 瓦片坐标」并生成{api.basePath}/Videos/{itemId}/Trickplay/{resolution}/{sheetIndex}.jpg形式的取图 URL拖动时以 200ms 节流计算 URL避免高频请求离线模式下则直接读取下载内容的本地 trickplay 目录trickPlayData.path并支持并发上限为 4 的批量预取prefetchAllTrickplayImages。媒体下载与离线播放「把能流媒体的内容下载到本地离线观看」是实验特性之一README 说明了它的工作原理下载时使用 FFmpeg 将 HLS 流实时转换为设备上的视频文件转换由 Jellyfin 服务器在下载过程中实时完成。这样虽然耗时略长但能保证与服务器可转码的任何文件格式兼容。源码侧的佐证providers/Downloads/types.ts 定义了完整的JobStatus包含statusdownloading / error / pending / completed / queued、maxBitrate下载码率来自 components/BitrateSelector.tsx、isTranscoding是否正在转码等字段转码内容在下载完成前无法预知文件大小因此JobStatus专门提供estimatedTotalSizeBytes用于进度估算见 providers/Downloads/types.ts下载的「配菜」也被一并处理外部字幕、trickplay 雪碧图、片头/片尾分段都会预下载到本地introSegments、creditSegments、trickPlayData等字段保证离线播放体验与在线一致hooks/usePlaybackManager.ts 提供本地播放进度落库逻辑进度 ≥5% 才保存、≥90% 判定为已看完并同步标记离线时写入本地数据库联网时同步回服务器。设置管理与 Streamyfin 插件README 提到「通过插件管理所有用户的 App 配置」。Streamyfin 配套的 Jellyfin 服务端插件jellyfin-plugin-streamyfin可在服务端集中下发设置例如Seerr原 Jellyseerr自动登录无需任何用户输入设置首选默认语言配置下载方式与搜索提供方个性化首页等。客户端侧对此的落地可以从 components/settings/Seerr.tsx 看到pluginSettings?.seerrServerUrl?.locked与seerrApiKey?.locked表示管理员锁定的配置项URL 被锁定但仍允许用户登录该服务器。自动登录的核心逻辑在 utils/seerrQuickConnect.ts优先走Quick Connect由 Seerr 3.4.0 自行向 Jellyfin 发起 Quick Connect 请求本 App 用已持有的登录态代为批准从而在不接触密码、不接触管理员 API Key的情况下建立普通用户级 Seerr 会话失败时返回具名拒绝原因quick-connect-disabled、seerr-has-no-route、different-jellyfin-server、not-approved、session-moved-on方便诊断utils/seerrSignInAtLogin.ts 则实现了登录 Jellyfin 后「静默」补登 Seerr先 Quick Connect不行再测试是否要求密码最后才用密码登录并记住密码全程不阻塞 Jellyfin 登录流程。会话视图SessionsREADME 列出「查看服务器上所有活跃会话」。实现位于 hooks/useSessions.ts通过getSessionApi(api).getSessions({ activeWithinSeconds })拉取会话列表仅管理员可见user?.Policy?.IsAdministrator默认每 5 秒轮询一次、只显示当前有播放内容的会话NowPlayingItem非空并按节目名排序。Chromecast 投屏README 标注 Chromecast 为开发中的实验特性视频投屏已可用字幕支持等仍在推进。组件 components/Chromecast.tsx 基于react-native-google-cast实现挂载后启动设备发现discoveryManager.startDiscovery()点击头部图标时——若已有播放中内容则打开展开控制showExpandedControls否则弹出设备选择对话框showCastDialog。注意 Android 端需要挂载一个透明、不参与布局的CastButton才能正常触发startDiscovery见 components/Chromecast.tsx 的注释。自定义认证请求头对于部署在 Cloudflare Zero Trust、Pangolin 等访问网关后面的 JellyfinREADME 指向了专门的文档 docs/custom-headers.md可针对 Jellyfin 及各集成Seerr / Streamystats / Marlin分别配置 HTTP 头头值存于 Keychain/Keystoreexpo-secure-store并遵循「Authorization头会被丢弃避免覆盖会话令牌、自定义Accept-Language会覆盖应用语言、本地网络 URL 不附加任何头」等规则。实验特性详解README 明确指出下载与 Chromecast 属于「实验特性」处于积极开发中期待用户反馈。除上述两项外还有两个值得一提的实验/生态项MPV 播放器Streamyfin 在所有平台上将MPV作为主要视频播放器底层由 MPVKit 模块含 68 个 Kotlin 文件与 41 个 Swift 文件是 Streamyfin 的原生 MPV 封装README 感谢了社区开发者 Alexk2309 对此模块的贡献。MPV 以格式支持广泛、播放质量高著称这也是「平滑可靠流媒体体验」的重要支撑。Jellysearch 集成README 提及 Jellysearch一个面向 Jellyfin 的全文检索代理可与 Streamyfin 协同工作为搜索体验提供补充。此项属于第三方生态协作具体集成的启用方式以客户端设置页为准。下载与安装渠道README 提供了四个官方分发渠道分别对应不同用户习惯渠道说明App StoreiOS 正式版Google PlayAndroid 正式版GitHub Releases侧载 APK / IPAObtainiumAndroid 应用自动更新工具可直接添加仓库源Beta 测试需订阅 Patreon 的 Member 及以上档位之后可在 Discord 的 beta-releases 频道获取 APK/IPATestFlight 需人工手动添加在 Discord 私信作者 Cagemaster 提供 Apple 账号邮箱。对源码有实际贡献的开发者可自动获得 beta 版本访问权限。前置条件与开发环境搭建运行前置条件普通用户设备与 Jellyfin 服务器处于同一网络本地连接场景若需远程连接服务器需开启远程访问服务器版本保持较新旧版本可能导致兼容性问题拥有有效的 Jellyfin 用户账号且该账号对目标媒体库有访问权限若使用下载或Seerr 集成等功能需先在 Jellyfin 服务端安装并配置对应插件。开发环境搭建贡献者README 的 Development Info 给出完整步骤结合 package.json 中的 scripts 可还原出实际命令。项目只支持 bunnpm、yarn、npx均不受支持Node 版本使用20安装依赖bun i安装原生工具链安装 Xcode 和/或 Android Studio参考 Expo 官方模拟器指南若 iOS 构建报missing Metal Toolchain与 KSPlayer shaders 相关执行一次bun run ios:install-metal-toolchain对应 scripts/ios/install-metal-toolchain.sh安装 BiomeJS 扩展VSCode/IDE 中安装 Biome用于代码检查与格式化仓库用biome check/biome format维护代码质量生成原生工程bun run prebuild启动开发构建bun run ios或bun run android会自动打开模拟器并运行 App。TV 版本所有命令追加:tv后缀——bun run prebuild:tv、bun run ios:tv、bun run android:tv。TV 与移动端通过环境变量EXPO_TV区分见 package.jsonapp.config.ts中也据此条件性地注入不同插件如 TV 版不注入 google-cast 与 expo-camera见 app.config.ts。提交流程打开 PR 前阅读 CONTRIBUTING.md 并运行bun run test。该命令是一个完整的质量门禁typecheck→test:unitJest→lintBiome→format→i18n:check校验翻译键→doctorexpo-doctor见 package.json。TV 平台的集成设计详见仓库文档 docs/tv-discovery.md。常见问题FAQREADME 收录了两个高频问题为什么在 Streamyfin 中看不到我的媒体库确保服务器运行的是较新版本并且至少有一个非纯音频的媒体库。为什么看不到音乐库当前版本不支持音乐且短期内没有支持计划。这解释了为什么 utils/jellyfin 等模块中媒体的处理主要围绕视频内容展开。国际化与社区协作Streamyfin 支持多语言翻译工作通过 Crowdin 平台协作完成。仓库 translations 目录下已有 30 个语言文件含简体中文zh-CN.json、繁体中文zh-TW.jsoni18n.ts 中通过 expo-localization 读取设备语言、回退到英文并对「zh」宏语言做了默认简体处理i18n.ts。翻译贡献者可前往 Crowdin 项目页直接参与。社区渠道包括Discord 服务器支持求助、GitHub Issues报 bug / 提需求、开发者邮箱 developerstreamyfin.app。许可与使用边界Streamyfin 采用Mozilla Public License 2.0MPL-2.0可任意目的使用、修改并分发修改版必须保留原始版权与许可声明对覆盖文件的修改必须公开源码允许大型作品将 MPL 代码与其他许可代码混合但 MPL 组件必须保持 MPL 许可完整条款见仓库 LICENSE.txt。免责声明需特别注意Streamyfin 不以任何形式支持、鼓励或纵容盗版。App 仅用于播放用户个人拥有并控制的媒体本身不提供也不包含任何媒体内容所有官方渠道明令禁止讨论或引用盗版相关内容。结语从 README 出发可以看到Streamyfin 不是简单的「又一个 Jellyfin 客户端」它以 Expo 技术栈实现了跳转片头/片尾、Trickplay 预览、离线下载、Seerr 自动登录、会话监控、Chromecast 投屏等一整套现代流媒体体验并通过 MPV 提供跨平台的高质量播放。无论是作为 Jellyfin 用户选择客户端还是作为 Expo/React Native 开发者研究「如何构建一个成熟的视频流媒体 App」这个仓库的源码尤其 utils/segments.ts、utils/trickplay.ts、hooks/usePlaybackManager.ts 等核心实现都是很好的学习素材。赞分享音视频移动开发【免费下载链接】streamyfinA modern Jellyfin client built with Expo项目地址https://gitcode.com/gh_mirrors/st/streamyfin点击查看免费下载相关推荐Streamyfin基于Expo的终极Jellyfin客户端打造流畅媒体流体验Streamyfin基于Expo的终极Jellyfin客户端打造流畅媒体流体验 Streamyfin是一款基于Expo框架构建的现代化Jellyfin客户端音视频移动开发2025全新Typst桌面客户端开发指南从环境搭建到功能实现2025全新Typst桌面客户端开发指南从环境搭建到功能实现 你还在为LaTeX的复杂配置和缓慢编译烦恼吗Typst作为新一代标记语言排版系统兼具LaTe编译器CLINextcloud Android客户端开发环境搭建指南Nextcloud Android客户端开发环境搭建指南 前言 Nextcloud Android客户端是一款开源的个人云存储应用允许用户在移动设备上访问和管移动开发企业应用上一篇Desloppify支持29种编程语言从TypeScript到Rust的深度插件体系揭秘下一篇Lap 离线照片管理器 EXIF 元数据解析双引擎kamadak-exif 与 little_exif 分工全揭秘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考