收起左侧

【FPK应用】iptv **器

2
回复
87
查看
[ 复制链接 ]

2

主题

5

回帖

0

牛值

fnOS系统内测组

ScreenShot_2026-05-09_103533_447.png

ScreenShot_2026-05-09_103713_936.png

ScreenShot_2026-05-09_103557_345.png

ScreenShot_2026-05-09_103505_299.png

ScreenShot_2026-05-09_103644_909.png

ScreenShot_2026-05-09_103745_683.png

下载地址:https://wwbse.lanzoue.com/iD76D3p2ifih

NexPlay v1.0.0 详细功能说明

一、应用概述

项目 内容
应用名称 NexPlay
版本 1.0.0(内部版本号 v1.7.26)
开发者 最北的北
应用类型 飞牛NAS(fnOS)第三方应用
运行架构 x86_64
最低系统版本 fnOS 0.9.0
依赖 Python 3.12
应用入口 iframe 类型,URL 为 /cgi/ThirdParty/NexPlay/index.cgi/
应用描述 NexPlay 是一款 IPTV 直播播放器,支持 M3U 播放列表导入、EPG 节目单、分组管理、FLV/HLS 直播流播放,数据服务器端存储,节目单智能刷新,内存优化,全屏播放优化

二、核心功能模块

1. 直播流播放

1.1 多协议支持

协议 实现方式 说明
HLS(M3U/M3U8) hls.js 流式播放,支持直播和点播,自动解析 M3U8 清单
FLV flv.js FLV 直播流播放,支持元数据解析和分辨率检测
原生播放 浏览器原生 <video> 浏览器原生支持的视频格式直接播放
PHP 代理链接 CGI 后端代理 自动识别 .php 后缀的代理链接,通过后端代理播放
AllInOne 直播 CGI 代理 + flv.js/hls.js 支持抖音、B站等平台的 AllInOne 聚合直播源

1.2 智能播放策略

  • 自动协议检测:根据 URL 后缀自动判断流类型
    • .m3u8 / .m3u → HLS 播放
    • .flv → FLV 播放
    • .php → PHP 代理播放
    • :10055 / /allinone → AllInOne 播放
    • 其他格式 → 先尝试直连,失败后代理
  • 直连优先,代理兜底:优先直连播放,直连失败自动切换至 CGI 代理模式
  • FLV → HLS 自动降级:FLV 播放失败(8 秒超时或网络错误)时自动切换 HLS 播放(抖音平台除外,抖音仅有 FLV 流)
  • 错误自动恢复
    • 网络错误:自动重连(最多 5 次),重连失败则重建播放器
    • 媒体错误:调用 recoverMediaError() 恢复
    • 缓冲停滞:自动从最新位置重新加载(startLoad(-1)
  • HTTP 500 自动隐藏:FLV 播放返回 500 错误时自动隐藏该频道

1.3 CGI 代理服务(后端 Python)

端点 功能 说明
/live?url= HLS/M3U8 代理 自动重写 M3U8 中的 TS 分片和嵌套 M3U8 URL 为代理 URL,解决跨域问题
/raw?url= 原始资源代理 用于代理 TS 分片、密钥 URI 等资源,支持重定向跟踪
/allinone/* AllInOne 平台代理 抖音直播、B站直播等平台的直播源代理

代理特性:

  • 支持 SSL 证书验证跳过(适应自签名证书环境)
  • 支持重定向跟踪,自动获取最终 URL
  • M3U8 代理时自动重写内部 URL:
    • TS 分片 → /raw?url= 代理
    • 嵌套 M3U8 → /live?url= 代理
    • 密钥 URI → /raw?url= 代理

1.4 HLS 播放优化配置

配置项 说明
lowLatencyMode true 低延迟模式
maxBufferLength 10 秒 最大缓冲长度(默认 30 秒,缩短以降低延迟)
maxMaxBufferLength 30 秒 最大后退缓冲(默认 60 秒)
maxBufferSize 30MB 最大缓冲大小
startLevel -1 自动选择码率
startFragPrefetch true 快速分片预取
abrEwmaDefaultEstimate 1Mbps 初始带宽估计(默认 500Kbps,提高以获得更高质量起始)
forceKeyFrameOnDiscontinuity true 不连续时强制关键帧
fixAudioTimestampGap true 修复音频时间戳间隙
manifestLoadingMaxRetry 3 清单加载重试次数
fragLoadingMaxRetry 3 分片加载重试次数

1.5 播放信息展示

  • 状态栏:实时显示当前播放状态(加载中 / 播放中 / 错误等)
  • 分辨率显示:自动检测视频分辨率,标注清晰度等级(4K / 1080P / 720P / 480P / SD)
  • 连接模式标识
    • 绿色 = 直连模式
    • ** = 代理模式
  • 频道信息条:切换频道时底部浮现 5 秒,显示:
    • 频道台标(大图)
    • 频道名称
    • 正在播放的节目名称 + 时间段
    • 下一节目名称 + 时间段

1.6 全屏播放

  • 支持全标准全屏 API:
    • requestFullscreen(标准)
    • webkitRequestFullscreen(WebKit)
    • webkitEnterFullscreen(iOS Safari)
    • mozRequestFullScreen(Firefox)
    • msRequestFullscreen(IE/Edge)
  • X5 内核适配(微信 / QQ 浏览器)
  • 双击视频区域切换全屏(防止单击误触)
  • 全屏切换保持播放状态不中断(延迟 100ms 恢复播放)
  • 竖屏模式优化:16:9 比例显示
  • 降级方案:全屏 API 失败时使用 CSS 模拟全屏(fixed 定位 + 100vw/100vh)
  • 全屏状态监听:通过 fullscreenchange / webkitfullscreenchange 事件同步状态

2. 频道管理

2.1 频道列表

  • 左侧边栏展示所有频道
  • 每个频道项显示:台标、频道名称、当前节目信息(时间 + 节目名)
  • 底部显示频道总数
  • 点击频道立即播放
  • 悬停显示操作按钮:
    • ⭐ 收藏/取消收藏
    • ✏️ 编辑频道

2.2 频道编辑

可编辑字段:

字段 说明 是否必填
频道名称 显示名称 是(默认"未命名")
播放地址 直播流 URL
台标 URL 自定义台标图片地址
分组 所属分组
EPG 匹配名称 用于精确匹配节目单的名称(如 **1, 湖南卫视)

支持删除频道(需确认)。

2.3 收藏功能

  • 点击星标按钮收藏 / 取消收藏频道
  • 收藏频道在列表中高亮显示(特殊背景色)
  • 侧边栏有独立的"⭐ 收藏"分组标签
  • 收藏状态持久化存储

2.4 频道隐藏与恢复

  • 自动隐藏:直播源检测失效或 HTTP 500 错误时自动隐藏,记录隐藏时间和原因
  • 手动隐藏:通过直播源检测批量隐藏失效频道
  • 查看隐藏频道:在分组管理中查看所有被隐藏的频道及隐藏原因
  • 恢复隐藏频道:一键恢复,重新显示在频道列表中
  • 30 天前的隐藏记录自动清理

3. 播放列表导入

3.1 文件导入

  • 支持点击上传或拖拽文件到上传区域
  • 支持格式:.m3u / .m3u8 / .txt
  • 拖拽时视觉反馈(边框高亮 + 背景色变化)

3.2 网络 URL 导入

  • 输入 M3U/M3U8/TXT 链接在线导入
  • 直连失败时自动通过 CGI /raw 代理获取

3.3 格式解析

M3U 格式(标准 IPTV 播放列表):

#EXTM3U
#EXTINF:-1 tvg-logo="http://..." tvg-name="**1" group-title="央视",**1综合
http://example.com/live/**1.m3u8

解析字段:

  • 频道名称:逗号后的文本
  • 台标:tvg-logo 属性
  • 分组:group-title 属性(自动创建不存在的分组)
  • EPG 匹配名:tvg-name 属性

简单列表格式(国内常用):

央视,#genre#
**1,http://example.com/live/**1.m3u8
**2,http://example.com/live/**2.m3u8
卫视,#genre#
湖南卫视,http://example.com/live/hunan.m3u8

解析规则:

  • 分组名,#genre# → 识别为分组行
  • 频道名,URL → 识别为频道行(支持 http/https/rtmp/rtsp 协议)

导入时可选择目标分组。

3.4 手动输入

  • 顶部输入框可直接输入直播地址播放
  • 自动以 URL 中提取的文件名作为频道名
  • 输入的地址会自动添加到频道列表

4. 分组管理

4.1 分组操作

操作 说明
新增分组 输入分组名称,自动生成唯一 ID
重命名分组 点击分组名即可编辑,实时保存
删除分组 需确认,删除后频道移至默认分组

M3U 导入时根据 group-title 标签自动创建分组。

4.2 分组筛选

  • 侧边栏顶部显示分组标签页
  • 预置标签:全部 / ⭐ 收藏
  • 自定义分组标签
  • 点击标签切换当前显示的频道分组
  • 分组标签支持横向滚动和换行

4.3 分组诊断

在分组管理弹窗中提供诊断工具,显示:

  • 各分组名称、ID、频道数量
  • 频道分组字段分布统计
  • 未匹配的分组 ID 检测(频道引用了不存在的分组)

4.4 数据工具

分组管理弹窗底部提供以下工具按钮:

按钮 功能
👁️ 显示隐藏频道 查看所有被隐藏的频道及原因,支持恢复
📊 查看分组诊断 显示分组诊断报告
🔍 检测直播源 批量检测频道直播源可用性
🗑️ 清除所有数据 删除所有频道、分组、收藏、EPG 缓存(需确认,清除后需重新导入)

5. EPG 节目单

5.1 节目单来源

  • 默认源:http://epg.51zmt.top:8000/e.xml(标准 XMLTV 格式)
  • 支持自定义 XMLTV 格式的 EPG 源 URL
  • 支持重置为默认源

5.2 节目单加载与缓存策略

触发条件 行为
页面加载 强制刷新 EPG(清除缓存后重新获取)
缓存有效期 3 小时 有效期内使用缓存,过期后重新获取
0 点自动刷新 定时器调度,0 点时自动刷新 EPG
日期变更检测 检测到跨天时自动刷新
节目数据过期 每 2 分钟检测,节目结束时间超过 15 分钟自动刷新
手动刷新 用户点击刷新按钮
代理失败降级 代理加载失败时自动尝试直连

EPG 请求超时:15 秒。

缓存存储:

  • iptv_epg_data - EPG 数据
  • iptv_epg_time - 缓存时间戳
  • iptv_epg_date - 缓存日期
  • iptv_ep**ax_stop - 数据最大有效时间(用于判断数据是否过期)

5.3 节目单匹配算法

多级匹配策略(匹配分数越高优先级越高):

分数 匹配类型 示例
3 完全匹配 "**1" = "**1"
3 核心名匹配 "**1综合" → "**1" = "**1"
3 前缀+数字精确匹配 "**" + "1" = "**" + "1"
2 包含匹配(长度差 ≤ 3) "**5" ⊂ "**5Plus"
2 核心名/原名交叉匹配 "**1" = 去除后缀的 "**1综合"
0 前缀相同数字不同 "**1" ≠ "**13"

特殊处理

  • 保留 + 号区分 **5 和 **5+
  • 频道名标准化:去除空格、连字符、下划线、点号
  • 去除常见后缀:HD / 4K / 高清 / 超清 / 标清 / 综合 / 新闻 / 频道 / 直播
  • 支持 tvg-id / tvg-name 自定义匹配(优先级高于频道名匹配)
  • 只接受分数 ≥ 2 的匹配结果

时区转换

  • 自动处理 XMLTV 中的时区偏移(如 +0800+0000
  • 转换为浏览器本地时区时间

5.4 节目信息展示

  • 频道列表:每个频道下方实时显示当前节目名称和时间段(如 20:00-22:00 新闻联播
  • 播放信息条:切换频道时显示"正在播放"和"接下来"节目
  • 自动更新:每 60 秒刷新一次节目显示
  • 预告:距离下一节目开始不到 5 分钟时,显示 当前节目 → 下一节目

5.5 节目单测试

在节目单设置弹窗中提供测试功能:

  • 显示响应状态码、Content-Type、耗时
  • 校验 XML 格式是否正确
  • 显示频道数量和节目数量
  • 列出前 5 个频道信息
  • 给出测试结论(✅ 格式正确 / ❌ 内容不完整 / ❌ 请求失败)

6. 台标系统

6.1 台标来源

来源 URL 优先级
主 CDN https://gcore.jsdelivr.net/gh/taksssss/tv/icon/ 1(最高)
备用 CDN https://raw.githubusercontent.com/taksssss/tv/master/icon/ 2
EPG 台标 EPG XML 中的 <icon src="..."> 3
城市地标 本地生成的 SVG Data URL 4
文字台标 本地生成的 SVG Data URL 5(最低)

6.2 智能台标匹配

预置频道名称映射表,覆盖范围:

  • ** 全系列:**1-**17,含 **5+
  • 各省卫视:湖南、浙江、江苏、东方、北京、广东、深圳、山东、四川、湖北、安徽、河南、辽宁、天津、重庆、江西、福建(东南卫视)、贵州、云南、广西、河北、山西、陕西、甘肃、青海、宁夏、新疆、**、内蒙古、吉林、黑龙江、海南
  • 地面频道:杭州综合、南京新闻等
  • 专题频道:风云足球、高尔夫网球、CHC 电影、华诚电影、金鹰卡通、卡酷少儿、嘉佳卡通、纪实、上海纪实等
  • 港澳及海外:凤凰中文、凤凰资讯、星空、华娱、MTV

自动标准化匹配规则:

  • 去除空格、连字符、下划线、点号
  • 去除常见后缀(HD / 4K / 高清 / 超清 / 标清 / 综合 / 新闻 / 频道 / 直播 / 括号内容)
  • ** 特殊正则匹配:**13新闻**13
  • 过滤 EPG 服务器域名(避免误请求)

6.3 台标降级策略

主 CDN 加载 → 失败 → 备用 CDN 加载 → 失败 → 文字台标(SVG)
                                         ↑
                            城市频道 → 城市地标台标(SVG)

文字台标:根据频道名生成带颜色背景的缩写图标

  • 中文名取前两个字(如"湖南" → "湖南")
  • 英文名取前两个字母或单词首字母(如"**5" → "CC")
  • 颜色根据频道名哈希值生成固定色相

城市地标台标:为主要城市频道生成带地标 emoji 的 SVG 图标,覆盖 30+ 城市:

  • 直辖市:北京(🏛️)、上海(🗼)、天津(🎡)、重庆(🏯)
  • 省会城市:广州(🏗️)、深圳(🌆)、杭州(🏛️)、成都(🐼)、武汉(🏯)、西安(🏛️)等

6.4 台标缓存

  • 内存缓存logoCache 对象,避免重复 URL 生成
  • localStorage 缓存iptv_text_logo_cache,持久化文字台标 Data URL
  • 缓存优先查询,减少网络请求

7. 直播源检测

7.1 批量检测

  • 检测所有可见频道(排除已隐藏频道)
  • 分批并发检测:每批 5 个频道,间隔 100ms
  • 进度条实时显示检测进度和百分比
  • 显示正常 / 失效频道计数

7.2 检测方式

链接类型 检测方式 超时
普通链接 HEAD 请求 + no-cors 模式 10 秒
PHP 代理链接 通过 CGI /live 端点 HEAD 请求 10 秒

7.3 结果处理

  • 检测完成后显示结果面板:
    • 正常频道计数(绿色 ✓)
    • 失效频道计数(红色 ✗)
  • 失效频道列表:显示频道名称 + URL 预览(前 60 字符)
  • 全选 / 反选失效频道
  • 批量隐藏选中的失效频道(记录隐藏原因为"直播源检测失效")

8. 健康检测

  • 定时自动检测所有可见频道
  • 检测间隔:3 小时
  • 分批并发控制:每批 3 个,间隔 2 秒
  • 支持 AbortController 中止检测(页面关闭或新检测启动时)
  • 失效频道自动隐藏并弹出 Toast 提示

9. 数据存储与同步

9.1 本地存储(localStorage)

Key 内容 过期策略
iptv_channels 频道数据(JSON) 手动清除
iptv_groups 分组数据(JSON) 手动清除
iptv_epg_data EPG 节目单数据(JSON) 3 小时 / 数据过期
iptv_epg_time EPG 缓存时间戳 同上
iptv_epg_date EPG 缓存日期 同上
iptv_ep**ax_stop EPG 数据最大有效时间 同上
iptv_epg_url EPG 源 URL 手动修改
iptv_hidden_channels 隐藏频道数据(JSON) 30 天自动清理
iptv_text_logo_cache 文字台标缓存(JSON) 手动清除

9.2 服务器端存储

  • 后端 Python CGI 提供数据持久化 API
  • 数据存储目录:/var/apps/fnnas.liveplayer/config/data/
文件 内容
channels.json 频道数据
favorites.json 收藏数据
groups.json 分组数据
settings.json 设置数据
epg_cache.json EPG 缓存数据
epg_time.txt EPG 缓存时间戳

9.3 数据同步机制

页面加载 → 从服务器读取数据(5秒超时)
         ↓ 成功                    ↓ 超时/失败
    使用服务器数据               使用本地数据
         ↓                         ↓
    渲染界面                     渲染界面
         ↓                         ↓
    标记 isDataLoaded = true    标记 isDataLoaded = true
  • 自动同步:数据变更时标记 isDataModified,2 秒防抖后自动同步到服务器
  • 手动同步:点击同步状态指示器触发
  • 同步状态指示器
    • 🟢 已同步(绿色对勾)
    • 🟡 同步中(**圆圈)
    • 🔴 同步失败(红色叉号)

9.4 数据清理

清理项 条件 时机
EPG 缓存数据 超过 7 天 页面加载时
隐藏频道记录 超过 30 天 页面加载时
文字台标缓存 localStorage 溢出时 按需

10. 界面与交互

10.1 界面布局

**─────────────────────────────────────────────────**
**  NexPlay  ** 输入直播地址 ** 播放 导入 分组 节目单 清空 ** 🟢已同步 **
**───────────**─────────────────────────────────────**
** 频道列表  **                                     **
** ────────  **                                     **
** 全部**收藏  **          视频播放区域                **
** 央视**卫视  **                                     **
** ────────  **                                     **
** **1     **                                     **
**  20:00 新闻**                                     **
** **2     **                                     **
**  20:00 经济**     **──────────────────────**        **
** ...       **     **  📺 **1            **        **
**           **     **  正在播放: 新闻联播    **        **
**           **     **  接下来: 天气预报      **        **
**           **     **──────────────────────**        **
** 12 个频道  **                                     **
** 更新: 20:00**─────────────────────────────────────**
**           ** 就绪          1920x1080 (1080P)  代理  全屏 **
**───────────**─────────────────────────────────────**

10.2 主题与配色

  • 深色主题设计
  • 主背景色:#0a0a0f
  • 侧边栏背景:#0f0f15
  • 头部背景:#1a1a2e
  • 主色调:渐变 #667eea#764ba2(紫蓝色系)
  • 自定义滚动条样式

10.3 弹窗系统

弹窗 触发方式 内容
导入弹窗 点击"导入"按钮 文件上传区域 + URL 输入 + 目标分组选择
分组管理弹窗 点击"分组"按钮 新增分组 + 分组列表 + 数据工具
节目单设置弹窗 点击"节目单"按钮或 EPG 状态标签 EPG URL 配置 + 测试 + 调试信息
直播源检测弹窗 点击"检测直播源" 进度条 + 检测结果 + 批量操作
频道编辑弹窗 点击频道的 ✏️ 按钮 名称/URL/台标/分组/EPG匹配 编辑
调试信息弹窗 播放出错时自动弹出 错误类型 + 详细信息
自定义对话框 查看隐藏频道等场景 自定义标题和内容

10.4 移动端适配

  • playsinline / webkit-playsinline 属性:iOS 内联播放
  • X5 内核适配:
    • x5-video-player-type="h5" - H5 同层播放器
    • x5-video-player-fullscreen="true" - X5 全屏
    • x5-video-orientation="portrait" - 竖屏方向
  • 视频初始静音(适应移动端自动播放策略),播放后自动取消静音
  • 响应式布局:工具栏 flex-wrap 自动换行

三、后端 API 接口清单

3.1 数据 API

端点 方法 功能 请求体 响应
/api/data GET 获取所有数据 - { channels, favorites, groups, settings, epgCache, epgTime }
/api/data POST 保存所有数据 { channels?, favorites?, groups?, settings?, epgCache?, epgTime? } { ok, saved }
/api/channels GET 获取频道列表 - 频道数组
/api/channels POST 保存频道列表 频道数组 { ok }
/api/favorites GET 获取收藏列表 - 收藏数组
/api/favorites POST 保存收藏列表 收藏数组 { ok }

3.2 代理 API

端点 方法 功能 参数
/raw?url= GET 代理原始资源 url - 目标资源 URL
/live?url= GET 代理 HLS 直播流 url - M3U8 地址
/allinone/* GET 代理 AllInOne 平台直播源 路径参数

3.3 静态文件服务

  • 提供 HTML / CSS / JS / 图片等静态资源
  • 支持的 MIME 类型:html、css、js、json、png、jpg、gif、svg、ico、xml、m3u、m3u8、txt
  • 路径安全检查:禁止 .. 路径穿越

3.4 CORS 支持

所有 API 响应均包含跨域头:

  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Methods: GET, POST, OPTIONS
  • Access-Control-Allow-Headers: *
  • 支持 OPTIONS 预检请求

四、安装与运维

4.1 安装信息

项目 内容
安装方式 FPK 包标准安装
运行依赖 Python 3.12
应用类型 iframe(通过飞牛 NAS 桌面 iframe 加载)
数据目录 /var/apps/fnnas.liveplayer/config/data/
应用目录 /var/apps/fnnas.liveplayer/target/ui/
授权路径 已禁用(disable_authorization_path=true
端口检测 已关闭(checkport=false

4.2 生命周期脚本

脚本 触发时机 说明
install_init 安装初始化 无特殊操作
install_callback 安装完成后 输出"安装完成"
upgrade_init 升级初始化 无特殊操作
upgrade_callback 升级完成后 输出"升级完成"
uninstall_init 卸载初始化 无特殊操作
uninstall_callback 卸载完成后 可选保留或删除用户数据(默认保留,注释中有 rm -rf 命令)
config_init 配置初始化 无特殊操作
config_callback 配置变更后 无特殊操作
main 服务管理 支持 start/stop/status 命令(当前均为空操作)

4.3 卸载数据保留

卸载时默认保留用户数据,如需清除需手动删除:

rm -rf /var/apps/fnnas.liveplayer/data

五、版本更新日志

v1.7.26

  • 修复节目单过期问题
  • 缩短缓存时间至 3 小时
  • 添加手动刷新按钮
  • 显示最后更新时间
  • 智能检测过期节目自动刷新

六、技术栈

组件 技术 / 版本
后端语言 Python 3.12
前端框架 原生 HTML / CSS / JavaScript
HLS 播放器 hls.js(CDN 引入)
FLV 播放器 flv.js(CDN 引入)
EPG 格式 XMLTV 标准格式
数据格式 JSON
CGI 协议 标准 CGI(环境变量 + stdin/stdout)
台标 CDN jsDelivr / GitHub Raw
收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

15

回帖

0

牛值

江湖小虾

有好用的节目源吗

0

主题

15

回帖

0

牛值

江湖小虾

强烈支持

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则