Ver Fonte

增加并发数设置

Signed-off-by: allan716 <[email protected]>
allan716 há 4 anos atrás
pai
commit
01cbd4602f
13 ficheiros alterados com 173 adições e 73 exclusões
  1. 12 7
      README.md
  2. 2 2
      common/config.go
  3. 1 1
      common/reqParam.go
  4. 1 0
      config.yaml.sample
  5. 88 34
      downloader.go
  6. 1 1
      go.mod
  7. 5 0
      go.sum
  8. 2 2
      main.go
  9. 2 7
      model/sub_helper.go
  10. 51 3
      model/util.go
  11. 2 2
      movie_helper/movieHelper.go
  12. 2 2
      series_helper/seriesHelper.go
  13. 4 12
      sub_supplier/subSupplierHub.go

+ 12 - 7
README.md

@@ -4,7 +4,7 @@
 
 > 开发中,可能有不兼容性的调整(配置文件字段变更)
 >
-> 最新版本 v0.3.x 支持连续剧字幕下载(暂时部支持 subhd)
+> 最新版本 v0.4.x 支持连续剧字幕下载,且支持设置并发数(暂时不支持 subhd)
 
 ## Why?
 
@@ -23,11 +23,11 @@
 
 ### 支持的视频分类
 
-|  类型  | 是否支持 |                             备注                             |
-| :----: | :------: | :----------------------------------------------------------: |
-|  电影  |    ✔     |           已经支持,通过 IMDB、或者文件名进行搜索            |
-| 连续剧 |    ✔     | 正在开发中(v0.3.x 欢迎试用)。连续剧只支持有 *.nfo 文件能够读取到 IMDB ID 才能够进行自动化下载,否则跳过。 |
-|  动画  |    -     |                             待定                             |
+|  类型  | 是否支持 |                  备注                   |
+| :----: | :------: | :-------------------------------------: |
+|  电影  |    ✔     | 已经支持,通过 IMDB、或者文件名进行搜索 |
+| 连续剧 |    ✔     |      正在开发中(v0.3.x 欢迎试用)      |
+|  动画  |    -     |                  待定                   |
 
 
 
@@ -99,6 +99,7 @@ services:
 UseProxy: false
 HttpProxy: http://127.0.0.1:10809
 EveryTime: 12h
+Threads: 4
 DebugMode: false
 SaveMultiSub: false
 MovieFolder: /app/MovieFolder
@@ -113,6 +114,7 @@ SeriesFolder: /app/SeriesFolder
 UseProxy: false
 HttpProxy: http://127.0.0.1:10809
 EveryTime: 6h
+Threads: 4
 DebugMode: false
 SaveMultiSub: false
 MovieFolder: X:\电影
@@ -121,7 +123,8 @@ SeriesFolder: X:\连续剧
 
 * UseProxy,默认false。是否使用代理,需要配合 HttpProxy 设置
 * HttpProxy,默认 http://127.0.0.1:10809。http 代理这里不要留空,不适应就设置 UseProxy 为 false
-* EveryTime,,默认 6h。每隔多久触发一次下载逻辑。怎么用参考,[robfig/cron: a cron library for go (github.com)](https://github.com/robfig/cron)
+* EveryTime,默认 6h。每隔多久触发一次下载逻辑。怎么用参考,[robfig/cron: a cron library for go (github.com)](https://github.com/robfig/cron)
+* Threads,并发数,最高到 20 个。看机器性能和网速来调整即可。
 * DebugMode,默认 false。调试模式,会在每个视频的文件夹下,新建一个  subtmp 文件夹,把所有匹配到的字幕都缓存到这个目录,没啥事可以不开。开的话就可以让你手动选择一堆的字幕啦。
 * SaveMultiSub,默认值 false。true 会在每个视频下面保存每个网站找到的最佳字幕(见下面《如何手动刷新 emby 加载字幕》,会举例)。false ,那么每个视频下面就一个最优字幕。
 * MovieFolder,填写你的电影的目录
@@ -155,6 +158,8 @@ SeriesFolder: X:\连续剧
 
 ## 版本
 
+* v0.4.x 支持设置并发数 -- 2021年6月18日
+* v0.3.x 支持连续剧字幕下载(暂时不支持 subhd) -- 2021年6月17日
 * v0.2.0 docker 版本支持 subhd 的下载了,镜像体积也变大了 -- 2021年6月14日
 * 完成初版,仅仅支持电影的字幕下载 -- 2021年6月13日
 

+ 2 - 2
common/config.go

@@ -3,10 +3,10 @@ package common
 type Config struct {
 	UseProxy bool
 	HttpProxy string
-	EveryTime string
+	EveryTime string		// 一轮扫描字幕下载的间隔时间
 	DebugMode bool
+	Threads   int			// 同时并发的线程数(准确来说在go中不是线程,是 goroutine)
 	SaveMultiSub bool
-	FoundExistSubFileThanSkip bool
 	MovieFolder string
 	SeriesFolder string
 	AnimeFolder string

+ 1 - 1
common/reqParam.go

@@ -5,7 +5,7 @@ type ReqParam struct {
 	UserExtList []string	// 用户确认的视频后缀名支持列表
 	SaveMultiSub bool		// 存储每个网站 Top1 的字幕
 	DebugMode bool			// 调试标志位
-	FoundExistSubFileThanSkip bool	// 如果视频的目录下面有字幕文件了,就跳过
+	Threads   int			// 同时并发的线程数(准确来说在go中不是线程,是 goroutine)
 	HttpProxy string		// HttpClient 相关
 	UserAgent string		// HttpClient 相关
 	Referer   string		// HttpClient 相关

+ 1 - 0
config.yaml.sample

@@ -1,6 +1,7 @@
 UseProxy: false
 HttpProxy: http://127.0.0.1:10809
 EveryTime: 12h
+Threads: 4
 DebugMode: false
 SaveMultiSub: true
 MovieFolder: X:\电影

+ 88 - 34
downloader.go

@@ -11,11 +11,13 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/sub_supplier/xunlei"
 	"github.com/allanpk716/ChineseSubFinder/sub_supplier/zimuku"
 	"github.com/go-rod/rod/lib/utils"
+	"github.com/panjf2000/ants/v2"
 	"github.com/sirupsen/logrus"
 	"os"
 	"path"
 	"path/filepath"
 	"strings"
+	"sync"
 )
 
 type Downloader struct {
@@ -38,7 +40,14 @@ func NewDownloader(_reqParam ...common.ReqParam) *Downloader {
 		if downloader.reqParam.Topic > 0 && downloader.reqParam.Topic != downloader.topic {
 			downloader.topic = downloader.reqParam.Topic
 		}
+		// 并发线程的范围控制
+		if downloader.reqParam.Threads <= 0 {
+			downloader.reqParam.Threads = 2
+		} else if downloader.reqParam.Threads >= 10 {
+			downloader.reqParam.Threads = 10
+		}
 	}
+
 	var sitesSequence = make([]string, 0)
 	// TODO 这里写固定了抉择字幕的顺序
 	sitesSequence = append(sitesSequence, common.SubSiteZiMuKu)
@@ -52,64 +61,85 @@ func NewDownloader(_reqParam ...common.ReqParam) *Downloader {
 
 func (d Downloader) DownloadSub4Movie(dir string) error {
 	defer func() {
-		// 抉择完毕,需要清理缓存目录
-		err := model.ClearTmpFolder()
+		// 所有的电影字幕下载完成,抉择完成,需要清理缓存目录
+		err := model.ClearRootTmpFolder()
 		if err != nil {
 			d.log.Error(err)
 		}
+		// 注意并发 pool 的释放
+		defer ants.Release()
 	}()
 	nowVideoList, err := model.SearchMatchedVideoFile(dir)
 	if err != nil {
 		return err
 	}
-	// 构建每个字幕站点下载者的实例
-	var subSupplierHub *sub_supplier.SubSupplierHub
-	subSupplierHub = sub_supplier.NewSubSupplierHub(shooter.NewSupplier(d.reqParam),
-		subhd.NewSupplier(d.reqParam),
-		xunlei.NewSupplier(d.reqParam),
-		zimuku.NewSupplier(d.reqParam),
-	)
-	// TODO 后续再改为每个视频以上的流程都是一个 channel 来做(目前做不了,得重构缓存字幕的方式,不然会出问题),并且需要控制在一个并发量之下(很可能没必要,毕竟要在弱鸡机器上挂机用的)
-	// 一个视频文件同时多个站点查询,阻塞完毕后,在进行下一个
-	for i, oneVideoFullPath := range nowVideoList {
+
+	// 并发控制
+	movieDlFunc := func(i interface{}) {
+		inData := i.(InputData)
+		// -----------------------------------------------------
+		// 构建每个字幕站点下载者的实例
+		var subSupplierHub = sub_supplier.NewSubSupplierHub(shooter.NewSupplier(d.reqParam),
+			subhd.NewSupplier(d.reqParam),
+			xunlei.NewSupplier(d.reqParam),
+			zimuku.NewSupplier(d.reqParam),
+		)
 		// 字幕都下载缓存好了,需要抉择存哪一个,优先选择中文双语的,然后到中文
-		organizeSubFiles, err := subSupplierHub.DownloadSub4Movie(oneVideoFullPath, i)
+		organizeSubFiles, err := subSupplierHub.DownloadSub4Movie(inData.OneVideoFullPath, inData.Index)
 		if err != nil {
-			d.log.Errorln("subSupplierHub.DownloadSub4Movie", oneVideoFullPath ,err)
-			continue
+			d.log.Errorln("subSupplierHub.DownloadSub4Movie", inData.OneVideoFullPath ,err)
+			return
 		}
-		d.oneVideoSelectBestSub(oneVideoFullPath, organizeSubFiles)
+		d.oneVideoSelectBestSub(inData.OneVideoFullPath, organizeSubFiles)
 		// -----------------------------------------------------
 	}
+	wg := sync.WaitGroup{}
+	p, err := ants.NewPoolWithFunc(d.reqParam.Threads, func(inData interface{}) {
+		movieDlFunc(inData)
+		wg.Done()
+	})
+	if err != nil {
+		return err
+	}
+	// 一个视频文件同时多个站点查询,阻塞完毕后,在进行下一个
+	for i, oneVideoFullPath := range nowVideoList {
+		wg.Add(1)
+		err = p.Invoke(InputData{OneVideoFullPath: oneVideoFullPath, Index: i})
+		if err != nil {
+			d.log.Errorln("movie ants.Invoke",err)
+		}
+	}
 	return nil
 }
 
 func (d Downloader) DownloadSub4Series(dir string) error {
 	defer func() {
-		// 抉择完毕,需要清理缓存目录
-		err := model.ClearTmpFolder()
+		// 所有的连续剧字幕下载完成,抉择完成,需要清理缓存目录
+		err := model.ClearRootTmpFolder()
 		if err != nil {
 			d.log.Error(err)
 		}
+		// 注意并发 pool 的释放
+		defer ants.Release()
 	}()
-	// 构建每个字幕站点下载者的实例
-	var subSupplierHub *sub_supplier.SubSupplierHub
-	subSupplierHub = sub_supplier.NewSubSupplierHub(zimuku.NewSupplier(d.reqParam),
-		shooter.NewSupplier(d.reqParam),
-		//subhd.NewSupplier(d.reqParam),
-		xunlei.NewSupplier(d.reqParam),
-	)
-	// 遍历连续剧总目录下的第一层目录
-	seriesDirList, err := series_helper.GetSeriesList(dir)
-	if err != nil {
-		return err
-	}
-	for i, oneSeriesPath := range seriesDirList {
+
+
+	// 并发控制
+	seriesDlFunc := func(i interface{}) {
+
+		inData := i.(InputData)
+		// 构建每个字幕站点下载者的实例
+		var subSupplierHub *sub_supplier.SubSupplierHub
+		subSupplierHub = sub_supplier.NewSubSupplierHub(zimuku.NewSupplier(d.reqParam),
+			shooter.NewSupplier(d.reqParam),
+			//subhd.NewSupplier(d.reqParam),
+			xunlei.NewSupplier(d.reqParam),
+		)
 		// 这里拿到了这一部连续剧的所有的剧集信息,以及所有下载到的字幕信息
-		seriesInfo, organizeSubFiles, err := subSupplierHub.DownloadSub4Series(oneSeriesPath, i)
+		seriesInfo, organizeSubFiles, err := subSupplierHub.DownloadSub4Series(inData.OneVideoFullPath, inData.Index)
 		if err != nil {
-			d.log.Errorln("subSupplierHub.DownloadSub4Series", oneSeriesPath ,err)
-			return err
+			d.log.Errorln("subSupplierHub.DownloadSub4Series", inData.OneVideoFullPath ,err)
+			return
 		}
 		// 只针对需要下载字幕的视频进行字幕的选择保存
 		for epsKey, episodeInfo := range seriesInfo.NeedDlEpsKeyList {
@@ -125,6 +155,26 @@ func (d Downloader) DownloadSub4Series(dir string) error {
 			d.oneVideoSelectBestSub(episodeInfo.FileFullPath, fullSeasonSubDict[seasonEpsKey])
 		}
 	}
+	wg := sync.WaitGroup{}
+	p, err := ants.NewPoolWithFunc(d.reqParam.Threads, func(inData interface{}) {
+		seriesDlFunc(inData)
+		wg.Done()
+	})
+	if err != nil {
+		return err
+	}
+	// 遍历连续剧总目录下的第一层目录
+	seriesDirList, err := series_helper.GetSeriesList(dir)
+	if err != nil {
+		return err
+	}
+	for i, oneSeriesPath := range seriesDirList {
+		wg.Add(1)
+		err = p.Invoke(InputData{OneVideoFullPath: oneSeriesPath, Index: i})
+		if err != nil {
+			d.log.Errorln("series ants.Invoke",err)
+		}
+	}
 	return nil
 }
 
@@ -258,3 +308,7 @@ func (d Downloader) copySubFile2DesFolder(desFolder string, subFiles []string) e
 	return nil
 }
 
+type InputData struct {
+	OneVideoFullPath string
+	Index			int
+}

+ 1 - 1
go.mod

@@ -18,7 +18,7 @@ require (
 	github.com/mholt/archiver/v3 v3.5.0
 	github.com/middelink/go-parse-torrent-name v0.0.0-20190301154245-3ff4efacd4c4
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
-	github.com/pioz/tvdb v0.0.0-20200804122320-6d5b1ef61c13 // indirect
+	github.com/panjf2000/ants/v2 v2.4.5 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/robfig/cron/v3 v3.0.0
 	github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca

+ 5 - 0
go.sum

@@ -179,6 +179,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S
 github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/panjf2000/ants/v2 v2.4.5 h1:kcGvjXB7ea0MrzzszpnlVFthhYKoFxLi75nRbsq01HY=
+github.com/panjf2000/ants/v2 v2.4.5/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
@@ -235,6 +237,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
@@ -386,8 +389,10 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 2 - 2
main.go

@@ -49,8 +49,8 @@ func main() {
 		HttpProxy: httpProxy,
 		DebugMode: config.DebugMode,
 		SaveMultiSub: config.SaveMultiSub,
-		FoundExistSubFileThanSkip: config.FoundExistSubFileThanSkip,
-		})
+		Threads: config.Threads,
+	})
 	//任务还没执行完,下一次执行时间到来,下一次执行就跳过不执行
 	c := cron.New(cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)))
 	// 定时器

+ 2 - 7
model/sub_helper.go

@@ -10,17 +10,12 @@ import (
 )
 
 // OrganizeDlSubFiles 需要从汇总来是网站字幕中,解压对应的压缩包中的字幕出来
-func OrganizeDlSubFiles(subInfos []common.SupplierSubInfo) (map[string][]string, error) {
+func OrganizeDlSubFiles(tmpFolderName string, subInfos []common.SupplierSubInfo) (map[string][]string, error) {
 
 	// 缓存列表,整理后的字幕列表
 	// SxEx - []string 字幕的路径
 	var siteSubInfoDict = make(map[string][]string)
-	tmpFolderFullPath, err := GetTmpFolder()
-	if err != nil {
-		return nil, err
-	}
-	// 先清理缓存目录
-	err = ClearTmpFolder()
+	tmpFolderFullPath, err := GetTmpFolder(tmpFolderName)
 	if err != nil {
 		return nil, err
 	}

+ 51 - 3
model/util.go

@@ -107,7 +107,8 @@ func GetDebugFolder() (string, error) {
 	return defDebugFolder, nil
 }
 
-func GetTmpFolder() (string, error) {
+// GetRootTmpFolder 获取缓存的根目录,每一个视频的缓存将在其中额外新建子集文件夹
+func GetRootTmpFolder() (string, error) {
 	if defTmpFolder == "" {
 		nowProcessRoot, _ := os.Getwd()
 		nowProcessRoot = path.Join(nowProcessRoot, common.TmpFolder)
@@ -121,8 +122,55 @@ func GetTmpFolder() (string, error) {
 	return defTmpFolder, nil
 }
 
-func ClearTmpFolder() error {
-	nowTmpFolder, err := GetTmpFolder()
+// ClearRootTmpFolder 清理缓存的根目录,将里面的子文件夹一并清理
+func ClearRootTmpFolder() error {
+	nowTmpFolder, err := GetRootTmpFolder()
+	if err != nil {
+		return err
+	}
+
+	pathSep := string(os.PathSeparator)
+	files, err := ioutil.ReadDir(nowTmpFolder)
+	if err != nil {
+		return err
+	}
+	for _, curFile := range files {
+		fullPath := nowTmpFolder + pathSep + curFile.Name()
+		if curFile.IsDir() {
+			err = os.RemoveAll(fullPath)
+			if err != nil {
+				return err
+			}
+		} else {
+			// 这里就是文件了
+			err = os.Remove(fullPath)
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	return nil
+}
+
+// GetTmpFolder 获取缓存的文件夹,没有则新建
+func GetTmpFolder(folderName string) (string, error) {
+	rootPath, err := GetRootTmpFolder()
+	if err != nil {
+		return "", err
+	}
+	tmpFolderFullPath :=path.Join(rootPath, folderName)
+	err = os.MkdirAll(tmpFolderFullPath, os.ModePerm)
+	if err != nil {
+		return "", err
+	}
+	return tmpFolderFullPath, nil
+}
+
+// ClearTmpFolder 清理指定的缓存文件夹
+func ClearTmpFolder(folderName string) error {
+
+	nowTmpFolder, err := GetTmpFolder(folderName)
 	if err != nil {
 		return err
 	}

+ 2 - 2
movie_helper/movieHelper.go

@@ -112,11 +112,11 @@ func MovieNeedDlSub(videoFullPath string) (bool, error) {
 		return true, nil
 	} else {
 		if modifyTime.Add(dayRange).After(currentTime) == false {
-			model.GetLogger().Infoln("Skip", videoFullPath, "Sub Download, because movie has sub and downloaded more than 30 days")
+			model.GetLogger().Infoln("Skip", filepath.Base(videoFullPath), "Sub Download, because movie has sub and downloaded more than 3 months")
 			return false, nil
 		}
 		if found == true {
-			model.GetLogger().Infoln("Skip", videoFullPath, "Sub Download, because sub file found")
+			model.GetLogger().Infoln("Skip", filepath.Base(videoFullPath), "Sub Download, because sub file found")
 			return false, nil
 		}
 

+ 2 - 2
series_helper/seriesHelper.go

@@ -216,9 +216,9 @@ func whichEpsNeedDownloadSub(seriesInfo *common.SeriesInfo) map[string]common.Ep
 			needDlSubEpsList[epsKey] = epsInfo
 		} else {
 			if len(epsInfo.SubAlreadyDownloadedList) > 0 {
-				model.GetLogger().Infoln("Skip because find sub file and over 30 days,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
+				model.GetLogger().Infoln("Skip because find sub file and over 3 months,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
 			} else if epsInfo.ModifyTime.Add(dayRange).After(currentTime) == false {
-				model.GetLogger().Infoln("Skip because 30 days pass,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
+				model.GetLogger().Infoln("Skip because 3 months pass,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
 			}
 		}
 	}

+ 4 - 12
sub_supplier/subSupplierHub.go

@@ -7,6 +7,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/movie_helper"
 	"github.com/allanpk716/ChineseSubFinder/series_helper"
 	"github.com/sirupsen/logrus"
+	"path/filepath"
 )
 
 type SubSupplierHub struct {
@@ -29,11 +30,7 @@ func NewSubSupplierHub(one _interface.ISupplier,_inSupplier ..._interface.ISuppl
 
 // DownloadSub4Movie 某一个电影字幕下载,下载完毕后,返回下载缓存每个字幕的位置
 func (d SubSupplierHub) DownloadSub4Movie(videoFullPath string, index int) ([]string, error) {
-	// 先清理缓存文件夹
-	err := model.ClearTmpFolder()
-	if err != nil {
-		d.log.Error(err)
-	}
+
 	// 跳过中文的电影,不是一定要跳过的
 	skip, err := movie_helper.SkipChineseMovie(videoFullPath, d.Suppliers[0].GetReqParam())
 	if err != nil {
@@ -52,7 +49,7 @@ func (d SubSupplierHub) DownloadSub4Movie(videoFullPath string, index int) ([]st
 		// 下载所有字幕
 		subInfos := movie_helper.OneMovieDlSubInAllSite(d.Suppliers, videoFullPath, index)
 		// 整理字幕,比如解压什么的
-		organizeSubFiles, err := model.OrganizeDlSubFiles(subInfos)
+		organizeSubFiles, err := model.OrganizeDlSubFiles(filepath.Base(videoFullPath), subInfos)
 		if err != nil {
 			return nil, err
 		}
@@ -70,11 +67,6 @@ func (d SubSupplierHub) DownloadSub4Movie(videoFullPath string, index int) ([]st
 // DownloadSub4Series 某一部连续剧的字幕下载,下载完毕后,返回下载缓存每个字幕的位置
 func (d SubSupplierHub) DownloadSub4Series(seriesDirPath string, index int) (*common.SeriesInfo, map[string][]string, error) {
 
-	// 先清理缓存文件夹
-	err := model.ClearTmpFolder()
-	if err != nil {
-		d.log.Error(err)
-	}
 	// 跳过中文的连续剧,不是一定要跳过的
 	skip, err := series_helper.SkipChineseSeries(seriesDirPath, d.Suppliers[0].GetReqParam())
 	if err != nil {
@@ -96,7 +88,7 @@ func (d SubSupplierHub) DownloadSub4Series(seriesDirPath string, index int) (*co
 	subInfos := series_helper.OneSeriesDlSubInAllSite(d.Suppliers, seriesInfo, index)
 	// 整理字幕,比如解压什么的
 	// 每一集 SxEx - 对应解压整理后的字幕列表
-	organizeSubFiles, err := model.OrganizeDlSubFiles(subInfos)
+	organizeSubFiles, err := model.OrganizeDlSubFiles(filepath.Dir(seriesDirPath), subInfos)
 
 	return seriesInfo, organizeSubFiles, nil
 }