util.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/allanpk716/ChineseSubFinder/common"
  5. "github.com/go-resty/resty/v2"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "path"
  11. "regexp"
  12. "strconv"
  13. "strings"
  14. )
  15. // NewHttpClient 新建一个 resty 的对象
  16. func NewHttpClient(_reqParam ...common.ReqParam) *resty.Client {
  17. //const defUserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
  18. const defUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41"
  19. var reqParam common.ReqParam
  20. var HttpProxy, UserAgent, Referer string
  21. if len(_reqParam) > 0 {
  22. reqParam = _reqParam[0]
  23. }
  24. if len(reqParam.HttpProxy) > 0 {
  25. HttpProxy = reqParam.HttpProxy
  26. }
  27. if len(reqParam.UserAgent) > 0 {
  28. UserAgent = reqParam.UserAgent
  29. } else {
  30. UserAgent = defUserAgent
  31. }
  32. if len(reqParam.Referer) > 0 {
  33. Referer = reqParam.Referer
  34. }
  35. httpClient := resty.New()
  36. httpClient.SetTimeout(common.HTMLTimeOut)
  37. if HttpProxy != "" {
  38. httpClient.SetProxy(HttpProxy)
  39. }
  40. httpClient.SetHeaders(map[string]string{
  41. "Content-Type": "application/json",
  42. "User-Agent": UserAgent,
  43. })
  44. if len(Referer) > 0 {
  45. httpClient.SetHeader("Referer", Referer)
  46. }
  47. return httpClient
  48. }
  49. // DownFile 从指定的 url 下载文件
  50. func DownFile(urlStr string, _reqParam ...common.ReqParam) ([]byte, string, error) {
  51. var reqParam common.ReqParam
  52. if len(_reqParam) > 0 {
  53. reqParam = _reqParam[0]
  54. }
  55. httpClient := NewHttpClient(reqParam)
  56. resp, err := httpClient.R().Get(urlStr)
  57. if err != nil {
  58. return nil, "", err
  59. }
  60. filename := GetFileName(resp.RawResponse)
  61. return resp.Body(), filename, nil
  62. }
  63. // GetFileName 获取下载文件的文件名
  64. func GetFileName(resp *http.Response) string {
  65. contentDisposition := resp.Header.Get("Content-Disposition")
  66. if len(contentDisposition) == 0 {
  67. return ""
  68. }
  69. re := regexp.MustCompile(`filename=["]*([^"]+)["]*`)
  70. matched := re.FindStringSubmatch(contentDisposition)
  71. if matched == nil || len(matched) == 0 || len(matched[0]) == 0 {
  72. //fmt.Println("######")
  73. return ""
  74. }
  75. return matched[1]
  76. }
  77. // AddBaseUrl 判断驶入的 url 是否需要拼接 baseUrl
  78. func AddBaseUrl(baseUrl, url string) string {
  79. if strings.Contains(url, "://") {
  80. return url
  81. }
  82. return fmt.Sprintf("%s%s", baseUrl, url)
  83. }
  84. func GetDebugFolder() (string, error) {
  85. if defDebugFolder == "" {
  86. nowProcessRoot, _ := os.Getwd()
  87. nowProcessRoot = path.Join(nowProcessRoot, common.DebugFolder)
  88. err := os.MkdirAll(nowProcessRoot, os.ModePerm)
  89. if err != nil {
  90. return "", err
  91. }
  92. defDebugFolder = nowProcessRoot
  93. return nowProcessRoot, err
  94. }
  95. return defDebugFolder, nil
  96. }
  97. func GetTmpFolder() (string, error) {
  98. if defTmpFolder == "" {
  99. nowProcessRoot, _ := os.Getwd()
  100. nowProcessRoot = path.Join(nowProcessRoot, common.TmpFolder)
  101. err := os.MkdirAll(nowProcessRoot, os.ModePerm)
  102. if err != nil {
  103. return "", err
  104. }
  105. defTmpFolder = nowProcessRoot
  106. return nowProcessRoot, err
  107. }
  108. return defTmpFolder, nil
  109. }
  110. func ClearTmpFolder() error {
  111. nowTmpFolder, err := GetTmpFolder()
  112. if err != nil {
  113. return err
  114. }
  115. pathSep := string(os.PathSeparator)
  116. files, err := ioutil.ReadDir(nowTmpFolder)
  117. if err != nil {
  118. return err
  119. }
  120. for _, curFile := range files {
  121. fullPath := nowTmpFolder + pathSep + curFile.Name()
  122. if curFile.IsDir() {
  123. err = os.RemoveAll(fullPath)
  124. if err != nil {
  125. return err
  126. }
  127. } else {
  128. // 这里就是文件了
  129. err = os.Remove(fullPath)
  130. if err != nil {
  131. return err
  132. }
  133. }
  134. }
  135. return nil
  136. }
  137. func CopyFile(dstName, srcName string) (written int64, err error) {
  138. src, err := os.Open(srcName)
  139. if err != nil {
  140. return
  141. }
  142. defer src.Close()
  143. dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
  144. if err != nil {
  145. return
  146. }
  147. defer dst.Close()
  148. return io.Copy(dst, src)
  149. }
  150. func IsDir(path string) bool {
  151. s, err := os.Stat(path)
  152. if err != nil {
  153. return false
  154. }
  155. return s.IsDir()
  156. }
  157. func VideoNameSearchKeywordMaker(title string, year string) string {
  158. iYear, err := strconv.Atoi(year)
  159. if err != nil {
  160. // 允许的错误
  161. GetLogger().Errorln("VideoNameSearchKeywordMaker", "year to int", err)
  162. iYear = 0
  163. }
  164. searchKeyword := title
  165. if iYear >= 2020 {
  166. searchKeyword = searchKeyword + year
  167. }
  168. return searchKeyword
  169. }
  170. var (
  171. defDebugFolder = ""
  172. defTmpFolder = ""
  173. )