subtitle_best_api.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. package subtitle_best_api
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "io/ioutil"
  9. "os"
  10. "path/filepath"
  11. "strconv"
  12. "time"
  13. "github.com/allanpk716/ChineseSubFinder/pkg/global_value"
  14. "github.com/allanpk716/ChineseSubFinder/pkg/common"
  15. "github.com/sirupsen/logrus"
  16. "github.com/allanpk716/ChineseSubFinder/internal/models"
  17. "github.com/allanpk716/ChineseSubFinder/pkg/my_util"
  18. "github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
  19. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  20. )
  21. type SubtitleBestApi struct {
  22. log *logrus.Logger
  23. authKey random_auth_key.AuthKey
  24. randomAuthKey *random_auth_key.RandomAuthKey
  25. proxySettings *settings.ProxySettings
  26. }
  27. func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey, proxySettings *settings.ProxySettings) *SubtitleBestApi {
  28. return &SubtitleBestApi{
  29. log: log,
  30. randomAuthKey: random_auth_key.NewRandomAuthKey(5, inAuthKey),
  31. authKey: inAuthKey,
  32. proxySettings: proxySettings,
  33. }
  34. }
  35. func (s *SubtitleBestApi) CheckAlive(proxySettings ...*settings.ProxySettings) error {
  36. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  37. return errors.New("auth key is not set")
  38. }
  39. postUrl := webUrlBase + "/v1/subhd-code"
  40. httpClient, err := my_util.NewHttpClient(proxySettings...)
  41. if err != nil {
  42. return err
  43. }
  44. authKey, err := s.randomAuthKey.GetAuthKey()
  45. if err != nil {
  46. return err
  47. }
  48. var codeReplyData CodeReplyData
  49. resp, err := httpClient.R().
  50. SetHeader("Authorization", "beer "+authKey).
  51. SetQueryParams(map[string]string{
  52. "now_time": time.Now().Format("2006-01-02"),
  53. }).
  54. SetHeader("Accept", "application/json").
  55. SetResult(&codeReplyData).
  56. Get(postUrl)
  57. if err != nil {
  58. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  59. return err
  60. }
  61. return nil
  62. }
  63. func (s *SubtitleBestApi) GetCode() (string, error) {
  64. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  65. return "", errors.New("auth key is not set")
  66. }
  67. postUrl := webUrlBase + "/v1/subhd-code"
  68. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  69. if err != nil {
  70. return "", err
  71. }
  72. authKey, err := s.randomAuthKey.GetAuthKey()
  73. if err != nil {
  74. return "", err
  75. }
  76. var codeReplyData CodeReplyData
  77. resp, err := httpClient.R().
  78. SetHeader("Authorization", "beer "+authKey).
  79. SetQueryParams(map[string]string{
  80. "now_time": time.Now().Format("2006-01-02"),
  81. }).
  82. SetHeader("Accept", "application/json").
  83. SetResult(&codeReplyData).
  84. Get(postUrl)
  85. if err != nil {
  86. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  87. return "", err
  88. }
  89. if codeReplyData.Status == 0 {
  90. s.log.Warningln("status code:", resp.StatusCode())
  91. }
  92. if codeReplyData.Status == 0 {
  93. return "", errors.New(codeReplyData.Message)
  94. }
  95. decodeBytes, err := base64.StdEncoding.DecodeString(codeReplyData.Code)
  96. if err != nil {
  97. return "", err
  98. }
  99. return string(decodeBytes), nil
  100. }
  101. func (s *SubtitleBestApi) GetMediaInfo(id, source, videoType string) (*MediaInfoReply, error) {
  102. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  103. return nil, errors.New("auth key is not set")
  104. }
  105. if len(s.authKey.AESKey16) != 16 {
  106. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  107. }
  108. if len(s.authKey.AESIv16) != 16 {
  109. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  110. }
  111. postUrl := webUrlBase + "/v1/media-info"
  112. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  113. if err != nil {
  114. return nil, err
  115. }
  116. authKey, err := s.randomAuthKey.GetAuthKey()
  117. if err != nil {
  118. return nil, err
  119. }
  120. var mediaInfoReply MediaInfoReply
  121. resp, err := httpClient.R().
  122. SetHeader("Authorization", "beer "+authKey).
  123. SetBody(MediaInfoReq{
  124. Id: id,
  125. Source: source,
  126. VideoType: videoType,
  127. }).
  128. SetResult(&mediaInfoReply).
  129. Post(postUrl)
  130. if err != nil {
  131. s.log.Errorln("get media info error, status code:", resp.StatusCode(), "Error:", err)
  132. return nil, err
  133. }
  134. if mediaInfoReply.Status == 0 {
  135. s.log.Warningln("status code:", resp.StatusCode())
  136. }
  137. return &mediaInfoReply, nil
  138. }
  139. // AskFroUpload 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID
  140. func (s *SubtitleBestApi) AskFroUpload(subSha256 string, IsMovie, trusted bool, ImdbId, TmdbId string, Season, Episode int, VideoFeature string) (*AskForUploadReply, error) {
  141. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  142. return nil, errors.New("auth key is not set")
  143. }
  144. postUrl := webUrlBase + "/v1/ask-for-upload"
  145. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  146. if err != nil {
  147. return nil, err
  148. }
  149. authKey, err := s.randomAuthKey.GetAuthKey()
  150. if err != nil {
  151. return nil, err
  152. }
  153. isMovieStr := "false"
  154. if IsMovie == true {
  155. isMovieStr = "true"
  156. }
  157. trustedStr := "false"
  158. if trusted == true {
  159. trustedStr = "true"
  160. }
  161. formData := make(map[string]string)
  162. if trusted == true {
  163. formData["sub_sha256"] = subSha256
  164. formData["is_movie"] = isMovieStr
  165. formData["trusted"] = trustedStr
  166. formData["imdb_id"] = ImdbId
  167. formData["tmdb_id"] = TmdbId
  168. formData["season"] = strconv.Itoa(Season)
  169. formData["episode"] = strconv.Itoa(Episode)
  170. formData["video_feature"] = VideoFeature
  171. } else {
  172. formData["sub_sha256"] = subSha256
  173. formData["is_movie"] = isMovieStr
  174. }
  175. var askForUploadReply AskForUploadReply
  176. resp, err := httpClient.R().
  177. SetHeader("Authorization", "beer "+authKey).
  178. SetFormData(formData).
  179. SetResult(&askForUploadReply).
  180. Post(postUrl)
  181. if err != nil {
  182. s.log.Errorln("ask for upload error, status code:", resp.StatusCode(), "Error:", err)
  183. return nil, err
  184. }
  185. if askForUploadReply.Status == 0 {
  186. s.log.Warningln("status code:", resp.StatusCode())
  187. }
  188. return &askForUploadReply, nil
  189. }
  190. // UploadSub 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID,其实在这一步应该默认就拿到了 TMDB ID,需要提前在 AskFroUpload 接口调用前就搞定这个
  191. // year 这个也是从之前的接口拿到, 2019 or 2022
  192. func (s *SubtitleBestApi) UploadSub(videoSubInfo *models.VideoSubInfo, subSaveRootDirPath string, tmdbId, year string) (*UploadSubReply, error) {
  193. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  194. return nil, errors.New("auth key is not set")
  195. }
  196. postUrl := webUrlBase + "/v1/upload-sub"
  197. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  198. if err != nil {
  199. return nil, err
  200. }
  201. authKey, err := s.randomAuthKey.GetAuthKey()
  202. if err != nil {
  203. return nil, err
  204. }
  205. // 从相对路径转换为绝对路径
  206. subFileFPath := filepath.Join(subSaveRootDirPath, videoSubInfo.StoreRPath)
  207. if my_util.IsFile(subFileFPath) == false {
  208. return nil, errors.New(fmt.Sprintf("sub file not exist, %s", subFileFPath))
  209. }
  210. file, err := os.Open(subFileFPath)
  211. if err != nil {
  212. return nil, errors.New(fmt.Sprintf("open sub file failed, %s", subFileFPath))
  213. }
  214. defer func() {
  215. _ = file.Close()
  216. }()
  217. fd, err := ioutil.ReadAll(file)
  218. if err != nil {
  219. return nil, errors.New(fmt.Sprintf("read sub file failed, %s", subFileFPath))
  220. }
  221. isDouble := "false"
  222. if videoSubInfo.IsDouble == true {
  223. isDouble = "true"
  224. }
  225. isMovieStr := "false"
  226. if videoSubInfo.IsMovie == true {
  227. isMovieStr = "true"
  228. }
  229. var uploadSubReply UploadSubReply
  230. resp, err := httpClient.R().
  231. SetHeader("Authorization", "beer "+authKey).
  232. SetFileReader("sub_file_context", videoSubInfo.SubName, bytes.NewReader(fd)).
  233. SetFormData(map[string]string{
  234. "sub_sha256": videoSubInfo.SHA256,
  235. "is_movie": isMovieStr,
  236. "season": strconv.Itoa(videoSubInfo.Season),
  237. "episode": strconv.Itoa(videoSubInfo.Episode),
  238. "is_double": isDouble,
  239. "language_iso": videoSubInfo.LanguageISO,
  240. "my_language": videoSubInfo.MyLanguage,
  241. "extra_pre_name": videoSubInfo.ExtraPreName,
  242. "imdb_id": videoSubInfo.IMDBInfoID,
  243. "tmdb_id": tmdbId,
  244. "video_feature": videoSubInfo.Feature,
  245. "year": year,
  246. }).
  247. SetResult(&uploadSubReply).
  248. Post(postUrl)
  249. if err != nil {
  250. s.log.Errorln("upload sub error, status code:", resp.StatusCode(), "Error:", err)
  251. if resp != nil && resp.StatusCode() == 413 {
  252. // 文件上传大小超限
  253. return nil, common.ErrorUpload413
  254. }
  255. return nil, err
  256. }
  257. if uploadSubReply.Status == 0 {
  258. s.log.Warningln("status code:", resp.StatusCode())
  259. }
  260. if resp.StatusCode() == 413 {
  261. // 文件上传大小超限
  262. return nil, common.ErrorUpload413
  263. }
  264. return &uploadSubReply, nil
  265. }
  266. func (s *SubtitleBestApi) UploadLowTrustSub(lowTrustVideoSubInfo *models.LowVideoSubInfo, subSaveRootDirPath string, tmdbId, year, taskID string) (*UploadSubReply, error) {
  267. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  268. return nil, errors.New("auth key is not set")
  269. }
  270. postUrl := webUrlBase + "/v1/upload-sub"
  271. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  272. if err != nil {
  273. return nil, err
  274. }
  275. authKey, err := s.randomAuthKey.GetAuthKey()
  276. if err != nil {
  277. return nil, err
  278. }
  279. // 从相对路径转换为绝对路径
  280. subFileFPath := filepath.Join(subSaveRootDirPath, lowTrustVideoSubInfo.StoreRPath)
  281. if my_util.IsFile(subFileFPath) == false {
  282. return nil, errors.New(fmt.Sprintf("sub file not exist, %s", subFileFPath))
  283. }
  284. file, err := os.Open(subFileFPath)
  285. if err != nil {
  286. return nil, errors.New(fmt.Sprintf("open sub file failed, %s", subFileFPath))
  287. }
  288. defer func() {
  289. _ = file.Close()
  290. }()
  291. fd, err := ioutil.ReadAll(file)
  292. if err != nil {
  293. return nil, errors.New(fmt.Sprintf("read sub file failed, %s", subFileFPath))
  294. }
  295. isDouble := "false"
  296. if lowTrustVideoSubInfo.IsDouble == true {
  297. isDouble = "true"
  298. }
  299. isMovieStr := "false"
  300. if lowTrustVideoSubInfo.IsMovie == true {
  301. isMovieStr = "true"
  302. }
  303. var uploadSubReply UploadSubReply
  304. resp, err := httpClient.R().
  305. SetHeader("Authorization", "beer "+authKey).
  306. SetFileReader("sub_file_context", lowTrustVideoSubInfo.SubName, bytes.NewReader(fd)).
  307. SetFormData(map[string]string{
  308. "sub_sha256": lowTrustVideoSubInfo.SHA256,
  309. "is_movie": isMovieStr,
  310. "season": strconv.Itoa(lowTrustVideoSubInfo.Season),
  311. "episode": strconv.Itoa(lowTrustVideoSubInfo.Episode),
  312. "is_double": isDouble,
  313. "language_iso": lowTrustVideoSubInfo.LanguageISO,
  314. "my_language": lowTrustVideoSubInfo.MyLanguage,
  315. "extra_pre_name": lowTrustVideoSubInfo.ExtraPreName,
  316. "imdb_id": lowTrustVideoSubInfo.IMDBID,
  317. "tmdb_id": tmdbId,
  318. "video_feature": lowTrustVideoSubInfo.Feature,
  319. "year": year,
  320. "low_trust": "true",
  321. "task_id": taskID,
  322. }).
  323. SetResult(&uploadSubReply).
  324. Post(postUrl)
  325. if err != nil {
  326. s.log.Errorln("upload sub error, status code:", resp.StatusCode(), "Error:", err)
  327. if resp != nil && resp.StatusCode() == 413 {
  328. // 文件上传大小超限
  329. return nil, common.ErrorUpload413
  330. }
  331. return nil, err
  332. }
  333. if uploadSubReply.Status == 0 {
  334. s.log.Warningln("status code:", resp.StatusCode())
  335. }
  336. if resp.StatusCode() == 413 {
  337. // 文件上传大小超限
  338. return nil, common.ErrorUpload413
  339. }
  340. return &uploadSubReply, nil
  341. }
  342. func (s *SubtitleBestApi) AskFindSub(VideoFeature, ImdbId, TmdbId, Season, Episode, FindSubToken, ApiKey string) (*AskFindSubReply, error) {
  343. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  344. return nil, errors.New("auth key is not set")
  345. }
  346. postUrl := webUrlBase + "/v1/ask-find-sub"
  347. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  348. if err != nil {
  349. return nil, err
  350. }
  351. authKey, err := s.randomAuthKey.GetAuthKey()
  352. if err != nil {
  353. return nil, err
  354. }
  355. postData := map[string]string{
  356. "video_feature": VideoFeature,
  357. "imdb_id": ImdbId,
  358. "tmdb_id": TmdbId,
  359. "season": Season,
  360. "episode": Episode,
  361. "find_sub_token": FindSubToken,
  362. }
  363. if ApiKey != "" {
  364. postData["api_key"] = ApiKey
  365. }
  366. var askFindSubReply AskFindSubReply
  367. resp, err := httpClient.R().
  368. SetHeader("Authorization", "beer "+authKey).
  369. SetFormData(postData).
  370. SetResult(&askFindSubReply).
  371. Post(postUrl)
  372. if err != nil {
  373. s.log.Errorln("ask find sub error, status code:", resp.StatusCode(), "Error:", err)
  374. return nil, err
  375. }
  376. if askFindSubReply.Status == 0 {
  377. s.log.Warningln("status code:", resp.StatusCode())
  378. }
  379. return &askFindSubReply, nil
  380. }
  381. func (s *SubtitleBestApi) FindSub(VideoFeature, ImdbId, TmdbId, Season, Episode, FindSubToken, ApiKey string) (*FindSubReply, error) {
  382. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  383. return nil, errors.New("auth key is not set")
  384. }
  385. postUrl := webUrlBase + "/v1/find-sub"
  386. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  387. if err != nil {
  388. return nil, err
  389. }
  390. authKey, err := s.randomAuthKey.GetAuthKey()
  391. if err != nil {
  392. return nil, err
  393. }
  394. postData := map[string]string{
  395. "video_feature": VideoFeature,
  396. "imdb_id": ImdbId,
  397. "tmdb_id": TmdbId,
  398. "season": Season,
  399. "episode": Episode,
  400. "find_sub_token": FindSubToken,
  401. }
  402. if ApiKey != "" {
  403. postData["api_key"] = ApiKey
  404. }
  405. var findSubReply FindSubReply
  406. resp, err := httpClient.R().
  407. SetHeader("Authorization", "beer "+authKey).
  408. SetFormData(postData).
  409. SetResult(&findSubReply).
  410. Post(postUrl)
  411. if err != nil {
  412. s.log.Errorln("find sub error, status code:", resp.StatusCode(), "Error:", err)
  413. return nil, err
  414. }
  415. if findSubReply.Status == 0 {
  416. s.log.Warningln("status code:", resp.StatusCode())
  417. }
  418. return &findSubReply, nil
  419. }
  420. func (s *SubtitleBestApi) AskDownloadSub(SubSha256, DownloadToken, ApiKey string) (*AskForDownloadReply, error) {
  421. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  422. return nil, errors.New("auth key is not set")
  423. }
  424. postUrl := webUrlBase + "/v1/ask-for-download"
  425. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  426. if err != nil {
  427. return nil, err
  428. }
  429. authKey, err := s.randomAuthKey.GetAuthKey()
  430. if err != nil {
  431. return nil, err
  432. }
  433. postData := map[string]string{
  434. "sub_sha256": SubSha256,
  435. "download_token": DownloadToken,
  436. }
  437. if ApiKey != "" {
  438. postData["api_key"] = ApiKey
  439. }
  440. var askDownloadReply AskForDownloadReply
  441. resp, err := httpClient.R().
  442. SetHeader("Authorization", "beer "+authKey).
  443. SetFormData(postData).
  444. SetResult(&askDownloadReply).
  445. Post(postUrl)
  446. if err != nil {
  447. s.log.Errorln("ask download sub error, status code:", resp.StatusCode(), "Error:", err)
  448. return nil, err
  449. }
  450. if askDownloadReply.Status == 0 {
  451. s.log.Warningln("status code:", resp.StatusCode())
  452. }
  453. return &askDownloadReply, nil
  454. }
  455. // DownloadSub 首先要确认 downloadFileDesFPath 这个文件是否存在,如果存在且跟需要下载的文件的 sha256 一样就要跳过,然后下载完毕后,也需要 check 这个文件是否存在,存在则需要判断是否是字幕
  456. func (s *SubtitleBestApi) DownloadSub(SubSha256, DownloadToken, ApiKey, downloadFileDesFPath string) (*DownloadSubReply, error) {
  457. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  458. return nil, errors.New("auth key is not set")
  459. }
  460. postUrl := webUrlBase + "/v1/download-sub"
  461. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  462. if err != nil {
  463. return nil, err
  464. }
  465. authKey, err := s.randomAuthKey.GetAuthKey()
  466. if err != nil {
  467. return nil, err
  468. }
  469. postData := map[string]string{
  470. "sub_sha256": SubSha256,
  471. "download_token": DownloadToken,
  472. }
  473. if ApiKey != "" {
  474. postData["api_key"] = ApiKey
  475. }
  476. if my_util.IsFile(downloadFileDesFPath) == true {
  477. err = os.Remove(downloadFileDesFPath)
  478. if err != nil {
  479. return nil, errors.New("remove file error: " + err.Error())
  480. }
  481. }
  482. var downloadReply DownloadSubReply
  483. resp, err := httpClient.R().
  484. SetHeader("Authorization", "beer "+authKey).
  485. SetFormData(postData).
  486. SetOutput(downloadFileDesFPath).
  487. Post(postUrl)
  488. if err != nil {
  489. s.log.Errorln("download sub error, status code:", resp.StatusCode(), "Error:", err)
  490. return nil, err
  491. }
  492. if downloadReply.Status == 0 {
  493. s.log.Warningln("status code:", resp.StatusCode())
  494. }
  495. readFile, err := ioutil.ReadFile(downloadFileDesFPath)
  496. if err != nil {
  497. return nil, errors.New("read file error: " + err.Error())
  498. }
  499. err = json.Unmarshal(readFile, &downloadReply)
  500. if err != nil {
  501. // 说明成功了,但是出去,还是要再次判断这个是不是字幕文件才行
  502. downloadReply.Status = 1
  503. downloadReply.Message = "success"
  504. return &downloadReply, nil
  505. }
  506. // 正常来说,只会获取到字幕,不会有这个 DownloadSubReply 结构的返回,上面获取到了字幕文件,也是伪造一个返回而已
  507. // 说明返回的这个文件是正常的 reply 文件,那么需要把下载的文件给删除了
  508. err = os.Remove(downloadFileDesFPath)
  509. if err != nil {
  510. return nil, errors.New("remove file error: " + err.Error())
  511. }
  512. return &downloadReply, nil
  513. }
  514. func (s *SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertReply, error) {
  515. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  516. return nil, errors.New("auth key is not set")
  517. }
  518. if len(s.authKey.AESKey16) != 16 {
  519. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  520. }
  521. if len(s.authKey.AESIv16) != 16 {
  522. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  523. }
  524. postUrl := webUrlBase + "/v1/id-convert"
  525. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  526. if err != nil {
  527. return nil, err
  528. }
  529. authKey, err := s.randomAuthKey.GetAuthKey()
  530. if err != nil {
  531. return nil, err
  532. }
  533. var idConvertReply IdConvertReply
  534. resp, err := httpClient.R().
  535. SetHeader("Authorization", "beer "+authKey).
  536. SetBody(IdConvertReq{
  537. Id: id,
  538. Source: source,
  539. VideoType: videoType,
  540. }).
  541. SetResult(&idConvertReply).
  542. Post(postUrl)
  543. if err != nil {
  544. s.log.Errorln("convert id error, status code:", resp.StatusCode(), "Error:", err)
  545. return nil, err
  546. }
  547. if idConvertReply.Status == 0 {
  548. s.log.Warningln("status code:", resp.StatusCode())
  549. }
  550. return &idConvertReply, nil
  551. }
  552. func (s *SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare, EnableApiKey bool) (*FeedReply, error) {
  553. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  554. return nil, errors.New("auth key is not set")
  555. }
  556. if len(s.authKey.AESKey16) != 16 {
  557. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  558. }
  559. if len(s.authKey.AESIv16) != 16 {
  560. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  561. }
  562. postUrl := webUrlBase + "/v1/feedback"
  563. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  564. if err != nil {
  565. return nil, err
  566. }
  567. authKey, err := s.randomAuthKey.GetAuthKey()
  568. if err != nil {
  569. return nil, err
  570. }
  571. formData := make(map[string]string)
  572. formData["id"] = id
  573. formData["version"] = version
  574. formData["media_server"] = MediaServer
  575. formData["enable_share"] = strconv.FormatBool(EnableShare)
  576. formData["enable_api_key"] = strconv.FormatBool(EnableApiKey)
  577. var feedReply FeedReply
  578. resp, err := httpClient.R().
  579. SetHeader("Authorization", "beer "+authKey).
  580. SetFormData(formData).
  581. SetResult(&feedReply).
  582. Post(postUrl)
  583. if err != nil {
  584. s.log.Errorln("feedback error, status code:", resp.StatusCode(), "Error:", err)
  585. return nil, err
  586. }
  587. if feedReply.Status == 0 {
  588. s.log.Warningln("status code:", resp.StatusCode())
  589. }
  590. return &feedReply, nil
  591. }
  592. func (s *SubtitleBestApi) AskDownloadTask(id string) (*AskDownloadTaskReply, error) {
  593. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  594. return nil, errors.New("auth key is not set")
  595. }
  596. if len(s.authKey.AESKey16) != 16 {
  597. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  598. }
  599. if len(s.authKey.AESIv16) != 16 {
  600. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  601. }
  602. postUrl := webUrlBase + "/v1/ask-download-task"
  603. httpClient, err := my_util.NewHttpClient(s.proxySettings)
  604. if err != nil {
  605. return nil, err
  606. }
  607. authKey, err := s.randomAuthKey.GetAuthKey()
  608. if err != nil {
  609. return nil, err
  610. }
  611. major, minor, patch := global_value.AppVersionInt()
  612. var askDownloadTaskReply AskDownloadTaskReply
  613. resp, err := httpClient.R().
  614. SetHeader("Authorization", "beer "+authKey).
  615. SetFormData(map[string]string{
  616. "fid": id,
  617. "app_version_major": fmt.Sprintf("%d", major),
  618. "app_version_minor": fmt.Sprintf("%d", minor),
  619. "app_version_patch": fmt.Sprintf("%d", patch),
  620. }).
  621. SetResult(&askDownloadTaskReply).
  622. Post(postUrl)
  623. if err != nil {
  624. s.log.Errorln("ask download task error, status code:", resp.StatusCode(), "Error:", err)
  625. return nil, err
  626. }
  627. if askDownloadTaskReply.Status == 0 {
  628. s.log.Warningln("status code:", resp.StatusCode())
  629. }
  630. return &askDownloadTaskReply, nil
  631. }
  632. const (
  633. webUrlBase = "https://api.subtitle.best"
  634. //webUrlBase = "http://127.0.0.1:8893"
  635. )