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),仅供参考

相关新闻

激光雷达里面的芯片,到底在处理什么

激光雷达里面的芯片,到底在处理什么

目录 1 引言 2 激光雷达内部芯片完整处理链路 2.1 整机时序与硬件管控 2.2 信号数字化与 ToF 测距解算 2.3 多回波信号解析 2.4 点云预处理与噪声过滤 2.5 点云数据重组、坐标解算 2.6 点云压缩、编码输出 3 两种硬件架构:传统分立 FPGA 架构 VS SPAD‑SoC 数字化架构…

2026/10/13 14:54:14 阅读更多 →
MPU6050_tockn库使用指南:Arduino姿态解算与滤波调参实战

MPU6050_tockn库使用指南:Arduino姿态解算与滤波调参实战

简介:MPU6050_tockn.zip 是基于 Energia/Arduino 环境的 MPU6050 六轴惯性测量单元驱动库,面向使用 TI MSP430 或 LPC 系列微控制器做姿态感知开发的嵌入式初学者与进阶用户。MPU6050 集成三轴陀螺仪和三轴加速度计,常用于无人机、机器人、运…

2026/10/13 14:53:13 阅读更多 →
如何构建属于自己的NDLOCR-Lite?基于Flet的跨平台打包教程

如何构建属于自己的NDLOCR-Lite?基于Flet的跨平台打包教程

【免费下载链接】ndlocr-lite NDLOCR-Liteアプリケーションのリポジトリ(ソースコードを含む)NDLOCR‑Lite application repository (including source code) 项目地址: https://gitcode.com/gh_mirrors/nd/ndlocr-lite 点击查看 免费下载 N…

2026/10/13 14:53:13 阅读更多 →

最新新闻

DCM4CHE多帧DICOM解析实战:从像素流到可计算单帧图像

DCM4CHE多帧DICOM解析实战:从像素流到可计算单帧图像

1. 项目概述:为什么多帧图像处理是医学影像工作流里的“隐形关卡”在某高校医学影像实验室做数据预处理时,我第一次被DCM4CHE处理多帧图像的问题卡住整整三天——不是报错,而是结果“看起来对”,但下游算法一跑就崩。后来发现&…

2026/10/13 15:38:35 阅读更多 →
20万+硅基员工在岗:Voice AI 排行榜该看哪几栏

20万+硅基员工在岗:Voice AI 排行榜该看哪几栏

摘要:“Voice AI 软件排行榜”并不是一个确定的榜单名称。在公开信息里,它至少指三类性质不同的名单:技术评测类、产业评选类、标准与合规类。三者的评价对象、证明力与适用场景都不相同,混在一张表里比较,结论往往失真…

2026/10/13 15:38:35 阅读更多 →
长沙老板必看:AI搜索时代,本地生意如何被豆包、元宝主动推荐

长沙老板必看:AI搜索时代,本地生意如何被豆包、元宝主动推荐

长沙的老板们,先看一个场景:晚上七点,游客和本地人打开豆包或元宝,问一句"五一广场附近,适合带家人吃晚饭的湘菜馆有哪些"。几分钟内,AI给出几家店的名字和理由,你的店可能在其中&…

2026/10/13 15:38:35 阅读更多 →
Python生成伯德图手绘坐标纸:从半对数原理到PDF打印实践

Python生成伯德图手绘坐标纸:从半对数原理到PDF打印实践

简介:面向自动控制原理教学与工程分析场景,Matlab平台提供了一套伯德图坐标纸定制生成工具,帮助自动化专业学生与工程师规范化绘制系统频率响应曲线,用于幅频特性与相频特性的直观呈现。压缩包共4个文件,包含3个m脚本&…

2026/10/13 15:38:35 阅读更多 →
Java POI模板化生成Word:告别手写代码,实现样式与内容解耦

Java POI模板化生成Word:告别手写代码,实现样式与内容解耦

简介:本资源面向需要在Java环境中批量生成定制化Word文档的开发者,重点解决基于模板替换占位符、动态填充表格与图片的自动化文档生成问题,适合具备一定Java基础、希望掌握POI模板引擎用法的中高级程序员。压缩包共11个文件,约7.3…

2026/10/13 15:38:35 阅读更多 →
电商盗图风险:搜索引擎下载的图片用于商品主图是否侵权

电商盗图风险:搜索引擎下载的图片用于商品主图是否侵权

在电商运营与内容创作中,许多从业者习惯通过搜索引擎直接保存图片作为商品主图或详情页素材。然而,搜索引擎仅作为信息索引工具,并不拥有图片版权,也未获得转授权许可。将来源不明的网络图片直接用于商业展示、广告投放或产品包装…

2026/10/13 15:37:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →