×

📺 IPTV

B2C · Xtream · Reseller

IPTV 管理用户

存档存储层

适用于 500 多个并发客户端的三层归档系统。

编码器

写缓冲区

2小时热窗口(NVMe或tmpfs)

→ 镜像(连续)

硬盘RAID 5

50 TB,保留 14 天

→ 按需预取

播放缓存

1 TB 热缓存,500 多个客户端

客户

照镜子,不动

早于mirror_min_age_分钟的段将连续复制到 RAID。

等级

目的

设置

写缓冲区

24/7 接收片段,保持 2 小时热窗口以进行快速最近倒回播放,保护 RAID 免受随机 IO 的影响。

device_path(块设备或“tmpfs”)、tmpfs_size_pct(tmpfs 时为 10-50% MemAvailable)、mirror_min_age_ 分钟、evict_age_分钟、flush_threshold_percent(强制刷新触发)

硬盘 RAID 存档

长尾存储可实现完全保留(默认 14 天)。

保留天数、raid_device、nginx_location、min_free_percent

播放缓存(可选)

超过 2 小时的流行文件的读取端缓存(例如 EPG 追赶)。

prefetch_hours、max_sessions、eviction_policy(会话/lru/fifo)

容量计算

实时写入 × 2h = write_buffer 热窗口大小。

读取(分层感知查找)

Stream.dvr_file_path/2 按顺序探测 write_buffer →playback_cache →archive。

tmpfs 虚拟磁盘(开发/测试)

每个层都可以使用 RAM 支持的 tmpfs 虚拟磁盘,而不是物理块设备。

大小(以 % 可用 RAM 表示)

分配被指定为 MemAvailable 的百分比(来自 /proc/meminfo)——步骤 10,有效值 10/20/30/40/50。

OOM安全卫士

如果计算的目标超过当前 MemAvailable 的 60%,则挂载将被拒绝,并且该层保持脱机状态(Stream.archive_path 会下降到下一个正常的层)。

重启持久化

tmpfs 存在于 RAM 中 — 当主机重新启动时,任何正在运行的缓冲区内容都会丢失。

何时使用 tmpfs

在以下情况下使用 tmpfs 进行 write_buffer:(a) 开发/测试盒没有备用 NVMe,但您仍希望运行完整的 DVR 管道以进行集成测试,(b) 操作员希望验证镜像 + 存档行为而不预先购买 NVMe,(c) 可以接受重新启动时丢失的临时测试。

更快地刷新 tmpfs

当写入层为 tmpfs 时,StorageTierFlush 使用更严格的默认值 —mirror_min_age 2 分钟,evict_age 15 分钟(物理 NVMe 为 5 分钟/120 分钟)。

层自动配置和安全

层通过配置 > 存储 > 存储层配置一次并自动配置 — 无需在主机上进行手动 mkfs/mount/fstab 编辑。

默认启动种子

首次启动时(数据库中无写入层),系统会自动创建一个 tmpfs 支持的写入层,分配 30% MemAvailable,挂载点 /mnt/nvme_write。

健康与故障转移

Stream.archive_path/1 返回第一个“健康”层 — write_buffer(如果 Mount+writable+free_pct 高于安全层),否则回退到存档(降级模式)。

实时尺寸变化

在 UI 中更改 tmpfs_size_pct 会在保存时触发 umount + 重新挂载新大小。

基本 URL — OSTV 播放器

封装字段

包API

密码政策

经销商API

设置

用户字段

用户管理

IPTV 管理用户

基本 URL — OSTV 播放器

OSTV 播放器应用程序允许用户更改服务器基本 URL(API 地址)。

原因:更改基本 URL 仅适用于管理员/root 用户,以便他们可以在服务器之间切换(例如生产与测试)。

用户字段

包API

返回所有活动套餐的列表以及价格和计费周期。

管理用户列表(经销商/提供商)。

返回特定管理用户的信用余额。

封装字段

经销商API

面向经销商/提供商的 API。

密码政策

创建订阅者时需要密码。

最少 8 个字符

至少 1 个大写字母 (A-Z)

至少 1 个特殊字符(!@#$%^&* 等)

适用于 UI 和 API。

设置

层自动配置和安全

容量 + 文件系统自动检测:当从下拉列表中选择空闲 NVMe 时,将从 lsblk -bn -o SIZE 读取容量 (GB),并从 blkid 读取当前 FS(使用整个磁盘回退)。

分层冲洗机制——连续镜

StorageTierFlush GenServer 每 60 秒运行一次。

为什么连续镜像胜过“等待 60 分钟,批量移动”:(1) RAID 负载均匀 — 在小时边界内没有 5GB 突发,只有 7MB 段的涓流;

正在进行的段安全:镜像仅通过 find -mmin +5 选取早于 MIRROR_MIN_AGE_MINUTES 的文件。

每次部署调整 (.env)

500–1000

尺寸规则:

DVR 预览日历

DVR 预览选项卡显示服务器呈现的日历,仅突出显示磁盘上存在录制内容的日期。

有录音的日子是可点击的(蓝色)——点击会在日期时间输入中预先填充当天的 00:00;

在 Stream.available_dvr_days/1 中通过每个层挂载上的 find -mindepth 4 -maxdepth 4 -type d 实现;

B2C 播放器 API

概述

B2C(企业对消费者)API 为最终用户播放器应用程序提供身份验证和流访问。

验证

对用户进行身份验证并获取 auth_token 以供后续 API 调用使用。

方法

端点

请求正文

范围

类型

必需的

描述

是的

用户登录名

用户密码

请求示例

响应字段

成功响应 (200)

用于后续 API 调用的加密身份验证令牌

ISO 8601 格式的令牌到期日期/时间

成功响应示例

错误响应 (403)

错误描述信息

HTTP 状态码

错误响应示例

用户信息

使用身份验证令牌检索有关经过身份验证的用户的信息。

响应字段

经过身份验证的用户的用户名

服务器消息(如果没有则为空)

身份验证状态(1 = 已通过身份验证)

帐户状态:活动、禁止、禁用、试用

帐户到期日期(如果无限制则为空)

当前活跃连接数

ISO 8601 格式的帐户创建日期

允许的最大同时连接数

允许的输出流格式列表

用户所有者/经销商的提供商名称(如果没有则为 null)

提供商徽标图像的 URL(如果没有则为 null)

提供商折叠徽标图像 208x208 的 URL(如果没有则为 null)

ISO 8601 格式的当前服务器时间

请求示例

类别

检索按类型过滤的类别。

类别类型:直播、点播或连续剧

字符串形式的类别 ID

类别显示名称

父类别 ID(如果为根,则为 0)

用于缓存失效的内容的 MD5 哈希值

请求示例

点播详情

检索特定 VOD 项目的详细信息,包括元数据和流链接。

点播流 ID (UUID)

信息对象字段

封面图片网址

TMDB标识符

背景图片 URL

流派字符串

情节/描述

演职人员

评分值(0-10)

董事姓名

发售日期

持续时间(以秒为单位)

格式化字符串形式的持续时间

类别 ID 数组

如果是成人内容则为 1,否则为 0

VOD 对象字段

点播流ID

点播标题

添加日期 (ISO 8601)

流链接 URL

视频/音频编解码器元数据

系列详情

检索包含完整季和剧集列表的系列信息(按季号分组)。

系列 ID (UUID)

季节数组字段

季数

季节显示名称

本季剧集数

当季播出日期

季节概述/描述

季节封面图片 URL

剧集对象

地图以季节编号字符串为键。

剧集对象字段

剧集 ID

TMDB 剧集 ID

季内集数

剧集标题

添加日期 (ISO 8601)

季数

剧集信息对象(与 VOD 信息结构相同)

流链接 URL

视频/音频编解码器元数据

笔记

令牌过期时间取决于用户角色:admin = 365 天,其他 = 30 天|禁用帐户无法进行身份验证(返回 403)|每次成功登录都会更新用户的last_login 时间戳|令牌经过加密并包含 user_id、用户名、角色和过期时间

成功响应 (200)

从 /auth 端点获取的身份验证令牌