Преглед изворни кода

调整 rod 使用自定义缓存的流程

Signed-off-by: allan716 <[email protected]>
allan716 пре 3 година
родитељ
комит
092fce111f

+ 9 - 0
internal/logic/pre_download_process/pre_download_proces.go

@@ -113,6 +113,15 @@ func (p *PreDownloadProcess) Init() *PreDownloadProcess {
 		// 如果找到 code 了,那么就可以继续用这个实例
 		p.SubSupplierHub.AddSubSupplier(subhd.NewSupplier(*settings.GetSettings()))
 	}
+	// ------------------------------------------------------------------------
+	// 清理自定义的 rod 缓存目录
+	err = my_util.ClearRodTmpRootFolder()
+	if err != nil {
+		p.gError = errors.New("ClearRodTmpRootFolder " + err.Error())
+		return p
+	}
+
+	log_helper.GetLogger().Infoln("ClearRodTmpRootFolder Done")
 
 	return p
 }

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

@@ -486,7 +486,7 @@ func (s Supplier) downloadSubFile(browser *rod.Browser, page *rod.Page) (bool, *
 	fileName := ""
 	fileByte := []byte{0}
 	err = rod.Try(func() {
-		tmpDir := filepath.Join(global_value.DefRodTmpFolder, "downloads")
+		tmpDir := filepath.Join(global_value.DefRodTmpRootFolder, "downloads")
 		wait := browser.WaitDownload(tmpDir)
 		getDownloadFile := func() ([]byte, string, error) {
 			info := wait()

+ 1 - 1
internal/pkg/global_value/global_value.go

@@ -13,7 +13,7 @@ var (
 	ConfigRootDirFPath   = ""
 	DefDebugFolder       = ""
 	DefTmpFolder         = ""
-	DefRodTmpFolder      = ""
+	DefRodTmpRootFolder  = ""
 	DefSubFixCacheFolder = ""
 	WantedExtMap         = make(map[string]string) // 人工确认的需要监控的视频后缀名
 	DefExtMap            = make(map[string]string) // 内置支持的视频后缀名列表

+ 7 - 7
internal/pkg/my_util/folder.go

@@ -33,9 +33,9 @@ func Init() error {
 		log_helper.GetLogger().Panicln("GetRootTmpFolder", err)
 	}
 
-	global_value.DefRodTmpFolder, err = GetRodTmpFolder()
+	global_value.DefRodTmpRootFolder, err = GetRodTmpRootFolder()
 	if err != nil {
-		log_helper.GetLogger().Panicln("GetRodTmpFolder", err)
+		log_helper.GetLogger().Panicln("GetRodTmpRootFolder", err)
 	}
 
 	global_value.DefSubFixCacheFolder, err = GetRootSubFixCacheFolder()
@@ -184,8 +184,8 @@ func ClearRootTmpFolder() error {
 // Rod Cache
 // --------------------------------------------------------------
 
-// GetRodTmpFolder 在程序的根目录新建,rod 缓存用文件夹
-func GetRodTmpFolder() (string, error) {
+// GetRodTmpRootFolder 在程序的根目录新建,rod 缓存用文件夹
+func GetRodTmpRootFolder() (string, error) {
 
 	nowProcessRoot, err := os.Getwd()
 	if err != nil {
@@ -199,10 +199,10 @@ func GetRodTmpFolder() (string, error) {
 	return nowProcessRoot, err
 }
 
-// ClearRodTmpFolder 清理 rod 缓存文件夹
-func ClearRodTmpFolder() error {
+// ClearRodTmpRootFolder 清理 rod 缓存文件夹
+func ClearRodTmpRootFolder() error {
 
-	nowTmpFolder, err := GetRodTmpFolder()
+	nowTmpFolder, err := GetRodTmpRootFolder()
 	if err != nil {
 		return err
 	}

+ 29 - 2
internal/pkg/my_util/random.go

@@ -2,14 +2,41 @@ package my_util
 
 import (
 	"math/rand"
+	"strings"
 	"time"
 )
 
 func RandomSecondDuration(min, max int32) time.Duration {
-	tmp := random.Int31n(max-min) + min
+	tmp := src.Int31n(max-min) + min
 	return time.Duration(tmp) * time.Second
 }
 
+func RandStringBytesMaskImprSrcSB(n int) string {
+	sb := strings.Builder{}
+	sb.Grow(n)
+	// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
+	for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
+		if remain == 0 {
+			cache, remain = src.Int63(), letterIdxMax
+		}
+		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
+			sb.WriteByte(letterBytes[idx])
+			i--
+		}
+		cache >>= letterIdxBits
+		remain--
+	}
+
+	return sb.String()
+}
+
 var (
-	random = rand.New(rand.NewSource(time.Now().UnixNano()))
+	src = rand.New(rand.NewSource(time.Now().UnixNano()))
+)
+
+const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+const (
+	letterIdxBits = 6                    // 6 bits to represent a letter index
+	letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
+	letterIdxMax  = 63 / letterIdxBits   // # of letter indices fitting in 63 bits
 )

+ 8 - 5
internal/pkg/rod_helper/rodHelper.go

@@ -35,6 +35,9 @@ func NewBrowser(httpProxyURL string, loadAdblock bool) (*rod.Browser, error) {
 			log_helper.GetLogger().Panicln("releaseAdblock", err)
 		}
 	})
+
+	// 随机的 rod 子文件夹名称
+	nowUserData := filepath.Join(global_value.DefRodTmpRootFolder, my_util.RandStringBytesMaskImprSrcSB(20))
 	var browser *rod.Browser
 	err = rod.Try(func() {
 		purl := ""
@@ -44,14 +47,14 @@ func NewBrowser(httpProxyURL string, loadAdblock bool) (*rod.Browser, error) {
 				Set("load-extension", adblockSavePath).
 				Proxy(httpProxyURL).
 				Headless(false). // 插件模式需要设置这个
-				UserDataDir(global_value.DefRodTmpFolder).
+				UserDataDir(nowUserData).
 				//XVFB("--server-num=5", "--server-args=-screen 0 1600x900x16").
 				//XVFB("-ac :99", "-screen 0 1280x1024x16").
 				MustLaunch()
 		} else {
 			purl = launcher.New().
 				Proxy(httpProxyURL).
-				UserDataDir(global_value.DefRodTmpFolder).
+				UserDataDir(nowUserData).
 				MustLaunch()
 		}
 
@@ -161,13 +164,13 @@ func Clear() {
 		defer browser.MustClose()
 	})
 
-	err := my_util.ClearRodTmpFolder()
+	err := my_util.ClearRodTmpRootFolder()
 	if err != nil {
-		log_helper.GetLogger().Errorln("ClearRodTmpFolder", err)
+		log_helper.GetLogger().Errorln("ClearRodTmpRootFolder", err)
 		return
 	}
 
-	log_helper.GetLogger().Infoln("ClearRodTmpFolder Done")
+	log_helper.GetLogger().Infoln("ClearRodTmpRootFolder Done")
 }
 
 func newPage(browser *rod.Browser) (*rod.Page, error) {