subtitle_best_api.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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"
  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/random_auth_key"
  18. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  19. )
  20. type SubtitleBestApi struct {
  21. log *logrus.Logger
  22. authKey random_auth_key.AuthKey
  23. randomAuthKey *random_auth_key.RandomAuthKey
  24. proxySettings *settings.ProxySettings
  25. }
  26. func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey, proxySettings *settings.ProxySettings) *SubtitleBestApi {
  27. return &SubtitleBestApi{
  28. log: log,
  29. randomAuthKey: random_auth_key.NewRandomAuthKey(5, inAuthKey),
  30. authKey: inAuthKey,
  31. proxySettings: proxySettings,
  32. }
  33. }
  34. func (s *SubtitleBestApi) CheckAlive(proxySettings ...*settings.ProxySettings) error {
  35. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  36. return errors.New("auth key is not set")
  37. }
  38. postUrl := webUrlBase + "/v1/subhd-code"
  39. httpClient, err := pkg.NewHttpClient(proxySettings...)
  40. if err != nil {
  41. return err
  42. }
  43. authKey, err := s.randomAuthKey.GetAuthKey()
  44. if err != nil {
  45. return err
  46. }
  47. var codeReplyData CodeReplyData
  48. resp, err := httpClient.R().
  49. SetHeader("Authorization", "beer "+authKey).
  50. SetQueryParams(map[string]string{
  51. "now_time": time.Now().Format("2006-01-02"),
  52. }).
  53. SetHeader("Accept", "application/json").
  54. SetResult(&codeReplyData).
  55. Get(postUrl)
  56. if err != nil {
  57. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  58. return err
  59. }
  60. return nil
  61. }
  62. func (s *SubtitleBestApi) GetCode() (string, error) {
  63. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  64. return "", errors.New("auth key is not set")
  65. }
  66. postUrl := webUrlBase + "/v1/subhd-code"
  67. httpClient, err := pkg.NewHttpClient(s.proxySettings)
  68. if err != nil {
  69. return "", err
  70. }
  71. authKey, err := s.randomAuthKey.GetAuthKey()
  72. if err != nil {
  73. return "", err
  74. }
  75. var codeReplyData CodeReplyData
  76. resp, err := httpClient.R().
  77. SetHeader("Authorization", "beer "+authKey).
  78. SetQueryParams(map[string]string{
  79. "now_time": time.Now().Format("2006-01-02"),
  80. }).
  81. SetHeader("Accept", "application/json").
  82. SetResult(&codeReplyData).
  83. Get(postUrl)
  84. if err != nil {
  85. s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
  86. return "", err
  87. }
  88. if codeReplyData.Status == 0 {
  89. s.log.Warningln("status code:", resp.StatusCode())
  90. }
  91. if codeReplyData.Status == 0 {
  92. return "", errors.New(codeReplyData.Message)
  93. }
  94. decodeBytes, err := base64.StdEncoding.DecodeString(codeReplyData.Code)
  95. if err != nil {
  96. return "", err
  97. }
  98. return string(decodeBytes), nil
  99. }
  100. func (s *SubtitleBestApi) GetMediaInfo(id, source, videoType string) (*MediaInfoReply, error) {
  101. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  102. return nil, errors.New("auth key is not set")
  103. }
  104. if len(s.authKey.AESKey16) != 16 {
  105. return nil, errors.New(fmt.Sprintf("AESKey16 is not set, %s", s.authKey.AESKey16))
  106. }
  107. if len(s.authKey.AESIv16) != 16 {
  108. return nil, errors.New(fmt.Sprintf("AESIv16 is not set, %s", s.authKey.AESIv16))
  109. }
  110. postUrl := webUrlBase + "/v1/media-info"
  111. httpClient, err := pkg.NewHttpClient(s.proxySettings)
  112. if err != nil {
  113. return nil, err
  114. }
  115. authKey, err := s.randomAuthKey.GetAuthKey()
  116. if err != nil {
  117. return nil, err
  118. }
  119. var mediaInfoReply MediaInfoReply
  120. resp, err := httpClient.R().
  121. SetHeader("Authorization", "beer "+authKey).
  122. SetBody(MediaInfoReq{
  123. Id: id,
  124. Source: source,
  125. VideoType: videoType,
  126. }).
  127. SetResult(&mediaInfoReply).
  128. Post(postUrl)
  129. if err != nil {
  130. s.log.Errorln("get media info error, status code:", resp.StatusCode(), "Error:", err)
  131. return nil, err
  132. }
  133. if mediaInfoReply.Status == 0 {
  134. s.log.Warningln("status code:", resp.StatusCode())
  135. }
  136. return &mediaInfoReply, nil
  137. }
  138. // AskFroUpload 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID
  139. func (s *SubtitleBestApi) AskFroUpload(subSha256 string, IsMovie, trusted bool, ImdbId, TmdbId string, Season, Episode int, VideoFeature string) (*AskForUploadReply, error) {
  140. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  141. return nil, errors.New("auth key is not set")
  142. }
  143. postUrl := webUrlBase + "/v1/ask-for-upload"
  144. httpClient, err := pkg.NewHttpClient(s.proxySettings)
  145. if err != nil {
  146. return nil, err
  147. }
  148. authKey, err := s.randomAuthKey.GetAuthKey()
  149. if err != nil {
  150. return nil, err
  151. }
  152. isMovieStr := "false"
  153. if IsMovie == true {
  154. isMovieStr = "true"
  155. }
  156. trustedStr := "false"
  157. if trusted == true {
  158. trustedStr = "true"
  159. }
  160. formData := make(map[string]string)
  161. if trusted == true {
  162. formData["sub_sha256"] = subSha256
  163. formData["is_movie"] = isMovieStr
  164. formData["trusted"] = trustedStr
  165. formData["imdb_id"] = ImdbId
  166. formData["tmdb_id"] = TmdbId
  167. formData["season"] = strconv.Itoa(Season)
  168. formData["episode"] = strconv.Itoa(Episode)
  169. formData["video_feature"] = VideoFeature
  170. } else {
  171. formData["sub_sha256"] = subSha256
  172. formData["is_movie"] = isMovieStr
  173. }
  174. var askForUploadReply AskForUploadReply
  175. resp, err := httpClient.R().
  176. SetHeader("Authorization", "beer "+authKey).
  177. SetFormData(formData).
  178. SetResult(&askForUploadReply).
  179. Post(postUrl)
  180. if err != nil {
  181. s.log.Errorln("ask for upload error, status code:", resp.StatusCode(), "Error:", err)
  182. return nil, err
  183. }
  184. if askForUploadReply.Status == 0 {
  185. s.log.Warningln("status code:", resp.StatusCode())
  186. }
  187. return &askForUploadReply, nil
  188. }
  189. // UploadSub 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID,其实在这一步应该默认就拿到了 TMDB ID,需要提前在 AskFroUpload 接口调用前就搞定这个
  190. // year 这个也是从之前的接口拿到, 2019 or 2022
  191. func (s *SubtitleBestApi) UploadSub(videoSubInfo *models.VideoSubInfo, subSaveRootDirPath string, tmdbId, year string) (*UploadSubReply, error) {
  192. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  193. return nil, errors.New("auth key is not set")
  194. }
  195. postUrl := webUrlBase + "/v1/upload-sub"
  196. httpClient, err := pkg.NewHttpClient(s.proxySettings)
  197. if err != nil {
  198. return nil, err
  199. }
  200. authKey, err := s.randomAuthKey.GetAuthKey()
  201. if err != nil {
  202. return nil, err
  203. }
  204. // 从相对路径转换为绝对路径
  205. subFileFPath := filepath.Join(subSaveRootDirPath, videoSubInfo.StoreRPath)
  206. if pkg.IsFile(subFileFPath) == false {
  207. return nil, errors.New(fmt.Sprintf("sub file not exist, %s", subFileFPath))
  208. }
  209. file, err := os.Open(subFileFPath)
  210. if err != nil {
  211. return nil, errors.New(fmt.Sprintf("open sub file failed, %s", subFileFPath))
  212. }
  213. defer func() {
  214. _ = file.Close()
  215. }()
  216. fd, err := ioutil.ReadAll(file)
  217. if err != nil {
  218. return nil, errors.New(fmt.Sprintf("read sub file failed, %s", subFileFPath))
  219. }
  220. isDouble := "false"
  221. if videoSubInfo.IsDouble == true {
  222. isDouble = "true"
  223. }
  224. isMovieStr := "false"
  225. if videoSubInfo.IsMovie == true {
  226. isMovieStr = "true"
  227. }
  228. var uploadSubReply UploadSubReply
  229. resp, err := httpClient.R().
  230. SetHeader("Authorization", "beer "+authKey).
  231. SetFileReader("sub_file_context", videoSubInfo.SubName, bytes.NewReader(fd)).
  232. SetFormData(map[string]string{
  233. "sub_sha256": videoSubInfo.SHA256,
  234. "is_movie": isMovieStr,
  235. "season": strconv.Itoa(videoSubInfo.Season),
  236. "episode": strconv.Itoa(videoSubInfo.Episode),
  237. "is_double": isDouble,
  238. "language_iso": videoSubInfo.LanguageISO,
  239. "my_language": videoSubInfo.MyLanguage,
  240. "extra_pre_name": videoSubInfo.ExtraPreName,
  241. "imdb_id": videoSubInfo.IMDBInfoID,
  242. "tmdb_id": tmdbId,
  243. "video_feature": videoSubInfo.Feature,
  244. "year": year,
  245. }).
  246. SetResult(&uploadSubReply).
  247. Post(postUrl)
  248. if err != nil {
  249. s.log.Errorln("upload sub error, status code:", resp.StatusCode(), "Error:", err)
  250. if resp != nil && resp.StatusCode() == 413 {
  251. // 文件上传大小超限
  252. return nil, common.ErrorUpload413
  253. }
  254. return nil, err
  255. }
  256. if uploadSubReply.Status == 0 {
  257. s.log.Warningln("status code:", resp.StatusCode())
  258. }
  259. if resp.StatusCode() == 413 {
  260. // 文件上传大小超限
  261. return nil, common.ErrorUpload413
  262. }
  263. return &uploadSubReply, nil
  264. }
  265. func (s *SubtitleBestApi) UploadLowTrustSub(lowTrustVideoSubInfo *models.LowVideoSubInfo, subSaveRootDirPath string, tmdbId, year, taskID string) (*UploadSubReply, error) {
  266. if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
  267. return nil, errors.New("auth key is not set")
  268. }
  269. postUrl := webUrlBase + "/v1/upload-sub"
  270. httpClient, err := pkg.NewHttpClient(s.proxySettings)
  271. if err != nil {
  272. return nil, err
  273. }
  274. authKey, err := s.randomAuthKey.GetAuthKey()
  275. if err != nil {
  276. return nil, err
  277. }
  278. // 从相对路径转换为绝对路径
  279. subFileFPath := filepath.Join(subSaveRootDirPath, lowTrustVideoSubInfo.StoreRPath)
  280. if pkg.IsFile(subFileFPath) == false {
  281. return nil, errors.New(fmt.Sprintf("sub file not exist, %s", subFileFPath))
  282. }
  283. file, err := os.Open(subFileFPath)
  284. if err != nil {
  285. return nil, errors.New(fmt.Sprintf("open sub file failed, %s", subFileFPath))
  286. }
  287. defer func() {
  288. _ = file.Close()
  289. }()
  290. fd, err := ioutil.ReadAll(file)
  291. if err != nil {
  292. return nil, errors.New(fmt.Sprintf("read sub file failed, %s", subFileFPath))
  293. }
  294. isDouble := "false"
  295. if lowTrustVideoSubInfo.IsDouble == true {
  296. isDouble = "true"
  297. }
  298. isMovieStr := "false"
  299. if lowTrustVideoSubInfo.IsMovie == true {
  300. isMovieStr = "true"
  301. }
  302. var uploadSubReply UploadSubReply
  303. resp, err := httpClient.R().
  304. SetHeader("Authorization", "beer "+authKey).
  305. SetFileReader("sub_file_context", lowTrustVideoSubInfo.SubName, bytes.NewReader(fd)).
  306. SetFormData(map[string]string{
  307. "sub_sha256": lowTrustVideoSubInfo.SHA256,
  308. "is_movie": isMovieStr,
  309. "season": strconv.Itoa(lowTrustVideoSubInfo.Season),
  310. "episode": strconv.Itoa(lowTrustVideoSubInfo.Episode),
  311. "is_double": isDouble,
  312. "language_iso": lowTrustVideoSubInfo.LanguageISO,
  313. "my_language": lowTrustVideoSubInfo.MyLanguage,
  314. "extra_pre_name": lowTrustVideoSubInfo.ExtraPreName,
  315. "imdb_id": lowTrustVideoSubInfo.IMDBID,
  316. "tmdb_id": tmdbId,
  317. "video_feature": lowTrustVideoSubInfo.Feature,
  318. "year": year,
  319. "low_trust": "true",
  320. "task_id": taskID,
  321. }).
  322. SetResult(&uploadSubReply).
  323. Post(postUrl)
  324. if err != nil {
  325. if resp != nil && resp.StatusCode() == 413 {
  326. // 文件上传大小超限
  327. s.log.Errorln("upload sub error, status code:", resp.StatusCode(), "Error:", err)
  328. return nil, common.ErrorUpload413
  329. }
  330. s.log.Errorln("upload sub Error:", err)
  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 := pkg.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 := pkg.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 := pkg.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 := pkg.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 pkg.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 := pkg.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 := pkg.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 := pkg.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 := pkg.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. )