Преглед изворни кода

feat(live-stream): implement live stream management features and UI enhancements

- Added API functions for managing live streams, including listing, adding, updating, and deleting streams.
- Introduced a new Vue component for live stream management, featuring a search form and a data table for displaying stream information.
- Updated form layout to include necessary fields such as LSS ID, camera ID, and push method, enhancing user experience.
- Refactored related types to accommodate the new live stream structure and ensure consistency across the application.
- Created comprehensive documentation for the live stream API to provide clear usage guidelines.
yb пре 1 недеља
родитељ
комит
58497408ff

+ 0 - 3326
docs/api_torna/export-1768527071618.md

@@ -1,3326 +0,0 @@
-# 文档
-
-## 摄像头控制 Controller
-
-MVP API 接口:
-
-- GET /camera/list 获取摄像头列表
-- GET /camera/{id} 获取摄像头信息
-- POST /camera/switch 切换摄像头通道
-- GET /camera/current 获取当前通道
-
-后台 PTZ 接口(可选):
-
-- POST /camera/{id}/ptz/start 开始 PTZ 控制
-- POST /camera/{id}/ptz/stop 停止 PTZ 控制
-
-### 获取摄像头列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/list
-
-描述:获取摄像头列表
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述            | 示例值      |
-| --------- | ------ | ---- | -------- | --------------- | ----------- |
-| machineId | String | 否   | -        | 机器 ID(可选) | machine_001 |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 摄像头名称 | 主摄像头 |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
-| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
-| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
-| └ channels | List<ChannelDTO> | 否 |  | 通道列表 (ActualType: ChannelDTO) |  |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 通道状态: ONLINE, OFFLINE | ONLINE |
-| └ cameraId | String | 否 | - | 所属摄像头 ID | cam_001 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "cameraId": "cam_001",
-            "name": "主摄像头",
-            "machineId": "machine_001",
-            "status": "ONLINE",
-            "capability": "ptz_enabled",
-            "ptzSupported": true,
-            "channels": [
-                {
-                    "channelId": "ch_001",
-                    "name": "主通道",
-                    "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                    "defaultView": true,
-                    "status": "ONLINE",
-                    "cameraId": "cam_001"
-                }
-            ]
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头信息
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/camera/{cameraId}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/{cameraId}
-
-描述:获取摄像头信息
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值     |
-| -------- | ---- | --------- | ---------- |
-| cameraId | 是   | 摄像头 ID | camera_001 |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraDTO) |  |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 摄像头名称 | 主摄像头 |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
-| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
-| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
-| └ channels | List<ChannelDTO> | 否 |  | 通道列表 (ActualType: ChannelDTO) |  |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 通道状态: ONLINE, OFFLINE | ONLINE |
-| └ cameraId | String | 否 | - | 所属摄像头 ID | cam_001 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "machineId": "machine_001",
-        "status": "ONLINE",
-        "capability": "ptz_enabled",
-        "ptzSupported": true,
-        "channels": [
-            {
-                "channelId": "ch_001",
-                "name": "主通道",
-                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                "defaultView": true,
-                "status": "ONLINE",
-                "cameraId": "cam_001"
-            }
-        ]
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 切换摄像头通道(MVP 核心)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/switch
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/switch
-
-描述:切换摄像头通道(MVP 核心)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述        | 示例值      |
-| --------- | ------ | ---- | -------- | ----------- | ----------- |
-| machineId | String | 是   | -        | 机器 ID     | machine_001 |
-| channelId | String | 是   | -        | 目标通道 ID | ch_001      |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001",
-    "channelId": "ch_001"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型    | 必填 | 最大长度 | 描述                              | 示例值                           |
-| ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- |
-| success       | Boolean | 否   | -        | 请求是否成功                      | true                             |
-| errCode       | String  | 否   | -        | 错误码(失败时返回)              |                                  |
-| errMessage    | String  | 否   | -        | 错误信息(失败时返回)            |                                  |
-| data          | object  | 否   |          | 响应数据 (ActualType: ChannelDTO) |                                  |
-| └ channelId   | String  | 否   | -        | 通道 ID                           | ch_001                           |
-| └ name        | String  | 否   | -        | 通道名称                          | 主通道                           |
-| └ rtspUrl     | String  | 否   | -        | RTSP 地址                         | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否   | -        | 是否默认视角                      | true                             |
-| └ status      | String  | 否   | -        | 通道状态: ONLINE, OFFLINE         | ONLINE                           |
-| └ cameraId    | String  | 否   | -        | 所属摄像头 ID                     | cam_001                          |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "channelId": "ch_001",
-        "name": "主通道",
-        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-        "defaultView": true,
-        "status": "ONLINE",
-        "cameraId": "cam_001"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取当前活动通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/camera/current
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/current
-
-描述:获取当前活动通道
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述    | 示例值      |
-| --------- | ------ | ---- | -------- | ------- | ----------- |
-| machineId | string | 是   | -        | 机器 ID | machine_001 |
-
-#### 响应参数
-
-| 名称          | 类型    | 必填 | 最大长度 | 描述                              | 示例值                           |
-| ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- |
-| success       | Boolean | 否   | -        | 请求是否成功                      | true                             |
-| errCode       | String  | 否   | -        | 错误码(失败时返回)              |                                  |
-| errMessage    | String  | 否   | -        | 错误信息(失败时返回)            |                                  |
-| data          | object  | 否   |          | 响应数据 (ActualType: ChannelDTO) |                                  |
-| └ channelId   | String  | 否   | -        | 通道 ID                           | ch_001                           |
-| └ name        | String  | 否   | -        | 通道名称                          | 主通道                           |
-| └ rtspUrl     | String  | 否   | -        | RTSP 地址                         | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否   | -        | 是否默认视角                      | true                             |
-| └ status      | String  | 否   | -        | 通道状态: ONLINE, OFFLINE         | ONLINE                           |
-| └ cameraId    | String  | 否   | -        | 所属摄像头 ID                     | cam_001                          |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "channelId": "ch_001",
-        "name": "主通道",
-        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-        "defaultView": true,
-        "status": "ONLINE",
-        "cameraId": "cam_001"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 开始 PTZ 控制(后台专用)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/start
-
-描述:开始 PTZ 控制(后台专用)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称   | 类型   | 必填 | 最大长度 | 描述        | 示例值 |
-| ------ | ------ | ---- | -------- | ----------- | ------ |
-| action | string | 是   | -        | PTZ 动作    | up     |
-| speed  | int32  | 是   | -        | 速度(1-100) | 50     |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 停止 PTZ 控制(后台专用)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/stop
-
-描述:停止 PTZ 控制(后台专用)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### PTZ 直接控制(兼容前端 pan/tilt/zoom 方式)
-
-与前端海康调试接口一致:直接传 pan/tilt/zoom 值
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/control
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/control
-
-描述:PTZ 直接控制(兼容前端 pan/tilt/zoom 方式)
-
-与前端海康调试接口一致:直接传 pan/tilt/zoom 值
-
-ContentType:`application/json`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                                   | 示例值 |
-| ------- | ------- | ---- | -------- | ------------------------------------------------------ | ------ |
-| pan     | Integer | 否   | 100      | 水平移动速度<br>负值向左,正值向右<br>范围: -100 ~ 100 | 0      |
-| tilt    | Integer | 否   | 100      | 垂直移动速度<br>负值向下,正值向上<br>范围: -100 ~ 100 | 0      |
-| zoom    | Integer | 否   | 100      | 缩放速度<br>负值缩小,正值放大<br>范围: -100 ~ 100     | 0      |
-| channel | Integer | 否   | -        | 通道号(可选,默认 1)                                 | 0      |
-
-#### 请求示例
-
-```
-{
-    "pan": 0,
-    "tilt": 0,
-    "zoom": 0,
-    "channel": 0
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 摄像头管理
-
-### 获取摄像头列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/list
-
-描述:获取摄像头列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型    | 必填 | 最大长度 | 描述                                            | 示例值      |
-| --------- | ------- | ---- | -------- | ----------------------------------------------- | ----------- |
-| page      | Integer | 否   | -        | 页码 (从 1 开始)                                | 1           |
-| size      | Integer | 否   | -        | 每页条数                                        | 10          |
-| keyword   | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头      |
-| enabled   | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true        |
-| sortBy    | String  | 否   | -        | 排序字段                                        | createdAt   |
-| sortDir   | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC        |
-| machineId | String  | 否   | -        | 机器 ID 过滤                                    | machine_001 |
-| status    | String  | 否   | -        | 在线状态过滤 (ONLINE/OFFLINE)                   | ONLINE      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC",
-    "machineId": "machine_001",
-    "status": "ONLINE"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
-| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
-| └ size | Integer | 否 | - | 每页条数 | 10 |
-| └ total | Long | 否 | - | 总记录数 | 100 |
-| └ totalPages | Integer | 否 | - | 总页数 | 10 |
-| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
-| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "cameraId": "cam_001",
-                "name": "主摄像头",
-                "ip": "192.168.1.100",
-                "port": 80,
-                "username": "admin",
-                "brand": "hikvision",
-                "capability": "ptz_enabled",
-                "status": "ONLINE",
-                "machineId": "machine_001",
-                "machineName": "1号机",
-                "enabled": true,
-                "channels": [
-                    {
-                        "id": 1,
-                        "channelId": "ch_001",
-                        "name": "主通道",
-                        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                        "defaultView": true,
-                        "status": "ONLINE"
-                    }
-                ],
-                "createdAt": "2026-01-07T10:00:00",
-                "updatedAt": "2026-01-07T10:00:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/listAll
-
-描述:获取摄像头列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述            | 示例值      |
-| --------- | ------ | ---- | -------- | --------------- | ----------- |
-| machineId | string | 否   | -        | 机器 ID(可选) | machine_001 |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "cameraId": "cam_001",
-            "name": "主摄像头",
-            "ip": "192.168.1.100",
-            "port": 80,
-            "username": "admin",
-            "brand": "hikvision",
-            "capability": "ptz_enabled",
-            "status": "ONLINE",
-            "machineId": "machine_001",
-            "machineName": "1号机",
-            "enabled": true,
-            "channels": [
-                {
-                    "id": 1,
-                    "channelId": "ch_001",
-                    "name": "主通道",
-                    "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                    "defaultView": true,
-                    "status": "ONLINE"
-                }
-            ],
-            "createdAt": "2026-01-07T10:00:00",
-            "updatedAt": "2026-01-07T10:00:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/detail
-
-描述:获取摄像头详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "machineId": "machine_001",
-        "machineName": "1号机",
-        "enabled": true,
-        "channels": [
-            {
-                "id": 1,
-                "channelId": "ch_001",
-                "name": "主通道",
-                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                "defaultView": true,
-                "status": "ONLINE"
-            }
-        ],
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/add
-
-描述:添加摄像头
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
-| cameraId | String | 是 | 50 | 摄像头 ID(唯一标识)<br>Validate[max: 50; ] | cam_001 |
-| name | String | 是 | 100 | 名称<br>Validate[max: 100; ] | 主摄像头 |
-| ip | String | 是 | - | IP 地址<br>Validate[regexp: ^((25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)\\.){3}(25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)$; ] | 192.168.1.100 |
-| port | Integer | 否 | - | 端口 | 80 |
-| username | String | 否 | 50 | 用户名<br>Validate[max: 50; ] | admin |
-| password | String | 否 | 100 | 密码<br>Validate[max: 100; ] | password123 |
-| brand | String | 否 | 30 | 品牌<br>Validate[max: 30; ] | hikvision |
-| capability | String | 否 | - | 能力: switch_only, ptz_enabled<br>Validate[regexp: ^(switch_only | ptz_enabled)$; ] | ptz_enabled |
-| machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| channels | List<CameraAddRequest$ChannelAddRequest> | 否 |  | 通道列表 (ActualType: ChannelAddRequest) |  |
-| └ channelId | String | 是 | - | 通道 ID | ch_001 |
-| └ name | String | 是 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-
-#### 请求示例
-
-```
-{
-    "cameraId": "cam_001",
-    "name": "主摄像头",
-    "ip": "192.168.1.100",
-    "port": 80,
-    "username": "admin",
-    "password": "password123",
-    "brand": "hikvision",
-    "capability": "ptz_enabled",
-    "machineId": "machine_001",
-    "channels": [
-        {
-            "channelId": "ch_001",
-            "name": "主通道",
-            "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-            "defaultView": true
-        }
-    ]
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "machineId": "machine_001",
-        "machineName": "1号机",
-        "enabled": true,
-        "channels": [
-            {
-                "id": 1,
-                "channelId": "ch_001",
-                "name": "主通道",
-                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                "defaultView": true,
-                "status": "ONLINE"
-            }
-        ],
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/update
-
-描述:更新摄像头
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| id | Long | 否 | - | 摄像头数据库 ID | 1 |
-| name | String | 否 | - | 名称 | 主摄像头 |
-| ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| port | Integer | 否 | - | 端口 | 80 |
-| username | String | 否 | - | 用户名 | admin |
-| password | String | 否 | - | 密码(不传或为空则不修改) | password123 |
-| brand | String | 否 | - | 品牌 | hikvision |
-| capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| enabled | Boolean | 否 | - | 启用状态 | true |
-| channels | List<CameraUpdateRequest$ChannelUpdateRequest> | 否 |  | 通道列表 (ActualType: ChannelUpdateRequest) |  |
-| └ id | Long | 否 | - | 通道数据库 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "主摄像头",
-    "ip": "192.168.1.100",
-    "port": 80,
-    "username": "admin",
-    "password": "password123",
-    "brand": "hikvision",
-    "capability": "ptz_enabled",
-    "machineId": "machine_001",
-    "enabled": true,
-    "channels": [
-        {
-            "id": 1,
-            "channelId": "ch_001",
-            "name": "主通道",
-            "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-            "defaultView": true
-        }
-    ]
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
-| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | ch_001 |
-| └ name | String | 否 | - | 通道名称 | 主通道 |
-| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "machineId": "machine_001",
-        "machineName": "1号机",
-        "enabled": true,
-        "channels": [
-            {
-                "id": 1,
-                "channelId": "ch_001",
-                "name": "主通道",
-                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-                "defaultView": true,
-                "status": "ONLINE"
-            }
-        ],
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/delete
-
-描述:删除摄像头
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 检测摄像头连通性
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/check
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/check
-
-描述:检测摄像头连通性
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                           | 示例值 |
-| ---------- | ------- | ---- | -------- | ------------------------------ | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                   | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)           |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)         |        |
-| data       | boolean | 否   | -        | 响应数据 (ActualType: Boolean) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": false
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头快照
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/snapshot
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/snapshot
-
-描述:获取摄像头快照
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型          | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean       | 否   | -        | 请求是否成功                | true   |
-| errCode    | String        | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String        | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | array         | 否   |          | 响应数据 (ActualType: byte) |        |
-| └ -        | array[byte[]] | 否   | -        | array of byte[]             |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            " -": ""
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### PTZ 控制
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/ptz
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/ptz
-
-描述:PTZ 控制
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称   | 类型   | 必填 | 最大长度 | 描述             | 示例值 |
-| ------ | ------ | ---- | -------- | ---------------- | ------ |
-| id     | Long   | 否   | -        | 摄像头 ID        | 1      |
-| action | String | 否   | -        | PTZ 动作         | UP     |
-| speed  | Float  | 否   | -        | 速度 (0.0 - 1.0) | 0.5    |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "action": "UP",
-    "speed": 0.5
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                           | 示例值 |
-| ---------- | ------- | ---- | -------- | ------------------------------ | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                   | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)           |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)         |        |
-| data       | boolean | 否   | -        | 响应数据 (ActualType: Boolean) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": false
-}
-```
-
-#### 错误码
-
-无
-
-## 机器管理
-
-### 获取机器列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/list
-
-描述:获取机器列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                                | 示例值              |
-| ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                        | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)                |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)              |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: PageResponse) |                     |
-| └ list        | List<T>       | 否   |          | 数据列表 (ActualType: T)            |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                             | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                             | machine_001         |
-| └ name        | String        | 否   | -        | 名称                                | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                                | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                                | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                            | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                          | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                            | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                            | 2026-01-07T10:00:00 |
-| └ page        | Integer       | 否   | -        | 当前页码 (从 1 开始)                | 1                   |
-| └ size        | Integer       | 否   | -        | 每页条数                            | 10                  |
-| └ total       | Long          | 否   | -        | 总记录数                            | 100                 |
-| └ totalPages  | Integer       | 否   | -        | 总页数                              | 10                  |
-| └ hasNext     | Boolean       | 否   | -        | 是否有下一页                        | true                |
-| └ hasPrevious | Boolean       | 否   | -        | 是否有上一页                        | false               |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "machineId": "machine_001",
-                "name": "1号机",
-                "location": "A区1楼",
-                "description": "主力机器",
-                "enabled": true,
-                "cameraCount": 3,
-                "createdAt": "2026-01-07T10:00:00",
-                "updatedAt": "2026-01-07T10:00:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取机器列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/machines/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/listAll
-
-描述:获取机器列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                        | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)        |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)      |                     |
-| data          | array         | 否   |          | 响应数据 (ActualType: List) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                     | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                     | machine_001         |
-| └ name        | String        | 否   | -        | 名称                        | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                        | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                        | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                    | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                  | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                    | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                    | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "machineId": "machine_001",
-            "name": "1号机",
-            "location": "A区1楼",
-            "description": "主力机器",
-            "enabled": true,
-            "cameraCount": 3,
-            "createdAt": "2026-01-07T10:00:00",
-            "updatedAt": "2026-01-07T10:00:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取机器详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/machines/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/detail
-
-描述:获取机器详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述        | 示例值 |
-| ---- | ----- | ---- | -------- | ----------- | ------ |
-| id   | int64 | 是   | -        | 机器主键 ID | 1      |
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/add
-
-描述:添加机器
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型   | 必填 | 最大长度 | 描述                                       | 示例值      |
-| ----------- | ------ | ---- | -------- | ------------------------------------------ | ----------- |
-| machineId   | String | 是   | 50       | 机器 ID(唯一标识)<br>Validate[max: 50; ] | machine_001 |
-| name        | String | 是   | 100      | 名称<br>Validate[max: 100; ]               | 1 号机      |
-| location    | String | 否   | 200      | 位置<br>Validate[max: 200; ]               | A 区 1 楼   |
-| description | String | 否   | 500      | 描述<br>Validate[max: 500; ]               | 主力机器    |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001",
-    "name": "1号机",
-    "location": "A区1楼",
-    "description": "主力机器"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/update
-
-描述:更新机器
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型    | 必填 | 最大长度 | 描述          | 示例值    |
-| ----------- | ------- | ---- | -------- | ------------- | --------- |
-| id          | Long    | 否   | -        | 机器数据库 ID | 1         |
-| name        | String  | 否   | -        | 名称          | 1 号机    |
-| location    | String  | 否   | -        | 位置          | A 区 1 楼 |
-| description | String  | 否   | -        | 描述          | 主力机器  |
-| enabled     | Boolean | 否   | -        | 启用状态      | true      |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "1号机",
-    "location": "A区1楼",
-    "description": "主力机器",
-    "enabled": true
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/delete
-
-描述:删除机器
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述        | 示例值 |
-| ---- | ----- | ---- | -------- | ----------- | ------ |
-| id   | int64 | 是   | -        | 机器主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 推流通道管理
-
-### 获取推流通道列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/list
-
-描述:获取推流通道列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
-| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
-| └ size | Integer | 否 | - | 每页条数 | 10 |
-| └ total | Long | 否 | - | 总记录数 | 100 |
-| └ totalPages | Integer | 否 | - | 总页数 | 10 |
-| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
-| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "channelId": "cf_channel_001",
-                "name": "主推流通道",
-                "accountId": "5544eac7cfb260d4fec9467d49513cea",
-                "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-                "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-                "mode": "WHIP",
-                "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-                "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-                "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-                "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-                "recordingEnabled": false,
-                "enabled": true,
-                "createdAt": "2024-01-15T10:30:00",
-                "updatedAt": "2024-01-15T10:30:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/listAll
-
-描述:获取推流通道列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "channelId": "cf_channel_001",
-            "name": "主推流通道",
-            "accountId": "5544eac7cfb260d4fec9467d49513cea",
-            "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-            "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-            "mode": "WHIP",
-            "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-            "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-            "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-            "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-            "recordingEnabled": false,
-            "enabled": true,
-            "createdAt": "2024-01-15T10:30:00",
-            "updatedAt": "2024-01-15T10:30:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/detail
-
-描述:获取推流通道详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述            | 示例值 |
-| ---- | ----- | ---- | -------- | --------------- | ------ |
-| id   | int64 | 是   | -        | 推流通道主键 ID | 1      |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/add
-
-描述:添加推流通道
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| channelId | String | 是 | - | 通道 ID | cf_channel_001 |
-| name | String | 是 | - | 通道名称 | 主推流通道 |
-| accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW |
-| liveInputId | String | 是 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 |
-| customerSubdomain | String | 是 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-
-#### 请求示例
-
-```
-{
-    "channelId": "cf_channel_001",
-    "name": "主推流通道",
-    "accountId": "5544eac7cfb260d4fec9467d49513cea",
-    "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW",
-    "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-    "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6",
-    "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-    "mode": "WHIP",
-    "recordingEnabled": false
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/update
-
-描述:更新推流通道
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| id | Long | 是 | - | 主键 ID | 1 |
-| name | String | 否 | - | 通道名称 | 主推流通道 |
-| accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW |
-| liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 |
-| customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| enabled | Boolean | 否 | - | 是否启用 | true |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "主推流通道",
-    "accountId": "5544eac7cfb260d4fec9467d49513cea",
-    "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW",
-    "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-    "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6",
-    "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-    "mode": "WHIP",
-    "recordingEnabled": false,
-    "enabled": true
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/delete
-
-描述:删除推流通道
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述            | 示例值 |
-| ---- | ----- | ---- | -------- | --------------- | ------ |
-| id   | int64 | 是   | -        | 推流通道主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 管理员认证
-
-### 登录
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/login
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/login
-
-描述:登录
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称     | 类型   | 必填 | 最大长度 | 描述                          | 示例值 |
-| -------- | ------ | ---- | -------- | ----------------------------- | ------ |
-| username | String | 是   | 50       | 用户名<br>Validate[max: 50; ] | admin  |
-| password | String | 是   | 100      | 密码<br>Validate[max: 100; ]  | 123456 |
-
-#### 请求示例
-
-```
-{
-    "username": "admin",
-    "password": "123456"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: LoginResponse) |  |
-| └ token | String | 否 | - | JWT Token | eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx |
-| └ tokenType | String | 否 | - | Token 类型 | Bearer |
-| └ expiresIn | Long | 否 | - | 过期时间(秒) | 86400 |
-| └ admin | AdminInfoDTO | 否 |  | 用户信息 |  |
-| └ id | Long | 否 | - | 用户 ID | 1 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ nickname | String | 否 | - | 昵称 | 管理员 |
-| └ role | String | 否 | - | 角色 | ADMIN |
-| └ lastLoginAt | LocalDateTime | 否 | - | 最后登录时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx",
-        "tokenType": "Bearer",
-        "expiresIn": 86400,
-        "admin": {
-            "id": 1,
-            "username": "admin",
-            "nickname": "管理员",
-            "role": "ADMIN",
-            "lastLoginAt": "2026-01-07T10:00:00"
-        }
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 登出
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/logout
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/logout
-
-描述:登出
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取当前用户信息(直接从 Token 解析,不查询数据库)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/auth/info
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/auth/info
-
-描述:获取当前用户信息(直接从 Token 解析,不查询数据库)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                                | 示例值              |
-| ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                        | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)                |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)              |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: AdminInfoDTO) |                     |
-| └ id          | Long          | 否   | -        | 用户 ID                             | 1                   |
-| └ username    | String        | 否   | -        | 用户名                              | admin               |
-| └ nickname    | String        | 否   | -        | 昵称                                | 管理员              |
-| └ role        | String        | 否   | -        | 角色                                | ADMIN               |
-| └ lastLoginAt | LocalDateTime | 否   | -        | 最后登录时间                        | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "username": "admin",
-        "nickname": "管理员",
-        "role": "ADMIN",
-        "lastLoginAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 修改密码
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/password
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/password
-
-描述:修改密码
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型   | 必填 | 最大长度 | 描述                                         | 示例值      |
-| ----------- | ------ | ---- | -------- | -------------------------------------------- | ----------- |
-| oldPassword | String | 是   | -        | 旧密码                                       | oldpassword |
-| newPassword | String | 是   | 100      | 新密码(6-100 字符)<br>Validate[max: 100; ] | newpassword |
-
-#### 请求示例
-
-```
-{
-    "oldPassword": "oldpassword",
-    "newPassword": "newpassword"
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 统计
-
-### 获取仪表盘统计数据
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stats/dashboard
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stats/dashboard
-
-描述:获取仪表盘统计数据
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称             | 类型    | 必填 | 最大长度 | 描述                                     | 示例值 |
-| ---------------- | ------- | ---- | -------- | ---------------------------------------- | ------ |
-| success          | Boolean | 否   | -        | 请求是否成功                             | true   |
-| errCode          | String  | 否   | -        | 错误码(失败时返回)                     |        |
-| errMessage       | String  | 否   | -        | 错误信息(失败时返回)                   |        |
-| data             | object  | 否   |          | 响应数据 (ActualType: DashboardStatsDTO) |        |
-| └ machineTotal   | Long    | 否   | -        | 机器总数                                 | 10     |
-| └ machineEnabled | Long    | 否   | -        | 启用的机器数                             | 8      |
-| └ cameraTotal    | Long    | 否   | -        | 摄像头总数                               | 20     |
-| └ cameraOnline   | Long    | 否   | -        | 在线摄像头数                             | 15     |
-| └ cameraOffline  | Long    | 否   | -        | 离线摄像头数                             | 5      |
-| └ channelTotal   | Long    | 否   | -        | 通道总数                                 | 40     |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "machineTotal": 10,
-        "machineEnabled": 8,
-        "cameraTotal": 20,
-        "cameraOnline": 15,
-        "cameraOffline": 5,
-        "channelTotal": 40
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## 本地视频推流 Controller
-
-本地视频直接推送到 Cloudflare WHIP:
-
-- POST /stream/local/start 启动本地视频推流
-- POST /stream/local/stop 停止本地视频推流
-- GET /stream/local/{name} 获取推流状态
-- GET /stream/local/list 获取所有本地视频推流
-
-### 启动本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/local/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/start
-
-描述:启动本地视频推流
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称            | 类型    | 必填 | 最大长度 | 描述                                        | 示例值 |
-| --------------- | ------- | ---- | -------- | ------------------------------------------- | ------ |
-| streamName      | String  | 否   | -        | 流名称(唯一标识)                          |        |
-| videoPath       | String  | 否   | -        | 视频文件路径                                |        |
-| loop            | Boolean | 否   | -        | 是否循环播放                                | true   |
-| targetChannelId | String  | 否   | -        | 目标推流通道 ID(可选,不传则使用默认通道) |        |
-
-#### 请求示例
-
-```
-{
-    "streamName": "string",
-    "videoPath": "string",
-    "loop": true,
-    "targetChannelId": "string"
-}
-```
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                       | 示例值 |
-| -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                               | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                       |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                     |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: LocalVideoStreamDTO) |        |
-| └ streamName   | String  | 否   | -        | 流名称                                     |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera         |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)          |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL                   |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                               | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare)     |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)            |        |
-| └ status       | String  | 否   | -        | 状态                                       |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamName": "string",
-        "sourceType": "string",
-        "sourcePath": "string",
-        "rtspUrl": "string",
-        "loop": true,
-        "streamTaskId": "string",
-        "playbackUrl": "string",
-        "status": "string"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/local/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/stop
-
-描述:停止本地视频推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称       | 类型   | 必填 | 最大长度 | 描述               | 示例值 |
-| ---------- | ------ | ---- | -------- | ------------------ | ------ |
-| streamName | string | 是   | -        | No comments found. |        |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取本地视频推流状态
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/local/{streamName}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/{streamName}
-
-描述:获取本地视频推流状态
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称       | 必填 | 描述               | 示例值 |
-| ---------- | ---- | ------------------ | ------ |
-| streamName | 是   | No comments found. |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                       | 示例值 |
-| -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                               | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                       |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                     |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: LocalVideoStreamDTO) |        |
-| └ streamName   | String  | 否   | -        | 流名称                                     |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera         |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)          |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL                   |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                               | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare)     |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)            |        |
-| └ status       | String  | 否   | -        | 状态                                       |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamName": "string",
-        "sourceType": "string",
-        "sourcePath": "string",
-        "rtspUrl": "string",
-        "loop": true,
-        "streamTaskId": "string",
-        "playbackUrl": "string",
-        "status": "string"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取所有本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/local/list
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/list
-
-描述:获取所有本地视频推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                   | 示例值 |
-| -------------- | ------- | ---- | -------- | -------------------------------------- | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                           | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                   |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                 |        |
-| data           | array   | 否   |          | 响应数据 (ActualType: List)            |        |
-| └ streamName   | String  | 否   | -        | 流名称                                 |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera     |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)      |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL               |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                           | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare) |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)        |        |
-| └ status       | String  | 否   | -        | 状态                                   |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "streamName": "string",
-            "sourceType": "string",
-            "sourcePath": "string",
-            "rtspUrl": "string",
-            "loop": true,
-            "streamTaskId": "string",
-            "playbackUrl": "string",
-            "status": "string"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-## 推流服务 Controller
-
-推流管理 API 接口:
-
-- POST /stream/start 启动推流任务
-- POST /stream/stop 停止推流任务
-- GET /stream/task/{taskId} 获取任务状态
-- GET /stream/tasks 获取机器推流任务列表
-- GET /stream/tasks/active 获取所有活动任务
-- GET /stream/channels 获取推流通道列表
-- POST /stream/task/{taskId}/switch 切换推流源
-
-### 启动推流任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/start
-
-描述:启动推流任务
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| machineId | String | 否 | - | 机器 ID(必填) | machine_001 |
-| cameraId | String | 否 | - | 摄像头 ID(必填) | hikvision_ptz |
-| cameraChannelId | String | 否 | - | 摄像头通道 ID(必填) | hik_main |
-| sourceRtspUrl | String | 否 | - | 源 RTSP 地址(可选,如不传则从摄像头服务获取) | rtsp://admin:password@192.168.1.101:554/stream1 |
-| targetChannelId | String | 否 | - | 目标推流通道 ID(可选,如不传则使用默认通道) | cf_channel_001 |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001",
-    "cameraId": "hikvision_ptz",
-    "cameraChannelId": "hik_main",
-    "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-    "targetChannelId": "cf_channel_001"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
-| └ machineId | String | 否 | - | 机器 ID | machine_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
-| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "taskId": "task_abc123def456",
-        "machineId": "machine_001",
-        "cameraId": "hikvision_ptz",
-        "cameraChannelId": "hik_main",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止推流任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/stop
-
-描述:停止推流任务
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述                                            | 示例值            |
-| --------- | ------ | ---- | -------- | ----------------------------------------------- | ----------------- |
-| taskId    | String | 否   | -        | 任务 ID(与 machineId 二选一)                  | task_abc123def456 |
-| machineId | String | 否   | -        | 机器 ID(与 taskId 二选一,停止该机器所有推流) | machine_001       |
-
-#### 请求示例
-
-```
-{
-    "taskId": "task_abc123def456",
-    "machineId": "machine_001"
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取任务状态
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/task/{taskId}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/task/{taskId}
-
-描述:获取任务状态
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称   | 必填 | 描述    | 示例值            |
-| ------ | ---- | ------- | ----------------- |
-| taskId | 是   | 任务 ID | task_abc123def456 |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
-| └ machineId | String | 否 | - | 机器 ID | machine_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
-| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "taskId": "task_abc123def456",
-        "machineId": "machine_001",
-        "cameraId": "hikvision_ptz",
-        "cameraChannelId": "hik_main",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取机器推流任务列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/tasks
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks
-
-描述:获取机器推流任务列表
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述    | 示例值      |
-| --------- | ------ | ---- | -------- | ------- | ----------- |
-| machineId | string | 是   | -        | 机器 ID | machine_001 |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
-| └ machineId | String | 否 | - | 机器 ID | machine_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
-| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "taskId": "task_abc123def456",
-            "machineId": "machine_001",
-            "cameraId": "hikvision_ptz",
-            "cameraChannelId": "hik_main",
-            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-            "status": "STREAMING",
-            "statusDescription": "推流中",
-            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-            "errorMessage": "string",
-            "retryCount": 0,
-            "createdAt": "2024-01-15T10:30:00",
-            "startedAt": "2024-01-15T10:30:05",
-            "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取所有活动任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/tasks/active
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks/active
-
-描述:获取所有活动任务
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
-| └ machineId | String | 否 | - | 机器 ID | machine_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
-| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "taskId": "task_abc123def456",
-            "machineId": "machine_001",
-            "cameraId": "hikvision_ptz",
-            "cameraChannelId": "hik_main",
-            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-            "status": "STREAMING",
-            "statusDescription": "推流中",
-            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-            "errorMessage": "string",
-            "retryCount": 0,
-            "createdAt": "2024-01-15T10:30:00",
-            "startedAt": "2024-01-15T10:30:05",
-            "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/channels
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/channels
-
-描述:获取推流通道列表
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ mode | String | 否 | - | 推流模式: WHIP, RTMPS | WHIP |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ recordingEnabled | boolean | 否 | - | 是否启用录制 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "channelId": "cf_channel_001",
-            "name": "主推流通道",
-            "mode": "WHIP",
-            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-            "recordingEnabled": false
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 切换推流源
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/switch
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/switch
-
-描述:切换推流源
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称         | 类型   | 必填 | 最大长度 | 描述              | 示例值                                          |
-| ------------ | ------ | ---- | -------- | ----------------- | ----------------------------------------------- |
-| taskId       | String | 是   | -        | 任务 ID           | task_abc123def456                               |
-| newChannelId | String | 是   | -        | 新的摄像头通道 ID | hik_main                                        |
-| newRtspUrl   | String | 是   | -        | 新的 RTSP 地址    | rtsp://admin:password@192.168.1.101:554/stream1 |
-
-#### 请求示例
-
-```
-{
-    "taskId": "task_abc123def456",
-    "newChannelId": "hik_main",
-    "newRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
-| └ machineId | String | 否 | - | 机器 ID | machine_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
-| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "taskId": "task_abc123def456",
-        "machineId": "machine_001",
-        "cameraId": "hikvision_ptz",
-        "cameraChannelId": "hik_main",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## 房间控制 Controller
-
-房间播放 API 接口:
-
-- GET /room/{roomId}/play 获取播放信息(按需启动推流)
-- POST /room/{roomId}/stop 停止房间推流
-
-### 获取房间播放信息
-
-按需启动推流:
-
-- 检查 FFmpeg 是否在跑
-- 没跑则自动启动
-- 返回 WHEP URL (WebRTC 播放)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/room/{roomId}/play
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/room/{roomId}/play
-
-描述:获取房间播放信息
-
-按需启动推流:
-
-- 检查 FFmpeg 是否在跑
-- 没跑则自动启动
-- 返回 WHEP URL (WebRTC 播放)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称   | 必填 | 描述    | 示例值 |
-| ------ | ---- | ------- | ------ |
-| roomId | 是   | 房间 ID |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                    | 示例值 |
-| -------------- | ------- | ---- | -------- | --------------------------------------- | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                            | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                    |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                  |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: RoomPlayResponse) |        |
-| └ roomId       | String  | 否   | -        | 房间 ID                                 |        |
-| └ taskId       | String  | 否   | -        | 推流任务 ID                             |        |
-| └ whepUrl      | String  | 否   | -        | WHEP 播放地址 (WebRTC)                  |        |
-| └ status       | String  | 否   | -        | 推流状态                                |        |
-| └ newlyStarted | boolean | 否   | -        | 是否为新启动的推流                      | true   |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "roomId": "string",
-        "taskId": "string",
-        "whepUrl": "string",
-        "status": "string",
-        "newlyStarted": true
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止房间推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/room/{roomId}/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/room/{roomId}/stop
-
-描述:停止房间推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称   | 必填 | 描述    | 示例值 |
-| ------ | ---- | ------- | ------ |
-| roomId | 是   | 房间 ID |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无

+ 0 - 4075
docs/api_torna/export-1768870608391.md

@@ -1,4075 +0,0 @@
-# 文档
-
-## 摄像头控制 Controller
-
-MVP API 接口:
-
-- GET /camera/list 获取摄像头列表
-- GET /camera/{id} 获取摄像头信息
-- POST /camera/switch 切换摄像头通道
-- GET /camera/current 获取当前通道
-
-后台 PTZ 接口(可选):
-
-- POST /camera/{id}/ptz/start 开始 PTZ 控制
-- POST /camera/{id}/ptz/stop 停止 PTZ 控制
-
-### 获取摄像头列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/list
-
-描述:获取摄像头列表
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述            | 示例值      |
-| --------- | ------ | ---- | -------- | --------------- | ----------- |
-| machineId | String | 否   | -        | 机器 ID(可选) | machine_001 |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 摄像头名称 | 主摄像头 |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2143G2-IS |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
-| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
-| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "cameraId": "cam_001",
-            "name": "主摄像头",
-            "lssId": "lss_001",
-            "model": "DS-2CD2143G2-IS",
-            "rtspUrl": "rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101",
-            "channelNo": "1",
-            "status": "ONLINE",
-            "capability": "ptz_enabled",
-            "ptzSupported": true,
-            "remark": "string",
-            "enabled": true
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头信息
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/camera/{cameraId}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/{cameraId}
-
-描述:获取摄像头信息
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值     |
-| -------- | ---- | --------- | ---------- |
-| cameraId | 是   | 摄像头 ID | camera_001 |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraDTO) |  |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 摄像头名称 | 主摄像头 |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2143G2-IS |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
-| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
-| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "lssId": "lss_001",
-        "model": "DS-2CD2143G2-IS",
-        "rtspUrl": "rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101",
-        "channelNo": "1",
-        "status": "ONLINE",
-        "capability": "ptz_enabled",
-        "ptzSupported": true,
-        "remark": "string",
-        "enabled": true
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 切换摄像头通道(MVP 核心)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/switch
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/switch
-
-描述:切换摄像头通道(MVP 核心)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述        | 示例值      |
-| --------- | ------ | ---- | -------- | ----------- | ----------- |
-| machineId | String | 是   | -        | 机器 ID     | machine_001 |
-| channelId | String | 是   | -        | 目标通道 ID | ch_001      |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001",
-    "channelId": "ch_001"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型    | 必填 | 最大长度 | 描述                              | 示例值                           |
-| ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- |
-| success       | Boolean | 否   | -        | 请求是否成功                      | true                             |
-| errCode       | String  | 否   | -        | 错误码(失败时返回)              |                                  |
-| errMessage    | String  | 否   | -        | 错误信息(失败时返回)            |                                  |
-| data          | object  | 否   |          | 响应数据 (ActualType: ChannelDTO) |                                  |
-| └ channelId   | String  | 否   | -        | 通道 ID                           | ch_001                           |
-| └ name        | String  | 否   | -        | 通道名称                          | 主通道                           |
-| └ rtspUrl     | String  | 否   | -        | RTSP 地址                         | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否   | -        | 是否默认视角                      | true                             |
-| └ status      | String  | 否   | -        | 通道状态: ONLINE, OFFLINE         | ONLINE                           |
-| └ cameraId    | String  | 否   | -        | 所属摄像头 ID                     | cam_001                          |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "channelId": "ch_001",
-        "name": "主通道",
-        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-        "defaultView": true,
-        "status": "ONLINE",
-        "cameraId": "cam_001"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取当前活动通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/camera/current
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/current
-
-描述:获取当前活动通道
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述    | 示例值      |
-| --------- | ------ | ---- | -------- | ------- | ----------- |
-| machineId | string | 是   | -        | 机器 ID | machine_001 |
-
-#### 响应参数
-
-| 名称          | 类型    | 必填 | 最大长度 | 描述                              | 示例值                           |
-| ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- |
-| success       | Boolean | 否   | -        | 请求是否成功                      | true                             |
-| errCode       | String  | 否   | -        | 错误码(失败时返回)              |                                  |
-| errMessage    | String  | 否   | -        | 错误信息(失败时返回)            |                                  |
-| data          | object  | 否   |          | 响应数据 (ActualType: ChannelDTO) |                                  |
-| └ channelId   | String  | 否   | -        | 通道 ID                           | ch_001                           |
-| └ name        | String  | 否   | -        | 通道名称                          | 主通道                           |
-| └ rtspUrl     | String  | 否   | -        | RTSP 地址                         | rtsp://192.168.1.100:554/stream1 |
-| └ defaultView | Boolean | 否   | -        | 是否默认视角                      | true                             |
-| └ status      | String  | 否   | -        | 通道状态: ONLINE, OFFLINE         | ONLINE                           |
-| └ cameraId    | String  | 否   | -        | 所属摄像头 ID                     | cam_001                          |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "channelId": "ch_001",
-        "name": "主通道",
-        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
-        "defaultView": true,
-        "status": "ONLINE",
-        "cameraId": "cam_001"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 开始 PTZ 控制(后台专用)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/start
-
-描述:开始 PTZ 控制(后台专用)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称   | 类型   | 必填 | 最大长度 | 描述        | 示例值 |
-| ------ | ------ | ---- | -------- | ----------- | ------ |
-| action | string | 是   | -        | PTZ 动作    | up     |
-| speed  | int32  | 是   | -        | 速度(1-100) | 50     |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 停止 PTZ 控制(后台专用)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/stop
-
-描述:停止 PTZ 控制(后台专用)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### PTZ 直接控制(兼容前端 pan/tilt/zoom 方式)
-
-与前端海康调试接口一致:直接传 pan/tilt/zoom 值
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/control
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/control
-
-描述:PTZ 直接控制(兼容前端 pan/tilt/zoom 方式)
-
-与前端海康调试接口一致:直接传 pan/tilt/zoom 值
-
-ContentType:`application/json`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述      | 示例值        |
-| -------- | ---- | --------- | ------------- |
-| cameraId | 是   | 摄像头 ID | hikvision_ptz |
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                                   | 示例值 |
-| ------- | ------- | ---- | -------- | ------------------------------------------------------ | ------ |
-| pan     | Integer | 否   | 100      | 水平移动速度<br>负值向左,正值向右<br>范围: -100 ~ 100 | 0      |
-| tilt    | Integer | 否   | 100      | 垂直移动速度<br>负值向下,正值向上<br>范围: -100 ~ 100 | 0      |
-| zoom    | Integer | 否   | 100      | 缩放速度<br>负值缩小,正值放大<br>范围: -100 ~ 100     | 0      |
-| channel | Integer | 否   | -        | 通道号(可选,默认 1)                                 | 0      |
-
-#### 请求示例
-
-```
-{
-    "pan": 0,
-    "tilt": 0,
-    "zoom": 0,
-    "channel": 0
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 摄像头管理
-
-### 获取摄像头列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/list
-
-描述:获取摄像头列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-| lssId   | String  | 否   | -        | LSS 节点 ID 过滤                                | lss_001   |
-| status  | String  | 否   | -        | 在线状态过滤 (ONLINE/OFFLINE)                   | ONLINE    |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC",
-    "lssId": "lss_001",
-    "status": "ONLINE"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
-| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
-| └ size | Integer | 否 | - | 每页条数 | 10 |
-| └ total | Long | 否 | - | 总记录数 | 100 |
-| └ totalPages | Integer | 否 | - | 总页数 | 10 |
-| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
-| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "cameraId": "cam_001",
-                "name": "主摄像头",
-                "ip": "192.168.1.100",
-                "port": 80,
-                "username": "admin",
-                "brand": "hikvision",
-                "capability": "ptz_enabled",
-                "status": "ONLINE",
-                "lssId": "lss_001",
-                "model": "DS-2CD2T47G2-LSU/SL",
-                "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-                "channelNo": "1",
-                "remark": "string",
-                "enabled": true,
-                "createdAt": "2026-01-07T10:00:00",
-                "updatedAt": "2026-01-07T10:00:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/listAll
-
-描述:获取摄像头列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述            | 示例值      |
-| --------- | ------ | ---- | -------- | --------------- | ----------- |
-| machineId | string | 否   | -        | 机器 ID(可选) | machine_001 |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "cameraId": "cam_001",
-            "name": "主摄像头",
-            "ip": "192.168.1.100",
-            "port": 80,
-            "username": "admin",
-            "brand": "hikvision",
-            "capability": "ptz_enabled",
-            "status": "ONLINE",
-            "lssId": "lss_001",
-            "model": "DS-2CD2T47G2-LSU/SL",
-            "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-            "channelNo": "1",
-            "remark": "string",
-            "enabled": true,
-            "createdAt": "2026-01-07T10:00:00",
-            "updatedAt": "2026-01-07T10:00:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/detail
-
-描述:获取摄像头详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "lssId": "lss_001",
-        "model": "DS-2CD2T47G2-LSU/SL",
-        "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-        "channelNo": "1",
-        "remark": "string",
-        "enabled": true,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/add
-
-描述:添加摄像头
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
-| cameraId | String | 是 | 50 | 摄像头 ID(唯一标识)<br>Validate[max: 50; ] | cam_001 |
-| name | String | 是 | 100 | 名称<br>Validate[max: 100; ] | 主摄像头 |
-| ip | String | 是 | - | IP 地址<br>Validate[regexp: ^((25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)\\.){3}(25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)$; ] | 192.168.1.100 |
-| port | Integer | 否 | - | 端口 | 80 |
-| username | String | 否 | 50 | 用户名<br>Validate[max: 50; ] | admin |
-| password | String | 否 | 100 | 密码<br>Validate[max: 100; ] | password123 |
-| brand | String | 否 | 30 | 品牌<br>Validate[max: 30; ] | hikvision |
-| capability | String | 否 | - | 能力: switch_only, ptz_enabled<br>Validate[regexp: ^(switch_only | ptz_enabled)$; ] | ptz_enabled |
-| lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| model | String | 否 | 100 | 摄像头型号<br>Validate[max: 100; ] | DS-2CD2T47G2-LSU/SL |
-| rtspUrl | String | 否 | 500 | RTSP 推流地址<br>Validate[max: 500; ] | rtsp://admin:password@192.168.1.100:554/stream1 |
-| channelNo | String | 否 | 20 | 通道号 (用于多通道摄像头)<br>Validate[max: 20; ] | 1 |
-| remark | String | 否 | 500 | 备注<br>Validate[max: 500; ] |  |
-
-#### 请求示例
-
-```
-{
-    "cameraId": "cam_001",
-    "name": "主摄像头",
-    "ip": "192.168.1.100",
-    "port": 80,
-    "username": "admin",
-    "password": "password123",
-    "brand": "hikvision",
-    "capability": "ptz_enabled",
-    "lssId": "lss_001",
-    "model": "DS-2CD2T47G2-LSU/SL",
-    "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-    "channelNo": "1",
-    "remark": "string"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "lssId": "lss_001",
-        "model": "DS-2CD2T47G2-LSU/SL",
-        "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-        "channelNo": "1",
-        "remark": "string",
-        "enabled": true,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/update
-
-描述:更新摄像头
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| id | Long | 否 | - | 摄像头数据库 ID | 1 |
-| name | String | 否 | - | 名称 | 主摄像头 |
-| ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| port | Integer | 否 | - | 端口 | 80 |
-| username | String | 否 | - | 用户名 | admin |
-| password | String | 否 | - | 密码(不传或为空则不修改) | password123 |
-| brand | String | 否 | - | 品牌 | hikvision |
-| capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| channelNo | String | 否 | - | 通道号 | 1 |
-| remark | String | 否 | - | 备注 |  |
-| enabled | Boolean | 否 | - | 启用状态 | true |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "主摄像头",
-    "ip": "192.168.1.100",
-    "port": 80,
-    "username": "admin",
-    "password": "password123",
-    "brand": "hikvision",
-    "capability": "ptz_enabled",
-    "lssId": "lss_001",
-    "model": "DS-2CD2T47G2-LSU/SL",
-    "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-    "channelNo": "1",
-    "remark": "string",
-    "enabled": true
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: CameraInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ name | String | 否 | - | 名称 | 主摄像头 |
-| └ ip | String | 否 | - | IP 地址 | 192.168.1.100 |
-| └ port | Integer | 否 | - | 端口 | 80 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ brand | String | 否 | - | 品牌 | hikvision |
-| └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled |
-| └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE |
-| └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 |
-| └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL |
-| └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 |
-| └ channelNo | String | 否 | - | 通道号 | 1 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "cameraId": "cam_001",
-        "name": "主摄像头",
-        "ip": "192.168.1.100",
-        "port": 80,
-        "username": "admin",
-        "brand": "hikvision",
-        "capability": "ptz_enabled",
-        "status": "ONLINE",
-        "lssId": "lss_001",
-        "model": "DS-2CD2T47G2-LSU/SL",
-        "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1",
-        "channelNo": "1",
-        "remark": "string",
-        "enabled": true,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除摄像头
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/delete
-
-描述:删除摄像头
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 检测摄像头连通性
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/check
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/check
-
-描述:检测摄像头连通性
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                           | 示例值 |
-| ---------- | ------- | ---- | -------- | ------------------------------ | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                   | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)           |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)         |        |
-| data       | boolean | 否   | -        | 响应数据 (ActualType: Boolean) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": false
-}
-```
-
-#### 错误码
-
-无
-
-### 获取摄像头快照
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/snapshot
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/snapshot
-
-描述:获取摄像头快照
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述          | 示例值 |
-| ---- | ----- | ---- | -------- | ------------- | ------ |
-| id   | int64 | 是   | -        | 摄像头主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型          | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean       | 否   | -        | 请求是否成功                | true   |
-| errCode    | String        | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String        | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | array         | 否   |          | 响应数据 (ActualType: byte) |        |
-| └ -        | array[byte[]] | 否   | -        | array of byte[]             |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            " -": ""
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### PTZ 控制
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/ptz
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/ptz
-
-描述:PTZ 控制
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称   | 类型   | 必填 | 最大长度 | 描述             | 示例值 |
-| ------ | ------ | ---- | -------- | ---------------- | ------ |
-| id     | Long   | 否   | -        | 摄像头 ID        | 1      |
-| action | String | 否   | -        | PTZ 动作         | UP     |
-| speed  | Float  | 否   | -        | 速度 (0.0 - 1.0) | 0.5    |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "action": "UP",
-    "speed": 0.5
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                           | 示例值 |
-| ---------- | ------- | ---- | -------- | ------------------------------ | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                   | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)           |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)         |        |
-| data       | boolean | 否   | -        | 响应数据 (ActualType: Boolean) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": false
-}
-```
-
-#### 错误码
-
-无
-
-## 机器管理
-
-### 获取机器列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/list
-
-描述:获取机器列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                                | 示例值              |
-| ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                        | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)                |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)              |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: PageResponse) |                     |
-| └ list        | List<T>       | 否   |          | 数据列表 (ActualType: T)            |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                             | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                             | machine_001         |
-| └ name        | String        | 否   | -        | 名称                                | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                                | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                                | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                            | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                          | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                            | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                            | 2026-01-07T10:00:00 |
-| └ page        | Integer       | 否   | -        | 当前页码 (从 1 开始)                | 1                   |
-| └ size        | Integer       | 否   | -        | 每页条数                            | 10                  |
-| └ total       | Long          | 否   | -        | 总记录数                            | 100                 |
-| └ totalPages  | Integer       | 否   | -        | 总页数                              | 10                  |
-| └ hasNext     | Boolean       | 否   | -        | 是否有下一页                        | true                |
-| └ hasPrevious | Boolean       | 否   | -        | 是否有上一页                        | false               |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "machineId": "machine_001",
-                "name": "1号机",
-                "location": "A区1楼",
-                "description": "主力机器",
-                "enabled": true,
-                "cameraCount": 3,
-                "createdAt": "2026-01-07T10:00:00",
-                "updatedAt": "2026-01-07T10:00:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取机器列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/machines/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/listAll
-
-描述:获取机器列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                        | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)        |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)      |                     |
-| data          | array         | 否   |          | 响应数据 (ActualType: List) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                     | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                     | machine_001         |
-| └ name        | String        | 否   | -        | 名称                        | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                        | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                        | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                    | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                  | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                    | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                    | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "machineId": "machine_001",
-            "name": "1号机",
-            "location": "A区1楼",
-            "description": "主力机器",
-            "enabled": true,
-            "cameraCount": 3,
-            "createdAt": "2026-01-07T10:00:00",
-            "updatedAt": "2026-01-07T10:00:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取机器详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/machines/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/detail
-
-描述:获取机器详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述        | 示例值 |
-| ---- | ----- | ---- | -------- | ----------- | ------ |
-| id   | int64 | 是   | -        | 机器主键 ID | 1      |
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/add
-
-描述:添加机器
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型   | 必填 | 最大长度 | 描述                                       | 示例值      |
-| ----------- | ------ | ---- | -------- | ------------------------------------------ | ----------- |
-| machineId   | String | 是   | 50       | 机器 ID(唯一标识)<br>Validate[max: 50; ] | machine_001 |
-| name        | String | 是   | 100      | 名称<br>Validate[max: 100; ]               | 1 号机      |
-| location    | String | 否   | 200      | 位置<br>Validate[max: 200; ]               | A 区 1 楼   |
-| description | String | 否   | 500      | 描述<br>Validate[max: 500; ]               | 主力机器    |
-
-#### 请求示例
-
-```
-{
-    "machineId": "machine_001",
-    "name": "1号机",
-    "location": "A区1楼",
-    "description": "主力机器"
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/update
-
-描述:更新机器
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型    | 必填 | 最大长度 | 描述          | 示例值    |
-| ----------- | ------- | ---- | -------- | ------------- | --------- |
-| id          | Long    | 否   | -        | 机器数据库 ID | 1         |
-| name        | String  | 否   | -        | 名称          | 1 号机    |
-| location    | String  | 否   | -        | 位置          | A 区 1 楼 |
-| description | String  | 否   | -        | 描述          | 主力机器  |
-| enabled     | Boolean | 否   | -        | 启用状态      | true      |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "1号机",
-    "location": "A区1楼",
-    "description": "主力机器",
-    "enabled": true
-}
-```
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                              | 示例值              |
-| ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                      | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)              |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)            |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: MachineDTO) |                     |
-| └ id          | Long          | 否   | -        | 主键 ID                           | 1                   |
-| └ machineId   | String        | 否   | -        | 机器 ID                           | machine_001         |
-| └ name        | String        | 否   | -        | 名称                              | 1 号机              |
-| └ location    | String        | 否   | -        | 位置                              | A 区 1 楼           |
-| └ description | String        | 否   | -        | 描述                              | 主力机器            |
-| └ enabled     | Boolean       | 否   | -        | 是否启用                          | true                |
-| └ cameraCount | Integer       | 否   | -        | 摄像头数量                        | 3                   |
-| └ createdAt   | LocalDateTime | 否   | -        | 创建时间                          | 2026-01-07T10:00:00 |
-| └ updatedAt   | LocalDateTime | 否   | -        | 更新时间                          | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "machineId": "machine_001",
-        "name": "1号机",
-        "location": "A区1楼",
-        "description": "主力机器",
-        "enabled": true,
-        "cameraCount": 3,
-        "createdAt": "2026-01-07T10:00:00",
-        "updatedAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除机器
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/machines/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/delete
-
-描述:删除机器
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述        | 示例值 |
-| ---- | ----- | ---- | -------- | ----------- | ------ |
-| id   | int64 | 是   | -        | 机器主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 推流通道管理
-
-### 获取推流通道列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/list
-
-描述:获取推流通道列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
-| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
-| └ size | Integer | 否 | - | 每页条数 | 10 |
-| └ total | Long | 否 | - | 总记录数 | 100 |
-| └ totalPages | Integer | 否 | - | 总页数 | 10 |
-| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
-| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 1,
-                "channelId": "cf_channel_001",
-                "name": "主推流通道",
-                "accountId": "5544eac7cfb260d4fec9467d49513cea",
-                "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-                "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-                "mode": "WHIP",
-                "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-                "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-                "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-                "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-                "recordingEnabled": false,
-                "enabled": true,
-                "createdAt": "2024-01-15T10:30:00",
-                "updatedAt": "2024-01-15T10:30:00"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道列表(全部,不分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/listAll
-
-描述:获取推流通道列表(全部,不分页)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 1,
-            "channelId": "cf_channel_001",
-            "name": "主推流通道",
-            "accountId": "5544eac7cfb260d4fec9467d49513cea",
-            "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-            "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-            "mode": "WHIP",
-            "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-            "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-            "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-            "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-            "recordingEnabled": false,
-            "enabled": true,
-            "createdAt": "2024-01-15T10:30:00",
-            "updatedAt": "2024-01-15T10:30:00"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/detail
-
-描述:获取推流通道详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述            | 示例值 |
-| ---- | ----- | ---- | -------- | --------------- | ------ |
-| id   | int64 | 是   | -        | 推流通道主键 ID | 1      |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 添加推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/add
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/add
-
-描述:添加推流通道
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| channelId | String | 是 | - | 通道 ID | cf_channel_001 |
-| name | String | 是 | - | 通道名称 | 主推流通道 |
-| accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW |
-| liveInputId | String | 是 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 |
-| customerSubdomain | String | 是 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-
-#### 请求示例
-
-```
-{
-    "channelId": "cf_channel_001",
-    "name": "主推流通道",
-    "accountId": "5544eac7cfb260d4fec9467d49513cea",
-    "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW",
-    "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-    "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6",
-    "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-    "mode": "WHIP",
-    "recordingEnabled": false
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 更新推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/update
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/update
-
-描述:更新推流通道
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| id | Long | 是 | - | 主键 ID | 1 |
-| name | String | 否 | - | 通道名称 | 主推流通道 |
-| accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW |
-| liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 |
-| customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| enabled | Boolean | 否 | - | 是否启用 | true |
-
-#### 请求示例
-
-```
-{
-    "id": 1,
-    "name": "主推流通道",
-    "accountId": "5544eac7cfb260d4fec9467d49513cea",
-    "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW",
-    "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-    "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6",
-    "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-    "mode": "WHIP",
-    "recordingEnabled": false,
-    "enabled": true
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamChannelInfoDTO) |  |
-| └ id | Long | 否 | - | 主键 ID | 1 |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea |
-| └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 |
-| └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 |
-| └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish |
-| └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 |
-| └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play |
-| └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "channelId": "cf_channel_001",
-        "name": "主推流通道",
-        "accountId": "5544eac7cfb260d4fec9467d49513cea",
-        "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6",
-        "customerSubdomain": "customer-pj89kn2ke2tcuh19",
-        "mode": "WHIP",
-        "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish",
-        "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx",
-        "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8",
-        "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play",
-        "recordingEnabled": false,
-        "enabled": true,
-        "createdAt": "2024-01-15T10:30:00",
-        "updatedAt": "2024-01-15T10:30:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 删除推流通道
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/delete
-
-描述:删除推流通道
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称 | 类型  | 必填 | 最大长度 | 描述            | 示例值 |
-| ---- | ----- | ---- | -------- | --------------- | ------ |
-| id   | int64 | 是   | -        | 推流通道主键 ID | 1      |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 管理员认证
-
-### 登录
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/login
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/login
-
-描述:登录
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称     | 类型   | 必填 | 最大长度 | 描述                          | 示例值 |
-| -------- | ------ | ---- | -------- | ----------------------------- | ------ |
-| username | String | 是   | 50       | 用户名<br>Validate[max: 50; ] | admin  |
-| password | String | 是   | 100      | 密码<br>Validate[max: 100; ]  | 123456 |
-
-#### 请求示例
-
-```
-{
-    "username": "admin",
-    "password": "123456"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: LoginResponse) |  |
-| └ token | String | 否 | - | JWT Token | eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx |
-| └ tokenType | String | 否 | - | Token 类型 | Bearer |
-| └ expiresIn | Long | 否 | - | 过期时间(秒) | 86400 |
-| └ admin | AdminInfoDTO | 否 |  | 用户信息 |  |
-| └ id | Long | 否 | - | 用户 ID | 1 |
-| └ username | String | 否 | - | 用户名 | admin |
-| └ nickname | String | 否 | - | 昵称 | 管理员 |
-| └ role | String | 否 | - | 角色 | ADMIN |
-| └ lastLoginAt | LocalDateTime | 否 | - | 最后登录时间 | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx",
-        "tokenType": "Bearer",
-        "expiresIn": 86400,
-        "admin": {
-            "id": 1,
-            "username": "admin",
-            "nickname": "管理员",
-            "role": "ADMIN",
-            "lastLoginAt": "2026-01-07T10:00:00"
-        }
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 登出
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/logout
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/logout
-
-描述:登出
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取当前用户信息(直接从 Token 解析,不查询数据库)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/auth/info
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/auth/info
-
-描述:获取当前用户信息(直接从 Token 解析,不查询数据库)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称          | 类型          | 必填 | 最大长度 | 描述                                | 示例值              |
-| ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- |
-| success       | Boolean       | 否   | -        | 请求是否成功                        | true                |
-| errCode       | String        | 否   | -        | 错误码(失败时返回)                |                     |
-| errMessage    | String        | 否   | -        | 错误信息(失败时返回)              |                     |
-| data          | object        | 否   |          | 响应数据 (ActualType: AdminInfoDTO) |                     |
-| └ id          | Long          | 否   | -        | 用户 ID                             | 1                   |
-| └ username    | String        | 否   | -        | 用户名                              | admin               |
-| └ nickname    | String        | 否   | -        | 昵称                                | 管理员              |
-| └ role        | String        | 否   | -        | 角色                                | ADMIN               |
-| └ lastLoginAt | LocalDateTime | 否   | -        | 最后登录时间                        | 2026-01-07T10:00:00 |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 1,
-        "username": "admin",
-        "nickname": "管理员",
-        "role": "ADMIN",
-        "lastLoginAt": "2026-01-07T10:00:00"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 修改密码
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/auth/password
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/password
-
-描述:修改密码
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型   | 必填 | 最大长度 | 描述                                         | 示例值      |
-| ----------- | ------ | ---- | -------- | -------------------------------------------- | ----------- |
-| oldPassword | String | 是   | -        | 旧密码                                       | oldpassword |
-| newPassword | String | 是   | 100      | 新密码(6-100 字符)<br>Validate[max: 100; ] | newpassword |
-
-#### 请求示例
-
-```
-{
-    "oldPassword": "oldpassword",
-    "newPassword": "newpassword"
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## 统计
-
-### 获取仪表盘统计数据
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/stats/dashboard
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stats/dashboard
-
-描述:获取仪表盘统计数据
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称             | 类型    | 必填 | 最大长度 | 描述                                     | 示例值 |
-| ---------------- | ------- | ---- | -------- | ---------------------------------------- | ------ |
-| success          | Boolean | 否   | -        | 请求是否成功                             | true   |
-| errCode          | String  | 否   | -        | 错误码(失败时返回)                     |        |
-| errMessage       | String  | 否   | -        | 错误信息(失败时返回)                   |        |
-| data             | object  | 否   |          | 响应数据 (ActualType: DashboardStatsDTO) |        |
-| └ machineTotal   | Long    | 否   | -        | 机器总数                                 | 10     |
-| └ machineEnabled | Long    | 否   | -        | 启用的机器数                             | 8      |
-| └ cameraTotal    | Long    | 否   | -        | 摄像头总数                               | 20     |
-| └ cameraOnline   | Long    | 否   | -        | 在线摄像头数                             | 15     |
-| └ cameraOffline  | Long    | 否   | -        | 离线摄像头数                             | 5      |
-| └ channelTotal   | Long    | 否   | -        | 通道总数                                 | 40     |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "machineTotal": 10,
-        "machineEnabled": 8,
-        "cameraTotal": 20,
-        "cameraOnline": 15,
-        "cameraOffline": 5,
-        "channelTotal": 40
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## LSS 节点管理
-
-### 获取 LSS 节点列表(分页)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/list
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/list
-
-描述:获取 LSS 节点列表(分页)
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
-| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
-| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
-| size    | Integer | 否   | -        | 每页条数                                        | 10        |
-| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
-| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
-| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
-| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
-
-#### 请求示例
-
-```
-{
-    "page": 1,
-    "size": 10,
-    "keyword": "摄像头",
-    "enabled": true,
-    "sortBy": "createdAt",
-    "sortDir": "DESC"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
-| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
-| └ id | Long | 否 | - | 数据库主键 | 0 |
-| └ lssId | String | 否 | - | LSS 节点 ID |  |
-| └ lssName | String | 否 | - | LSS 节点名称 |  |
-| └ machineId | String | 否 | - | 关联的机器 ID |  |
-| └ address | String | 否 | - | LSS 地址 (IP:Port) |  |
-| └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 |
-| └ currentTasks | Integer | 否 | - | 当前任务数 | 0 |
-| └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE |  |
-| └ ffmpegVersion | String | 否 | - | FFmpeg 版本 |  |
-| └ systemInfo | String | 否 | - | 系统信息 (JSON) |  |
-| └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss |
-| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
-| └ size | Integer | 否 | - | 每页条数 | 10 |
-| └ total | Long | 否 | - | 总记录数 | 100 |
-| └ totalPages | Integer | 否 | - | 总页数 | 10 |
-| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
-| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "list": [
-            {
-                "id": 0,
-                "lssId": "string",
-                "lssName": "string",
-                "machineId": "string",
-                "address": "string",
-                "maxTasks": 0,
-                "currentTasks": 0,
-                "status": "string",
-                "ffmpegVersion": "string",
-                "systemInfo": "string",
-                "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss",
-                "enabled": true,
-                "loadRate": 0,
-                "createdAt": "yyyy-MM-dd HH:mm:ss",
-                "updatedAt": "yyyy-MM-dd HH:mm:ss"
-            }
-        ],
-        "page": 1,
-        "size": 10,
-        "total": 100,
-        "totalPages": 10,
-        "hasNext": true,
-        "hasPrevious": false
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取全部 LSS 节点列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/listAll
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/listAll
-
-描述:获取全部 LSS 节点列表
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 数据库主键 | 0 |
-| └ lssId | String | 否 | - | LSS 节点 ID |  |
-| └ lssName | String | 否 | - | LSS 节点名称 |  |
-| └ machineId | String | 否 | - | 关联的机器 ID |  |
-| └ address | String | 否 | - | LSS 地址 (IP:Port) |  |
-| └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 |
-| └ currentTasks | Integer | 否 | - | 当前任务数 | 0 |
-| └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE |  |
-| └ ffmpegVersion | String | 否 | - | FFmpeg 版本 |  |
-| └ systemInfo | String | 否 | - | 系统信息 (JSON) |  |
-| └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 0,
-            "lssId": "string",
-            "lssName": "string",
-            "machineId": "string",
-            "address": "string",
-            "maxTasks": 0,
-            "currentTasks": 0,
-            "status": "string",
-            "ffmpegVersion": "string",
-            "systemInfo": "string",
-            "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss",
-            "enabled": true,
-            "loadRate": 0,
-            "createdAt": "yyyy-MM-dd HH:mm:ss",
-            "updatedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取 LSS 节点详情
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/detail
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/detail
-
-描述:获取 LSS 节点详情
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称  | 类型   | 必填 | 最大长度 | 描述        | 示例值 |
-| ----- | ------ | ---- | -------- | ----------- | ------ |
-| lssId | string | 是   | -        | LSS 节点 ID |        |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: LssNodeDTO) |  |
-| └ id | Long | 否 | - | 数据库主键 | 0 |
-| └ lssId | String | 否 | - | LSS 节点 ID |  |
-| └ lssName | String | 否 | - | LSS 节点名称 |  |
-| └ machineId | String | 否 | - | 关联的机器 ID |  |
-| └ address | String | 否 | - | LSS 地址 (IP:Port) |  |
-| └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 |
-| └ currentTasks | Integer | 否 | - | 当前任务数 | 0 |
-| └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE |  |
-| └ ffmpegVersion | String | 否 | - | FFmpeg 版本 |  |
-| └ systemInfo | String | 否 | - | 系统信息 (JSON) |  |
-| └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "id": 0,
-        "lssId": "string",
-        "lssName": "string",
-        "machineId": "string",
-        "address": "string",
-        "maxTasks": 0,
-        "currentTasks": 0,
-        "status": "string",
-        "ffmpegVersion": "string",
-        "systemInfo": "string",
-        "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss",
-        "enabled": true,
-        "loadRate": 0,
-        "createdAt": "yyyy-MM-dd HH:mm:ss",
-        "updatedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 根据机器 ID 获取关联的 LSS 节点
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/byMachine
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/byMachine
-
-描述:根据机器 ID 获取关联的 LSS 节点
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称      | 类型   | 必填 | 最大长度 | 描述    | 示例值 |
-| --------- | ------ | ---- | -------- | ------- | ------ |
-| machineId | string | 是   | -        | 机器 ID |        |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ id | Long | 否 | - | 数据库主键 | 0 |
-| └ lssId | String | 否 | - | LSS 节点 ID |  |
-| └ lssName | String | 否 | - | LSS 节点名称 |  |
-| └ machineId | String | 否 | - | 关联的机器 ID |  |
-| └ address | String | 否 | - | LSS 地址 (IP:Port) |  |
-| └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 |
-| └ currentTasks | Integer | 否 | - | 当前任务数 | 0 |
-| └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE |  |
-| └ ffmpegVersion | String | 否 | - | FFmpeg 版本 |  |
-| └ systemInfo | String | 否 | - | 系统信息 (JSON) |  |
-| └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss |
-| └ enabled | Boolean | 否 | - | 是否启用 | true |
-| └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss |
-| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "id": 0,
-            "lssId": "string",
-            "lssName": "string",
-            "machineId": "string",
-            "address": "string",
-            "maxTasks": 0,
-            "currentTasks": 0,
-            "status": "string",
-            "ffmpegVersion": "string",
-            "systemInfo": "string",
-            "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss",
-            "enabled": true,
-            "loadRate": 0,
-            "createdAt": "yyyy-MM-dd HH:mm:ss",
-            "updatedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 启用/禁用 LSS 节点
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/setEnabled
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/setEnabled
-
-描述:启用/禁用 LSS 节点
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称    | 类型    | 必填 | 最大长度 | 描述        | 示例值 |
-| ------- | ------- | ---- | -------- | ----------- | ------ |
-| lssId   | string  | 是   | -        | LSS 节点 ID |        |
-| enabled | boolean | 是   | -        | 是否启用    | true   |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 删除 LSS 节点
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/delete
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/delete
-
-描述:删除 LSS 节点
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称  | 类型   | 必填 | 最大长度 | 描述        | 示例值 |
-| ----- | ------ | ---- | -------- | ----------- | ------ |
-| lssId | string | 是   | -        | LSS 节点 ID |        |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取 LSS 节点统计信息
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/stats
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/stats
-
-描述:获取 LSS 节点统计信息
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称          | 类型    | 必填 | 最大长度 | 描述                                | 示例值 |
-| ------------- | ------- | ---- | -------- | ----------------------------------- | ------ |
-| success       | Boolean | 否   | -        | 请求是否成功                        | true   |
-| errCode       | String  | 否   | -        | 错误码(失败时返回)                |        |
-| errMessage    | String  | 否   | -        | 错误信息(失败时返回)              |        |
-| data          | object  | 否   |          | 响应数据 (ActualType: LssNodeStats) |        |
-| └ total       | long    | 否   | -        | No comments found.                  | 0      |
-| └ online      | long    | 否   | -        | No comments found.                  | 0      |
-| └ offline     | long    | 否   | -        | No comments found.                  | 0      |
-| └ busy        | long    | 否   | -        | No comments found.                  | 0      |
-| └ maintenance | long    | 否   | -        | No comments found.                  | 0      |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "total": 0,
-        "online": 0,
-        "offline": 0,
-        "busy": 0,
-        "maintenance": 0
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## 本地视频推流 Controller
-
-本地视频直接推送到 Cloudflare WHIP:
-
-- POST /stream/local/start 启动本地视频推流
-- POST /stream/local/stop 停止本地视频推流
-- GET /stream/local/{name} 获取推流状态
-- GET /stream/local/list 获取所有本地视频推流
-
-### 启动本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/local/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/start
-
-描述:启动本地视频推流
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称            | 类型    | 必填 | 最大长度 | 描述                                        | 示例值 |
-| --------------- | ------- | ---- | -------- | ------------------------------------------- | ------ |
-| streamName      | String  | 否   | -        | 流名称(唯一标识)                          |        |
-| videoPath       | String  | 否   | -        | 视频文件路径                                |        |
-| loop            | Boolean | 否   | -        | 是否循环播放                                | true   |
-| targetChannelId | String  | 否   | -        | 目标推流通道 ID(可选,不传则使用默认通道) |        |
-
-#### 请求示例
-
-```
-{
-    "streamName": "string",
-    "videoPath": "string",
-    "loop": true,
-    "targetChannelId": "string"
-}
-```
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                       | 示例值 |
-| -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                               | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                       |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                     |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: LocalVideoStreamDTO) |        |
-| └ streamName   | String  | 否   | -        | 流名称                                     |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera         |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)          |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL                   |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                               | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare)     |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)            |        |
-| └ status       | String  | 否   | -        | 状态                                       |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamName": "string",
-        "sourceType": "string",
-        "sourcePath": "string",
-        "rtspUrl": "string",
-        "loop": true,
-        "streamTaskId": "string",
-        "playbackUrl": "string",
-        "status": "string"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/local/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/stop
-
-描述:停止本地视频推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称       | 类型   | 必填 | 最大长度 | 描述               | 示例值 |
-| ---------- | ------ | ---- | -------- | ------------------ | ------ |
-| streamName | string | 是   | -        | No comments found. |        |
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取本地视频推流状态
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/local/{streamName}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/{streamName}
-
-描述:获取本地视频推流状态
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称       | 必填 | 描述               | 示例值 |
-| ---------- | ---- | ------------------ | ------ |
-| streamName | 是   | No comments found. |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                       | 示例值 |
-| -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                               | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                       |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                     |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: LocalVideoStreamDTO) |        |
-| └ streamName   | String  | 否   | -        | 流名称                                     |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera         |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)          |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL                   |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                               | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare)     |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)            |        |
-| └ status       | String  | 否   | -        | 状态                                       |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamName": "string",
-        "sourceType": "string",
-        "sourcePath": "string",
-        "rtspUrl": "string",
-        "loop": true,
-        "streamTaskId": "string",
-        "playbackUrl": "string",
-        "status": "string"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取所有本地视频推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/local/list
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/list
-
-描述:获取所有本地视频推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                   | 示例值 |
-| -------------- | ------- | ---- | -------- | -------------------------------------- | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                           | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                   |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                 |        |
-| data           | array   | 否   |          | 响应数据 (ActualType: List)            |        |
-| └ streamName   | String  | 否   | -        | 流名称                                 |        |
-| └ sourceType   | String  | 否   | -        | 源类型:local_video 或 rtsp_camera     |        |
-| └ sourcePath   | String  | 否   | -        | 源路径(视频文件路径或 RTSP URL)      |        |
-| └ rtspUrl      | String  | 否   | -        | MediaMTX 提供的 RTSP URL               |        |
-| └ loop         | Boolean | 否   | -        | 是否循环播放                           | true   |
-| └ streamTaskId | String  | 否   | -        | 推流任务 ID(如果已推送到 Cloudflare) |        |
-| └ playbackUrl  | String  | 否   | -        | 播放地址(Cloudflare HLS/WHEP)        |        |
-| └ status       | String  | 否   | -        | 状态                                   |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "streamName": "string",
-            "sourceType": "string",
-            "sourcePath": "string",
-            "rtspUrl": "string",
-            "loop": true,
-            "streamTaskId": "string",
-            "playbackUrl": "string",
-            "status": "string"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-## 推流服务 Controller
-
-推流管理 API 接口:
-
-- POST /stream/start 启动推流任务
-- POST /stream/stop 停止推流任务
-- GET /stream/task/{streamSn} 获取任务状态
-- GET /stream/tasks 获取 LSS 推流任务列表
-- GET /stream/tasks/active 获取所有活动任务
-- GET /stream/channels 获取推流通道列表
-- POST /stream/switch 切换推流源
-
-### 启动推流任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/start
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/start
-
-描述:启动推流任务
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| lssId | String | 否 | - | LSS 节点 ID(可选,不传则自动选择) | lss_001 |
-| cameraId | String | 否 | - | 摄像头 ID(必填) | cam_001 |
-| sourceRtspUrl | String | 否 | - | 源 RTSP 地址(可选,如不传则从摄像头服务获取) | rtsp://admin:password@192.168.1.101:554/stream1 |
-| profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| remark | String | 否 | - | 备注 |  |
-
-#### 请求示例
-
-```
-{
-    "name": "投币机1号直播",
-    "lssId": "lss_001",
-    "cameraId": "cam_001",
-    "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-    "profile": "low_latency",
-    "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-    "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-    "remark": "string"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 |
-| └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| └ lssId | String | 否 | - | LSS 节点 ID | lss_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamSn": "stream_abc123def456",
-        "name": "投币机1号直播",
-        "lssId": "lss_001",
-        "cameraId": "cam_001",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "profile": "low_latency",
-        "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-        "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "remark": "string",
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止推流任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/stop
-
-描述:停止推流任务
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称   | 类型   | 必填 | 最大长度 | 描述                                                 | 示例值              |
-| ------ | ------ | ---- | -------- | ---------------------------------------------------- | ------------------- |
-| taskId | String | 否   | -        | 推流任务流水号(与 lssId 二选一)                    | stream_abc123def456 |
-| lssId  | String | 否   | -        | LSS 节点 ID(与 taskId 二选一,停止该 LSS 所有推流) | lss_001             |
-
-#### 请求示例
-
-```
-{
-    "taskId": "stream_abc123def456",
-    "lssId": "lss_001"
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### 获取任务状态
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/task/{streamSn}
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/task/{streamSn}
-
-描述:获取任务状态
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称     | 必填 | 描述           | 示例值              |
-| -------- | ---- | -------------- | ------------------- |
-| streamSn | 是   | 推流任务流水号 | stream_abc123def456 |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 |
-| └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| └ lssId | String | 否 | - | LSS 节点 ID | lss_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamSn": "stream_abc123def456",
-        "name": "投币机1号直播",
-        "lssId": "lss_001",
-        "cameraId": "cam_001",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "profile": "low_latency",
-        "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-        "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "remark": "string",
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取 LSS 推流任务列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/tasks
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks
-
-描述:获取 LSS 推流任务列表
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称  | 类型   | 必填 | 最大长度 | 描述        | 示例值  |
-| ----- | ------ | ---- | -------- | ----------- | ------- |
-| lssId | string | 是   | -        | LSS 节点 ID | lss_001 |
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 |
-| └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| └ lssId | String | 否 | - | LSS 节点 ID | lss_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "streamSn": "stream_abc123def456",
-            "name": "投币机1号直播",
-            "lssId": "lss_001",
-            "cameraId": "cam_001",
-            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-            "profile": "low_latency",
-            "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-            "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-            "status": "STREAMING",
-            "statusDescription": "推流中",
-            "errorMessage": "string",
-            "retryCount": 0,
-            "remark": "string",
-            "createdAt": "2024-01-15T10:30:00",
-            "startedAt": "2024-01-15T10:30:05",
-            "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取所有活动任务
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/tasks/active
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks/active
-
-描述:获取所有活动任务
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 |
-| └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| └ lssId | String | 否 | - | LSS 节点 ID | lss_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "streamSn": "stream_abc123def456",
-            "name": "投币机1号直播",
-            "lssId": "lss_001",
-            "cameraId": "cam_001",
-            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-            "profile": "low_latency",
-            "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-            "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-            "status": "STREAMING",
-            "statusDescription": "推流中",
-            "errorMessage": "string",
-            "retryCount": 0,
-            "remark": "string",
-            "createdAt": "2024-01-15T10:30:00",
-            "startedAt": "2024-01-15T10:30:05",
-            "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 获取推流通道列表
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/stream/channels
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/channels
-
-描述:获取推流通道列表
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | array | 否 |  | 响应数据 (ActualType: List) |  |
-| └ channelId | String | 否 | - | 通道 ID | cf_channel_001 |
-| └ name | String | 否 | - | 通道名称 | 主推流通道 |
-| └ mode | String | 否 | - | 推流模式: WHIP, RTMPS | WHIP |
-| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
-| └ recordingEnabled | boolean | 否 | - | 是否启用录制 | false |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": [
-        {
-            "channelId": "cf_channel_001",
-            "name": "主推流通道",
-            "mode": "WHIP",
-            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
-            "recordingEnabled": false
-        }
-    ]
-}
-```
-
-#### 错误码
-
-无
-
-### 切换推流源
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/stream/switch
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/switch
-
-描述:切换推流源
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称        | 类型   | 必填 | 最大长度 | 描述           | 示例值                                          |
-| ----------- | ------ | ---- | -------- | -------------- | ----------------------------------------------- |
-| streamSn    | String | 是   | -        | 推流任务流水号 | stream_abc123def456                             |
-| newCameraId | String | 是   | -        | 新的摄像头 ID  | cam_001                                         |
-| newRtspUrl  | String | 是   | -        | 新的 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-
-#### 请求示例
-
-```
-{
-    "streamSn": "stream_abc123def456",
-    "newCameraId": "cam_001",
-    "newRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1"
-}
-```
-
-#### 响应参数
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| success | Boolean | 否 | - | 请求是否成功 | true |
-| errCode | String | 否 | - | 错误码(失败时返回) |  |
-| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
-| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
-| └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 |
-| └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 |
-| └ lssId | String | 否 | - | LSS 节点 ID | lss_001 |
-| └ cameraId | String | 否 | - | 摄像头 ID | cam_001 |
-| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
-| └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency |
-| └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish |
-| └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play |
-| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
-| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
-| └ errorMessage | String | 否 | - | 错误信息 |  |
-| └ retryCount | int | 否 | - | 重试次数 | 0 |
-| └ remark | String | 否 | - | 备注 |  |
-| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 |
-| └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 |
-| └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "streamSn": "stream_abc123def456",
-        "name": "投币机1号直播",
-        "lssId": "lss_001",
-        "cameraId": "cam_001",
-        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
-        "profile": "low_latency",
-        "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish",
-        "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play",
-        "status": "STREAMING",
-        "statusDescription": "推流中",
-        "errorMessage": "string",
-        "retryCount": 0,
-        "remark": "string",
-        "createdAt": "2024-01-15T10:30:00",
-        "startedAt": "2024-01-15T10:30:05",
-        "stoppedAt": "yyyy-MM-dd HH:mm:ss"
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## 房间控制 Controller
-
-房间播放 API 接口:
-
-- GET /room/{roomId}/play 获取播放信息(按需启动推流)
-- POST /room/{roomId}/stop 停止房间推流
-
-### 获取房间播放信息
-
-按需启动推流:
-
-- 检查 FFmpeg 是否在跑
-- 没跑则自动启动
-- 返回 WHEP URL (WebRTC 播放)
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/room/{roomId}/play
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/room/{roomId}/play
-
-描述:获取房间播放信息
-
-按需启动推流:
-
-- 检查 FFmpeg 是否在跑
-- 没跑则自动启动
-- 返回 WHEP URL (WebRTC 播放)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称   | 必填 | 描述    | 示例值 |
-| ------ | ---- | ------- | ------ |
-| roomId | 是   | 房间 ID |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称           | 类型    | 必填 | 最大长度 | 描述                                    | 示例值 |
-| -------------- | ------- | ---- | -------- | --------------------------------------- | ------ |
-| success        | Boolean | 否   | -        | 请求是否成功                            | true   |
-| errCode        | String  | 否   | -        | 错误码(失败时返回)                    |        |
-| errMessage     | String  | 否   | -        | 错误信息(失败时返回)                  |        |
-| data           | object  | 否   |          | 响应数据 (ActualType: RoomPlayResponse) |        |
-| └ roomId       | String  | 否   | -        | 房间 ID                                 |        |
-| └ taskId       | String  | 否   | -        | 推流任务 ID                             |        |
-| └ whepUrl      | String  | 否   | -        | WHEP 播放地址 (WebRTC)                  |        |
-| └ status       | String  | 否   | -        | 推流状态                                |        |
-| └ newlyStarted | boolean | 否   | -        | 是否为新启动的推流                      | true   |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "roomId": "string",
-        "taskId": "string",
-        "whepUrl": "string",
-        "status": "string",
-        "newlyStarted": true
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 停止房间推流
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/room/{roomId}/stop
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/room/{roomId}/stop
-
-描述:停止房间推流
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### Path 参数
-
-| 名称   | 必填 | 描述    | 示例值 |
-| ------ | ---- | ------- | ------ |
-| roomId | 是   | 房间 ID |        |
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-## Ably Token 接口
-
-前端通过此接口获取 Ably Token,用于连接 Ably 实时通信
-
-### 获取 Ably Token
-
-前端使用此 Token 连接 Ably,只授予订阅权限(不能发布)
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/ably/token
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/ably/token
-
-描述:获取 Ably Token
-
-前端使用此 Token 连接 Ably,只授予订阅权限(不能发布)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-##### Query Parameter
-
-| 名称     | 类型   | 必填 | 最大长度 | 描述                              | 示例值     |
-| -------- | ------ | ---- | -------- | --------------------------------- | ---------- |
-| clientId | string | 否   | -        | 客户端标识(如用户 ID 或会话 ID) | web-client |
-
-#### 响应参数
-
-| 名称         | 类型    | 必填 | 最大长度 | 描述                       | 示例值 |
-| ------------ | ------- | ---- | -------- | -------------------------- | ------ |
-| success      | Boolean | 否   | -        | 请求是否成功               | true   |
-| errCode      | String  | 否   | -        | 错误码(失败时返回)       |        |
-| errMessage   | String  | 否   | -        | 错误信息(失败时返回)     |        |
-| data         | object  | 否   |          | 响应数据 (ActualType: Map) |        |
-| └ mapKey     | Object  | 否   |          | A map key.                 |        |
-| └ any object | object  | 否   | -        | any object.                |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "mapKey": {
-            "any object": {}
-        }
-    }
-}
-```
-
-#### 错误码
-
-无
-
-### 获取 Ably 连接信息
-
-返回前端连接 Ably 所需的配置信息(不包含 API Key)
-
-#### URL
-
-- 本地开发环境: `GET` http://localhost:10050/api/ably/config
-- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/ably/config
-
-描述:获取 Ably 连接信息
-
-返回前端连接 Ably 所需的配置信息(不包含 API Key)
-
-ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
-
-#### 请求参数
-
-#### 响应参数
-
-| 名称         | 类型    | 必填 | 最大长度 | 描述                       | 示例值 |
-| ------------ | ------- | ---- | -------- | -------------------------- | ------ |
-| success      | Boolean | 否   | -        | 请求是否成功               | true   |
-| errCode      | String  | 否   | -        | 错误码(失败时返回)       |        |
-| errMessage   | String  | 否   | -        | 错误信息(失败时返回)     |        |
-| data         | object  | 否   |          | 响应数据 (ActualType: Map) |        |
-| └ mapKey     | Object  | 否   |          | A map key.                 |        |
-| └ any object | object  | 否   | -        | any object.                |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {
-        "mapKey": {
-            "any object": {}
-        }
-    }
-}
-```
-
-#### 错误码
-
-无
-
-## LSS 回调接口
-
-接收来自 LSS (Local Sender Service) 的回调请求:
-
-- 节点注册
-- 心跳上报
-- 任务状态回调
-
-### LSS 节点注册
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/lss/register
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/register
-
-描述:LSS 节点注册
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称              | 类型       | 必填 | 最大长度 | 描述               | 示例值 |
-| ----------------- | ---------- | ---- | -------- | ------------------ | ------ |
-| nodeId            | String     | 否   | -        | No comments found. |        |
-| nodeName          | String     | 否   | -        | No comments found. |        |
-| nodeIp            | String     | 否   | -        | No comments found. |        |
-| nodePort          | Integer    | 否   | -        | No comments found. | 0      |
-| machineId         | String     | 否   | -        | No comments found. |        |
-| maxTasks          | int        | 否   | -        | No comments found. | 0      |
-| ffmpegPath        | String     | 否   | -        | No comments found. |        |
-| systemInfo        | SystemInfo | 否   |          | No comments found. |        |
-| └ os              | String     | 否   | -        | No comments found. |        |
-| └ cpuCores        | int        | 否   | -        | No comments found. | 0      |
-| └ totalMemory     | long       | 否   | -        | No comments found. | 0      |
-| └ availableMemory | long       | 否   | -        | No comments found. | 0      |
-| └ ffmpegVersion   | String     | 否   | -        | No comments found. |        |
-
-#### 请求示例
-
-```
-{
-    "nodeId": "string",
-    "nodeName": "string",
-    "nodeIp": "string",
-    "nodePort": 0,
-    "machineId": "string",
-    "maxTasks": 0,
-    "ffmpegPath": "string",
-    "systemInfo": {
-        "os": "string",
-        "cpuCores": 0,
-        "totalMemory": 0,
-        "availableMemory": 0,
-        "ffmpegVersion": "string"
-    }
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### LSS 心跳上报
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/lss/heartbeat
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/heartbeat
-
-描述:LSS 心跳上报
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称            | 类型   | 必填 | 最大长度 | 描述               | 示例值 |
-| --------------- | ------ | ---- | -------- | ------------------ | ------ |
-| nodeId          | String | 否   | -        | No comments found. |        |
-| activeTaskCount | int    | 否   | -        | No comments found. | 0      |
-| cpuUsage        | Double | 否   | -        | No comments found. | 0.0    |
-| memoryUsage     | Double | 否   | -        | No comments found. | 0.0    |
-
-#### 请求示例
-
-```
-{
-    "nodeId": "string",
-    "activeTaskCount": 0,
-    "cpuUsage": 0,
-    "memoryUsage": 0
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无
-
-### LSS 任务状态回调
-
-维护人:TG Live
-
-#### URL
-
-- 本地开发环境: `POST` http://localhost:10050/api/lss/task/callback
-- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/task/callback
-
-描述:LSS 任务状态回调
-
-ContentType:`application/json`
-
-#### 请求参数
-
-##### Body Parameter
-
-| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
-| --- | --- | --- | --- | --- | --- |
-| taskId | String | 否 | - | No comments found. |  |
-| nodeId | String | 否 | - | No comments found. |  |
-| callbackType | enum | 否 | - | No comments found.<br/>[Enum values:<br/>STARTED()<br/>STOPPED()<br/>ERROR()<br/>STATUS_UPDATE()<br/>] | STARTED |
-| status | String | 否 | - | No comments found. |  |
-| processId | Long | 否 | - | No comments found. | 0 |
-| hlsPlaybackUrl | String | 否 | - | No comments found. |  |
-| errorMessage | String | 否 | - | No comments found. |  |
-
-#### 请求示例
-
-```
-{
-    "taskId": "string",
-    "nodeId": "string",
-    "callbackType": "STARTED",
-    "status": "string",
-    "processId": 0,
-    "hlsPlaybackUrl": "string",
-    "errorMessage": "string"
-}
-```
-
-#### 响应参数
-
-| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
-| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
-| success    | Boolean | 否   | -        | 请求是否成功                | true   |
-| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
-| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
-| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
-
-#### 响应示例
-
-```
-{
-    "success": true,
-    "errCode": "string",
-    "errMessage": "string",
-    "data": {}
-}
-```
-
-#### 错误码
-
-无

+ 705 - 0
docs/api_torna/live-stream.md

@@ -1 +1,706 @@
 # 文档
+
+## 管理后台
+
+## Live Stream 管理
+
+### 获取 Live Stream 列表(分页)
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `POST` http://localhost:10050/api/admin/live-stream/list
+- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/live-stream/list
+
+描述:获取 Live Stream 列表(分页)
+
+ContentType:`application/json`
+
+#### 请求参数
+
+##### Body Parameter
+
+| 名称    | 类型    | 必填 | 最大长度 | 描述                                            | 示例值    |
+| ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- |
+| page    | Integer | 否   | -        | 页码 (从 1 开始)                                | 1         |
+| size    | Integer | 否   | -        | 每页条数                                        | 10        |
+| keyword | String  | 否   | -        | 搜索关键词 (模糊匹配名称、ID 等)                | 摄像头    |
+| enabled | Boolean | 否   | -        | 启用状态过滤 (null=全部, true=启用, false=禁用) | true      |
+| sortBy  | String  | 否   | -        | 排序字段                                        | createdAt |
+| sortDir | String  | 否   | -        | 排序方向 (ASC/DESC)                             | DESC      |
+
+#### 请求示例
+
+```
+{
+    "page": 1,
+    "size": 10,
+    "keyword": "摄像头",
+    "enabled": true,
+    "sortBy": "createdAt",
+    "sortDir": "DESC"
+}
+```
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
+| └ list | List<T> | 否 |  | 数据列表 (ActualType: T) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+| └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 |
+| └ size | Integer | 否 | - | 每页条数 | 10 |
+| └ total | Long | 否 | - | 总记录数 | 100 |
+| └ totalPages | Integer | 否 | - | 总页数 | 10 |
+| └ hasNext | Boolean | 否 | - | 是否有下一页 | true |
+| └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {
+        "list": [
+            {
+                "id": 1,
+                "streamSn": "stream_1705823456789_0001",
+                "name": "测试推流-001",
+                "lssId": "lss-machine_001",
+                "cameraId": "CAM-069",
+                "channelId": 1,
+                "pushMethod": "ffmpeg",
+                "commandTemplate": "string",
+                "timeoutSeconds": 30,
+                "status": "IDLE",
+                "enabled": true,
+                "remark": "测试备注",
+                "createdAt": "2024-01-21T10:00:00",
+                "updatedAt": "2024-01-21T10:00:00"
+            }
+        ],
+        "page": 1,
+        "size": 10,
+        "total": 100,
+        "totalPages": 10,
+        "hasNext": true,
+        "hasPrevious": false
+    }
+}
+```
+
+#### 错误码
+
+无
+
+### 获取全部 Live Stream 列表(不分页)
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `GET` http://localhost:10050/api/admin/live-stream/listAll
+- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/live-stream/listAll
+
+描述:获取全部 Live Stream 列表(不分页)
+
+ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
+
+#### 请求参数
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | array | 否 |  | 响应数据 (ActualType: List) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": [
+        {
+            "id": 1,
+            "streamSn": "stream_1705823456789_0001",
+            "name": "测试推流-001",
+            "lssId": "lss-machine_001",
+            "cameraId": "CAM-069",
+            "channelId": 1,
+            "pushMethod": "ffmpeg",
+            "commandTemplate": "string",
+            "timeoutSeconds": 30,
+            "status": "IDLE",
+            "enabled": true,
+            "remark": "测试备注",
+            "createdAt": "2024-01-21T10:00:00",
+            "updatedAt": "2024-01-21T10:00:00"
+        }
+    ]
+}
+```
+
+#### 错误码
+
+无
+
+### 根据 LSS ID 获取 Live Stream 列表
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `GET` http://localhost:10050/api/admin/live-stream/listByLssId
+- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/live-stream/listByLssId
+
+描述:根据 LSS ID 获取 Live Stream 列表
+
+ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
+
+#### 请求参数
+
+##### Query Parameter
+
+| 名称  | 类型   | 必填 | 最大长度 | 描述        | 示例值          |
+| ----- | ------ | ---- | -------- | ----------- | --------------- |
+| lssId | string | 是   | -        | LSS 节点 ID | lss-machine_001 |
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | array | 否 |  | 响应数据 (ActualType: List) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": [
+        {
+            "id": 1,
+            "streamSn": "stream_1705823456789_0001",
+            "name": "测试推流-001",
+            "lssId": "lss-machine_001",
+            "cameraId": "CAM-069",
+            "channelId": 1,
+            "pushMethod": "ffmpeg",
+            "commandTemplate": "string",
+            "timeoutSeconds": 30,
+            "status": "IDLE",
+            "enabled": true,
+            "remark": "测试备注",
+            "createdAt": "2024-01-21T10:00:00",
+            "updatedAt": "2024-01-21T10:00:00"
+        }
+    ]
+}
+```
+
+#### 错误码
+
+无
+
+### 获取 Live Stream 详情
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `GET` http://localhost:10050/api/admin/live-stream/detail
+- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/live-stream/detail
+
+描述:获取 Live Stream 详情
+
+ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
+
+#### 请求参数
+
+##### Query Parameter
+
+| 名称 | 类型  | 必填 | 最大长度 | 描述    | 示例值 |
+| ---- | ----- | ---- | -------- | ------- | ------ |
+| id   | int64 | 是   | -        | 主键 ID | 1      |
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | object | 否 |  | 响应数据 (ActualType: LiveStreamInfoDTO) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {
+        "id": 1,
+        "streamSn": "stream_1705823456789_0001",
+        "name": "测试推流-001",
+        "lssId": "lss-machine_001",
+        "cameraId": "CAM-069",
+        "channelId": 1,
+        "pushMethod": "ffmpeg",
+        "commandTemplate": "string",
+        "timeoutSeconds": 30,
+        "status": "IDLE",
+        "enabled": true,
+        "remark": "测试备注",
+        "createdAt": "2024-01-21T10:00:00",
+        "updatedAt": "2024-01-21T10:00:00"
+    }
+}
+```
+
+#### 错误码
+
+无
+
+### 根据 stream sn 获取详情
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `GET` http://localhost:10050/api/admin/live-stream/detailByStreamSn
+- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/live-stream/detailByStreamSn
+
+描述:根据 stream sn 获取详情
+
+ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
+
+#### 请求参数
+
+##### Query Parameter
+
+| 名称     | 类型   | 必填 | 最大长度 | 描述       | 示例值                    |
+| -------- | ------ | ---- | -------- | ---------- | ------------------------- |
+| streamSn | string | 是   | -        | 推流流水号 | stream_1705823456789_0001 |
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | object | 否 |  | 响应数据 (ActualType: LiveStreamInfoDTO) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {
+        "id": 1,
+        "streamSn": "stream_1705823456789_0001",
+        "name": "测试推流-001",
+        "lssId": "lss-machine_001",
+        "cameraId": "CAM-069",
+        "channelId": 1,
+        "pushMethod": "ffmpeg",
+        "commandTemplate": "string",
+        "timeoutSeconds": 30,
+        "status": "IDLE",
+        "enabled": true,
+        "remark": "测试备注",
+        "createdAt": "2024-01-21T10:00:00",
+        "updatedAt": "2024-01-21T10:00:00"
+    }
+}
+```
+
+#### 错误码
+
+无
+
+### 添加 Live Stream
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `POST` http://localhost:10050/api/admin/live-stream/add
+- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/live-stream/add
+
+描述:添加 Live Stream
+
+ContentType:`application/json`
+
+#### 请求参数
+
+##### Body Parameter
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| name | String | 是 | - | 名称 | 测试推流-001 |
+| lssId | String | 是 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| commandTemplate | String | 否 | - | FFmpeg 命令模板 | /usr/local/ffmpeg-whip/bin/ffmpeg -rtsp_transport tcp -i {RTSP_URL} ... |
+| timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| remark | String | 否 | - | 备注 | 测试备注 |
+
+#### 请求示例
+
+```
+{
+    "name": "测试推流-001",
+    "lssId": "lss-machine_001",
+    "cameraId": "CAM-069",
+    "channelId": 1,
+    "pushMethod": "ffmpeg",
+    "commandTemplate": "/usr/local/ffmpeg-whip/bin/ffmpeg -rtsp_transport tcp -i {RTSP_URL} ...",
+    "timeoutSeconds": 30,
+    "remark": "测试备注"
+}
+```
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | object | 否 |  | 响应数据 (ActualType: LiveStreamInfoDTO) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {
+        "id": 1,
+        "streamSn": "stream_1705823456789_0001",
+        "name": "测试推流-001",
+        "lssId": "lss-machine_001",
+        "cameraId": "CAM-069",
+        "channelId": 1,
+        "pushMethod": "ffmpeg",
+        "commandTemplate": "string",
+        "timeoutSeconds": 30,
+        "status": "IDLE",
+        "enabled": true,
+        "remark": "测试备注",
+        "createdAt": "2024-01-21T10:00:00",
+        "updatedAt": "2024-01-21T10:00:00"
+    }
+}
+```
+
+#### 错误码
+
+无
+
+### 更新 Live Stream
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `POST` http://localhost:10050/api/admin/live-stream/update
+- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/live-stream/update
+
+描述:更新 Live Stream
+
+ContentType:`application/json`
+
+#### 请求参数
+
+##### Body Parameter
+
+| 名称            | 类型    | 必填 | 最大长度 | 描述             | 示例值          |
+| --------------- | ------- | ---- | -------- | ---------------- | --------------- |
+| id              | Long    | 是   | -        | 主键 ID          | 1               |
+| name            | String  | 否   | -        | 名称             | 测试推流-001    |
+| lssId           | String  | 否   | -        | 关联 LSS 节点 ID | lss-machine_001 |
+| cameraId        | String  | 否   | -        | 关联摄像头 ID    | CAM-069         |
+| channelId       | Long    | 否   | -        | 关联推流通道 ID  | 1               |
+| pushMethod      | String  | 否   | -        | 推流方式: ffmpeg | ffmpeg          |
+| commandTemplate | String  | 否   | -        | FFmpeg 命令模板  |                 |
+| timeoutSeconds  | Integer | 否   | -        | 超时时间(秒)   | 30              |
+| enabled         | Boolean | 否   | -        | 是否启用         | true            |
+| remark          | String  | 否   | -        | 备注             | 测试备注        |
+
+#### 请求示例
+
+```
+{
+    "id": 1,
+    "name": "测试推流-001",
+    "lssId": "lss-machine_001",
+    "cameraId": "CAM-069",
+    "channelId": 1,
+    "pushMethod": "ffmpeg",
+    "commandTemplate": "string",
+    "timeoutSeconds": 30,
+    "enabled": true,
+    "remark": "测试备注"
+}
+```
+
+#### 响应参数
+
+| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
+| --- | --- | --- | --- | --- | --- |
+| success | Boolean | 否 | - | 请求是否成功 | true |
+| errCode | String | 否 | - | 错误码(失败时返回) |  |
+| errMessage | String | 否 | - | 错误信息(失败时返回) |  |
+| data | object | 否 |  | 响应数据 (ActualType: LiveStreamInfoDTO) |  |
+| └ id | Long | 否 | - | 主键 ID | 1 |
+| └ streamSn | String | 否 | - | 推流流水号 | stream_1705823456789_0001 |
+| └ name | String | 否 | - | 名称 | 测试推流-001 |
+| └ lssId | String | 否 | - | 关联 LSS 节点 ID | lss-machine_001 |
+| └ cameraId | String | 否 | - | 关联摄像头 ID | CAM-069 |
+| └ channelId | Long | 否 | - | 关联推流通道 ID | 1 |
+| └ pushMethod | String | 否 | - | 推流方式: ffmpeg | ffmpeg |
+| └ commandTemplate | String | 否 | - | FFmpeg 命令模板 |  |
+| └ timeoutSeconds | Integer | 否 | - | 超时时间(秒) | 30 |
+| └ status | String | 否 | - | 推流状态: IDLE / STREAMING / STOPPED / ERROR | IDLE |
+| └ enabled | Boolean | 否 | - | 是否启用 | true |
+| └ remark | String | 否 | - | 备注 | 测试备注 |
+| └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-21T10:00:00 |
+| └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-21T10:00:00 |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {
+        "id": 1,
+        "streamSn": "stream_1705823456789_0001",
+        "name": "测试推流-001",
+        "lssId": "lss-machine_001",
+        "cameraId": "CAM-069",
+        "channelId": 1,
+        "pushMethod": "ffmpeg",
+        "commandTemplate": "string",
+        "timeoutSeconds": 30,
+        "status": "IDLE",
+        "enabled": true,
+        "remark": "测试备注",
+        "createdAt": "2024-01-21T10:00:00",
+        "updatedAt": "2024-01-21T10:00:00"
+    }
+}
+```
+
+#### 错误码
+
+无
+
+### 删除 Live Stream
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `POST` http://localhost:10050/api/admin/live-stream/delete
+- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/live-stream/delete
+
+描述:删除 Live Stream
+
+ContentType:`application/x-www-form-urlencoded;charset=UTF-8`
+
+#### 请求参数
+
+##### Query Parameter
+
+| 名称 | 类型  | 必填 | 最大长度 | 描述    | 示例值 |
+| ---- | ----- | ---- | -------- | ------- | ------ |
+| id   | int64 | 是   | -        | 主键 ID | 1      |
+
+#### 响应参数
+
+| 名称       | 类型    | 必填 | 最大长度 | 描述                        | 示例值 |
+| ---------- | ------- | ---- | -------- | --------------------------- | ------ |
+| success    | Boolean | 否   | -        | 请求是否成功                | true   |
+| errCode    | String  | 否   | -        | 错误码(失败时返回)        |        |
+| errMessage | String  | 否   | -        | 错误信息(失败时返回)      |        |
+| data       | object  | 否   | -        | 响应数据 (ActualType: Void) |        |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": {}
+}
+```
+
+#### 错误码
+
+无
+
+### 批量删除 Live Stream
+
+维护人:TG Live
+
+#### URL
+
+- 本地开发环境: `POST` http://localhost:10050/api/admin/live-stream/deleteBatch
+- 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/live-stream/deleteBatch
+
+描述:批量删除 Live Stream
+
+ContentType:`application/json`
+
+#### 请求参数
+
+##### Body Parameter
+
+| 名称 | 类型  | 必填 | 最大长度 | 描述                     | 示例值  |
+| ---- | ----- | ---- | -------- | ------------------------ | ------- |
+| ids  | array | 否   | -        | ID 列表,[array of int64] | [1,2,3] |
+
+#### 请求示例
+
+```
+{
+    "ids": [
+        1,
+        2,
+        3
+    ]
+}
+```
+
+#### 响应参数
+
+| 名称       | 类型    | 必填 | 最大长度 | 描述                           | 示例值 |
+| ---------- | ------- | ---- | -------- | ------------------------------ | ------ |
+| success    | Boolean | 否   | -        | 请求是否成功                   | true   |
+| errCode    | String  | 否   | -        | 错误码(失败时返回)           |        |
+| errMessage | String  | 否   | -        | 错误信息(失败时返回)         |        |
+| data       | int32   | 否   | -        | 响应数据 (ActualType: Integer) |        |
+
+#### 响应示例
+
+```
+{
+    "success": true,
+    "errCode": "string",
+    "errMessage": "string",
+    "data": 0
+}
+```
+
+#### 错误码
+
+无

+ 83 - 0
src/api/live-stream.ts

@@ -0,0 +1,83 @@
+import { get, post } from '@/utils/request'
+import type {
+  IPageResponse,
+  IBaseResponse,
+  IListResponse,
+  BaseResponse,
+  LiveStreamDTO,
+  LiveStreamListRequest,
+  LiveStreamAddRequest,
+  LiveStreamUpdateRequest
+} from '@/types'
+
+/**
+ * 获取 LiveStream 列表(分页)
+ * POST /api/admin/live-stream/list
+ */
+export function listLiveStreams(params?: LiveStreamListRequest): Promise<IPageResponse<LiveStreamDTO>> {
+  return post('/admin/live-stream/list', params || {})
+}
+
+/**
+ * 获取全部 LiveStream 列表(不分页)
+ * GET /api/admin/live-stream/listAll
+ */
+export function listAllLiveStreams(): Promise<IListResponse<LiveStreamDTO>> {
+  return get('/admin/live-stream/listAll')
+}
+
+/**
+ * 根据 LSS ID 获取 LiveStream 列表
+ * GET /api/admin/live-stream/listByLssId?lssId=xxx
+ */
+export function listLiveStreamsByLssId(lssId: string): Promise<IListResponse<LiveStreamDTO>> {
+  return get('/admin/live-stream/listByLssId', { lssId })
+}
+
+/**
+ * 获取 LiveStream 详情
+ * GET /api/admin/live-stream/detail?id=X
+ */
+export function getLiveStreamDetail(id: number): Promise<IBaseResponse<LiveStreamDTO>> {
+  return get('/admin/live-stream/detail', { id })
+}
+
+/**
+ * 根据 streamSn 获取 LiveStream 详情
+ * GET /api/admin/live-stream/detailByStreamSn?streamSn=xxx
+ */
+export function getLiveStreamByStreamSn(streamSn: string): Promise<IBaseResponse<LiveStreamDTO>> {
+  return get('/admin/live-stream/detailByStreamSn', { streamSn })
+}
+
+/**
+ * 添加 LiveStream
+ * POST /api/admin/live-stream/add
+ */
+export function addLiveStream(data: LiveStreamAddRequest): Promise<IBaseResponse<LiveStreamDTO>> {
+  return post('/admin/live-stream/add', data)
+}
+
+/**
+ * 更新 LiveStream
+ * POST /api/admin/live-stream/update
+ */
+export function updateLiveStream(data: LiveStreamUpdateRequest): Promise<IBaseResponse<LiveStreamDTO>> {
+  return post('/admin/live-stream/update', data)
+}
+
+/**
+ * 删除 LiveStream
+ * POST /api/admin/live-stream/delete?id=X
+ */
+export function deleteLiveStream(id: number): Promise<BaseResponse> {
+  return post('/admin/live-stream/delete', null, { params: { id } })
+}
+
+/**
+ * 批量删除 LiveStream
+ * POST /api/admin/live-stream/deleteBatch
+ */
+export function deleteLiveStreamBatch(ids: number[]): Promise<IBaseResponse<number>> {
+  return post('/admin/live-stream/deleteBatch', { ids })
+}

+ 54 - 0
src/types/index.ts

@@ -465,6 +465,60 @@ export interface StreamChannelUpdateRequest {
   enabled?: boolean
 }
 
+// ==================== LiveStream 推流管理相关类型 ====================
+
+// LiveStream 状态
+export type LiveStreamStatus = 'IDLE' | 'STREAMING' | 'STOPPED' | 'ERROR'
+
+// LiveStream 信息 (LiveStreamInfoDTO)
+export interface LiveStreamDTO {
+  id: number
+  streamSn: string
+  name: string
+  lssId?: string
+  cameraId?: string
+  channelId?: number
+  pushMethod?: string
+  commandTemplate?: string
+  timeoutSeconds?: number
+  status: LiveStreamStatus
+  enabled: boolean
+  remark?: string
+  createdAt: string
+  updatedAt: string
+}
+
+// LiveStream 列表请求参数
+export interface LiveStreamListRequest extends PageRequest {
+  // 继承 PageRequest 的所有属性 (page, size, keyword, enabled, sortBy, sortDir)
+}
+
+// 创建 LiveStream 请求
+export interface LiveStreamAddRequest {
+  name: string
+  lssId: string
+  cameraId?: string
+  channelId?: number
+  pushMethod?: string
+  commandTemplate?: string
+  timeoutSeconds?: number
+  remark?: string
+}
+
+// 更新 LiveStream 请求
+export interface LiveStreamUpdateRequest {
+  id: number
+  name?: string
+  lssId?: string
+  cameraId?: string
+  channelId?: number
+  pushMethod?: string
+  commandTemplate?: string
+  timeoutSeconds?: number
+  enabled?: boolean
+  remark?: string
+}
+
 // ==================== 摄像头厂家相关类型 ====================
 
 // 摄像头厂家信息

+ 198 - 169
src/views/live-stream/index.vue

@@ -6,7 +6,7 @@
         <el-form-item :label="t('关键词')">
           <el-input
             v-model.trim="searchForm.keyword"
-            placeholder="搜索通道ID/名称"
+            placeholder="搜索名称/流水号"
             clearable
             @keyup.enter="handleSearch"
           />
@@ -30,42 +30,49 @@
       <el-table
         ref="tableRef"
         v-loading="loading"
-        :data="channelList"
+        :data="streamList"
         stripe
         size="default"
         height="100%"
         @sort-change="handleSortChange"
       >
-        <el-table-column prop="channelId" :label="t('通道ID')" width="160" show-overflow-tooltip />
+        <el-table-column prop="streamSn" :label="t('流水号')" width="220" show-overflow-tooltip />
         <el-table-column prop="name" :label="t('名称')" show-overflow-tooltip>
           <template #default="{ row }">
             <el-link type="primary" @click="handleEdit(row)">{{ row.name }}</el-link>
           </template>
         </el-table-column>
-        <el-table-column prop="mode" :label="t('推流模式')" width="100" align="center">
+        <el-table-column prop="lssId" :label="t('LSS 节点')" width="160" show-overflow-tooltip>
           <template #default="{ row }">
-            <el-tag size="small" :type="getModeTagType(row.mode)">{{ row.mode || '-' }}</el-tag>
+            <span>{{ row.lssId || '-' }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="hlsPlaybackUrl" :label="t('HLS 播放地址')" show-overflow-tooltip>
+        <el-table-column prop="cameraId" :label="t('摄像头')" width="120" show-overflow-tooltip>
           <template #default="{ row }">
-            <el-link v-if="row.hlsPlaybackUrl" type="primary" @click="handleCopy(row.hlsPlaybackUrl)">
-              {{ truncateUrl(row.hlsPlaybackUrl) }}
-            </el-link>
-            <span v-else>-</span>
+            <span>{{ row.cameraId || '-' }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="recordingEnabled" :label="t('录制')" width="80" align="center">
+        <el-table-column prop="channelId" :label="t('通道ID')" width="80" align="center">
           <template #default="{ row }">
-            <el-tag size="small" :type="row.recordingEnabled ? 'success' : 'info'">
-              {{ row.recordingEnabled ? t('是') : t('否') }}
+            <span>{{ row.channelId ?? '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="pushMethod" :label="t('推流方式')" width="100" align="center">
+          <template #default="{ row }">
+            <el-tag size="small">{{ row.pushMethod || 'ffmpeg' }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" :label="t('推流状态')" width="100" align="center">
+          <template #default="{ row }">
+            <el-tag size="small" :type="getStatusTagType(row.status)">
+              {{ getStatusLabel(row.status) }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="enabled" :label="t('状态')" width="80" align="center">
+        <el-table-column prop="enabled" :label="t('启用')" width="80" align="center">
           <template #default="{ row }">
             <el-tag size="small" :type="row.enabled ? 'success' : 'danger'">
-              {{ row.enabled ? t('启用') : t('禁用') }}
+              {{ row.enabled ? t('是') : t('否') }}
             </el-tag>
           </template>
         </el-table-column>
@@ -74,10 +81,9 @@
             {{ formatDateTime(row.createdAt) }}
           </template>
         </el-table-column>
-        <el-table-column :label="t('操作')" width="150" align="center" fixed="right">
+        <el-table-column :label="t('操作')" width="120" align="center" fixed="right">
           <template #default="{ row }">
             <el-button type="primary" link @click="handleEdit(row)">{{ t('编辑') }}</el-button>
-            <el-button type="primary" link :icon="View" @click="handleWatch(row)">{{ t('观看') }}</el-button>
             <el-button type="danger" link @click="handleDelete(row)">{{ t('删除') }}</el-button>
           </template>
         </el-table-column>
@@ -110,66 +116,67 @@
       <div class="drawer-content">
         <div class="drawer-header">{{ drawerTitle }}</div>
         <div class="drawer-body">
-          <el-form
-            ref="formRef"
-            :model="form"
-            :rules="rules"
-            label-width="130px"
-            label-position="left"
-            class="stream-form"
-          >
-            <el-form-item label="通道 ID:" prop="channelId">
-              <el-input
-                v-model="form.channelId"
-                placeholder="例如: cf_channel_001"
-                :disabled="isEdit"
-                style="width: 280px"
-              />
-            </el-form-item>
-            <el-form-item label="通道名称:" prop="name">
-              <el-input v-model="form.name" placeholder="例如: 主推流通道" style="width: 280px" />
+          <el-form ref="formRef" :model="form" :rules="rules" label-position="left" class="stream-form">
+            <el-form-item label="名称:" prop="name">
+              <el-input v-model="form.name" placeholder="例如: 测试推流-001" style="width: 300px" />
             </el-form-item>
-            <el-form-item label="Account ID:" prop="accountId">
-              <el-input v-model="form.accountId" placeholder="Cloudflare 账户 ID" style="width: 280px" />
+            <el-form-item label="LSS 节点:" prop="lssId">
+              <el-select v-model="form.lssId" placeholder="请选择 LSS 节点" clearable filterable style="width: 300px">
+                <el-option
+                  v-for="lss in lssOptions"
+                  :key="lss.lssId"
+                  :label="`${lss.lssId} - ${lss.lssName}`"
+                  :value="lss.lssId"
+                />
+              </el-select>
             </el-form-item>
-            <el-form-item label="API Token:" prop="apiToken">
-              <el-input
-                v-model="form.apiToken"
-                placeholder="Cloudflare API Token"
-                type="password"
-                show-password
-                style="width: 280px"
-              />
+            <el-form-item label="摄像头:" prop="cameraId">
+              <el-select v-model="form.cameraId" placeholder="请选择摄像头" clearable filterable style="width: 300px">
+                <el-option
+                  v-for="camera in cameraOptions"
+                  :key="camera.cameraId"
+                  :label="`${camera.cameraId} - ${camera.name}`"
+                  :value="camera.cameraId"
+                />
+              </el-select>
             </el-form-item>
-            <el-form-item label="Live Input ID:" prop="liveInputId">
-              <el-input v-model="form.liveInputId" placeholder="Cloudflare Live Input ID" style="width: 280px" />
+            <el-form-item label="推流方式:" prop="pushMethod">
+              <el-select v-model="form.pushMethod" placeholder="请选择" style="width: 300px">
+                <el-option label="ffmpeg" value="ffmpeg" />
+              </el-select>
             </el-form-item>
-            <el-form-item label="Stream Key:" prop="streamKey">
-              <el-input
-                v-model="form.streamKey"
-                placeholder="流密钥 (用于 RTMPS)"
-                type="password"
-                show-password
-                style="width: 280px"
+            <el-form-item label="超时时间:" prop="timeoutSeconds">
+              <el-input-number
+                v-model="form.timeoutSeconds"
+                :min="1"
+                :max="300"
+                placeholder="秒"
+                style="width: 150px"
               />
+              <span style="margin-left: 8px; color: #909399">秒</span>
+            </el-form-item>
+            <el-form-item label="命令模板:" prop="commandTemplate">
+              <div class="textarea-wrapper">
+                <el-input
+                  v-model="form.commandTemplate"
+                  type="textarea"
+                  :rows="6"
+                  placeholder="FFmpeg 命令模板,可使用 {RTSP_URL} 等变量"
+                  maxlength="2000"
+                  show-word-limit
+                />
+              </div>
             </el-form-item>
-            <el-form-item label="Customer 子域名:" prop="customerSubdomain">
+            <el-form-item label="备注:" prop="remark">
               <el-input
-                v-model="form.customerSubdomain"
-                placeholder="例如: customer-pj89kn2ke2tcuh19"
-                style="width: 280px"
+                v-model="form.remark"
+                type="textarea"
+                :rows="2"
+                placeholder="备注信息"
+                maxlength="500"
+                style="width: 300px"
               />
             </el-form-item>
-            <el-form-item label="推流模式:" prop="mode">
-              <el-select v-model="form.mode" placeholder="请选择" style="width: 280px">
-                <el-option label="WHIP (WebRTC)" value="WHIP" />
-                <el-option label="RTMPS" value="RTMPS" />
-                <el-option label="SRT" value="SRT" />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="启用录制:" prop="recordingEnabled">
-              <el-switch v-model="form.recordingEnabled" />
-            </el-form-item>
             <el-form-item v-if="isEdit" label="启用状态:" prop="enabled">
               <el-switch v-model="form.enabled" />
             </el-form-item>
@@ -188,16 +195,17 @@
 
 <script setup lang="ts">
 import { ref, reactive, onMounted, computed } from 'vue'
-import { useRouter } from 'vue-router'
 import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'element-plus'
-import { Search, RefreshRight, View, Plus } from '@element-plus/icons-vue'
-import { listStreamChannels, addStreamChannel, updateStreamChannel, deleteStreamChannel } from '@/api/stream-channel'
-import type { StreamChannelDTO, StreamChannelMode } from '@/types'
+import { Search, RefreshRight, Plus } from '@element-plus/icons-vue'
+import { listLiveStreams, addLiveStream, updateLiveStream, deleteLiveStream } from '@/api/live-stream'
+import { listAllLssNodes } from '@/api/lss'
+import { adminListCameras } from '@/api/camera'
+import { listAllStreamChannels } from '@/api/stream-channel'
+import type { LiveStreamDTO, LiveStreamStatus, LssNodeDTO, CameraInfoDTO, StreamChannelDTO } from '@/types'
 import dayjs from 'dayjs'
 import { useI18n } from 'vue-i18n'
 
 const { t } = useI18n({ useScope: 'global' })
-const router = useRouter()
 
 // 格式化时间
 function formatDateTime(dateStr: string | undefined): string {
@@ -205,44 +213,49 @@ function formatDateTime(dateStr: string | undefined): string {
   return dayjs(dateStr).format('YYYY-MM-DD HH:mm:ss')
 }
 
-// 获取模式标签颜色
-function getModeTagType(mode?: string): 'success' | 'warning' | 'info' {
-  switch (mode) {
-    case 'WHIP':
+// 获取状态标签颜色
+function getStatusTagType(status?: LiveStreamStatus): 'success' | 'warning' | 'danger' | 'info' {
+  switch (status) {
+    case 'STREAMING':
       return 'success'
-    case 'RTMPS':
-      return 'warning'
-    case 'SRT':
+    case 'IDLE':
       return 'info'
+    case 'STOPPED':
+      return 'warning'
+    case 'ERROR':
+      return 'danger'
     default:
       return 'info'
   }
 }
 
-// 截断 URL 显示
-function truncateUrl(url: string): string {
-  if (url.length > 50) {
-    return url.substring(0, 50) + '...'
-  }
-  return url
-}
-
-// 复制到剪贴板
-async function handleCopy(text: string) {
-  try {
-    await navigator.clipboard.writeText(text)
-    ElMessage.success(t('已复制到剪贴板'))
-  } catch {
-    ElMessage.error(t('复制失败'))
+// 获取状态标签文本
+function getStatusLabel(status?: LiveStreamStatus): string {
+  switch (status) {
+    case 'STREAMING':
+      return t('推流中')
+    case 'IDLE':
+      return t('空闲')
+    case 'STOPPED':
+      return t('已停止')
+    case 'ERROR':
+      return t('错误')
+    default:
+      return '-'
   }
 }
 
 const loading = ref(false)
 const submitLoading = ref(false)
-const channelList = ref<StreamChannelDTO[]>([])
+const streamList = ref<LiveStreamDTO[]>([])
 const drawerVisible = ref(false)
 const formRef = ref<FormInstance>()
 
+// 下拉选项
+const lssOptions = ref<LssNodeDTO[]>([])
+const cameraOptions = ref<CameraInfoDTO[]>([])
+const channelOptions = ref<StreamChannelDTO[]>([])
+
 // 排序状态
 const sortState = reactive<{
   prop: string
@@ -269,37 +282,33 @@ const total = ref(0)
 // 表单数据
 const form = reactive<{
   id?: number
-  channelId: string
   name: string
-  accountId: string
-  apiToken: string
-  liveInputId: string
-  streamKey: string
-  customerSubdomain: string
-  mode: StreamChannelMode
-  recordingEnabled: boolean
+  lssId: string
+  cameraId: string
+  channelId?: number
+  pushMethod: string
+  commandTemplate: string
+  timeoutSeconds: number
+  remark: string
   enabled: boolean
 }>({
-  channelId: '',
   name: '',
-  accountId: '',
-  apiToken: '',
-  liveInputId: '',
-  streamKey: '',
-  customerSubdomain: '',
-  mode: 'WHIP',
-  recordingEnabled: false,
+  lssId: '',
+  cameraId: '',
+  channelId: undefined,
+  pushMethod: 'ffmpeg',
+  commandTemplate: '',
+  timeoutSeconds: 30,
+  remark: '',
   enabled: true
 })
 
 const isEdit = computed(() => !!form.id)
-const drawerTitle = computed(() => (isEdit.value ? t('编辑推流通道') : t('新增推流通道')))
+const drawerTitle = computed(() => (isEdit.value ? t('编辑 Live Stream') : t('新增 Live Stream')))
 
 const rules: FormRules = {
-  channelId: [{ required: true, message: t('请输入通道ID'), trigger: 'blur' }],
-  name: [{ required: true, message: t('请输入通道名称'), trigger: 'blur' }],
-  liveInputId: [{ required: true, message: t('请输入 Live Input ID'), trigger: 'blur' }],
-  customerSubdomain: [{ required: true, message: t('请输入 Customer 子域名'), trigger: 'blur' }]
+  name: [{ required: true, message: t('请输入名称'), trigger: 'blur' }],
+  lssId: [{ required: true, message: t('请选择 LSS 节点'), trigger: 'change' }]
 }
 
 async function getList() {
@@ -320,9 +329,9 @@ async function getList() {
       params.sortDir = sortState.order === 'ascending' ? 'ASC' : 'DESC'
     }
 
-    const res = await listStreamChannels(params)
+    const res = await listLiveStreams(params)
     if (res.success) {
-      channelList.value = res.data.list
+      streamList.value = res.data.list
       total.value = res.data.total || 0
     }
   } finally {
@@ -330,6 +339,26 @@ async function getList() {
   }
 }
 
+async function loadOptions() {
+  try {
+    // 获取 LSS 节点列表
+    const lssRes = await listAllLssNodes()
+    if (lssRes.success && lssRes.data) {
+      lssOptions.value = lssRes.data || []
+    }
+  } catch (error) {
+    console.error('加载选项失败', error)
+  }
+}
+
+//  // 获取摄像头列表 ,
+async function loadCameraOptions() {
+  const cameraRes = await adminListCameras({ size: 1000 })
+  // if (cameraRes.success && cameraRes.data) {
+  //   cameraOptions.value = cameraRes.data || []
+  // }
+}
+
 function handleSearch() {
   currentPage.value = 1
   getList()
@@ -353,59 +382,44 @@ function handleSortChange({ prop, order }: { prop: string; order: 'ascending' |
 function handleAdd() {
   Object.assign(form, {
     id: undefined,
-    channelId: '',
     name: '',
-    accountId: '',
-    apiToken: '',
-    liveInputId: '',
-    streamKey: '',
-    customerSubdomain: '',
-    mode: 'WHIP' as StreamChannelMode,
-    recordingEnabled: false,
+    lssId: '',
+    cameraId: '',
+    channelId: undefined,
+    pushMethod: 'ffmpeg',
+    commandTemplate: '',
+    timeoutSeconds: 30,
+    remark: '',
     enabled: true
   })
   drawerVisible.value = true
 }
 
-function handleEdit(row: StreamChannelDTO) {
+function handleEdit(row: LiveStreamDTO) {
   Object.assign(form, {
     id: row.id,
-    channelId: row.channelId,
     name: row.name,
-    accountId: row.accountId || '',
-    apiToken: '',
-    liveInputId: row.liveInputId || '',
-    streamKey: '',
-    customerSubdomain: row.customerSubdomain || '',
-    mode: row.mode || 'WHIP',
-    recordingEnabled: row.recordingEnabled || false,
+    lssId: row.lssId || '',
+    cameraId: row.cameraId || '',
+    channelId: row.channelId,
+    pushMethod: row.pushMethod || 'ffmpeg',
+    commandTemplate: row.commandTemplate || '',
+    timeoutSeconds: row.timeoutSeconds || 30,
+    remark: row.remark || '',
     enabled: row.enabled
   })
   drawerVisible.value = true
 }
 
-function handleWatch(row: StreamChannelDTO) {
-  // 跳转到 Cloudflare Stream 播放页面
-  router.push({
-    path: '/cc',
-    query: {
-      channelId: row.channelId,
-      name: row.name,
-      hlsUrl: row.hlsPlaybackUrl || '',
-      whepUrl: row.whepPlaybackUrl || ''
-    }
-  })
-}
-
-async function handleDelete(row: StreamChannelDTO) {
+async function handleDelete(row: LiveStreamDTO) {
   try {
-    await ElMessageBox.confirm(t('确定要删除该推流通道吗?'), t('提示'), {
+    await ElMessageBox.confirm(t('确定要删除该 Live Stream 吗?'), t('提示'), {
       type: 'warning',
       confirmButtonText: t('确定'),
       cancelButtonText: t('取消')
     })
 
-    const res = await deleteStreamChannel(row.id)
+    const res = await deleteLiveStream(row.id)
     if (res.success) {
       ElMessage.success(t('删除成功'))
       getList()
@@ -425,16 +439,16 @@ async function handleSubmit() {
       submitLoading.value = true
       try {
         if (isEdit.value) {
-          const res = await updateStreamChannel({
+          const res = await updateLiveStream({
             id: form.id!,
             name: form.name,
-            accountId: form.accountId || undefined,
-            apiToken: form.apiToken || undefined,
-            liveInputId: form.liveInputId || undefined,
-            streamKey: form.streamKey || undefined,
-            customerSubdomain: form.customerSubdomain || undefined,
-            mode: form.mode,
-            recordingEnabled: form.recordingEnabled,
+            lssId: form.lssId || undefined,
+            cameraId: form.cameraId || undefined,
+            channelId: form.channelId,
+            pushMethod: form.pushMethod || undefined,
+            commandTemplate: form.commandTemplate || undefined,
+            timeoutSeconds: form.timeoutSeconds,
+            remark: form.remark || undefined,
             enabled: form.enabled
           })
           if (res.success) {
@@ -445,16 +459,15 @@ async function handleSubmit() {
             ElMessage.error(res.errMessage || t('修改失败'))
           }
         } else {
-          const res = await addStreamChannel({
-            channelId: form.channelId,
+          const res = await addLiveStream({
             name: form.name,
-            accountId: form.accountId || undefined,
-            apiToken: form.apiToken || undefined,
-            liveInputId: form.liveInputId,
-            streamKey: form.streamKey || undefined,
-            customerSubdomain: form.customerSubdomain,
-            mode: form.mode,
-            recordingEnabled: form.recordingEnabled
+            lssId: form.lssId,
+            cameraId: form.cameraId || undefined,
+            channelId: form.channelId,
+            pushMethod: form.pushMethod || undefined,
+            commandTemplate: form.commandTemplate || undefined,
+            timeoutSeconds: form.timeoutSeconds,
+            remark: form.remark || undefined
           })
           if (res.success) {
             ElMessage.success(t('新增成功'))
@@ -484,6 +497,7 @@ function handleCurrentChange(val: number) {
 
 onMounted(() => {
   getList()
+  loadOptions()
 })
 </script>
 
@@ -621,6 +635,21 @@ onMounted(() => {
     color: #606266;
     font-size: 14px;
   }
+
+  .textarea-wrapper {
+    width: 100%;
+
+    :deep(.el-textarea__inner) {
+      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
+      font-size: 13px;
+      background-color: #fafafa;
+      border: 1px solid #dcdfe6;
+
+      &:focus {
+        border-color: #4f46e5;
+      }
+    }
+  }
 }
 
 .drawer-footer {