download_file_info.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package cache_center
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/settings"
  9. "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
  10. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/types/supplier"
  11. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/cache_center/models"
  12. )
  13. func (c *CacheCenter) DownloadFileAdd(subInfo *supplier.SubInfo) error {
  14. defer c.locker.Unlock()
  15. c.locker.Lock()
  16. if subInfo.FileUrl == "" {
  17. return errors.New("subInfo FileUrl is empty")
  18. }
  19. // 只支持秒或者小时为单位
  20. tmpTTL := time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Second
  21. if settings.Get().AdvancedSettings.DownloadFileCache.Unit == "hour" {
  22. tmpTTL = time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Hour
  23. } else {
  24. tmpTTL = time.Duration(settings.Get().AdvancedSettings.DownloadFileCache.TTL) * time.Second
  25. }
  26. b, err := json.Marshal(subInfo)
  27. if err != nil {
  28. return err
  29. }
  30. // 保存到本地文件
  31. todayString := time.Now().Format("2006-01-02")
  32. saveFPath := filepath.Join(c.downloadFileSaveRootPath, todayString, subInfo.GetUID())
  33. err = pkg.WriteFile(saveFPath, b)
  34. if err != nil {
  35. return err
  36. }
  37. relPath, err := filepath.Rel(c.downloadFileSaveRootPath, saveFPath)
  38. if err != nil {
  39. return err
  40. }
  41. df := models.DownloadFileInfo{
  42. UID: subInfo.GetUID(),
  43. RelPath: relPath,
  44. ExpirationTime: time.Now().Add(tmpTTL),
  45. }
  46. c.db.Save(&df)
  47. return nil
  48. }
  49. func (c *CacheCenter) DownloadFileGet(fileUrlUID string) (bool, *supplier.SubInfo, error) {
  50. defer c.locker.Unlock()
  51. c.locker.Lock()
  52. var dfs []models.DownloadFileInfo
  53. c.db.Where("uid = ?", fileUrlUID).Find(&dfs)
  54. if len(dfs) == 0 {
  55. return false, nil, nil
  56. }
  57. localFileFPath := filepath.Join(c.downloadFileSaveRootPath, dfs[0].RelPath)
  58. if pkg.IsFile(localFileFPath) == false {
  59. return false, nil, nil
  60. }
  61. bytes, err := os.ReadFile(localFileFPath)
  62. if err != nil {
  63. return false, nil, err
  64. }
  65. var subInfo supplier.SubInfo
  66. err = json.Unmarshal(bytes, &subInfo)
  67. if err != nil {
  68. return false, nil, err
  69. }
  70. return true, &subInfo, nil
  71. }