|
|
@@ -1,6 +1,9 @@
|
|
|
package cron_helper
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
+ "github.com/allanpk716/ChineseSubFinder/internal/dao"
|
|
|
+ "github.com/allanpk716/ChineseSubFinder/internal/models"
|
|
|
"sync"
|
|
|
"time"
|
|
|
|
|
|
@@ -31,6 +34,7 @@ type CronHelper struct {
|
|
|
entryIDSupplierCheck cron.EntryID
|
|
|
entryIDQueueDownloader cron.EntryID
|
|
|
entryIDScanPlayedVideoSubInfo cron.EntryID
|
|
|
+ entryIDUploadPlayedVideoSub cron.EntryID
|
|
|
}
|
|
|
|
|
|
func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
|
|
|
@@ -110,23 +114,32 @@ func (ch *CronHelper) Start(runImmediately bool) {
|
|
|
// 这个暂时无法被取消执行
|
|
|
ch.entryIDScanVideoProcess, err = ch.c.AddFunc(ch.Settings.CommonSettings.ScanInterval, ch.scanVideoProcessAdd2DownloadQueue)
|
|
|
if err != nil {
|
|
|
- ch.log.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
|
|
|
+ ch.log.Panicln("CronHelper scanVideoProcessAdd2DownloadQueue, scanVideoProcessAdd2DownloadQueue Cron entryID:", ch.entryIDScanVideoProcess, "Error:", err)
|
|
|
}
|
|
|
// 这个可以由 ch.Downloader.Cancel() 取消执行
|
|
|
ch.entryIDSupplierCheck, err = ch.c.AddFunc("@every 1h", ch.Downloader.SupplierCheck)
|
|
|
if err != nil {
|
|
|
- ch.log.Panicln("CronHelper SupplierCheck, Cron entryID:", ch.entryIDSupplierCheck, "Error:", err)
|
|
|
+ ch.log.Panicln("CronHelper SupplierCheck, SupplierCheck Cron entryID:", ch.entryIDSupplierCheck, "Error:", err)
|
|
|
}
|
|
|
// 这个可以由 ch.Downloader.Cancel() 取消执行
|
|
|
ch.entryIDQueueDownloader, err = ch.c.AddFunc("@every 15s", ch.Downloader.QueueDownloader)
|
|
|
if err != nil {
|
|
|
- ch.log.Panicln("CronHelper QueueDownloader, Cron entryID:", ch.entryIDQueueDownloader, "Error:", err)
|
|
|
+ ch.log.Panicln("CronHelper QueueDownloader, QueueDownloader Cron entryID:", ch.entryIDQueueDownloader, "Error:", err)
|
|
|
}
|
|
|
// 这个可以由 ch.scanPlayedVideoSubInfo.Cancel() 取消执行
|
|
|
ch.entryIDScanPlayedVideoSubInfo, err = ch.c.AddFunc("@every 24h", ch.scanPlayedVideoSub)
|
|
|
if err != nil {
|
|
|
- ch.log.Panicln("CronHelper QueueDownloader, Cron entryID:", ch.entryIDScanPlayedVideoSubInfo, "Error:", err)
|
|
|
+ ch.log.Panicln("CronHelper QueueDownloader, scanPlayedVideoSub Cron entryID:", ch.entryIDScanPlayedVideoSubInfo, "Error:", err)
|
|
|
}
|
|
|
+ // 字幕的上传逻辑
|
|
|
+ if ch.Settings.ExperimentalFunction.ShareSubSettings.ShareSubEnabled == true {
|
|
|
+
|
|
|
+ ch.entryIDUploadPlayedVideoSub, err = ch.c.AddFunc("@every 5m", ch.uploadPlayedVideoSub)
|
|
|
+ if err != nil {
|
|
|
+ ch.log.Panicln("CronHelper QueueDownloader, uploadPlayedVideoSub Cron entryID:", ch.entryIDUploadPlayedVideoSub, "Error:", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// ----------------------------------------------
|
|
|
if runImmediately == true {
|
|
|
// 是否在定时器开启前先执行一次视频扫描任务
|
|
|
@@ -231,6 +244,72 @@ func (ch *CronHelper) scanPlayedVideoSub() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// uploadPlayedVideoSub 上传字幕的定时器
|
|
|
+func (ch *CronHelper) uploadPlayedVideoSub() {
|
|
|
+
|
|
|
+ // 找出没有上传过的字幕列表
|
|
|
+ var notUploadedVideoSubInfos []models.VideoSubInfo
|
|
|
+ dao.GetDb().Where("is_send = ?", false).Limit(1).Find(¬UploadedVideoSubInfos)
|
|
|
+
|
|
|
+ if len(notUploadedVideoSubInfos) < 1 {
|
|
|
+ ch.log.Debugln("No notUploadedVideoSubInfos")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 问询这个字幕是否上传过了,如果没有就需要进入上传的队列
|
|
|
+ askForUploadReply, err := ch.FileDownloader.SubtitleBestApi.AskFroUpload(notUploadedVideoSubInfos[0].SHA256)
|
|
|
+ if err != nil {
|
|
|
+ ch.log.Errorln(fmt.Errorf("AskFroUpload err: %v", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if askForUploadReply.Status == 3 {
|
|
|
+ // 上传过了,直接标记本地的 is_send 字段为 true
|
|
|
+ notUploadedVideoSubInfos[0].IsSend = true
|
|
|
+ dao.GetDb().Save(¬UploadedVideoSubInfos[0])
|
|
|
+ ch.log.Infoln("Subtitle has been uploaded, so will not upload again")
|
|
|
+ return
|
|
|
+ } else if askForUploadReply.Status == 4 {
|
|
|
+ // 上传队列满了,等待下次定时器触发
|
|
|
+ ch.log.Infoln("Subtitle upload queue is full, will try ask upload again")
|
|
|
+ return
|
|
|
+ } else if askForUploadReply.Status == 2 {
|
|
|
+ // 这个上传任务已经在队列中了,也许有其他人也需要上传这个字幕,或者本机排队的时候故障了,重启也可能遇到这个故障
|
|
|
+ ch.log.Infoln("Subtitle is int the queue")
|
|
|
+ return
|
|
|
+ } else if askForUploadReply.Status == 1 {
|
|
|
+ // 正确放入了队列,然后需要按规划的时间进行上传操作
|
|
|
+ // 这里可能需要执行耗时操作来等待到安排的时间点进行字幕的上传,不能直接长时间的 Sleep 操作
|
|
|
+ // 每次 Sleep 1s 然后就判断一次定时器是否还允许允许,如果不运行了,那么也就需要退出循环
|
|
|
+
|
|
|
+ // 得到目标时间与当前时间的差值,单位是s
|
|
|
+ waitTime := askForUploadReply.ScheduledUnixTime - time.Now().Unix()
|
|
|
+ if waitTime <= 0 {
|
|
|
+ waitTime = 5
|
|
|
+ }
|
|
|
+ var sleepCounter int64
|
|
|
+ sleepCounter = 0
|
|
|
+ normalStatus := false
|
|
|
+ for ch.cronHelperRunning == true {
|
|
|
+ if sleepCounter > waitTime {
|
|
|
+ normalStatus = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ time.Sleep(1 * time.Second)
|
|
|
+ sleepCounter++
|
|
|
+ }
|
|
|
+ if normalStatus == false || ch.cronHelperRunning == false {
|
|
|
+ // 说明不是正常跳出来的,是结束定时器来执行的
|
|
|
+ ch.log.Infoln("uploadPlayedVideoSub early termination")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 发送字幕
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // 不是预期的返回值,需要报警
|
|
|
+ ch.log.Errorln(fmt.Errorf("AskFroUpload Not the expected return value, Status: %d, Message: %v", askForUploadReply.Status, askForUploadReply.Message))
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func (ch *CronHelper) CronHelperRunning() bool {
|
|
|
|
|
|
defer func() {
|