|
|
@@ -82,30 +82,56 @@ func (d Downloader) DownloadSub(dir string) error {
|
|
|
for i, oneVideoFullPath := range nowVideoList {
|
|
|
nowSubInfos := d.downloadSub4OneVideo(oneVideoFullPath, suppliers, i)
|
|
|
// 字幕都下载缓存好了,需要抉择存哪一个,优先选择中文双语的,然后到中文
|
|
|
- err = d.chooseAndSaveSubFile(oneVideoFullPath, nowSubInfos)
|
|
|
+ organizeSubFiles, err := d.organizeDlSubFiles(nowSubInfos)
|
|
|
if err != nil {
|
|
|
d.log.Error(oneVideoFullPath, "Download Sub Error",err)
|
|
|
continue
|
|
|
}
|
|
|
+ // 得到目标视频文件的根目录
|
|
|
+ videoRootPath := filepath.Dir(oneVideoFullPath)
|
|
|
+ // -------------------------------------------------
|
|
|
+ // 调试缓存,把下载好的字幕写到对应的视频目录下,方便调试
|
|
|
+ if d.reqParam.DebugMode == true {
|
|
|
+ err = d.copySubFile2DesFolder(videoRootPath, organizeSubFiles)
|
|
|
+ if err != nil {
|
|
|
+ d.log.Error(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // -------------------------------------------------
|
|
|
+ // TODO 这里先处理 Top1 的字幕,后续再考虑怎么觉得 Top N 选择哪一个,很可能选择每个网站 Top 1就行了,具体的过滤逻辑在其内部实现
|
|
|
+ // 拿到现有的字幕列表,开始抉择
|
|
|
+ // 先判断当前字幕是什么语言(如果是简体,还需要考虑,判断这个字幕是简体还是繁体)
|
|
|
+ //for i, oneSubFileFullPath := range organizeSubFiles {
|
|
|
+ //
|
|
|
+ //}
|
|
|
+ println(videoRootPath)
|
|
|
+ // 抉择完毕,需要清理缓存目录
|
|
|
+ err = common.ClearTmpFolder()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// chooseAndSaveSubFile 需要从汇总来是网站字幕中,找到合适的
|
|
|
-func (d Downloader) chooseAndSaveSubFile(oneVideoFullPath string, subInfos []sub_supplier.SubInfo) error {
|
|
|
+// organizeDlSubFiles 需要从汇总来是网站字幕中,找到合适的
|
|
|
+func (d Downloader) organizeDlSubFiles(subInfos []sub_supplier.SubInfo) ([]string, error) {
|
|
|
|
|
|
- // 得到目标视频文件的根目录
|
|
|
- videoRootPath := filepath.Dir(oneVideoFullPath)
|
|
|
+ // 缓存列表,整理后的字幕列表
|
|
|
+ var siteSubInfoDict = make([]string, 0)
|
|
|
tmpFolderFullPath, err := common.GetTmpFolder()
|
|
|
if err != nil {
|
|
|
- return err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
-
|
|
|
- var siteSubInfoDict = make([]string, 0)
|
|
|
- // 第三方的解压函数,首先不支持 io.Reader 的操作,也就是得缓存到本地硬盘再读取解压
|
|
|
+ // 先清理缓存目录
|
|
|
+ err = common.ClearTmpFolder()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // 第三方的解压库,首先不支持 io.Reader 的操作,也就是得缓存到本地硬盘再读取解压
|
|
|
// 且使用 walk 会无法解压 rar,得指定具体的实例,太麻烦了,直接用通用的接口得了,就是得都缓存下来再判断
|
|
|
+ // 基于以上两点,写了一堆啰嗦的逻辑···
|
|
|
for _, subInfo := range subInfos {
|
|
|
- // TODO 这里先处理 Top1 的字幕,后续再考虑怎么觉得 Top N 选择哪一个,很可能选择每个网站 Top 1就行了,具体的过滤逻辑在其内部实现
|
|
|
// 先存下来,保存是时候需要前缀,前缀就是从那个网站下载来的
|
|
|
nowFileSaveFullPath := path.Join(tmpFolderFullPath, d.getFrontNameAndOrgName(subInfo))
|
|
|
err = utils.OutputFile(nowFileSaveFullPath, subInfo.Data)
|
|
|
@@ -113,7 +139,6 @@ func (d Downloader) chooseAndSaveSubFile(oneVideoFullPath string, subInfos []sub
|
|
|
d.log.Error(subInfo.FromWhere, subInfo.Name, subInfo.TopN, err)
|
|
|
continue
|
|
|
}
|
|
|
-
|
|
|
nowExt := strings.ToLower(subInfo.Ext)
|
|
|
if nowExt != ".zip" && nowExt != ".tar" && nowExt != ".rar" && nowExt != ".7z" {
|
|
|
// 是否是受支持的字幕类型
|
|
|
@@ -138,28 +163,27 @@ func (d Downloader) chooseAndSaveSubFile(oneVideoFullPath string, subInfos []sub
|
|
|
d.log.Error(subInfo.FromWhere, subInfo.Name, subInfo.TopN, err)
|
|
|
continue
|
|
|
}
|
|
|
+ // 这里需要给这些下载到的文件进行改名,加是从那个网站来的前缀,后续好查找
|
|
|
for _, fileFullPath := range subFileFullPaths {
|
|
|
+ newSubName := d.addFrontName(subInfo, filepath.Base(fileFullPath))
|
|
|
+ newSubNameFullPath := path.Join(tmpFolderFullPath, newSubName)
|
|
|
+ // 改名
|
|
|
+ err = os.Rename(fileFullPath, newSubNameFullPath)
|
|
|
+ if err != nil {
|
|
|
+ d.log.Error(subInfo.FromWhere, subInfo.Name, subInfo.TopN, err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
// 加入缓存列表
|
|
|
- siteSubInfoDict = append(siteSubInfoDict, fileFullPath)
|
|
|
+ siteSubInfoDict = append(siteSubInfoDict, newSubNameFullPath)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // 拿到现有的字幕列表,开始抉择
|
|
|
- // 还需要考虑,判断这个字幕是简体还是繁体
|
|
|
-
|
|
|
- println(videoRootPath)
|
|
|
|
|
|
- // 抉择完毕,需要清理缓存目录
|
|
|
- err = common.ClearTmpFolder()
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- return nil
|
|
|
+ return siteSubInfoDict, nil
|
|
|
}
|
|
|
|
|
|
// downloadSub4OneVideo 为这个视频下载字幕,所有网站找到的字幕都会汇总输出
|
|
|
func (d Downloader) downloadSub4OneVideo(oneVideoFullPath string, suppliers []sub_supplier.ISupplier, i int) []sub_supplier.SubInfo {
|
|
|
- ontVideoRootPath := filepath.Dir(oneVideoFullPath)
|
|
|
var outSUbInfos = make([]sub_supplier.SubInfo, 0)
|
|
|
// 同时进行查询
|
|
|
subInfosChannel := make(chan []sub_supplier.SubInfo)
|
|
|
@@ -167,7 +191,7 @@ func (d Downloader) downloadSub4OneVideo(oneVideoFullPath string, suppliers []su
|
|
|
for _, supplier := range suppliers {
|
|
|
supplier := supplier
|
|
|
go func() {
|
|
|
- subInfos, err := d.downloadSub4OneSite(oneVideoFullPath, i, supplier, ontVideoRootPath)
|
|
|
+ subInfos, err := d.downloadSub4OneSite(oneVideoFullPath, i, supplier)
|
|
|
if err != nil {
|
|
|
d.log.Error(err)
|
|
|
}
|
|
|
@@ -185,7 +209,7 @@ func (d Downloader) downloadSub4OneVideo(oneVideoFullPath string, suppliers []su
|
|
|
}
|
|
|
|
|
|
// downloadSub4OneSite 在一个站点下载这个视频的字幕
|
|
|
-func (d Downloader) downloadSub4OneSite(oneVideoFullPath string, i int, supplier sub_supplier.ISupplier, ontVideoRootPath string) ([]sub_supplier.SubInfo, error) {
|
|
|
+func (d Downloader) downloadSub4OneSite(oneVideoFullPath string, i int, supplier sub_supplier.ISupplier) ([]sub_supplier.SubInfo, error) {
|
|
|
d.log.Infoln(i, supplier.GetSupplierName(), "Start...")
|
|
|
subInfos, err := supplier.GetSubListFromFile(oneVideoFullPath)
|
|
|
if err != nil {
|
|
|
@@ -198,24 +222,6 @@ func (d Downloader) downloadSub4OneSite(oneVideoFullPath string, i int, supplier
|
|
|
subInfos[x].Name = tmpSubFileName + info.Ext
|
|
|
}
|
|
|
}
|
|
|
- if d.reqParam.DebugMode == true {
|
|
|
- // 需要进行字幕文件的缓存
|
|
|
- // 把缓存的文件夹新建出来
|
|
|
- desFolderFullPath := path.Join(ontVideoRootPath, SubTmpFolderName)
|
|
|
- err = os.MkdirAll(desFolderFullPath, os.ModePerm)
|
|
|
- if err != nil {
|
|
|
- d.log.Error(err)
|
|
|
- return subInfos, nil
|
|
|
- }
|
|
|
- for x, info := range subInfos {
|
|
|
- desSubFileFullPath := path.Join(desFolderFullPath, supplier.GetSupplierName() + "_" + strconv.Itoa(x)+"_"+info.Name)
|
|
|
- err = utils.OutputFile(desSubFileFullPath, info.Data)
|
|
|
- if err != nil {
|
|
|
- d.log.Error(err)
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
d.log.Infoln(i, supplier.GetSupplierName(), "End...")
|
|
|
return subInfos, nil
|
|
|
}
|
|
|
@@ -249,7 +255,7 @@ func (d Downloader) searchMatchedVideoFile(dir string) ([]string, error) {
|
|
|
|
|
|
// searchMatchedSubFile 搜索符合后缀名的视频文件
|
|
|
func (d Downloader) searchMatchedSubFile(dir string) ([]string, error) {
|
|
|
-
|
|
|
+ // 这里有个梗,会出现 __MACOSX 这类文件夹,那么里面会有一样的文件,需要用文件大小排除一下,至少大于 1 kb 吧
|
|
|
var fileFullPathList = make([]string, 0)
|
|
|
pathSep := string(os.PathSeparator)
|
|
|
files, err := ioutil.ReadDir(dir)
|
|
|
@@ -266,6 +272,9 @@ func (d Downloader) searchMatchedSubFile(dir string) ([]string, error) {
|
|
|
}
|
|
|
} else {
|
|
|
// 这里就是文件了
|
|
|
+ if curFile.Size() < 1000 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
if common.IsSubExtWanted(filepath.Ext(curFile.Name())) == true {
|
|
|
fileFullPathList = append(fileFullPathList, fullPath)
|
|
|
}
|
|
|
@@ -287,7 +296,32 @@ func (d Downloader) isWantedVideoExtDef(fileName string) bool {
|
|
|
|
|
|
// 返回的名称包含,那个网站下载的,这个网站中排名第几,文件名
|
|
|
func (d Downloader) getFrontNameAndOrgName(info sub_supplier.SubInfo) string {
|
|
|
- return "[" + info.FromWhere + "]" + strconv.FormatInt(info.TopN,10) +info.Name
|
|
|
+ return "[" + info.FromWhere + "]_" + strconv.FormatInt(info.TopN,10) + "_" + info.Name
|
|
|
+}
|
|
|
+
|
|
|
+func (d Downloader) addFrontName(info sub_supplier.SubInfo, orgName string) string {
|
|
|
+ return "[" + info.FromWhere + "]_" + strconv.FormatInt(info.TopN,10) + "_" + orgName
|
|
|
+}
|
|
|
+
|
|
|
+func (d Downloader) copySubFile2DesFolder(desFolder string, subFiles []string) error {
|
|
|
+
|
|
|
+ // 需要进行字幕文件的缓存
|
|
|
+ // 把缓存的文件夹新建出来
|
|
|
+ desFolderFullPath := path.Join(desFolder, SubTmpFolderName)
|
|
|
+ err := os.MkdirAll(desFolderFullPath, os.ModePerm)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ // 复制下载在 tmp 文件夹中的字幕文件到视频文件夹下面
|
|
|
+ for _, subFile := range subFiles {
|
|
|
+ newFn := path.Join(desFolderFullPath, filepath.Base(subFile))
|
|
|
+ _, err = common.CopyFile(newFn, subFile)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
const (
|
|
|
@@ -296,5 +330,5 @@ const (
|
|
|
VideoExtRmvb = ".rmvb"
|
|
|
VideoExtIso = ".iso"
|
|
|
|
|
|
- SubTmpFolderName = "subTmp"
|
|
|
+ SubTmpFolderName = "subtmp"
|
|
|
)
|