backend_static_file_system.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package base
  2. import (
  3. "fmt"
  4. "net/http"
  5. "sync"
  6. "time"
  7. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  8. "github.com/gin-gonic/gin"
  9. "github.com/sirupsen/logrus"
  10. "golang.org/x/net/context"
  11. )
  12. type StaticFileSystemBackEnd struct {
  13. logger *logrus.Logger
  14. running bool
  15. srv *http.Server
  16. locker sync.Mutex
  17. pathUrlMap map[string]string
  18. }
  19. func NewStaticFileSystemBackEnd(logger *logrus.Logger) *StaticFileSystemBackEnd {
  20. return &StaticFileSystemBackEnd{
  21. logger: logger,
  22. pathUrlMap: make(map[string]string),
  23. }
  24. }
  25. // GetPathUrlMap x://电影 -- /movie_dir_0 or x://电视剧 -- /series_dir_0
  26. func (s *StaticFileSystemBackEnd) GetPathUrlMap() map[string]string {
  27. return s.pathUrlMap
  28. }
  29. func (s *StaticFileSystemBackEnd) Start(commonSettings *settings.CommonSettings) {
  30. defer s.locker.Unlock()
  31. s.locker.Lock()
  32. if s.running == true {
  33. s.logger.Warningln("StaticFileSystemBackEnd is already running")
  34. return
  35. }
  36. s.running = true
  37. router := gin.Default()
  38. // 添加电影的
  39. for i, path := range commonSettings.MoviePaths {
  40. nowUrl := "/movie_dir_" + fmt.Sprintf("%d", i)
  41. s.pathUrlMap[path] = nowUrl
  42. router.StaticFS(nowUrl, http.Dir(path))
  43. }
  44. // 添加连续剧的
  45. for i, path := range commonSettings.SeriesPaths {
  46. nowUrl := "/series_dir_" + fmt.Sprintf("%d", i)
  47. s.pathUrlMap[path] = nowUrl
  48. router.StaticFS(nowUrl, http.Dir(path))
  49. }
  50. s.srv = &http.Server{
  51. Addr: ":" + commonSettings.LocalStaticFilePort,
  52. Handler: router,
  53. }
  54. go func() {
  55. // service connections
  56. s.logger.Infoln("Listening and serving HTTP on port " + commonSettings.LocalStaticFilePort)
  57. if err := s.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  58. s.logger.Errorln("StaticFileSystemBackEnd listen:", err)
  59. }
  60. }()
  61. }
  62. func (s *StaticFileSystemBackEnd) Stop() {
  63. defer func() {
  64. s.locker.Unlock()
  65. }()
  66. s.locker.Lock()
  67. if s.running == false {
  68. s.logger.Warningln("StaticFileSystemBackEnd is not running")
  69. return
  70. }
  71. defer func() {
  72. s.pathUrlMap = make(map[string]string)
  73. }()
  74. s.running = false
  75. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  76. defer cancel()
  77. if err := s.srv.Shutdown(ctx); err != nil {
  78. s.logger.Errorln("Server Shutdown:", err)
  79. }
  80. select {
  81. case <-ctx.Done():
  82. s.logger.Warningln("timeout of 5 seconds.")
  83. }
  84. s.logger.Infoln("Static File System Server exiting")
  85. }