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