Bläddra i källkod

修复代理保存和测试重复开启的问题

Signed-off-by: allan716 <[email protected]>
allan716 3 år sedan
förälder
incheckning
04a18380aa

+ 1 - 1
cmd/chinesesubfinder/main.go

@@ -101,7 +101,7 @@ func main() {
 		common.SetApiToken("")
 	}
 	// 是否开启开发模式,跳过某些流程
-	//settings.GetSettings().SpeedDevMode = true
+	settings.GetSettings().SpeedDevMode = false
 	if settings.GetSettings().SpeedDevMode == true {
 		loggerBase.Infoln("Speed Dev Mode is On")
 	} else {

+ 2 - 1
internal/backend/backend.go

@@ -51,7 +51,7 @@ func (b *BackEnd) start() {
 	engine := gin.Default()
 	// 默认所有都通过
 	engine.Use(cors.Default())
-	v1Router := InitRouter(b.logger, b.settings, engine, b.cronHelper, b.restartSignal)
+	cbBase, v1Router := InitRouter(b.logger, b.settings, engine, b.cronHelper, b.restartSignal)
 
 	engine.GET("/", func(c *gin.Context) {
 		c.Header("content-type", "text/html;charset=utf-8")
@@ -78,6 +78,7 @@ func (b *BackEnd) start() {
 			b.logger.Errorln("Start Server Error:", err)
 		}
 		defer func() {
+			cbBase.Close()
 			v1Router.Close()
 		}()
 	}()

+ 2 - 2
internal/backend/base_router.go

@@ -21,7 +21,7 @@ func InitRouter(
 	router *gin.Engine,
 	cronHelper *cron_helper.CronHelper,
 	restartSignal chan interface{},
-) *v1.ControllerBase {
+) (*base.ControllerBase, *v1.ControllerBase) {
 
 	cbBase := base.NewControllerBase(log, restartSignal)
 	cbV1 := v1.NewControllerBase(log, cronHelper, restartSignal)
@@ -95,5 +95,5 @@ func InitRouter(
 		GroupAPIV1.DELETE("/del-video-played-info", cbV1.DelVideoPlayedInfoHandler)
 	}
 
-	return cbV1
+	return cbBase, cbV1
 }

+ 11 - 3
internal/backend/controllers/base/controller_base.go

@@ -3,6 +3,8 @@ package base
 import (
 	"net/http"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/lock"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/cache_center"
 	"github.com/allanpk716/ChineseSubFinder/pkg/global_value"
 	"github.com/allanpk716/ChineseSubFinder/pkg/random_auth_key"
@@ -16,8 +18,9 @@ import (
 )
 
 type ControllerBase struct {
-	fileDownloader *file_downloader.FileDownloader
-	restartSignal  chan interface{}
+	fileDownloader   *file_downloader.FileDownloader
+	proxyCheckLocker lock.Lock
+	restartSignal    chan interface{}
 }
 
 func NewControllerBase(loggerBase *logrus.Logger, restartSignal chan interface{}) *ControllerBase {
@@ -29,7 +32,8 @@ func NewControllerBase(loggerBase *logrus.Logger, restartSignal chan interface{}
 				AESKey16: global_value.AESKey16(),
 				AESIv16:  global_value.AESIv16(),
 			}),
-		restartSignal: restartSignal,
+		proxyCheckLocker: lock.NewLock(),
+		restartSignal:    restartSignal,
 	}
 }
 
@@ -39,3 +43,7 @@ func (cb *ControllerBase) ErrorProcess(c *gin.Context, funcName string, err erro
 		c.JSON(http.StatusInternalServerError, backend.ReplyCommon{Message: err.Error()})
 	}
 }
+
+func (cb *ControllerBase) Close() {
+	cb.proxyCheckLocker.Close()
+}

+ 12 - 2
internal/backend/controllers/base/proxy.go

@@ -23,6 +23,11 @@ func (cb *ControllerBase) CheckProxyHandler(c *gin.Context) {
 		cb.ErrorProcess(c, "CheckProxyHandler", err)
 	}()
 
+	if cb.proxyCheckLocker.Lock() == false {
+		c.JSON(http.StatusOK, backend.ReplyCommon{Message: "running"})
+		return
+	}
+
 	checkProxy := backend.ReqCheckProxy{}
 	err = c.ShouldBindJSON(&checkProxy)
 	if err != nil {
@@ -61,15 +66,20 @@ func (cb *ControllerBase) CheckProxyHandler(c *gin.Context) {
 		subSupplierHub.AddSubSupplier(csf.NewSupplier(cb.fileDownloader))
 	}
 
-	outStatus := subSupplierHub.CheckSubSiteStatus()
+	outStatus := subSupplierHub.CheckSubSiteStatus(cb.fileDownloader.Settings.AdvancedSettings.ProxySettings)
 
 	defer func() {
 		// 还原
-		err = cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+		err = checkProxy.ProxySettings.CloseLocalHttpProxyServer()
 		if err != nil {
 			return
 		}
 		cb.fileDownloader.Settings.AdvancedSettings.ProxySettings = bkProxySettings
+		cb.proxyCheckLocker.Unlock()
+		err = cb.fileDownloader.Settings.AdvancedSettings.ProxySettings.CloseLocalHttpProxyServer()
+		if err != nil {
+			return
+		}
 	}()
 
 	c.JSON(http.StatusOK, outStatus)

+ 2 - 1
pkg/downloader/queue_local.go

@@ -2,6 +2,7 @@ package downloader
 
 import (
 	"fmt"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/decode"
 	"github.com/allanpk716/ChineseSubFinder/pkg/global_value"
 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
@@ -232,7 +233,7 @@ func (d *Downloader) queueDownloaderLocal() {
 			}
 			close(done)
 			close(panicChan)
-			// 下载完毕一次,进行一次缓存和 Chrome 的清理
+			// 下载完毕一次,进行一次缓存和 Chrome 的清理
 			err = my_folder.ClearRootTmpFolder()
 			if err != nil {
 				d.log.Error("ClearRootTmpFolder", err)

+ 1 - 1
pkg/ifaces/iSupplier.go

@@ -8,7 +8,7 @@ import (
 )
 
 type ISupplier interface {
-	CheckAlive() (bool, int64)
+	CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64)
 
 	IsAlive() bool
 

+ 16 - 7
pkg/local_http_proxy_server/local_http_proxy_server.go

@@ -3,12 +3,14 @@ package local_http_proxy_server
 import (
 	"encoding/base64"
 	"fmt"
-	"github.com/elazarl/goproxy"
-	"golang.org/x/net/context"
-	"golang.org/x/net/proxy"
 	"net"
 	"net/http"
 	"net/url"
+	"time"
+
+	"github.com/elazarl/goproxy"
+	"golang.org/x/net/context"
+	"golang.org/x/net/proxy"
 )
 
 // LocalHttpProxyServer see https://github.com/go-rod/rod/issues/305
@@ -71,8 +73,11 @@ func (l *LocalHttpProxyServer) Start(settings []string, localHttpProxyServerPort
 		}))
 
 		l.srv = &http.Server{Addr: ":" + l.LocalHttpProxyServerPort, Handler: middleProxy}
-
+		l.isRunning = true
 		go func() {
+
+			println("Try Start Local Proxy Server at :", l.LocalHttpProxyServerPort)
+
 			if err := l.srv.ListenAndServe(); err != http.ErrServerClosed {
 				panic(fmt.Sprintln("ListenAndServe() http proxy:", err))
 			}
@@ -80,7 +85,8 @@ func (l *LocalHttpProxyServer) Start(settings []string, localHttpProxyServerPort
 			println("http proxy closed")
 		}()
 
-		l.isRunning = true
+		time.Sleep(3 * time.Second)
+
 		l.LocalHttpProxyUrl = "http://127.0.0.1:" + l.LocalHttpProxyServerPort
 
 		return l.LocalHttpProxyUrl, nil
@@ -122,8 +128,10 @@ func (l *LocalHttpProxyServer) Start(settings []string, localHttpProxyServerPort
 		}))
 
 		l.srv = &http.Server{Addr: ":" + l.LocalHttpProxyServerPort, Handler: middleProxy}
-
+		l.isRunning = true
 		go func() {
+
+			println("Try Start Local Proxy Server at :", l.LocalHttpProxyServerPort)
 			if err := l.srv.ListenAndServe(); err != http.ErrServerClosed {
 				panic(fmt.Sprintln("ListenAndServe() socks5 proxy:", err))
 			}
@@ -131,7 +139,8 @@ func (l *LocalHttpProxyServer) Start(settings []string, localHttpProxyServerPort
 			println("socks5 proxy closed")
 		}()
 
-		l.isRunning = true
+		time.Sleep(3 * time.Second)
+
 		l.LocalHttpProxyUrl = "http://127.0.0.1:" + l.LocalHttpProxyServerPort
 
 		return l.LocalHttpProxyUrl, nil

+ 2 - 2
pkg/logic/sub_supplier/a4k/a4k.go

@@ -51,7 +51,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// 计算当前时间
 	startT := time.Now()
@@ -382,7 +382,7 @@ func (s *Supplier) listPageItems(keyword string, pageIndex int, isMovie bool) (s
 	return
 }
 
-func (s Supplier) downloadSub(videoFileName, downloadPageUrl string, season, eps int) (subInfo *supplier.SubInfo, err error) {
+func (s *Supplier) downloadSub(videoFileName, downloadPageUrl string, season, eps int) (subInfo *supplier.SubInfo, err error) {
 
 	defer func() {
 		time.Sleep(time.Second * 5)

+ 5 - 4
pkg/logic/sub_supplier/assrt/assrt.go

@@ -4,15 +4,16 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	common2 "github.com/allanpk716/ChineseSubFinder/pkg/types/common"
-	"github.com/allanpk716/ChineseSubFinder/pkg/types/series"
-	"github.com/allanpk716/ChineseSubFinder/pkg/types/supplier"
 	"net/url"
 	"os"
 	"path/filepath"
 	"strconv"
 	"time"
 
+	common2 "github.com/allanpk716/ChineseSubFinder/pkg/types/common"
+	"github.com/allanpk716/ChineseSubFinder/pkg/types/series"
+	"github.com/allanpk716/ChineseSubFinder/pkg/types/supplier"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/file_downloader"
 
 	"github.com/allanpk716/ChineseSubFinder/internal/models"
@@ -53,7 +54,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// 如果没有设置这个 API 接口,那么就任务是不可用的
 	if s.settings.SubtitleSources.AssrtSettings.Token == "" {

+ 4 - 2
pkg/logic/sub_supplier/csf/csf.go

@@ -55,11 +55,11 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// 计算当前时间
 	startT := time.Now()
-	_, err := s.fileDownloader.SubtitleBestApi.GetMediaInfo("tt4236770", "imdb", "series")
+	err := s.fileDownloader.SubtitleBestApi.CheckAlive(proxySettings...)
 	if err != nil {
 		s.log.Errorln(s.GetSupplierName(), "CheckAlive", "Error", err)
 		s.isAlive = false
@@ -339,6 +339,8 @@ func (s *Supplier) findAndDownload(videoFPath string, isMovie bool, Season, Epis
 		if err != nil {
 			return nil, errors.New(fmt.Sprintf("Remove File %s Error: %s", desSubSaveFPath, err.Error()))
 		}
+		s.log.Errorln("CSF.Download.DetermineFileTypeFromFile == false, Remove", desSubSaveFPath)
+		return
 	}
 
 	subFileName := strings.ReplaceAll(filepath.Base(videoFPath), filepath.Ext(videoFPath), "")

+ 1 - 1
pkg/logic/sub_supplier/shooter/shooter.go

@@ -45,7 +45,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 	// 计算当前时间
 	startT := time.Now()
 	_, err := s.getSubInfos(checkFileHash, checkFileName, qLan)

+ 2 - 2
pkg/logic/sub_supplier/subSupplierHub.go

@@ -181,7 +181,7 @@ func (d *SubSupplierHub) DownloadSub4Series(seriesDirPath string, seriesInfo *se
 }
 
 // CheckSubSiteStatus 检测多个字幕提供的网站是否是有效的,是否下载次数超限
-func (d *SubSupplierHub) CheckSubSiteStatus() backend.ReplyCheckStatus {
+func (d *SubSupplierHub) CheckSubSiteStatus(proxySettings ...*settings.ProxySettings) backend.ReplyCheckStatus {
 
 	outStatus := backend.ReplyCheckStatus{
 		SubSiteStatus: make([]backend.SiteStatus, 0),
@@ -190,7 +190,7 @@ func (d *SubSupplierHub) CheckSubSiteStatus() backend.ReplyCheckStatus {
 	// 测试提供字幕的网站是有效的
 	d.log.Infoln("Check Sub Supplier Start...")
 	for _, supplier := range d.Suppliers {
-		bAlive, speed := supplier.CheckAlive()
+		bAlive, speed := supplier.CheckAlive(proxySettings...)
 		if bAlive == false {
 			d.log.Warningln(supplier.GetSupplierName(), "Check Alive = false")
 		} else {

+ 1 - 1
pkg/logic/sub_supplier/subhd/subhd.go

@@ -71,7 +71,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	proxyStatus, proxySpeed, err := url_connectedness_helper.UrlConnectednessTest(s.settings.AdvancedSettings.SuppliersSettings.SubHD.RootUrl,
 		s.settings.AdvancedSettings.ProxySettings.GetLocalHttpProxyUrl())

+ 1 - 1
pkg/logic/sub_supplier/xunlei/xunlei.go

@@ -47,7 +47,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// 计算当前时间
 	startT := time.Now()

+ 1 - 1
pkg/logic/sub_supplier/zimuku/zimuku.go

@@ -68,7 +68,7 @@ func NewSupplier(fileDownloader *file_downloader.FileDownloader) *Supplier {
 	return &sup
 }
 
-func (s *Supplier) CheckAlive() (bool, int64) {
+func (s *Supplier) CheckAlive(proxySettings ...*settings.ProxySettings) (bool, int64) {
 
 	// TODO 是用本地的 Browser 还是远程的,推荐是远程的
 

+ 8 - 2
pkg/settings/proxy_settings.go

@@ -40,10 +40,13 @@ func NewProxySettings(useProxy bool, useWhichProxyProtocol string,
 }
 
 func (p *ProxySettings) CopyOne() *ProxySettings {
-	return NewProxySettings(
+
+	nowSettings := NewProxySettings(
 		p.UseProxy, p.UseWhichProxyProtocol, p.LocalHttpProxyServerPort,
 		p.InputProxyAddress, p.InputProxyPort,
 		p.InputProxyUsername, p.InputProxyPassword)
+	nowSettings.localHttpProxyServer = p.localHttpProxyServer
+	return nowSettings
 }
 
 func (p *ProxySettings) GetLocalHttpProxyUrl() string {
@@ -81,7 +84,10 @@ func (p *ProxySettings) GetLocalHttpProxyUrl() string {
 }
 
 func (p *ProxySettings) CloseLocalHttpProxyServer() error {
-	defer p.locker.Unlock()
+	defer func() {
+		println("CloseLocalHttpProxyServer Done")
+		p.locker.Unlock()
+	}()
 	p.locker.Lock()
 
 	if p.localHttpProxyServer == nil {

+ 37 - 4
pkg/subtitle_best_api/subtitle_best_api.go

@@ -6,13 +6,14 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"github.com/allanpk716/ChineseSubFinder/pkg/global_value"
 	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strconv"
 	"time"
 
+	"github.com/allanpk716/ChineseSubFinder/pkg/global_value"
+
 	"github.com/allanpk716/ChineseSubFinder/pkg/common"
 
 	"github.com/sirupsen/logrus"
@@ -40,6 +41,38 @@ func NewSubtitleBestApi(log *logrus.Logger, inAuthKey random_auth_key.AuthKey, p
 	}
 }
 
+func (s *SubtitleBestApi) CheckAlive(proxySettings ...*settings.ProxySettings) error {
+
+	if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
+		return errors.New("auth key is not set")
+	}
+
+	postUrl := webUrlBase + "/v1/subhd-code"
+	httpClient, err := my_util.NewHttpClient(proxySettings...)
+	if err != nil {
+		return err
+	}
+	authKey, err := s.randomAuthKey.GetAuthKey()
+	if err != nil {
+		return err
+	}
+	var codeReplyData CodeReplyData
+	resp, err := httpClient.R().
+		SetHeader("Authorization", "beer "+authKey).
+		SetQueryParams(map[string]string{
+			"now_time": time.Now().Format("2006-01-02"),
+		}).
+		SetHeader("Accept", "application/json").
+		SetResult(&codeReplyData).
+		Get(postUrl)
+	if err != nil {
+		s.log.Errorln("get code error, status code:", resp.StatusCode(), "Error:", err)
+		return err
+	}
+
+	return nil
+}
+
 func (s *SubtitleBestApi) GetCode() (string, error) {
 
 	if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
@@ -565,7 +598,7 @@ func (s *SubtitleBestApi) DownloadSub(SubSha256, DownloadToken, ApiKey, download
 	return &downloadReply, nil
 }
 
-func (s SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertReply, error) {
+func (s *SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertReply, error) {
 
 	if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
 		return nil, errors.New("auth key is not set")
@@ -610,7 +643,7 @@ func (s SubtitleBestApi) ConvertId(id, source, videoType string) (*IdConvertRepl
 	return &idConvertReply, nil
 }
 
-func (s SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare, EnableApiKey bool) (*FeedReply, error) {
+func (s *SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare, EnableApiKey bool) (*FeedReply, error) {
 
 	if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
 		return nil, errors.New("auth key is not set")
@@ -657,7 +690,7 @@ func (s SubtitleBestApi) FeedBack(id, version, MediaServer string, EnableShare,
 	return &feedReply, nil
 }
 
-func (s SubtitleBestApi) AskDownloadTask(id string) (*AskDownloadTaskReply, error) {
+func (s *SubtitleBestApi) AskDownloadTask(id string) (*AskDownloadTaskReply, error) {
 
 	if s.authKey.BaseKey == random_auth_key.BaseKey || s.authKey.AESKey16 == random_auth_key.AESKey16 || s.authKey.AESIv16 == random_auth_key.AESIv16 {
 		return nil, errors.New("auth key is not set")