backend_static_file_system.go 1.9 KB

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