subtitle_best_api.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package subtitle_best_api
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
  9. "github.com/sirupsen/logrus"
  10. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/random_auth_key"
  11. )
  12. type SubtitleBestApi struct {
  13. log *logrus.Logger
  14. authKey random_auth_key.AuthKey
  15. randomAuthKey *random_auth_key.RandomAuthKey
  16. }
  17. func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey) *SubtitleBestApi {
  18. return &SubtitleBestApi{
  19. log: log,
  20. randomAuthKey: random_auth_key.NewRandomAuthKey(5, inAuthKey),
  21. authKey: inAuthKey,
  22. }
  23. }
  24. func (s *SubtitleBestApi) CheckAlive() error {
  25. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  26. return errors.New("auth key is not set")
  27. }
  28. postUrl := webUrlBase + "/v1/subhd-code"
  29. httpClient, err := pkg.NewHttpClient()
  30. if err != nil {
  31. return err
  32. }
  33. authKey, err := s.randomAuthKey.GetAuthKey()
  34. if err != nil {
  35. return err
  36. }
  37. var codeReplyData CodeReplyData
  38. resp, err := httpClient.R().
  39. SetHeader("Authorization", "beer "+authKey).
  40. SetQueryParams(map[string]string{
  41. "now_time": time.Now().Format("2006-01-02"),
  42. }).
  43. SetHeader("Accept", "application/json").
  44. SetResult(&codeReplyData).
  45. Get(postUrl)
  46. if err != nil {
  47. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  48. return err
  49. }
  50. return nil
  51. }
  52. func (s *SubtitleBestApi) GetCode() (string, error) {
  53. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  54. return "", errors.New("auth key is not set")
  55. }
  56. postUrl := webUrlBase + "/v1/subhd-code"
  57. httpClient, err := pkg.NewHttpClient()
  58. if err != nil {
  59. return "", err
  60. }
  61. authKey, err := s.randomAuthKey.GetAuthKey()
  62. if err != nil {
  63. return "", err
  64. }
  65. var codeReplyData CodeReplyData
  66. resp, err := httpClient.R().
  67. SetHeader("Authorization", "beer "+authKey).
  68. SetQueryParams(map[string]string{
  69. "now_time": time.Now().Format("2006-01-02"),
  70. }).
  71. SetHeader("Accept", "application/json").
  72. SetResult(&codeReplyData).
  73. Get(postUrl)
  74. if err != nil {
  75. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  76. return "", err
  77. }
  78. if codeReplyData.Status == 0 {
  79. s.log.Warningln("status code:", resp.StatusCode())
  80. }
  81. if codeReplyData.Status == 0 {
  82. return "", errors.New(codeReplyData.Message)
  83. }
  84. decodeBytes, err := base64.StdEncoding.DecodeString(codeReplyData.Code)
  85. if err != nil {
  86. return "", err
  87. }
  88. return string(decodeBytes), nil
  89. }
  90. func (s *SubtitleBestApi) GetMediaInfo(id, source, videoType string) (*MediaInfoReply, error) {
  91. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  92. return nil, errors.New("auth key is not set")
  93. }
  94. if len(s.authKey.AESKey16) != 16 {
  95. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  96. }
  97. if len(s.authKey.AESIv16) != 16 {
  98. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  99. }
  100. postUrl := webUrlBase + "/v1/media-info"
  101. httpClient, err := pkg.NewHttpClient()
  102. if err != nil {
  103. return nil, err
  104. }
  105. authKey, err := s.randomAuthKey.GetAuthKey()
  106. if err != nil {
  107. return nil, err
  108. }
  109. var mediaInfoReply MediaInfoReply
  110. resp, err := httpClient.R().
  111. SetHeader("Authorization", "beer "+authKey).
  112. SetBody(MediaInfoReq{
  113. Id: id,
  114. Source: source,
  115. VideoType: videoType,
  116. }).
  117. SetResult(&mediaInfoReply).
  118. Post(postUrl)
  119. if err != nil {
  120. s.log.Errorln("get media info error, status code:", resp.StatusCode(), "Error:", err)
  121. return nil, err
  122. }
  123. if mediaInfoReply.Status == 0 {
  124. s.log.Warningln("status code:", resp.StatusCode())
  125. }
  126. return &mediaInfoReply, nil
  127. }
  128. // ConvertId 目前仅仅支持 TMDB ID 转 IMDB ID
  129. func (s *SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertReply, error) {
  130. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  131. return nil, errors.New("auth key is not set")
  132. }
  133. if len(s.authKey.AESKey16) != 16 {
  134. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  135. }
  136. if len(s.authKey.AESIv16) != 16 {
  137. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  138. }
  139. postUrl := webUrlBase + "/v1/id-convert"
  140. httpClient, err := pkg.NewHttpClient()
  141. if err != nil {
  142. return nil, err
  143. }
  144. authKey, err := s.randomAuthKey.GetAuthKey()
  145. if err != nil {
  146. return nil, err
  147. }
  148. var idConvertReply IdConvertReply
  149. resp, err := httpClient.R().
  150. SetHeader("Authorization", "beer "+authKey).
  151. SetBody(IdConvertReq{
  152. Id: id,
  153. Source: source,
  154. VideoType: videoType,
  155. }).
  156. SetResult(&idConvertReply).
  157. Post(postUrl)
  158. if err != nil {
  159. s.log.Errorln("convert id error, status code:", resp.StatusCode(), "Error:", err)
  160. return nil, err
  161. }
  162. if idConvertReply.Status == 0 {
  163. s.log.Warningln("status code:", resp.StatusCode())
  164. }
  165. return &idConvertReply, nil
  166. }
  167. func (s *SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare, EnableApiKey bool) (*FeedReply, error) {
  168. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  169. return nil, errors.New("auth key is not set")
  170. }
  171. if len(s.authKey.AESKey16) != 16 {
  172. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  173. }
  174. if len(s.authKey.AESIv16) != 16 {
  175. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  176. }
  177. postUrl := webUrlBase + "/v1/feedback"
  178. httpClient, err := pkg.NewHttpClient()
  179. if err != nil {
  180. return nil, err
  181. }
  182. authKey, err := s.randomAuthKey.GetAuthKey()
  183. if err != nil {
  184. return nil, err
  185. }
  186. formData := make(map[string]string)
  187. formData["id"] = id
  188. formData["version"] = version
  189. formData["media_server"] = MediaServer
  190. formData["enable_share"] = strconv.FormatBool(EnableShare)
  191. formData["enable_api_key"] = strconv.FormatBool(EnableApiKey)
  192. var feedReply FeedReply
  193. resp, err := httpClient.R().
  194. SetHeader("Authorization", "beer "+authKey).
  195. SetFormData(formData).
  196. SetResult(&feedReply).
  197. Post(postUrl)
  198. if err != nil {
  199. s.log.Errorln("feedback error, status code:", resp.StatusCode(), "Error:", err)
  200. return nil, err
  201. }
  202. if feedReply.Status == 0 {
  203. s.log.Warningln("status code:", resp.StatusCode())
  204. }
  205. return &feedReply, nil
  206. }
  207. const (
  208. webUrlBase = "https://api.subtitle.best"
  209. )