|
|
|
@ -1,7 +1,6 @@
|
|
|
|
package main
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
"strconv"
|
|
|
|
@ -30,22 +29,22 @@ type StreamListResponse struct {
|
|
|
|
Streams []Stream `json:"streams"`
|
|
|
|
Streams []Stream `json:"streams"`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Camera 摄像头信息结构
|
|
|
|
// JavaCamera 摄像头信息结构 - 用于Java集成API
|
|
|
|
type Camera struct {
|
|
|
|
type JavaCamera struct {
|
|
|
|
ID string `json:"id"`
|
|
|
|
ID string `json:"id"`
|
|
|
|
Name string `json:"name"`
|
|
|
|
Name string `json:"name"`
|
|
|
|
IP string `json:"ip"`
|
|
|
|
IP string `json:"ip"`
|
|
|
|
Port int `json:"port"`
|
|
|
|
Port int `json:"port"`
|
|
|
|
Username string `json:"username"`
|
|
|
|
Username string `json:"username"`
|
|
|
|
Password string `json:"password,omitempty"` // 敏感信息可选返回
|
|
|
|
Password string `json:"password,omitempty"` // 敏感信息可选返回
|
|
|
|
RTSPURL string `json:"rtsp_url"`
|
|
|
|
RTSPURL string `json:"rtsp_url"`
|
|
|
|
Status string `json:"status"`
|
|
|
|
Status string `json:"status"`
|
|
|
|
Enabled bool `json:"enabled"`
|
|
|
|
Enabled bool `json:"enabled"`
|
|
|
|
DeviceType string `json:"device_type"`
|
|
|
|
DeviceType string `json:"device_type"`
|
|
|
|
UnitCode string `json:"unit_code"`
|
|
|
|
UnitCode string `json:"unit_code"`
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
PlayURLs PlayURLs `json:"play_urls"`
|
|
|
|
PlayURLs PlayURLs `json:"play_urls"`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Stream 流信息结构
|
|
|
|
// Stream 流信息结构
|
|
|
|
@ -81,11 +80,11 @@ func HTTPJavaAPICameras(c *gin.Context) {
|
|
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
|
|
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
|
|
|
|
|
|
|
|
|
|
|
|
var cameras []Camera
|
|
|
|
var cameras []JavaCamera
|
|
|
|
var total int
|
|
|
|
var total int
|
|
|
|
|
|
|
|
|
|
|
|
// 如果数据库启用,从数据库获取
|
|
|
|
// 如果数据库启用,从数据库获取
|
|
|
|
if Storage.ServerDatabaseEnabled() {
|
|
|
|
if Storage.Server.DatabaseEnabled {
|
|
|
|
dbCameras, err := Storage.DatabaseGetCameras()
|
|
|
|
dbCameras, err := Storage.DatabaseGetCameras()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
c.JSON(http.StatusInternalServerError, JavaAPIResponse{
|
|
|
|
c.JSON(http.StatusInternalServerError, JavaAPIResponse{
|
|
|
|
@ -98,20 +97,20 @@ func HTTPJavaAPICameras(c *gin.Context) {
|
|
|
|
|
|
|
|
|
|
|
|
// 转换数据库摄像头为API格式
|
|
|
|
// 转换数据库摄像头为API格式
|
|
|
|
for _, dbCamera := range dbCameras {
|
|
|
|
for _, dbCamera := range dbCameras {
|
|
|
|
camera := Camera{
|
|
|
|
camera := JavaCamera{
|
|
|
|
ID: dbCamera.ID,
|
|
|
|
ID: fmt.Sprintf("%d", dbCamera.CameraID),
|
|
|
|
Name: dbCamera.Name,
|
|
|
|
Name: getStringValue(dbCamera.CameraName),
|
|
|
|
IP: dbCamera.IP,
|
|
|
|
IP: dbCamera.IP,
|
|
|
|
Port: dbCamera.Port,
|
|
|
|
Port: dbCamera.Port,
|
|
|
|
Username: dbCamera.Username,
|
|
|
|
Username: getStringValue(dbCamera.Username),
|
|
|
|
RTSPURL: dbCamera.RTSPURL,
|
|
|
|
RTSPURL: dbCamera.URL,
|
|
|
|
Status: dbCamera.Status,
|
|
|
|
Status: "online", // 默认状态
|
|
|
|
Enabled: dbCamera.Enabled,
|
|
|
|
Enabled: dbCamera.DelFlag == "0", // 删除标志为0表示启用
|
|
|
|
DeviceType: dbCamera.DeviceType,
|
|
|
|
DeviceType: getStringValue(dbCamera.DeviceType),
|
|
|
|
UnitCode: dbCamera.UnitCode,
|
|
|
|
UnitCode: getStringValue(dbCamera.UnitCode),
|
|
|
|
CreatedAt: dbCamera.CreatedAt,
|
|
|
|
CreatedAt: getTimeValue(dbCamera.CreateTime),
|
|
|
|
UpdatedAt: dbCamera.UpdatedAt,
|
|
|
|
UpdatedAt: getTimeValue(dbCamera.UpdateTime),
|
|
|
|
PlayURLs: generatePlayURLs(dbCamera.ID),
|
|
|
|
PlayURLs: generatePlayURLs(fmt.Sprintf("%d", dbCamera.CameraID)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 过滤条件
|
|
|
|
// 过滤条件
|
|
|
|
@ -126,9 +125,9 @@ func HTTPJavaAPICameras(c *gin.Context) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
// 从流配置获取
|
|
|
|
// 从流配置获取
|
|
|
|
streamsList := Storage.StreamsList()
|
|
|
|
streamsList := Storage.Streams
|
|
|
|
for streamID := range streamsList {
|
|
|
|
for streamID := range streamsList {
|
|
|
|
camera := Camera{
|
|
|
|
camera := JavaCamera{
|
|
|
|
ID: streamID,
|
|
|
|
ID: streamID,
|
|
|
|
Name: fmt.Sprintf("Stream %s", streamID),
|
|
|
|
Name: fmt.Sprintf("Stream %s", streamID),
|
|
|
|
Status: "online",
|
|
|
|
Status: "online",
|
|
|
|
@ -145,7 +144,7 @@ func HTTPJavaAPICameras(c *gin.Context) {
|
|
|
|
start := (page - 1) * size
|
|
|
|
start := (page - 1) * size
|
|
|
|
end := start + size
|
|
|
|
end := start + size
|
|
|
|
if start > total {
|
|
|
|
if start > total {
|
|
|
|
cameras = []Camera{}
|
|
|
|
cameras = []JavaCamera{}
|
|
|
|
} else if end > total {
|
|
|
|
} else if end > total {
|
|
|
|
cameras = cameras[start:]
|
|
|
|
cameras = cameras[start:]
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -156,9 +155,9 @@ func HTTPJavaAPICameras(c *gin.Context) {
|
|
|
|
Code: 200,
|
|
|
|
Code: 200,
|
|
|
|
Message: "Success",
|
|
|
|
Message: "Success",
|
|
|
|
Success: true,
|
|
|
|
Success: true,
|
|
|
|
Data: CameraListResponse{
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
Total: total,
|
|
|
|
"total": total,
|
|
|
|
Cameras: cameras,
|
|
|
|
"cameras": cameras,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -179,7 +178,7 @@ func HTTPJavaAPIStreams(c *gin.Context) {
|
|
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
|
|
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
|
|
|
|
|
|
|
|
|
|
|
|
streamsList := Storage.StreamsList()
|
|
|
|
streamsList := Storage.Streams
|
|
|
|
var streams []Stream
|
|
|
|
var streams []Stream
|
|
|
|
|
|
|
|
|
|
|
|
for streamID, streamData := range streamsList {
|
|
|
|
for streamID, streamData := range streamsList {
|
|
|
|
@ -191,7 +190,7 @@ func HTTPJavaAPIStreams(c *gin.Context) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取通道信息
|
|
|
|
// 获取通道信息
|
|
|
|
if streamData != nil {
|
|
|
|
if len(streamData.Channels) > 0 {
|
|
|
|
for channelID := range streamData.Channels {
|
|
|
|
for channelID := range streamData.Channels {
|
|
|
|
stream.Channels[channelID] = fmt.Sprintf("Channel %s", channelID)
|
|
|
|
stream.Channels[channelID] = fmt.Sprintf("Channel %s", channelID)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -238,7 +237,7 @@ func HTTPJavaAPICameraDetail(c *gin.Context) {
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if Storage.ServerDatabaseEnabled() {
|
|
|
|
if Storage.Server.DatabaseEnabled {
|
|
|
|
camera, err := Storage.DatabaseGetCamera(cameraID)
|
|
|
|
camera, err := Storage.DatabaseGetCamera(cameraID)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
c.JSON(http.StatusNotFound, JavaAPIResponse{
|
|
|
|
c.JSON(http.StatusNotFound, JavaAPIResponse{
|
|
|
|
@ -249,20 +248,20 @@ func HTTPJavaAPICameraDetail(c *gin.Context) {
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
apiCamera := Camera{
|
|
|
|
apiCamera := JavaCamera{
|
|
|
|
ID: camera.ID,
|
|
|
|
ID: fmt.Sprintf("%d", camera.CameraID),
|
|
|
|
Name: camera.Name,
|
|
|
|
Name: getStringValue(camera.CameraName),
|
|
|
|
IP: camera.IP,
|
|
|
|
IP: camera.IP,
|
|
|
|
Port: camera.Port,
|
|
|
|
Port: camera.Port,
|
|
|
|
Username: camera.Username,
|
|
|
|
Username: getStringValue(camera.Username),
|
|
|
|
RTSPURL: camera.RTSPURL,
|
|
|
|
RTSPURL: camera.URL,
|
|
|
|
Status: camera.Status,
|
|
|
|
Status: "online",
|
|
|
|
Enabled: camera.Enabled,
|
|
|
|
Enabled: camera.DelFlag == "0",
|
|
|
|
DeviceType: camera.DeviceType,
|
|
|
|
DeviceType: getStringValue(camera.DeviceType),
|
|
|
|
UnitCode: camera.UnitCode,
|
|
|
|
UnitCode: getStringValue(camera.UnitCode),
|
|
|
|
CreatedAt: camera.CreatedAt,
|
|
|
|
CreatedAt: getTimeValue(camera.CreateTime),
|
|
|
|
UpdatedAt: camera.UpdatedAt,
|
|
|
|
UpdatedAt: getTimeValue(camera.UpdateTime),
|
|
|
|
PlayURLs: generatePlayURLs(camera.ID),
|
|
|
|
PlayURLs: generatePlayURLs(fmt.Sprintf("%d", camera.CameraID)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, JavaAPIResponse{
|
|
|
|
c.JSON(http.StatusOK, JavaAPIResponse{
|
|
|
|
@ -282,7 +281,7 @@ func HTTPJavaAPICameraDetail(c *gin.Context) {
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
camera := Camera{
|
|
|
|
camera := JavaCamera{
|
|
|
|
ID: cameraID,
|
|
|
|
ID: cameraID,
|
|
|
|
Name: fmt.Sprintf("Stream %s", cameraID),
|
|
|
|
Name: fmt.Sprintf("Stream %s", cameraID),
|
|
|
|
Status: "online",
|
|
|
|
Status: "online",
|
|
|
|
@ -303,19 +302,19 @@ func HTTPJavaAPICameraDetail(c *gin.Context) {
|
|
|
|
func HTTPJavaAPISystemInfo(c *gin.Context) {
|
|
|
|
func HTTPJavaAPISystemInfo(c *gin.Context) {
|
|
|
|
systemInfo := map[string]interface{}{
|
|
|
|
systemInfo := map[string]interface{}{
|
|
|
|
"version": "1.0.0",
|
|
|
|
"version": "1.0.0",
|
|
|
|
"database_enabled": Storage.ServerDatabaseEnabled(),
|
|
|
|
"database_enabled": Storage.Server.DatabaseEnabled,
|
|
|
|
"demo_enabled": Storage.ServerHTTPDemo(),
|
|
|
|
"demo_enabled": Storage.ServerHTTPDemo(),
|
|
|
|
"total_streams": len(Storage.StreamsList()),
|
|
|
|
"total_streams": len(Storage.Streams),
|
|
|
|
"server_time": time.Now().Format(time.RFC3339),
|
|
|
|
"server_time": time.Now().Format(time.RFC3339),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if Storage.ServerDatabaseEnabled() {
|
|
|
|
if Storage.Server.DatabaseEnabled {
|
|
|
|
cameras, err := Storage.DatabaseGetCameras()
|
|
|
|
cameras, err := Storage.DatabaseGetCameras()
|
|
|
|
if err == nil {
|
|
|
|
if err == nil {
|
|
|
|
systemInfo["total_cameras"] = len(cameras)
|
|
|
|
systemInfo["total_cameras"] = len(cameras)
|
|
|
|
onlineCount := 0
|
|
|
|
onlineCount := 0
|
|
|
|
for _, camera := range cameras {
|
|
|
|
for _, camera := range cameras {
|
|
|
|
if camera.Status == "online" {
|
|
|
|
if camera.DelFlag == "0" { // 删除标志为0表示在线
|
|
|
|
onlineCount++
|
|
|
|
onlineCount++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -340,4 +339,4 @@ func generatePlayURLs(streamID string) PlayURLs {
|
|
|
|
MSE: fmt.Sprintf("%s/pages/player/mse/%s/0", baseURL, streamID),
|
|
|
|
MSE: fmt.Sprintf("%s/pages/player/mse/%s/0", baseURL, streamID),
|
|
|
|
All: fmt.Sprintf("%s/pages/player/all/%s/0", baseURL, streamID),
|
|
|
|
All: fmt.Sprintf("%s/pages/player/all/%s/0", baseURL, streamID),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|