Bläddra i källkod

新增用户分享后端接口

Signed-off-by: allan716 <[email protected]>
allan716 2 år sedan
förälder
incheckning
d2e895f61f
6 ändrade filer med 110 tillägg och 0 borttagningar
  1. 1 0
      go.mod
  2. 4 0
      go.sum
  3. 1 0
      internal/backend/base_router.go
  4. 82 0
      internal/backend/controllers/v1/subtitles.go
  5. 5 0
      pkg/types/subparser/fileinfo.go
  6. 17 0
      pkg/util.go

+ 1 - 0
go.mod

@@ -77,6 +77,7 @@ require (
 )
 
 require (
+	github.com/ChineseSubFinder/csf-supplier-base v0.0.41 // indirect
 	github.com/EDDYCJY/fake-useragent v0.2.0 // indirect
 	github.com/Microsoft/go-winio v0.4.16 // indirect
 	github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect

+ 4 - 0
go.sum

@@ -186,6 +186,10 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/ChineseSubFinder/csf-supplier-base v0.0.40 h1:yfhTljD7cP931UPZGAzXyae6zdeoG2TGwz7BZepPhkw=
+github.com/ChineseSubFinder/csf-supplier-base v0.0.40/go.mod h1:ZbyZMPofRIT4wGGEkjovSOz+6bqscwxfFPTUDV4ZFaI=
+github.com/ChineseSubFinder/csf-supplier-base v0.0.41 h1:XAXkc6aLVcSMV9axhsospkYmjyfda5ZzCkMJ1jQkzQs=
+github.com/ChineseSubFinder/csf-supplier-base v0.0.41/go.mod h1:ZbyZMPofRIT4wGGEkjovSOz+6bqscwxfFPTUDV4ZFaI=
 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 github.com/EDDYCJY/fake-useragent v0.2.0 h1:Jcnkk2bgXmDpX0z+ELlUErTkoLb/mxFBNd2YdcpvJBs=
 github.com/EDDYCJY/fake-useragent v0.2.0/go.mod h1:5wn3zzlDxhKW6NYknushqinPcAqZcAPHy8lLczCdJdc=

+ 1 - 0
internal/backend/base_router.go

@@ -132,6 +132,7 @@ func InitRouter(
 		GroupV1.POST("/subtitles/manual_upload_result", cbV1.ManualUploadSubtitleResult)
 		GroupV1.GET("/subtitles/list_manual_upload_2_local_job", cbV1.ListManualUploadSubtitle2LocalJob)
 		GroupV1.POST("/subtitles/is_manual_upload_2_local_in_queue", cbV1.IsManualUploadSubtitle2LocalJobInQueue)
+		GroupV1.POST("/subtitles/get_generate_upload_url_info", cbV1.GetGenerateUploadURLHandle)
 
 		GroupV1.POST("/preview/clean_up", cbV1.PreviewCleanUp)
 		GroupV1.GET("/preview/playlist/:videofpathbase64", cbV1.HlsPlaylist)

+ 82 - 0
internal/backend/controllers/v1/subtitles.go

@@ -2,6 +2,8 @@ package v1
 
 import (
 	"fmt"
+	"github.com/ChineseSubFinder/ChineseSubFinder/pkg/decode"
+	"github.com/ChineseSubFinder/csf-supplier-base/pkg/api_hub"
 	"net/http"
 	"path/filepath"
 	"strconv"
@@ -131,3 +133,83 @@ func (cb *ControllerBase) ManualUploadSubtitleResult(c *gin.Context) {
 	c.JSON(http.StatusOK, backend2.ReplyCommon{Message: result})
 	return
 }
+
+// GetGenerateUploadURLHandle 获取申请临时上传字幕地址信息结构
+func (cb *ControllerBase) GetGenerateUploadURLHandle(c *gin.Context) {
+	var err error
+	defer func() {
+		// 统一的异常处理
+		cb.ErrorProcess(c, "GetGenerateUploadURLHandle", err)
+	}()
+
+	job := api_hub.GetGenerateUploadURLReq{}
+	err = c.ShouldBindJSON(&job)
+	if err != nil {
+		return
+	}
+
+	if pkg.IsFile(job.VideoFPath) == false {
+		err = fmt.Errorf("video file not exist")
+		return
+	}
+
+	if pkg.IsFile(job.SubFPath) == false {
+		err = fmt.Errorf("sub file not exist")
+		return
+	}
+
+	bok, fileInfo, err := cb.cronHelper.FileDownloader.SubParserHub.DetermineFileTypeFromFile(job.SubFPath)
+	if err != nil {
+		return
+	}
+
+	if bok == false {
+		err = fmt.Errorf("sub file type not support")
+		return
+	}
+
+	req := api_hub.GenerateUploadURLReq{}
+	if job.IsMovie == true {
+		// 电影
+		videoNfoInfo, err := decode.GetVideoNfoInfo4Movie(job.VideoFPath)
+		if err != nil {
+			return
+		}
+		if videoNfoInfo.ImdbId == "" {
+			err = fmt.Errorf("imdb id not exist")
+			return
+		}
+		req.ImdbId = videoNfoInfo.ImdbId
+		req.Title = videoNfoInfo.Title
+		req.IsMovie = true
+		req.Season = -1
+		req.Episode = -1
+	} else {
+		// 电视剧
+		videoNfoInfo, err := decode.GetVideoNfoInfoFromEpisode(job.VideoFPath)
+		if err != nil {
+			return
+		}
+		if videoNfoInfo.ImdbId == "" {
+			err = fmt.Errorf("imdb id not exist")
+			return
+		}
+		req.ImdbId = videoNfoInfo.ImdbId
+		req.Title = videoNfoInfo.Title
+		req.IsMovie = false
+		req.Season = job.Season
+		req.Episode = job.Episode
+	}
+
+	sha256File, fileSize, err := pkg.Sha256File(job.SubFPath)
+	if err != nil {
+		return
+	}
+	req.SubSha256 = sha256File
+	req.Language = int(fileInfo.Lang)
+	req.Ext = filepath.Ext(job.SubFPath)
+	req.FileSize = fileSize
+
+	c.JSON(http.StatusOK, req)
+	return
+}

+ 5 - 0
pkg/types/subparser/fileinfo.go

@@ -1,6 +1,7 @@
 package subparser
 
 import (
+	"crypto/sha256"
 	"fmt"
 	"math"
 	"sort"
@@ -193,6 +194,10 @@ func (f FileInfo) GetNumFrames() int {
 	return int(math.Abs((pkg.Time2SecondNumber(f.GetEndTime()) - pkg.Time2SecondNumber(f.GetStartTime())) * 100))
 }
 
+func (f FileInfo) GetFileSha256() string {
+	return fmt.Sprintf("%x", sha256.Sum256(f.Data))
+}
+
 // OneDialogue 一句对话
 type OneDialogue struct {
 	Index     int      // 对白的索引

+ 17 - 0
pkg/util.go

@@ -735,6 +735,23 @@ func GetMaxSizeFile(path string) string {
 	return filepath.Join(path, maxFile.Name())
 }
 
+func Sha256File(fileFPath string) (string, int, error) {
+	fp, err := os.Open(fileFPath)
+	if err != nil {
+		return "", 0, err
+	}
+	defer func() {
+		_ = fp.Close()
+	}()
+
+	partAll, err := io.ReadAll(fp)
+	if err != nil {
+		return "", 0, err
+	}
+
+	return fmt.Sprintf("%x", sha256.Sum256(partAll)), len(partAll), nil
+}
+
 var (
 	_wantedExtMap = make(map[string]string) // 人工确认的需要监控的视频后缀名
 	_defExtMap    = make(map[string]string) // 内置支持的视频后缀名列表