scan_logic.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package scan_logic
  2. import (
  3. "path/filepath"
  4. "sync"
  5. PTN "github.com/middelink/go-parse-torrent-name"
  6. "github.com/sirupsen/logrus"
  7. "github.com/allanpk716/ChineseSubFinder/internal/dao"
  8. "github.com/allanpk716/ChineseSubFinder/internal/models"
  9. )
  10. type ScanLogic struct {
  11. l *logrus.Logger
  12. scanLogicMap sync.Map
  13. }
  14. func NewScanLogic(l *logrus.Logger) *ScanLogic {
  15. s := &ScanLogic{
  16. l: l,
  17. }
  18. // 那么尝试读取数据库,进行缓存,仅执行一次
  19. var skipInfos []*models.SkipScanInfo
  20. dao.GetDb().Find(&skipInfos)
  21. for _, skipInfo := range skipInfos {
  22. s.scanLogicMap.Store(skipInfo.UID, skipInfo.Skip)
  23. }
  24. return s
  25. }
  26. // Set 设置跳过扫描的信息
  27. func (s *ScanLogic) Set(skipInfo *models.SkipScanInfo) {
  28. s.scanLogicMap.Store(skipInfo.UID, skipInfo.Skip)
  29. dao.GetDb().Save(skipInfo)
  30. }
  31. // Get 是否跳过,获取跳过扫描的信息设置,带有缓存。电影就是具体的视频文件全路径,连续剧就是具体一集视频文件的全路径
  32. func (s *ScanLogic) Get(videoType int, videoPath string) bool {
  33. var uid string
  34. if videoType == 0 {
  35. // 电影
  36. uid = models.GenerateUID4Movie(videoPath)
  37. } else {
  38. // 电视剧
  39. var parse *PTN.TorrentInfo
  40. parse, err := PTN.Parse(videoPath)
  41. if err != nil {
  42. s.l.Errorln("scan_logic.Get.PTN.Parse", err)
  43. return true
  44. }
  45. dirFPath := filepath.Dir(filepath.Dir(videoPath))
  46. uid = models.GenerateUID4Series(dirFPath, parse.Season, parse.Episode)
  47. }
  48. value, found := s.scanLogicMap.Load(uid)
  49. if found == false {
  50. // 缓存没有找到那么就从数据库查询
  51. var skipInfos []models.SkipScanInfo
  52. dao.GetDb().Where("uid = ?", uid).Find(&skipInfos)
  53. if len(skipInfos) < 1 {
  54. // 数据库中没有找到,但是也需要写入一份到数据库中,默认是扫描
  55. skipInfo := models.NewSkipScanInfoByUID(uid, false)
  56. dao.GetDb().Save(skipInfo)
  57. // 缓存下来
  58. s.scanLogicMap.Store(uid, false)
  59. return false
  60. } else {
  61. // 数据库中找到了,缓存下来
  62. s.scanLogicMap.Store(uid, skipInfos[0].Skip)
  63. return skipInfos[0].Skip
  64. }
  65. } else {
  66. return value.(bool)
  67. }
  68. }