| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 | 
							- package TestCode
 
- import (
 
- 	"context"
 
- 	"fmt"
 
- 	"os"
 
- 	"path/filepath"
 
- 	"sync"
 
- 	common2 "github.com/allanpk716/ChineseSubFinder/pkg/types/common"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/task_control"
 
- 	"github.com/sirupsen/logrus"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/ffmpeg_helper"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/types/subparser"
 
- 	"github.com/huandu/go-clone"
 
- 	"github.com/xuri/excelize/v2"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/log_helper"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_parser/ass"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_parser/srt"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/logic/sub_timeline_fixer"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/settings"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/sub_parser_hub"
 
- 	"github.com/allanpk716/ChineseSubFinder/pkg/vad"
 
- )
 
- func statistics_subs_score_one(baseAudioFileFPath, baseSubFileFPath, srcSubFileFPath string) {
 
- 	audioVADInfos, err := vad.GetVADInfoFromAudio(vad.AudioInfo{
 
- 		FileFullPath: baseAudioFileFPath,
 
- 		SampleRate:   16000,
 
- 		BitDepth:     16,
 
- 	}, true)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	subParserHub := sub_parser_hub.NewSubParserHub(
 
- 		log_helper.GetLogger4Tester(),
 
- 		ass.NewParser(log_helper.GetLogger4Tester()),
 
- 		srt.NewParser(log_helper.GetLogger4Tester()),
 
- 	)
 
- 	bFind, infoBase, err := subParserHub.DetermineFileTypeFromFile(baseSubFileFPath)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	if bFind == false {
 
- 		return
 
- 	}
 
- 	bFind, srcBase, err := subParserHub.DetermineFileTypeFromFile(srcSubFileFPath)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	if bFind == false {
 
- 		return
 
- 	}
 
- 	s := sub_timeline_fixer.NewSubTimelineFixerHelperEx(log_helper.GetLogger4Tester(), *settings.NewTimelineFixerSettings())
 
- 	// path X:\电影\21座桥 (2019)\21座桥 (2019) 720p AAC.chinese(简,subhd).ass
 
- 	// 音频处理
 
- 	cloneSrcBase := clone.Clone(srcBase).(*subparser.FileInfo)
 
- 	bok, _, pipeResultAudio, err := s.ProcessByAudioVAD(audioVADInfos, cloneSrcBase)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	if bok == false {
 
- 		return
 
- 	}
 
- 	// 字幕处理
 
- 	cloneSrcBase = clone.Clone(srcBase).(*subparser.FileInfo)
 
- 	bok, _, pipeResultSub, err := s.ProcessBySubFileInfo(infoBase, cloneSrcBase)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	if bok == false {
 
- 		return
 
- 	}
 
- 	println(fmt.Sprintf("Audio Score: %f  Offset:%f\n", pipeResultAudio.Score, pipeResultAudio.GetOffsetTime()))
 
- 	println(fmt.Sprintf("Sub Score: %f  Offset:%f\n", pipeResultSub.Score, pipeResultSub.GetOffsetTime()))
 
- }
 
- func statistics_subs_score(baseAudioFileFPath, baseSubFileFPath, subSearchRootPath string) {
 
- 	f := excelize.NewFile()
 
- 	// Create a new sheet.
 
- 	sheetName := filepath.Base(subSearchRootPath)
 
- 	newSheet := f.NewSheet(sheetName)
 
- 	err := f.SetCellValue(sheetName, fmt.Sprintf("A%d", 1), "SubFPath")
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("B%d", 1), "AudioScore")
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("C%d", 1), "AudioOffset")
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("D%d", 1), "SubScore")
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("E%d", 1), "SubOffset")
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	audioVADInfos, err := vad.GetVADInfoFromAudio(vad.AudioInfo{
 
- 		FileFullPath: baseAudioFileFPath,
 
- 		SampleRate:   16000,
 
- 		BitDepth:     16,
 
- 	}, true)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	subParserHub := sub_parser_hub.NewSubParserHub(
 
- 		log_helper.GetLogger4Tester(),
 
- 		ass.NewParser(log_helper.GetLogger4Tester()),
 
- 		srt.NewParser(log_helper.GetLogger4Tester()),
 
- 	)
 
- 	bFind, infoBase, err := subParserHub.DetermineFileTypeFromFile(baseSubFileFPath)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	if bFind == false {
 
- 		return
 
- 	}
 
- 	subCounter := 1
 
- 	err = filepath.Walk(subSearchRootPath,
 
- 		func(path string, info os.FileInfo, err error) error {
 
- 			if err != nil {
 
- 				return err
 
- 			}
 
- 			if info.IsDir() == true {
 
- 				return nil
 
- 			}
 
- 			if sub_parser_hub.IsSubExtWanted(info.Name()) == false {
 
- 				return nil
 
- 			}
 
- 			bFind, srcBase, err := subParserHub.DetermineFileTypeFromFile(path)
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			if bFind == false {
 
- 				return nil
 
- 			}
 
- 			s := sub_timeline_fixer.NewSubTimelineFixerHelperEx(log_helper.GetLogger4Tester(), *settings.NewTimelineFixerSettings())
 
- 			// path X:\电影\21座桥 (2019)\21座桥 (2019) 720p AAC.chinese(简,subhd).ass
 
- 			// 音频处理
 
- 			cloneSrcBase := clone.Clone(srcBase).(*subparser.FileInfo)
 
- 			bok, _, pipeResultAudio, err := s.ProcessByAudioVAD(audioVADInfos, cloneSrcBase)
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			if bok == false {
 
- 				return nil
 
- 			}
 
- 			// 字幕处理
 
- 			cloneSrcBase = clone.Clone(srcBase).(*subparser.FileInfo)
 
- 			bok, _, pipeResultSub, err := s.ProcessBySubFileInfo(infoBase, cloneSrcBase)
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			if bok == false {
 
- 				return nil
 
- 			}
 
- 			subCounter++
 
- 			err = f.SetCellValue(sheetName, fmt.Sprintf("A%d", subCounter+1), info.Name())
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			err = f.SetCellValue(sheetName, fmt.Sprintf("B%d", subCounter+1), pipeResultAudio.Score)
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			err = f.SetCellValue(sheetName, fmt.Sprintf("C%d", subCounter+1), pipeResultAudio.GetOffsetTime())
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			err = f.SetCellValue(sheetName, fmt.Sprintf("D%d", subCounter+1), pipeResultSub.Score)
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			err = f.SetCellValue(sheetName, fmt.Sprintf("E%d", subCounter+1), pipeResultSub.GetOffsetTime())
 
- 			if err != nil {
 
- 				return nil
 
- 			}
 
- 			fmt.Println(subCounter, path, info.Size())
 
- 			return nil
 
- 		})
 
- 	if err != nil {
 
- 		fmt.Println("Walk", err)
 
- 		return
 
- 	}
 
- 	f.SetActiveSheet(newSheet)
 
- 	err = f.SaveAs(fmt.Sprintf("%s.xlsx", filepath.Dir(baseSubFileFPath)))
 
- 	if err != nil {
 
- 		fmt.Println("SaveAs", err)
 
- 		return
 
- 	}
 
- }
 
- func statistics_subs_score_is_match(
 
- 	logger *logrus.Logger,
 
- 	s *sub_timeline_fixer.SubTimelineFixerHelperEx,
 
- 	ffmpegInfo *ffmpeg_helper.FFMPEGInfo,
 
- 	audioVADInfos []vad.VADInfo, infoBase *subparser.FileInfo,
 
- 	subSearchRootPath, excelFileName string) {
 
- 	var err error
 
- 	f := excelize.NewFile()
 
- 	// Create a new sheet.
 
- 	sheetName := filepath.Base(subSearchRootPath)
 
- 	newSheet := f.NewSheet(sheetName)
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("A%d", 1), "SubFPath")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue A Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("B%d", 1), "AudioScore")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue B Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("C%d", 1), "AudioOffset")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue C Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("D%d", 1), "SubScore")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue D Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("E%d", 1), "SubOffset")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue E Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("F%d", 1), "IsMatch")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue F Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("G%d", 1), "VideoDuration")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue G Header", err)
 
- 		return
 
- 	}
 
- 	err = f.SetCellValue(sheetName, fmt.Sprintf("H%d", 1), "TargetSubEndTime")
 
- 	if err != nil {
 
- 		logger.Errorln("SetCellValue H Header", err)
 
- 		return
 
- 	}
 
- 	// --------------------------------------------------
 
- 	// 并发控制
 
- 	var taskControl *task_control.TaskControl
 
- 	taskControl, err = task_control.NewTaskControl(6, logger)
 
- 	if err != nil {
 
- 		logger.Errorln("NewTaskControl", err)
 
- 		return
 
- 	}
 
- 	taskControl.SetCtxProcessFunc("ScanSubPlayedPool", dealOne, common2.ScanPlayedSubTimeOut)
 
- 	// --------------------------------------------------
 
- 	subCounter = 1
 
- 	err = filepath.Walk(subSearchRootPath,
 
- 		func(path string, info os.FileInfo, err error) error {
 
- 			if err != nil {
 
- 				return err
 
- 			}
 
- 			if info.IsDir() == true {
 
- 				return nil
 
- 			}
 
- 			if sub_parser_hub.IsSubExtWanted(info.Name()) == false {
 
- 				return nil
 
- 			}
 
- 			// 并发控制
 
- 			err = taskControl.Invoke(&task_control.TaskData{
 
- 				Index: 0,
 
- 				Count: 0,
 
- 				DataEx: ExcelInputData{
 
- 					Logger:            logger,
 
- 					F:                 f,
 
- 					S:                 s,
 
- 					FfmpegInfo:        ffmpegInfo,
 
- 					AudioVADInfos:     audioVADInfos,
 
- 					InfoBase:          infoBase,
 
- 					NowTargetSubFPath: path,
 
- 					SubFileName:       info.Name(),
 
- 					SheetName:         sheetName,
 
- 				},
 
- 			})
 
- 			if err != nil {
 
- 				logger.Errorln("Invoke", err)
 
- 			}
 
- 			return nil
 
- 		})
 
- 	if err != nil {
 
- 		logger.Errorln("Walk", err)
 
- 		return
 
- 	}
 
- 	taskControl.Hold()
 
- 	f.SetActiveSheet(newSheet)
 
- 	err = f.SaveAs(fmt.Sprintf("%s.xlsx", excelFileName))
 
- 	if err != nil {
 
- 		logger.Errorln("SaveAs", err)
 
- 		return
 
- 	}
 
- 	logger.Infoln("Done")
 
- }
 
- func dealOne(ctx context.Context, inData interface{}) error {
 
- 	taskData := inData.(*task_control.TaskData)
 
- 	excelInputData := taskData.DataEx.(ExcelInputData)
 
- 	bok, matchResult, err := excelInputData.S.IsMatchBySubFile(
 
- 		excelInputData.FfmpegInfo,
 
- 		excelInputData.AudioVADInfos,
 
- 		excelInputData.InfoBase,
 
- 		excelInputData.NowTargetSubFPath,
 
- 		sub_timeline_fixer.CompareConfig{
 
- 			MinScore:                      40000,
 
- 			OffsetRange:                   2,
 
- 			DialoguesDifferencePercentage: 0.25,
 
- 		})
 
- 	if err != nil {
 
- 		return nil
 
- 	}
 
- 	if bok == false && matchResult == nil {
 
- 		return nil
 
- 	}
 
- 	counterLock.Lock()
 
- 	defer counterLock.Unlock()
 
- 	subCounter++
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("A%d", subCounter+1), excelInputData.SubFileName)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue A", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("B%d", subCounter+1), matchResult.AudioCompareScore)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue B", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("C%d", subCounter+1), matchResult.AudioCompareOffsetTime)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue C", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("D%d", subCounter+1), matchResult.SubCompareScore)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue D", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("E%d", subCounter+1), matchResult.SubCompareOffsetTime)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue E", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	iTrue := 0
 
- 	if bok == true {
 
- 		iTrue = 1
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("F%d", subCounter+1), iTrue)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue F", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("G%d", subCounter+1), matchResult.VideoDuration)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue G", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	err = excelInputData.F.SetCellValue(excelInputData.SheetName, fmt.Sprintf("H%d", subCounter+1), matchResult.TargetSubEndTime)
 
- 	if err != nil {
 
- 		excelInputData.Logger.Errorln("SetCellValue H", excelInputData.SubFileName, subCounter+1, err)
 
- 		return nil
 
- 	}
 
- 	excelInputData.Logger.Infoln(subCounter, excelInputData.NowTargetSubFPath)
 
- 	return nil
 
- }
 
- var counterLock sync.Mutex
 
- var subCounter int
 
- type ExcelInputData struct {
 
- 	Logger            *logrus.Logger
 
- 	F                 *excelize.File
 
- 	S                 *sub_timeline_fixer.SubTimelineFixerHelperEx
 
- 	FfmpegInfo        *ffmpeg_helper.FFMPEGInfo
 
- 	AudioVADInfos     []vad.VADInfo
 
- 	InfoBase          *subparser.FileInfo
 
- 	NowTargetSubFPath string
 
- 	SubFileName       string
 
- 	SheetName         string
 
- }
 
- type ExcelMathResult struct {
 
- 	Index       int
 
- 	Name        string
 
- 	MatchResult *sub_timeline_fixer.MatchResult
 
- }
 
 
  |