Bladeren bron

完成 upload sub 基础逻辑

Signed-off-by: allan716 <[email protected]>
allan716 3 jaren geleden
bovenliggende
commit
ac5be7f386

+ 62 - 0
internal/logic/cron_helper/cron_helper.go

@@ -1,9 +1,12 @@
 package cron_helper
 
 import (
+	"errors"
 	"fmt"
 	"github.com/allanpk716/ChineseSubFinder/internal/dao"
 	"github.com/allanpk716/ChineseSubFinder/internal/models"
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/mix_media_info"
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_folder"
 	"sync"
 	"time"
 
@@ -255,6 +258,45 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 		ch.log.Debugln("No notUploadedVideoSubInfos")
 		return
 	}
+
+	var imdbInfos []models.IMDBInfo
+	dao.GetDb().Where("imdb_id = ?", notUploadedVideoSubInfos[0].IMDBInfoID).Find(&imdbInfos)
+	if len(imdbInfos) < 1 {
+		// 如果没有找到,那么就没有办法推断出 IMDB ID 的相关信息和 TMDB ID 信息,要来何用,删除即可
+		ch.log.Infoln("No imdbInfos, will delete this VideoSubInfo,", notUploadedVideoSubInfos[0].SubName)
+		dao.GetDb().Delete(&notUploadedVideoSubInfos[0])
+		return
+	}
+	videoType := ""
+	if imdbInfos[0].IsMovie == true {
+		videoType = "movie"
+	} else {
+		videoType = "series"
+	}
+	var err error
+	var finalQueryIMDBInfo *models.MediaInfo
+	if imdbInfos[0].TmdbId == "" {
+
+		// 需要先对这个字幕的 IMDB ID 转 TMDB ID 信息进行查询,得到 TMDB ID 和 Year (2019 2022)
+		finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.log, ch.FileDownloader.SubtitleBestApi, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
+		if err != nil {
+			ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+			return
+		}
+	} else {
+
+		var mediaInfos []models.MediaInfo
+		dao.GetDb().Where("tmdb_id = ?", imdbInfos[0].TmdbId).Find(&mediaInfos)
+		if len(mediaInfos) < 1 {
+			finalQueryIMDBInfo, err = mix_media_info.GetMediaInfoAndSave(ch.log, ch.FileDownloader.SubtitleBestApi, &imdbInfos[0], imdbInfos[0].IMDBID, "imdb", videoType)
+			if err != nil {
+				ch.log.Errorln(errors.New("GetMediaInfoAndSave error:" + err.Error()))
+				return
+			}
+		} else {
+			finalQueryIMDBInfo = &mediaInfos[0]
+		}
+	}
 	// 问询这个字幕是否上传过了,如果没有就需要进入上传的队列
 	askForUploadReply, err := ch.FileDownloader.SubtitleBestApi.AskFroUpload(notUploadedVideoSubInfos[0].SHA256)
 	if err != nil {
@@ -302,6 +344,26 @@ func (ch *CronHelper) uploadPlayedVideoSub() {
 			return
 		}
 		// 发送字幕
+		shareRootDir, err := my_folder.GetShareSubRootFolder()
+		if err != nil {
+			ch.log.Errorln("GetShareSubRootFolder error:", err.Error())
+			return
+		}
+		uploadSubReply, err := ch.FileDownloader.SubtitleBestApi.UploadSub(&notUploadedVideoSubInfos[0], shareRootDir, finalQueryIMDBInfo.TmdbId, "", ch.Settings.AdvancedSettings.ProxySettings)
+		if err != nil {
+			ch.log.Errorln("UploadSub error:", err.Error())
+			return
+		}
+		if uploadSubReply.Status == 1 {
+			// 成功,其他情况就等待 Ask for Upload
+			notUploadedVideoSubInfos[0].IsSend = true
+			dao.GetDb().Save(&notUploadedVideoSubInfos[0])
+			ch.log.Infoln("Subtitle has been uploaded, so will not upload again")
+			return
+		} else {
+			ch.log.Warningln("UploadSub Message:", uploadSubReply.Message)
+			return
+		}
 
 	} else {
 		// 不是预期的返回值,需要报警

+ 1 - 1
internal/models/media_info.go

@@ -7,5 +7,5 @@ type MediaInfo struct {
 	OriginalLanguage string `gorm:"type:varchar(100)"` // 视频的原始语言  en zh
 	TitleEn          string `gorm:"type:varchar(100)"` // 英文标题
 	TitleCn          string `gorm:"type:varchar(100)"` // 中文的标题
-	Year             string `gorm:"type:varchar(20)"`  // 播出的时间,如果是连续剧是第一次播出的时间
+	Year             string `gorm:"type:varchar(20)"`  // 播出的时间,如果是连续剧是第一次播出的时间 2019-01-01  2022-01-01
 }

+ 1 - 1
internal/pkg/mix_media_info/mix_media_info.go

@@ -103,7 +103,7 @@ func getMediaInfoEx(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.Subti
 	return mediaInfo, nil
 }
 
-// GetMediaInfoAndSave 通过 IMDB ID 查询媒体信息,并保存到数据库,IMDB 和 MediaInfo 都会进行保存
+// GetMediaInfoAndSave 通过 IMDB ID 查询媒体信息,并保存到数据库,IMDB 和 MediaInfo 都会进行保存 // source,options=imdb|tmdb  videoType,options=movie|series
 func GetMediaInfoAndSave(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.SubtitleBestApi, imdbInfo *models.IMDBInfo, id, source, videoType string) (*models.MediaInfo, error) {
 
 	mediaInfo, err := getMediaInfoEx(log, SubtitleBestApi, id, source, videoType)

+ 71 - 1
internal/pkg/subtitle_best_api/subtitle_best_api.go

@@ -1,8 +1,14 @@
 package subtitle_best_api
 
 import (
+	"bytes"
 	"errors"
 	"fmt"
+	"github.com/allanpk716/ChineseSubFinder/internal/models"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strconv"
 
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/random_auth_key"
@@ -61,7 +67,8 @@ func (s *SubtitleBestApi) GetMediaInfo(id, source, videoType string, _proxySetti
 	return &mediaInfoReply, nil
 }
 
-func (s SubtitleBestApi) AskFroUpload(subSha256 string, _proxySettings ...*settings.ProxySettings) (*AskForUploadReply, error) {
+// AskFroUpload 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID
+func (s *SubtitleBestApi) AskFroUpload(subSha256 string, _proxySettings ...*settings.ProxySettings) (*AskForUploadReply, error) {
 
 	const postUrl = webUrlBase + "/v1/media-info"
 	httpClient, err := my_util.NewHttpClient(_proxySettings...)
@@ -89,6 +96,69 @@ func (s SubtitleBestApi) AskFroUpload(subSha256 string, _proxySettings ...*setti
 	return &askForUploadReply, nil
 }
 
+// UploadSub 在使用这个接口前,需要从 IMDB ID 获取到 TMDB ID,其实在这一步应该默认就拿到了 TMDB ID,需要提前在 AskFroUpload 接口调用前就搞定这个
+// year 这个也是从之前的接口拿到, 2019  or  2022
+func (s *SubtitleBestApi) UploadSub(videoSubInfo *models.VideoSubInfo, subSaveRootDirPath string, tmdbId, year string, _proxySettings ...*settings.ProxySettings) (*UploadSubReply, error) {
+
+	const postUrl = webUrlBase + "/v1/upload-sub"
+	httpClient, err := my_util.NewHttpClient(_proxySettings...)
+	if err != nil {
+		return nil, err
+	}
+
+	authKey, err := s.randomAuthKey.GetAuthKey()
+	if err != nil {
+		return nil, err
+	}
+
+	// 从相对路径转换为绝对路径
+	subFileFPath := filepath.Join(subSaveRootDirPath, videoSubInfo.StoreRPath)
+	if my_util.IsFile(subFileFPath) == false {
+		return nil, errors.New(fmt.Sprintf("sub file not exist, %s", subFileFPath))
+	}
+	file, err := os.Open(subFileFPath)
+	if err != nil {
+		return nil, errors.New(fmt.Sprintf("open sub file failed, %s", subFileFPath))
+	}
+	defer func() {
+		_ = file.Close()
+	}()
+	fd, err := ioutil.ReadAll(file)
+	if err != nil {
+		return nil, errors.New(fmt.Sprintf("read sub file failed, %s", subFileFPath))
+	}
+
+	isDouble := "false"
+	if videoSubInfo.IsDouble == true {
+		isDouble = "true"
+	}
+
+	var uploadSubReply UploadSubReply
+	_, err = httpClient.R().
+		SetHeader("Authorization", "beer "+authKey).
+		SetFileReader("sub_file_context", videoSubInfo.SubName, bytes.NewReader(fd)).
+		SetFormData(map[string]string{
+			"sub_sha256":     videoSubInfo.SHA256,
+			"season":         strconv.Itoa(videoSubInfo.Season),
+			"episode":        strconv.Itoa(videoSubInfo.Episode),
+			"is_double":      isDouble,
+			"language_iso":   videoSubInfo.LanguageISO,
+			"my_language":    videoSubInfo.MyLanguage,
+			"extra_pre_name": videoSubInfo.ExtraPreName,
+			"imdb_id":        videoSubInfo.IMDBInfoID,
+			"tmdb_id":        tmdbId,
+			"video_feature":  videoSubInfo.Feature,
+			"year":           year,
+		}).
+		SetResult(&uploadSubReply).
+		Post(postUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	return &uploadSubReply, nil
+}
+
 const (
 	webUrlBase = "https://api.subtitle.best"
 )

+ 20 - 0
internal/pkg/subtitle_best_api/upload_sub.go

@@ -0,0 +1,20 @@
+package subtitle_best_api
+
+type UploadSubReq struct {
+	SubSha256    string `json:"sub_sha256"`     // 文件的 SHA256
+	Season       int    `json:"season"`         // 如果对应的是电影则可能是 0,没有
+	Episode      int    `json:"episode"`        // 如果对应的是电影则可能是 0,没有
+	IsDouble     bool   `json:"is_double"`      // 是否是双语,基础是中文
+	LanguageISO  string `json:"language_iso"`   // 字幕的语言,目标语言,就算是双语,中英,也应该是中文。ISO_639-1_codes 标准,见 ISOLanguage.go 文件,这里无法区分简体繁体
+	MyLanguage   string `json:"my_language"`    // 这个是本程序定义的语言类型,见 my_language.go 文件
+	ExtraPreName string `json:"extra_pre_name"` // 字幕额外的命名信息,指 Emby 字幕命名格式(简英,subhd),的 subhd
+	ImdbId       string `json:"imdb_id"`        // IMDB ID
+	TmdbId       string `json:"tmdb_id"`        // TMDB ID,这里是这个剧集的 TMDB ID 不是这一集的哈
+	VideoFeature string `json:"video_feature"`  // VideoFeature ID
+	Year         int    `json:"year"`           // 年份,比如 2019、2022
+}
+
+type UploadSubReply struct {
+	Status  int    `json:"status"` // 0 失败,1 成功,2 超过了上传时间,需要再此申请上传(AskForUploadReply)
+	Message string `json:"message"`
+}