scan_logic.go 1.8 KB

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