如何为 NuvioMobile 开发自定义插件:Stremio 生态系统扩展教程
【免费下载链接】NuvioMobileOfficial Nuvio Mobile Repository项目地址: https://gitcode.com/gh_mirrors/nu/NuvioMobile
想要为你的 NuvioMobile 媒体中心添加更多内容源吗?通过开发自定义 Stremio 插件,你可以轻松扩展 NuvioMobile 的生态系统!😊 本教程将带你从零开始,一步步学习如何为 NuvioMobile 创建功能强大的 Stremio 插件,让你的媒体体验更加丰富多彩。
什么是 NuvioMobile 和 Stremio 插件系统?
NuvioMobile 是一个基于 Kotlin Multiplatform 和 Compose Multiplatform 构建的现代媒体中心应用,支持 Android 和 iOS 平台。它最大的特色就是集成了Stremio 插件生态系统,允许用户通过安装各种插件来访问不同的内容源。
Stremio 插件是一种标准化的媒体内容接口协议,它定义了如何描述多媒体内容目录、元数据和流媒体链接。通过这个协议,NuvioMobile 可以无缝聚合来自不同来源的内容,如 YouTube、Twitch、Netflix 等。
准备工作:了解插件开发基础
插件开发环境搭建
在开始开发之前,你需要准备以下工具:
- Node.js 环境(版本 14 或更高)
- npm 或 yarn包管理器
- 代码编辑器(如 VS Code)
- 本地或远程服务器用于部署插件
核心概念理解
Stremio 插件主要处理四种类型的资源请求:
- catalog- 媒体目录列表
- meta- 详细元数据信息
- stream- 流媒体链接
- subtitles- 字幕文件
每个插件都需要提供一个manifest.json文件,描述插件的基本信息和功能范围。
第一步:创建你的第一个 Stremio 插件
让我们从一个简单的示例开始。创建一个新的项目目录并初始化:
mkdir my-nuvio-addon cd my-nuvio-addon npm init -y npm install stremio-addon-sdk编写基本插件代码
创建一个addon.js文件,添加以下内容:
const { addonBuilder, serveHTTP } = require('stremio-addon-sdk') const builder = new addonBuilder({ id: 'com.example.myaddon', version: '1.0.0', name: '我的示例插件', description: '为 NuvioMobile 提供示例内容', resources: ['catalog', 'stream'], types: ['movie'], idPrefixes: ['tt'] }) // 定义目录处理器 builder.defineCatalogHandler(function(args) { if (args.type === 'movie') { return Promise.resolve({ metas: [ { id: 'tt1254207', type: 'movie', name: 'Big Buck Bunny', poster: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Big_buck_bunny_poster_big.jpg/300px-Big_buck_bunny_poster_big.jpg' } ] }) } return Promise.resolve({ metas: [] }) }) // 定义流处理器 builder.defineStreamHandler(function(args) { if (args.type === 'movie' && args.id === 'tt1254207') { return Promise.resolve({ streams: [ { url: 'http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4', title: '1080p 版本' } ] }) } return Promise.resolve({ streams: [] }) }) // 启动服务器 serveHTTP(builder.getInterface(), { port: 7000 }) console.log('插件已启动:http://localhost:7000/manifest.json')运行和测试插件
启动你的插件服务器:
node addon.js你会看到类似这样的输出:
插件已启动:http://localhost:7000/manifest.json现在,你可以在 NuvioMobile 中安装这个插件了!
第二步:在 NuvioMobile 中安装自定义插件
NuvioMobile 支持通过多种方式安装 Stremio 插件:
方法一:通过深链接安装
在 NuvioMobile 应用中,进入插件管理页面,选择"添加插件",然后输入你的插件 URL:
stremio://localhost:7000/manifest.json或者使用 HTTPS 地址(如果已部署):
https://your-domain.com/manifest.json方法二:通过 NuvioMobile 的插件管理界面
- 打开 NuvioMobile 应用
- 导航到"设置" → "插件"
- 点击"添加插件"按钮
- 输入插件的 manifest.json URL
- 点击"安装"完成添加
第三步:开发实用的媒体内容插件
现在让我们创建一个更实用的插件,比如从公开 API 获取电影信息:
示例:电影数据库插件
const { addonBuilder, serveHTTP } = require('stremio-addon-sdk') const axios = require('axios') const builder = new addonBuilder({ id: 'com.example.moviedb', version: '1.0.0', name: '电影数据库插件', description: '从公开API获取电影信息', resources: ['catalog', 'meta', 'stream'], types: ['movie'], idPrefixes: ['tt'], catalogs: [ { type: 'movie', id: 'popular', name: '热门电影', extra: [ { name: 'search', isRequired: false }, { name: 'genre', isRequired: false } ] } ] }) // 获取热门电影目录 builder.defineCatalogHandler(async function(args) { try { const response = await axios.get('https://api.themoviedb.org/3/movie/popular', { params: { api_key: 'YOUR_API_KEY', language: 'zh-CN', page: args.extra.skip ? Math.floor(args.extra.skip / 20) + 1 : 1 } }) const metas = response.data.results.map(movie => ({ id: `tt${movie.id}`, type: 'movie', name: movie.title, poster: movie.poster_path ? `https://image.tmdb.org/t/p/w300${movie.poster_path}` : undefined, description: movie.overview, releaseInfo: movie.release_date, imdbRating: movie.vote_average })) return { metas } } catch (error) { console.error('获取电影数据失败:', error) return { metas: [] } } }) // 获取电影详情 builder.defineMetaHandler(async function(args) { if (!args.id.startsWith('tt')) return { meta: null } const movieId = args.id.substring(2) try { const response = await axios.get(`https://api.themoviedb.org/3/movie/${movieId}`, { params: { api_key: 'YOUR_API_KEY', language: 'zh-CN' } }) const movie = response.data return { meta: { id: args.id, type: 'movie', name: movie.title, poster: movie.poster_path ? `https://image.tmdb.org/t/p/w500${movie.poster_path}` : undefined, background: movie.backdrop_path ? `https://image.tmdb.org/t/p/w1280${movie.backdrop_path}` : undefined, description: movie.overview, releaseInfo: movie.release_date, runtime: `${movie.runtime}分钟`, imdbRating: movie.vote_average, genres: movie.genres.map(g => g.name) } } } catch (error) { console.error('获取电影详情失败:', error) return { meta: null } } }) // 启动服务器 serveHTTP(builder.getInterface(), { port: 8000 })第四步:高级插件功能开发
支持搜索功能
要让你的插件支持搜索,需要在 catalog 处理器中处理search参数:
builder.defineCatalogHandler(async function(args) { const { type, id, extra } = args if (extra && extra.search) { // 处理搜索请求 const searchResults = await searchMovies(extra.search, extra.skip || 0) return { metas: searchResults } } // 正常目录请求 return await getPopularMovies(extra.skip || 0) })添加字幕支持
builder.defineSubtitlesHandler(async function(args) { const { type, id, extra } = args if (type === 'movie' && extra && extra.videoId) { const subtitles = await fetchSubtitles(extra.videoId, extra.videoSize) return { subtitles } } return { subtitles: [] } })配置插件缓存
为了提高性能,可以配置缓存策略:
serveHTTP(builder.getInterface(), { port: 7000, cacheMaxAge: 3600, // 缓存1小时 static: './public' // 静态文件目录 })第五步:部署和发布插件
本地部署
对于开发和测试,可以使用以下方式:
- 本地运行:直接使用
node addon.js - 使用 ngrok:将本地服务暴露到公网
ngrok http 7000
云部署选项
有多种免费的云平台可以部署你的 Stremio 插件:
- Vercel- 支持 Node.js,部署简单
- Railway- 提供免费额度
- Render- 免费的静态和动态网站托管
- Heroku- 经典的云平台
发布到公共目录
要让更多 NuvioMobile 用户发现你的插件,可以发布到 Stremio 公共目录:
const { publishToCentral } = require('stremio-addon-sdk') // 在插件启动后调用 publishToCentral('https://your-domain.com/manifest.json')第六步:调试和测试插件
使用 Stremio 开发者工具
- Stremio Web:访问 https://web.stremio.com/
- 开发者模式:在设置中启用开发者选项
- 插件测试:添加你的插件 URL 进行测试
验证插件响应
使用 curl 或 Postman 测试插件端点:
# 测试 manifest curl http://localhost:7000/manifest.json # 测试目录 curl "http://localhost:7000/catalog/movie/popular.json" # 测试元数据 curl "http://localhost:7000/meta/movie/tt1254207.json" # 测试流媒体 curl "http://localhost:7000/stream/movie/tt1254207.json"在 NuvioMobile 中测试
- 确保插件服务器正在运行
- 在 NuvioMobile 中添加插件
- 浏览目录内容
- 播放测试视频
- 检查日志和错误信息
最佳实践和注意事项
性能优化建议
- 实现缓存机制- 减少对后端 API 的请求
- 使用分页- 处理大量数据时使用 skip/limit
- 压缩响应- 启用 gzip 压缩
- 设置合理的超时- 避免长时间等待
错误处理
builder.defineStreamHandler(async function(args) { try { // 你的业务逻辑 return { streams: [] } } catch (error) { console.error('处理流请求失败:', error) // 返回空结果而不是抛出错误 return { streams: [] } } })安全性考虑
- 验证输入参数- 防止注入攻击
- 限制请求频率- 防止滥用
- 使用 HTTPS- 生产环境必须使用
- 保护 API 密钥- 不要硬编码在客户端代码中
常见问题解答
Q: 插件支持哪些媒体类型?
A: 目前支持 movie(电影)、series(剧集)、channel(频道)和 tv(电视节目)。
Q: 如何让插件支持多种语言?
A: 在 manifest 中配置catalogs时指定语言,并在处理器中根据用户偏好返回相应语言的内容。
Q: 插件需要处理并发请求吗?
A: 是的,Stremio 客户端可能同时发起多个请求,确保你的代码是线程安全的。
Q: 如何更新已发布的插件?
A: 修改 manifest.json 中的 version 字段,然后重新部署。NuvioMobile 会自动检测更新。
总结
通过本教程,你已经学会了如何为 NuvioMobile 开发自定义 Stremio 插件。从基础插件创建到高级功能开发,再到部署和测试,你现在可以:
✅ 创建基本的 Stremio 插件架构
✅ 实现目录、元数据和流媒体功能
✅ 在 NuvioMobile 中安装和测试插件
✅ 部署插件到生产环境
✅ 优化插件性能和用户体验
记住,Stremio 插件生态系统的强大之处在于其开放性。你可以为 NuvioMobile 用户提供各种内容源,从电影、电视剧到直播频道,甚至是自定义内容。开始你的插件开发之旅,为 NuvioMobile 社区贡献你的创意吧!🚀
如果你在开发过程中遇到问题,可以参考 Docs/Stremio addons refer/ 目录中的详细文档,或者查看 Docs/Stremio addons refer/examples.md 中的更多示例。
祝你开发顺利!🎉
【免费下载链接】NuvioMobileOfficial Nuvio Mobile Repository项目地址: https://gitcode.com/gh_mirrors/nu/NuvioMobile
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考