main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package main
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "io/ioutil"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. "sort"
  10. "strings"
  11. "github.com/go-ini/ini"
  12. "github.com/labstack/echo/v4"
  13. "github.com/labstack/echo/v4/middleware"
  14. )
  15. var config MainConfig
  16. type MainConfig struct {
  17. Listenaddr string //监听地址
  18. Baseurl string //监听地址
  19. Rootdir string //root文件夹
  20. DvrDir []string //dvr文件夹
  21. Secure string //加密字符串
  22. }
  23. func (o *MainConfig) ReadConfig() bool {
  24. dir, _ := os.Getwd() //filepath.Abs(filepath.Dir(os.Args[0]))
  25. path := dir + string(filepath.Separator)
  26. var ret = false
  27. fini, err := ini.Load(path + "main.ini")
  28. if err == nil {
  29. fsec := fini.Section("mediasvr")
  30. if fsec != nil {
  31. o.Listenaddr = fsec.Key("listenaddr").String()
  32. o.Baseurl = fsec.Key("baseurl").String()
  33. o.Secure = fsec.Key("secure").String()
  34. o.Rootdir = fsec.Key("rootdir").String()
  35. dvrdir := fsec.Key("dvrdir").String()
  36. if len(dvrdir) > 0 {
  37. o.DvrDir = strings.Split(dvrdir, ",")
  38. }
  39. ret = true
  40. }
  41. }
  42. return ret
  43. }
  44. // 根据流ID和日期,获取对应的回放文件链接
  45. func getFile(streams, date string) []string {
  46. var fileList []string
  47. for _, dir := range config.DvrDir {
  48. path := string(filepath.Separator) + dir + string(filepath.Separator) + streams + string(filepath.Separator) + date
  49. if rd, err := ioutil.ReadDir(config.Rootdir + path); err == nil {
  50. for _, fi := range rd {
  51. //过滤掉路径和非mp4文件
  52. if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".mp4") {
  53. httpurl := config.Baseurl + strings.ReplaceAll(path+string(filepath.Separator)+fi.Name(), string(filepath.Separator), "/")
  54. fileList = append(fileList, httpurl)
  55. }
  56. }
  57. }
  58. }
  59. sort.Strings(fileList)
  60. return fileList
  61. }
  62. func SearchFile(c echo.Context) error {
  63. streamid := c.Param("streamid")
  64. date := c.Param("date")
  65. debug := c.Param("debug")
  66. var list []string
  67. //hxz
  68. if len(streamid) > 0 && len(date) > 0 {
  69. list = getFile(streamid, date)
  70. }
  71. if len(list) == 0 {
  72. list = make([]string, 0)
  73. }
  74. if debug == "bug" {
  75. return c.JSON(http.StatusOK, list)
  76. } else if buf, err := json.Marshal(list); err == nil {
  77. enstr := "LC" + base64.StdEncoding.EncodeToString(buf)
  78. //hxz
  79. return c.String(http.StatusOK, enstr)
  80. }
  81. return nil
  82. }
  83. func main() {
  84. if !config.ReadConfig() {
  85. return
  86. }
  87. e := echo.New()
  88. e.Use(middleware.Recover())
  89. e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
  90. AllowOrigins: []string{"*"},
  91. AllowMethods: []string{"*"},
  92. AllowHeaders: []string{"*"},
  93. AllowCredentials: true,
  94. ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin"},
  95. }))
  96. e.Debug = true
  97. e.HideBanner = true
  98. //注册一个Get请求, 路由地址为: 并且绑定一个控制器函数, 这里使用的是闭包函数。
  99. e.GET("/list/:streamid/:date", SearchFile)
  100. e.GET("/list/:streamid/:date/:debug", SearchFile)
  101. e.Static("/", config.Rootdir)
  102. //e.StartTLS(config.Listenaddr, "server.crt", "server.key")
  103. e.Logger.Fatal(e.Start(config.Listenaddr))
  104. }