something_static.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package something_static
  2. import (
  3. b64 "encoding/base64"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "time"
  9. "github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
  10. "github.com/allanpk716/ChineseSubFinder/internal/types/common"
  11. "github.com/sirupsen/logrus"
  12. )
  13. func WriteFile(CloneProjectDesSaveDir, enString, nowTime, nowTimeFileNamePrix string) (bool, error) {
  14. saveFileFPath := filepath.Join(CloneProjectDesSaveDir, nowTimeFileNamePrix+common.StaticFileName00)
  15. saveFileFPathWait := filepath.Join(CloneProjectDesSaveDir, nowTimeFileNamePrix+common.StaticFileName00+waitExt)
  16. if my_util.IsFile(saveFileFPath) == true {
  17. // 目标文件存在,则需要判断准备写入覆盖的文件是否与当前存在的文件 SHA1 的值是一样的,一样就跳过后续的操作
  18. // 写入等待替换的文件
  19. err := writeFile(saveFileFPathWait, enString, nowTime)
  20. if err != nil {
  21. return false, err
  22. }
  23. orgFileSHA1, err := my_util.GetFileSHA1(saveFileFPath)
  24. if err != nil {
  25. return false, err
  26. }
  27. waitFileSHA1, err := my_util.GetFileSHA1(saveFileFPathWait)
  28. if err != nil {
  29. return false, err
  30. }
  31. // 如果一样的,那么外面就需要判断无需继续往下执行
  32. if orgFileSHA1 == waitFileSHA1 {
  33. // 删除 wait 文件
  34. err = os.Remove(saveFileFPathWait)
  35. if err != nil {
  36. return false, err
  37. }
  38. return false, nil
  39. }
  40. // 如果不一样,那么就需要删除原来的文件,然后把 wait 文件 rename 过去
  41. err = os.Remove(saveFileFPath)
  42. if err != nil {
  43. return false, err
  44. }
  45. err = os.Rename(saveFileFPathWait, saveFileFPath)
  46. if err != nil {
  47. return false, err
  48. }
  49. } else {
  50. // 如果不存在,那么就直接写入就行了
  51. err := writeFile(saveFileFPath, enString, nowTime)
  52. if err != nil {
  53. return false, err
  54. }
  55. }
  56. return true, nil
  57. }
  58. func writeFile(saveFileFPath, enString, nowTime string) error {
  59. file, err := os.Create(saveFileFPath)
  60. if err != nil {
  61. return err
  62. }
  63. defer func() {
  64. _ = file.Close()
  65. }()
  66. _, err = file.WriteString(enString + b64.StdEncoding.EncodeToString([]byte(nowTime)))
  67. if err != nil {
  68. return err
  69. }
  70. return nil
  71. }
  72. func GetCodeFromWeb(l *logrus.Logger, nowTimeFileNamePrix string) (string, string, error) {
  73. // 默认的位置
  74. //const baseCodeFileUrl = "https://raw.githubusercontents.com/"
  75. const baseCodeFileUrl = "https://raw.staticdn.net/"
  76. const whichProject = "allanpk716/SomeThingsStatic/"
  77. desUrl := baseCodeFileUrl + whichProject + "master/" + nowTimeFileNamePrix + common.StaticFileName00
  78. // 备用的位置
  79. const backupCodeFileUrl = "https://get-static.subtitle.best/"
  80. desUrlBackup := backupCodeFileUrl + nowTimeFileNamePrix + common.StaticFileName00
  81. var err error
  82. updateTimeString := ""
  83. code := ""
  84. found := false
  85. count := 0
  86. for {
  87. if found == true {
  88. break
  89. }
  90. count++
  91. if count > 5 {
  92. break
  93. }
  94. updateTimeString, code, err = getCodeFromWeb(l, desUrl)
  95. if err != nil {
  96. updateTimeString, code, err = getCodeFromWeb(l, desUrlBackup)
  97. if err != nil {
  98. continue
  99. }
  100. }
  101. time.Sleep(time.Second * 5)
  102. found = true
  103. }
  104. if found == false {
  105. return "", "", errors.New(fmt.Sprintf("get code from web failed, %v \n", err.Error()))
  106. }
  107. return updateTimeString, code, nil
  108. }
  109. func getCodeFromWeb(l *logrus.Logger, desUrl string) (string, string, error) {
  110. fileBytes, _, err := my_util.DownFile(l, desUrl)
  111. if err != nil {
  112. return "", "", err
  113. }
  114. if len(fileBytes) < 24 {
  115. return "", "", errors.New("fileBytes len < 24")
  116. }
  117. timeB64String := fileBytes[len(fileBytes)-16:]
  118. decodedTime, err := b64.StdEncoding.DecodeString(string(timeB64String))
  119. if err != nil {
  120. return "", "", err
  121. }
  122. decodeTimeStr := string(decodedTime)
  123. codeB64String := fileBytes[:len(fileBytes)-16]
  124. decodedCode, err := b64.StdEncoding.DecodeString(string(codeB64String))
  125. if err != nil {
  126. return "", "", err
  127. }
  128. decodeCodeStr := string(decodedCode)
  129. return decodeTimeStr, decodeCodeStr, nil
  130. }
  131. const waitExt = ".wait"