Files
monibuca/plugin/crontab
langhuihui 8a9fffb987 refactor: frame converter and mp4 track improvements
- Refactor frame converter implementation
- Update mp4 track to use ICodex
- General refactoring and code improvements

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-28 19:55:37 +08:00
..
2025-08-21 22:43:08 +08:00
2025-08-21 22:43:08 +08:00
2025-08-21 22:43:08 +08:00
2025-08-21 22:43:08 +08:00
2025-08-21 22:43:08 +08:00
2025-08-03 20:35:52 +08:00

M7S Crontab 插件说明文档

1. 插件概述

Crontab 插件是 M7S 流媒体服务器的一个扩展组件,主要用于实现基于时间计划的自动录制功能。该插件允许用户创建定时录制计划,根据预设的时间表自动开始和停止流媒体的录制,支持灵活的周期性录制设置。

2. 核心功能

  • 定时录制计划管理:创建、更新、删除和查询录制计划
  • 流路径关联:将录制计划与特定的流路径关联
  • 时间表设置:通过 168 位的二进制字符串7天×24小时定义每周的录制时间段
  • 自动录制控制:根据时间计划自动开始和停止录制
  • 状态监控:查询当前正在执行和计划中的录制任务状态

3. 文件结构与功能

3.1 主要文件

3.1.1 index.go

插件的入口文件,定义了 CrontabPlugin 结构体和初始化方法。

  • 主要结构
    • CrontabPlugin插件的主结构体包含插件基础功能、API服务器实现和数据集合
  • 主要功能
    • OnInit():插件初始化函数,负责数据库迁移、加载已有录制计划并创建相应的定时任务

3.1.2 crontab.go

定义了定时任务的核心逻辑和执行流程。

  • 主要结构
    • TimeSlot:表示一个时间段,包含开始和结束时间
    • Crontab:定时任务调度器,负责根据计划执行录制操作
  • 主要功能
    • Start():初始化定时任务
    • Run():阻塞运行定时任务,循环检查并执行录制操作
    • Dispose():停止定时任务
    • getNextTimeSlot():计算下一个需要执行的时间段
    • startRecording():开始录制流
    • stopRecording():停止录制流

3.1.3 api.go

实现了插件的 API 接口,提供了与前端交互的功能。

  • 主要功能
    • 录制计划管理:List(), Add(), Update(), Remove()
    • 录制计划流关联管理:ListRecordPlanStreams(), AddRecordPlanStream(), UpdateRecordPlanStream(), RemoveRecordPlanStream()
    • 计划解析:ParsePlanTime()
    • 状态查询:GetCrontabStatus()
  • 辅助功能
    • 时间计算:getWeekdayName(), getWeekdayIndex(), getNextDateForWeekday()
    • 时间段计算:calculateTimeSlots(), getNextTimeSlotFromNow()

3.2 子目录文件

3.2.1 pkg 目录

包含数据模型定义和数据库操作相关功能。

  • recordplan.go

    • 定义 RecordPlan 结构体,表示录制计划的数据模型
    • 包含计划ID、名称、时间表和启用状态等字段
  • recordplanstream.go

    • 定义 RecordPlanStream 结构体,表示录制计划与流路径的关联
    • 提供数据库查询的辅助函数,如按流路径模糊查询、按创建时间排序等

3.2.2 pb 目录

包含 Protocol Buffers 定义和生成的代码,用于 API 接口和数据传输。

  • crontab.proto

    • 定义了插件的 API 服务接口
    • 定义了各种请求和响应消息结构
    • 包含 HTTP 路由映射配置
  • crontab.pb.go, crontab.pb.gw.go, crontab_grpc.pb.go

    • 由 Protocol Buffers 编译器自动生成的 Go 代码
    • 实现了消息序列化/反序列化和 gRPC 服务接口

4. 工作流程

4.1 插件初始化流程

  1. 插件启动时,OnInit() 方法被调用
  2. 执行数据库迁移,确保必要的表结构存在
  3. 从数据库加载所有录制计划和关联的流信息
  4. 对于已启用的计划,创建并启动相应的定时任务

4.2 录制计划执行流程

  1. 定时任务启动后,进入 Run() 方法的循环
  2. 通过 getNextTimeSlot() 计算下一个需要执行的时间段
  3. 设置定时器等待到达开始时间
  4. 到达开始时间后,调用 startRecording() 开始录制
  5. 设置定时器等待到达结束时间
  6. 到达结束时间后,调用 stopRecording() 停止录制
  7. 循环继续,计算下一个时间段

4.3 API 交互流程

  1. 前端通过 HTTP/gRPC 接口与插件交互
  2. 可以创建、更新、删除录制计划和流关联
  3. 可以查询当前正在执行和计划中的录制任务状态
  4. 可以解析计划字符串,获取时间段信息

5. 关键概念

5.1 录制计划 (RecordPlan)

录制计划定义了何时进行录制的时间表。每个计划包含:

  • ID:唯一标识符
  • 名称:计划名称
  • 时间表168位的二进制字符串表示一周中每个小时是否进行录制
  • 启用状态:是否启用该计划

5.2 录制计划流 (RecordPlanStream)

将录制计划与特定的流路径关联,定义了录制的具体参数:

  • 计划ID关联的录制计划ID
  • 流路径:要录制的流的路径
  • 分片设置:录制文件的分片参数
  • 文件路径:录制文件的保存路径
  • 启用状态:是否启用该关联

5.3 时间表格式

时间表使用 168 位的二进制字符串表示一周中的每个小时是否进行录制:

  • 每天 24 小时,一周 7 天,共 168 小时
  • 字符串中的每一位对应一个小时,'1' 表示录制,'0' 表示不录制
  • 字符串按周日到周六的顺序排列,每天 24 位

例如:

  • 全为 '0':一周中不进行任何录制
  • 前 24 位为 '1',其余为 '0':仅在周日全天录制
  • 每天的第 9 位到第 17 位为 '1':每天上午 9 点到下午 5 点录制

6. 使用场景

  1. 定期节目录制:适用于每周固定时间播出的节目自动录制
  2. 工作时间监控:仅在工作时间段自动录制监控视频
  3. 带宽管理:在网络带宽充足的时间段进行录制,避开高峰期
  4. 存储优化:只录制有价值的时间段,节省存储空间

7. API 接口说明

7.1 录制计划管理

  • 列表查询GET /plan/api/list
  • 添加计划POST /plan/api/add
  • 更新计划POST /plan/api/update/{id}
  • 删除计划POST /plan/api/remove/{id}

7.2 录制计划流管理

  • 列表查询GET /planstream/api/list
  • 添加关联POST /planstream/api/add
  • 更新关联POST /planstream/api/update
  • 删除关联POST /planstream/api/remove/{planId}/{streamPath}

7.3 其他接口

  • 解析计划GET /plan/api/parse/{plan}
  • 状态查询GET /crontab/api/status

8. 总结

Crontab 插件为 M7S 流媒体服务器提供了强大的定时录制功能,通过灵活的时间表设置和流路径关联,实现了自动化的录制控制。该插件适用于需要定期录制特定时间段流媒体内容的场景,能有效节省人力和存储资源。