Răsfoiți Sursa

调整字幕扫描任务细节

Signed-off-by: allan716 <[email protected]>
allan716 3 ani în urmă
părinte
comite
04aba6e277

+ 16 - 41
internal/backend/ws_helper/client.go

@@ -46,12 +46,11 @@ var upGrader = websocket.Upgrader{
 }
 
 type Client struct {
-	hub                     *Hub
-	conn                    *websocket.Conn // 与服务器连接实例
-	sendLogLineIndex        int             // 日志发送到那个位置了
-	sendLogFirstTimeSuccess bool            // 第一次日志发送成功了
-	authed                  bool            // 是否已经通过认证
-	send                    chan []byte     // 发送给 client 的内容 bytes
+	hub              *Hub
+	conn             *websocket.Conn // 与服务器连接实例
+	sendLogLineIndex int             // 日志发送到那个位置了
+	authed           bool            // 是否已经通过认证
+	send             chan []byte     // 发送给 client 的内容 bytes
 }
 
 // 接收 Client 发送来的消息
@@ -129,27 +128,6 @@ func (c *Client) readPump() {
 
 		} else {
 			// 进过认证后的消息,无需再次带有 token 信息
-			if revMessage.Type == ws.RunningLog.String() {
-
-				c.sendLogFirstTimeSuccess = false
-				c.sendLogLineIndex = 0
-				// Client 想要获取第一次的日志
-				nowRunningLog := log_helper.GetOnceLog4Running()
-				// 正在运行扫描日志
-				// 找到日志,把当前已有的日志发送出去,然后记录发送到哪里了
-				// 这里需要考虑一次性的信息太多,超过发送的缓冲区,所以需要拆分发送
-				outLogsBytes, err := RunningLogReply(nowRunningLog, c.sendLogLineIndex)
-				if err != nil {
-					log_helper.GetLogger().Errorln("readPump.RunningLogReply", err)
-					return
-				}
-				// 拆分到一条日志来发送
-				for _, logsByte := range outLogsBytes {
-					c.send <- logsByte
-					c.sendLogLineIndex += 1
-				}
-				c.sendLogFirstTimeSuccess = true
-			}
 		}
 	}
 }
@@ -241,11 +219,13 @@ func (c *Client) writePump() {
 				// 没有认证通过,就无需处理次定时器时间
 				continue
 			}
-			if common.IsSubDownloadJobInfoRunning == false {
+			// 如果没有开启总任务,或者停止总任务了,那么这里获取到的应该是 nil,不应该继续往下
+			info := common.GetSubScanJobStatus()
+			if info == nil {
 				continue
 			}
 			// 统一丢到 send 里面得了
-			outLogsBytes, err := SubScanJobStatusReply()
+			outLogsBytes, err := SubScanJobStatusReply(info)
 			if err != nil {
 				log_helper.GetLogger().Errorln("writePump.SubScanJobStatusReply", err)
 				return
@@ -258,10 +238,6 @@ func (c *Client) writePump() {
 				// 没有认证通过,就无需处理次定时器时间
 				continue
 			}
-			if c.sendLogFirstTimeSuccess == false {
-				// 要等待第一次发送结束后,才能够每次发送新的
-				continue
-			}
 			nowRunningLog := log_helper.GetOnceLog4Running()
 			// 找到日志,把当前已有的日志发送出去,然后记录发送到哪里了
 			// 这里需要考虑一次性的信息太多,超过发送的缓冲区,所以需要拆分发送
@@ -333,11 +309,11 @@ func RunningLogReply(log *log_hub.OnceLog, iPreSendLines ...int) ([][]byte, erro
 }
 
 // SubScanJobStatusReply 当前字幕扫描的进度信息
-func SubScanJobStatusReply() ([]byte, error) {
+func SubScanJobStatusReply(info *ws.SubDownloadJobInfo) ([]byte, error) {
 
 	var err error
 	var outData, outBytes []byte
-	outData, err = json.Marshal(common.GetSubScanJobStatus())
+	outData, err = json.Marshal(info)
 	if err != nil {
 		return nil, err
 	}
@@ -360,12 +336,11 @@ func ServeWs(hub *Hub, w http.ResponseWriter, r *http.Request) {
 	}
 
 	client := &Client{
-		hub:                     hub,
-		conn:                    conn,
-		sendLogLineIndex:        0,
-		authed:                  false,
-		sendLogFirstTimeSuccess: false,
-		send:                    make(chan []byte, bufSize),
+		hub:              hub,
+		conn:             conn,
+		sendLogLineIndex: 0,
+		authed:           false,
+		send:             make(chan []byte, bufSize),
 	}
 	client.hub.register <- client
 

+ 13 - 3
internal/logic/cron_helper/cron_helper.go

@@ -57,6 +57,15 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	log_helper.GetLogger().Infoln("CronHelper Start...")
 	log_helper.GetLogger().Infoln("Next Sub Scan Will Process After", settings.GetSettings().CommonSettings.ScanInterval)
 	ch.c.Start()
+
+	// 只有定时任务 start 之后才能拿到信息
+	if len(ch.c.Entries()) > 0 {
+		// 不会马上启动扫描,那么就需要设置当前的时间,且为 waiting
+		tttt := ch.c.Entries()[0].Next.Format("2006-01-02 15:04:05")
+		common.SetSubScanJobStatusWaiting(tttt)
+	} else {
+		log_helper.GetLogger().Errorln("Can't get cron jobs, will not send SubScanJobStatus")
+	}
 }
 
 // Stop 会阻塞等待任务完成
@@ -95,6 +104,8 @@ func (ch *CronHelper) Stop() {
 	ch.cronHelperRunningLock.Lock()
 	ch.cronHelperRunning = false
 	ch.cronHelperRunningLock.Unlock()
+
+	common.SetSubScanJobStatusNil()
 }
 
 func (ch *CronHelper) CronHelperRunning() bool {
@@ -139,8 +150,6 @@ func (ch *CronHelper) coreSubDownloadProcess() {
 		ch.fullSubDownloadProcessing = false
 		ch.fullSubDownloadProcessingLock.Unlock()
 
-		common.IsSubDownloadJobInfoRunning = false
-
 		log_helper.GetLogger().Infoln(log_helper.OnceSubsScanEnd)
 	}()
 
@@ -150,7 +159,8 @@ func (ch *CronHelper) coreSubDownloadProcess() {
 
 	log_helper.GetLogger().Infoln(log_helper.OnceSubsScanStart)
 
-	common.IsSubDownloadJobInfoRunning = true
+	// 扫描字幕任务开始,先是扫描阶段,那么是拿不到有多少视频需要扫描的数量的
+	common.SetSubScanJobStatusPreparing(time.Now().Format("2006-01-02 15:04:05"))
 
 	// 下载前的初始化
 	preDownloadProcess := pre_download_process.NewPreDownloadProcess()

+ 55 - 3
internal/pkg/common/global_value.go

@@ -30,13 +30,65 @@ func GetSubScanJobStatus() *ws.SubDownloadJobInfo {
 	return tmpSubDownloadJobInfoLock
 }
 
+// SetSubScanJobStatusPreparing 设置扫描字幕任务的状态为准备
+func SetSubScanJobStatusPreparing(startedTime string) {
+
+	subDownloadJobInfoLock.Lock()
+	if subDownloadJobInfo == nil {
+		subDownloadJobInfo = &ws.SubDownloadJobInfo{}
+	}
+	subDownloadJobInfo.Status = ws.Preparing
+	subDownloadJobInfo.StartedTime = startedTime
+	subDownloadJobInfoLock.Unlock()
+}
+
+// SetSubScanJobStatusRunning 设置扫描字幕任务的状态为运行
+func SetSubScanJobStatusRunning(WorkingUnitIndex, UnitCount int, WorkingUnitName string,
+	WorkingVideoIndex, VideoCount int, WorkingVideoName string) {
+
+	subDownloadJobInfoLock.Lock()
+	if subDownloadJobInfo == nil {
+		subDownloadJobInfo = &ws.SubDownloadJobInfo{}
+	}
+	subDownloadJobInfo.Status = ws.Running
+	subDownloadJobInfo.WorkingUnitIndex = WorkingUnitIndex
+	subDownloadJobInfo.UnitCount = UnitCount
+	subDownloadJobInfo.WorkingUnitName = WorkingUnitName
+
+	subDownloadJobInfo.WorkingVideoIndex = WorkingVideoIndex
+	subDownloadJobInfo.VideoCount = VideoCount
+	subDownloadJobInfo.WorkingVideoName = WorkingVideoName
+
+	subDownloadJobInfoLock.Unlock()
+}
+
+// SetSubScanJobStatusWaiting 设置扫描字幕任务的状态为等待
+func SetSubScanJobStatusWaiting(startedTime string) {
+
+	subDownloadJobInfoLock.Lock()
+	if subDownloadJobInfo == nil {
+		subDownloadJobInfo = &ws.SubDownloadJobInfo{}
+	}
+	subDownloadJobInfo.Status = ws.Waiting
+	subDownloadJobInfo.StartedTime = startedTime
+	subDownloadJobInfoLock.Unlock()
+}
+
+// SetSubScanJobStatusNil 如果总任务停止了,那么就需要设置为 nil,这样定时器发送的时候就会判断是否为 nil,是就不会继续触发
+// 如果总任务开始了,是否是立即开始都会由实例化操作
+func SetSubScanJobStatusNil() {
+
+	subDownloadJobInfoLock.Lock()
+	subDownloadJobInfo = nil
+	subDownloadJobInfoLock.Unlock()
+}
+
 var (
 	accessToken      = ""
 	mutexAccessToken sync.Mutex
 )
 
 var (
-	IsSubDownloadJobInfoRunning = false
-	subDownloadJobInfo          *ws.SubDownloadJobInfo
-	subDownloadJobInfoLock      sync.Mutex
+	subDownloadJobInfo     *ws.SubDownloadJobInfo
+	subDownloadJobInfoLock sync.Mutex
 )

+ 3 - 2
internal/types/backend/ws/ws_type.go

@@ -72,8 +72,9 @@ func (c CommonMessage) String() string {
 }
 
 const (
-	Running = "running"
-	Waiting = "waiting"
+	Preparing = "preparing"
+	Running   = "running"
+	Waiting   = "waiting"
 )
 
 var CloseThisConnect = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1}