Browse Source

新增,手动字幕上传任务和预览任务的结果查询

Signed-off-by: allan716 <[email protected]>
allan716 3 years ago
parent
commit
490f015c85

+ 2 - 0
internal/backend/base_router.go

@@ -115,12 +115,14 @@ func InitRouter(
 
 		GroupV1.POST("/subtitles/refresh_media_server_sub_list", cbV1.RefreshMediaServerSubList)
 		GroupV1.POST("/subtitles/manual_upload_2_local", cbV1.ManualUploadSubtitle2Local)
+		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("/preview/add", cbV1.PreviewAdd)
 		GroupV1.GET("/preview/list", cbV1.PreviewList)
 		GroupV1.POST("/preview/is_in_queue", cbV1.PreviewIsJobInQueue)
+		GroupV1.POST("/preview/job_result", cbV1.PreviewJobResult)
 		GroupV1.POST("/preview/export_info", cbV1.PreviewGetExportInfo)
 		GroupV1.POST("/preview/clean_up", cbV1.PreviewCleanUp)
 	}

+ 22 - 0
internal/backend/controllers/v1/preview.go

@@ -82,6 +82,28 @@ func (cb *ControllerBase) PreviewIsJobInQueue(c *gin.Context) {
 	return
 }
 
+// PreviewJobResult 预览的任务的结果,成功 ok,不存在空,其他是失败
+func (cb *ControllerBase) PreviewJobResult(c *gin.Context) {
+	var err error
+	defer func() {
+		// 统一的异常处理
+		cb.ErrorProcess(c, "PreviewJobResult", err)
+	}()
+
+	job := preview_queue.Job{}
+	err = c.ShouldBindJSON(&job)
+	if err != nil {
+		return
+	}
+
+	result := cb.cronHelper.Downloader.PreviewQueue.JobResult(&preview_queue.Job{
+		VideoFPath: job.VideoFPath,
+	})
+
+	c.JSON(http.StatusOK, backend2.ReplyCommon{Message: result})
+	return
+}
+
 // PreviewGetExportInfo 预览的任务的导出信息
 func (cb *ControllerBase) PreviewGetExportInfo(c *gin.Context) {
 	var err error

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

@@ -109,3 +109,25 @@ func (cb *ControllerBase) IsManualUploadSubtitle2LocalJobInQueue(c *gin.Context)
 	c.JSON(http.StatusOK, backend2.ReplyCommon{Message: strconv.FormatBool(found)})
 	return
 }
+
+// ManualUploadSubtitleResult 人工上传字幕到本地的任务的结果,成功 ok,不存在空,其他是失败
+func (cb *ControllerBase) ManualUploadSubtitleResult(c *gin.Context) {
+	var err error
+	defer func() {
+		// 统一的异常处理
+		cb.ErrorProcess(c, "ManualUploadSubtitleResult", err)
+	}()
+
+	job := manual_upload_sub_2_local.Job{}
+	err = c.ShouldBindJSON(&job)
+	if err != nil {
+		return
+	}
+
+	result := cb.cronHelper.Downloader.ManualUploadSub2Local.JobResult(&manual_upload_sub_2_local.Job{
+		VideoFPath: job.VideoFPath,
+	})
+
+	c.JSON(http.StatusOK, backend2.ReplyCommon{Message: result})
+	return
+}

+ 21 - 1
pkg/manual_upload_sub_2_local/processor.go

@@ -33,6 +33,7 @@ type ManualUploadSub2Local struct {
 	subNameFormatter subCommon.FormatterName        // 从 inSubFormatter 推断出来
 	processQueue     *llq.Queue
 	jobSet           *hashset.Set
+	jobResultMap     sync.Map
 	addOneSignal     chan interface{}
 	addLocker        sync.Mutex
 	subParserHub     *sub_parser_hub.SubParserHub
@@ -47,6 +48,7 @@ func NewManualUploadSub2Local(log *logrus.Logger, saveSubHelper *save_sub_helper
 		scanLogic:     scanLogic,
 		processQueue:  llq.New(),
 		jobSet:        hashset.New(),
+		jobResultMap:  sync.Map{},
 		addOneSignal:  make(chan interface{}, 1),
 		subParserHub:  sub_parser_hub.NewSubParserHub(log, ass.NewParser(log), srt.NewParser(log)),
 		workingJob:    nil,
@@ -114,6 +116,17 @@ func (m *ManualUploadSub2Local) Add(job *Job) {
 	return
 }
 
+// JobResult 任务结果,如果成功 ok,如果没有就是空,其他就是错误信息
+func (m *ManualUploadSub2Local) JobResult(job *Job) string {
+
+	value, found := m.jobResultMap.LoadAndDelete(job.VideoFPath)
+	if found == false {
+		return ""
+	}
+
+	return value.(string)
+}
+
 // ListJob 任务列表
 func (m *ManualUploadSub2Local) ListJob() []*Job {
 
@@ -159,16 +172,23 @@ func (m *ManualUploadSub2Local) dealers() {
 
 func (m *ManualUploadSub2Local) processSub(job *Job) error {
 
+	var err error
 	defer func() {
 		// 任务处理完了
 		m.addLocker.Lock()
 		m.workingJob = nil
 		m.addLocker.Unlock()
+
+		if err != nil {
+			m.jobResultMap.Store(job.VideoFPath, err.Error())
+		} else {
+			m.jobResultMap.Store(job.VideoFPath, "ok")
+		}
 	}()
 
 	// 不管是不是保存多个字幕,都要先扫描本地的字幕,进行 .Default .Forced 去除
 	// 这个视频的所有字幕,去除 .default .Forced 标记
-	err := sub_helper.SearchVideoMatchSubFileAndRemoveExtMark(m.log, job.VideoFPath)
+	err = sub_helper.SearchVideoMatchSubFileAndRemoveExtMark(m.log, job.VideoFPath)
 	if err != nil {
 		// 找个错误可以忍
 		m.log.Errorln("SearchVideoMatchSubFileAndRemoveExtMark,", job.VideoFPath, err)

+ 20 - 0
pkg/preview_queue/queue.go

@@ -22,6 +22,7 @@ type PreviewQueue struct {
 	ffmpegHelper *ffmpeg_helper.FFMPEGHelper
 	processQueue *llq.Queue
 	jobSet       *hashset.Set
+	jobResultMap sync.Map
 	addOneSignal chan interface{}
 	addLocker    sync.Mutex
 	workingJob   *Job // 正在操作的任务的路径
@@ -34,6 +35,7 @@ func NewPreviewQueue(log *logrus.Logger) *PreviewQueue {
 		ffmpegHelper: ffmpeg_helper.NewFFMPEGHelper(log),
 		processQueue: llq.New(),
 		jobSet:       hashset.New(),
+		jobResultMap: sync.Map{},
 		addOneSignal: make(chan interface{}, 1),
 		workingJob:   nil,
 	}
@@ -159,6 +161,17 @@ func (p *PreviewQueue) ListJob() []*Job {
 	return ret
 }
 
+// JobResult 任务结果,如果成功 ok,如果没有就是空,其他就是错误信息
+func (p *PreviewQueue) JobResult(job *Job) string {
+
+	value, found := p.jobResultMap.LoadAndDelete(job.VideoFPath)
+	if found == false {
+		return ""
+	}
+
+	return value.(string)
+}
+
 func (p *PreviewQueue) dealers() {
 
 	p.addLocker.Lock()
@@ -187,11 +200,18 @@ func (p *PreviewQueue) dealers() {
 
 func (p *PreviewQueue) processSub(job *Job) error {
 
+	var err error
 	defer func() {
 		// 任务处理完了
 		p.addLocker.Lock()
 		p.workingJob = nil
 		p.addLocker.Unlock()
+
+		if err != nil {
+			p.jobResultMap.Store(job.VideoFPath, err.Error())
+		} else {
+			p.jobResultMap.Store(job.VideoFPath, "ok")
+		}
 	}()
 
 	const segmentTime = "5.000"