diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..94cb879 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.exe filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/core/bmp.go b/core/bmp.go index 8f764bb..c3848b3 100644 --- a/core/bmp.go +++ b/core/bmp.go @@ -30,7 +30,7 @@ type BMPInfoHeader struct { ColorsImportant uint32 } -func readBmpInfo(filePath string) (error, int32, int32) { +func ReadBmpImage(filePath string) (error, int32, int32) { file, err := os.Open(filePath) if err != nil { fmt.Printf("=== Failed to open file: %v\n", err) diff --git a/core/file_scanner.go b/core/file_scanner.go index 8f0e21b..49a8aaa 100644 --- a/core/file_scanner.go +++ b/core/file_scanner.go @@ -1,8 +1,8 @@ package core import ( - "OdMediaPicker/util" - "OdMediaPicker/vars" + "ImageVideoResolutionPickerTool/util" + "ImageVideoResolutionPickerTool/vars" "fmt" "github.com/redmask-hb/GoSimplePrint/goPrint" "log" @@ -57,7 +57,7 @@ func (FileScanner) DoFilter() { } // mime格式为application/octet-stream的视频 ext := path.Ext(globalFilePath) - if isSupportVideo(ext) { + if util.IsSupportVideo(ext) { vars.GlobalVideoPathList = append(vars.GlobalVideoPathList, globalFilePath) bar.PrintBar(util.CalcPercentage(count, total)) continue @@ -67,7 +67,7 @@ func (FileScanner) DoFilter() { bar.PrintBar(util.CalcPercentage(count, total)) continue } - if isSupportImage(ext) { + if util.IsSupportImage(ext) { vars.GlobalImagePathList = append(vars.GlobalImagePathList, globalFilePath) bar.PrintBar(util.CalcPercentage(count, total)) continue diff --git a/core/files/ffmpeg-master-latest-win64-gpl.zip b/core/files/ffmpeg-master-latest-win64-gpl.zip deleted file mode 100644 index 40e8ac4..0000000 Binary files a/core/files/ffmpeg-master-latest-win64-gpl.zip and /dev/null differ diff --git a/core/files/ffprobe.exe b/core/files/ffprobe.exe deleted file mode 100644 index e37dcaf..0000000 Binary files a/core/files/ffprobe.exe and /dev/null differ diff --git a/core/files/upx-4.2.3-win64.zip b/core/files/upx-4.2.3-win64.zip deleted file mode 100644 index cce072a..0000000 Binary files a/core/files/upx-4.2.3-win64.zip and /dev/null differ diff --git a/core/handle_image.go b/core/handle_image.go index f8b88dc..4bfd7c4 100644 --- a/core/handle_image.go +++ b/core/handle_image.go @@ -1,11 +1,10 @@ package core import ( - "OdMediaPicker/util" - "OdMediaPicker/vars" + "ImageVideoResolutionPickerTool/util" + "ImageVideoResolutionPickerTool/vars" "fmt" uuid "github.com/satori/go.uuid" - "image" _ "image/gif" // 导入gif支持 _ "image/jpeg" // 导入jpeg支持 _ "image/png" // 导入png支持 @@ -13,94 +12,6 @@ import ( "strings" ) -var ignoreImagePathList []string // 忽略的文件路径 -var readErrorImagePathList []string // 读取信息异常的路径 -var imagePath2WidthHeightMap = make(map[string]string) // 图片路径和宽高比 -var supportImageTypes = []string{ - ".bmp", - ".gif", - ".jpg", - ".jpeg", - ".jpe", - ".png", - ".webp", - ".psb", - ".jfif", -} - -// gif图片 -var gifImageList []string - -// 横向图片 -var horizontalNormalImageList []string -var horizontal1KImageList []string -var horizontal2KImageList []string -var horizontal3KImageList []string -var horizontal4KImageList []string -var horizontal5KImageList []string -var horizontal6KImageList []string -var horizontal7KImageList []string -var horizontal8KImageList []string -var horizontal9KImageList []string -var horizontalHKImageList []string -var horizontalStandard720PImageList []string -var horizontalStandard1080PImageList []string -var horizontalStandard4KImageList []string -var horizontalStandard8KImageList []string - -// 纵向图片 -var verticalNormalImageList []string -var vertical1KImageList []string -var vertical2KImageList []string -var vertical3KImageList []string -var vertical4KImageList []string -var vertical5KImageList []string -var vertical6KImageList []string -var vertical7KImageList []string -var vertical8KImageList []string -var vertical9KImageList []string -var verticalHKImageList []string - -// 等比图片 -var squareNormalImageList []string -var square1KImageList []string -var square2KImageList []string -var square3KImageList []string -var square4KImageList []string -var square5KImageList []string -var square6KImageList []string -var square7KImageList []string -var square8KImageList []string -var square9KImageList []string -var squareHKImageList []string - -// psd图片 -var psdImageList []string - -// 判断是否属于支持的图片文件 -func isSupportImage(imageType string) bool { - for _, supportImageType := range supportImageTypes { - if strings.EqualFold(supportImageType, strings.ToLower(imageType)) { - return true - } - } - return false -} - -// 读取一般图片文件信息 -func readImageInfo(filePath string) (err error, width int, height int) { - file, err := os.Open(filePath) // 图片文件路径 - if err != nil { - return err, 0, 0 - } - defer file.Close() - img, _, err := image.DecodeConfig(file) - if err != nil { - return err, 0, 0 - } - return nil, img.Width, img.Height -} - func DoHandleImage(rootDir string) { total := len(vars.GlobalImagePathList) // 总数 successCount := 0 // 成功数 @@ -108,23 +19,23 @@ func DoHandleImage(rootDir string) { ignoreCount := 0 // 忽略数 for _, imageFilePath := range vars.GlobalImagePathList { suffix := vars.GlobalFilePath2FileExtMap[imageFilePath] - if isSupportImage(suffix) { - err, width, height := readImageInfo(imageFilePath) + if util.IsSupportImage(suffix) { + err, width, height := util.ReadImageInfo(imageFilePath) if err == nil { successCount = successCount + 1 - imagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", width, height) + vars.ImagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", width, height) fmt.Printf("=== Image总数: %d, 已读取Info: %d, 成功数: %d, 失败数: %d \n", total, successCount+errorCount+ignoreCount, successCount, errorCount) } else { errorCount = errorCount + 1 - readErrorImagePathList = append(readErrorImagePathList, imageFilePath) + vars.ImageReadErrorPathList = append(vars.ImageReadErrorPathList, imageFilePath) fmt.Printf("=== 异常图片: %s \n", imageFilePath) } continue } if strings.EqualFold(suffix, ".webp") { // 特殊文件处理, webp为网络常用图片格式 - webpErr, webpWidth, webpHeight := readWebpTypeImage(imageFilePath) + webpErr, webpWidth, webpHeight := ReadWebpImage(imageFilePath) if webpErr == nil { - imagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", webpWidth, webpHeight) + vars.ImagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", webpWidth, webpHeight) successCount = successCount + 1 } else { errorCount = errorCount + 1 @@ -133,9 +44,9 @@ func DoHandleImage(rootDir string) { continue } if strings.EqualFold(suffix, ".bmp") { // 特殊文件处理 - bpmErr, bmpWidth, bmpHeight := readBmpInfo(imageFilePath) + bpmErr, bmpWidth, bmpHeight := ReadBmpImage(imageFilePath) if bpmErr == nil { - imagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", bmpWidth, bmpHeight) + vars.ImagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", bmpWidth, bmpHeight) successCount = successCount + 1 } else { errorCount = errorCount + 1 @@ -144,40 +55,40 @@ func DoHandleImage(rootDir string) { continue } if strings.EqualFold(suffix, ".psd") { // 特殊文件处理 - psdImageList = append(psdImageList, imageFilePath) + vars.ImagePsdList = append(vars.ImagePsdList, imageFilePath) successCount = successCount + 1 continue } // 其他的直接先忽略吧, 爱改改, 不改拉倒 ignoreCount = ignoreCount + 1 - ignoreImagePathList = append(ignoreImagePathList, imageFilePath) + vars.ImageIgnorePathList = append(vars.ImageIgnorePathList, imageFilePath) } uid := strings.ReplaceAll(uuid.NewV4().String(), "-", "") - if len(psdImageList) > 0 { + if len(vars.ImagePsdList) > 0 { psdImagePath := rootDir + string(os.PathSeparator) + uid + "-图片_PSD" if util.CreateDir(psdImagePath) { - doMoveFileToDir(psdImageList, psdImagePath) + util.DoMoveFileToDir(vars.ImagePsdList, psdImagePath) } } - if len(readErrorImagePathList) > 0 { + if len(vars.ImageReadErrorPathList) > 0 { readInfoErrorPath := rootDir + string(os.PathSeparator) + uid + "-图片_读取异常" if util.CreateDir(readInfoErrorPath) { - doMoveFileToDir(readErrorImagePathList, readInfoErrorPath) + util.DoMoveFileToDir(vars.ImageReadErrorPathList, readInfoErrorPath) } } - if len(ignoreImagePathList) > 0 { + if len(vars.ImageIgnorePathList) > 0 { ignorePath := rootDir + string(os.PathSeparator) + uid + "-图片_已忽略" if util.CreateDir(ignorePath) { - doMoveFileToDir(ignoreImagePathList, ignorePath) + util.DoMoveFileToDir(vars.ImageIgnorePathList, ignorePath) } } - doPickImageFile(uid, rootDir, imagePath2WidthHeightMap) + doPickImageFile(uid, rootDir, vars.ImagePath2WidthHeightMap) fmt.Printf("=== 图片处理完毕(UID): %s \n\n", uid) } // 条件图片并分组存放 func doPickImageFile(uid string, rootDir string, imagePath2WidthHeightMap map[string]string) { - if len(imagePath2WidthHeightMap) == 0 { + if len(vars.ImagePath2WidthHeightMap) == 0 { fmt.Printf("=== 当前目录下没有扫描到图片文件, %s \n", rootDir) return } @@ -207,82 +118,117 @@ func doPickImageFile(uid string, rootDir string, imagePath2WidthHeightMap map[st // 统一处理gif func handleGifImage(path string) { - gifImageList = append(gifImageList, path) + vars.ImageGifList = append(vars.ImageGifList, path) } // 处理垂直图片 func handleVerticalImage(currentImagePath string, height int) { // 非标规格 if height < 1000 { - verticalNormalImageList = append(verticalNormalImageList, currentImagePath) + vars.ImageVerticalNormalList = append(vars.ImageVerticalNormalList, currentImagePath) } else if height < 2000 { - vertical1KImageList = append(vertical1KImageList, currentImagePath) + vars.ImageVertical1KList = append(vars.ImageVertical1KList, currentImagePath) } else if height < 3000 { - vertical2KImageList = append(vertical2KImageList, currentImagePath) + vars.ImageVertical2KList = append(vars.ImageVertical2KList, currentImagePath) } else if height < 4000 { - vertical3KImageList = append(vertical3KImageList, currentImagePath) + vars.ImageVertical3KList = append(vars.ImageVertical3KList, currentImagePath) } else if height < 5000 { - vertical4KImageList = append(vertical4KImageList, currentImagePath) + vars.ImageVertical4KList = append(vars.ImageVertical4KList, currentImagePath) } else if height < 6000 { - vertical5KImageList = append(vertical5KImageList, currentImagePath) + vars.ImageVertical5KList = append(vars.ImageVertical5KList, currentImagePath) } else if height < 7000 { - vertical6KImageList = append(vertical6KImageList, currentImagePath) + vars.ImageVertical6KList = append(vars.ImageVertical6KList, currentImagePath) } else if height < 8000 { - vertical7KImageList = append(vertical7KImageList, currentImagePath) + vars.ImageVertical7KList = append(vars.ImageVertical7KList, currentImagePath) } else if height < 9000 { - vertical8KImageList = append(vertical8KImageList, currentImagePath) + vars.ImageVertical8KList = append(vars.ImageVertical8KList, currentImagePath) } else if height < 10000 { - vertical9KImageList = append(vertical9KImageList, currentImagePath) + vars.ImageVertical9KList = append(vars.ImageVertical9KList, currentImagePath) } else if height >= 10000 { // 提示请忽略 - verticalHKImageList = append(verticalHKImageList, currentImagePath) + vars.ImageVerticalHKList = append(vars.ImageVerticalHKList, currentImagePath) } } // 处理横向图片 func handleHorizontalImage(currentImagePath string, width int, height int) { - // 1280 x 720 -> 720p + // 1280×720(720p)—— 标准高清(HD),常用于早期高清视频或小型屏幕 if width == 1280 && height == 720 { - horizontalStandard720PImageList = append(horizontalStandard720PImageList, currentImagePath) + vars.ImageHorizontalStandard720PList = append(vars.ImageHorizontalStandard720PList, currentImagePath) return } - // 1920 x 1080 -> 1080p + // 1600×900—— 介于HD和FHD之间 + if width == 1600 && height == 900 { + vars.ImageHorizontalStandard1D5KList = append(vars.ImageHorizontalStandard1D5KList, currentImagePath) + return + } + // 1920×1080(1080p)—— 全高清,主流显示器、电视和视频的分辨率 if width == 1920 && height == 1080 { - horizontalStandard1080PImageList = append(horizontalStandard1080PImageList, currentImagePath) + vars.ImageHorizontalStandard1080PList = append(vars.ImageHorizontalStandard1080PList, currentImagePath) return } - // 3840 x 2160 -> 4k + // 2048×1080(2dk)—— 影院2k + if width == 2048 && height == 1080 { + vars.ImageHorizontalStandard2DKList = append(vars.ImageHorizontalStandard2DKList, currentImagePath) + return + } + // 2560×1440(1440p)—— 俗称“2.5K”,电竞显示器或高端手机屏幕 + if width == 2560 && height == 1440 { + vars.ImageHorizontalStandard2D5KList = append(vars.ImageHorizontalStandard2D5KList, currentImagePath) + return + } + // 2560×1080—— 带鱼屏显示器(超宽屏) + if width == 2560 && height == 1080 { + vars.ImageHorizontalStandardUltraWide2List = append(vars.ImageHorizontalStandardUltraWide2List, currentImagePath) + return + } + // 3440×1440—— 带鱼屏显示器(超宽屏) + if width == 3440 && height == 1440 { + vars.ImageHorizontalStandardUltraWide3List = append(vars.ImageHorizontalStandardUltraWide3List, currentImagePath) + return + } + // 5120×2160—— 带鱼屏显示器(超宽屏) + if width == 5120 && height == 2160 { + vars.ImageHorizontalStandardUltraWide4List = append(vars.ImageHorizontalStandardUltraWide4List, currentImagePath) + return + } + // 3840×2160(主流4K)—— 超高清,现代高端显示器、电视和影视制作 if width == 3840 && height == 2160 { - horizontalStandard4KImageList = append(horizontalStandard4KImageList, currentImagePath) + vars.ImageHorizontalStandard4KList = append(vars.ImageHorizontalStandard4KList, currentImagePath) return } - // 7680 x 4320 -> 8k + // 4096×2160(DCI 4K)—— 电影行业标准 + if width == 4096 && height == 2160 { + vars.ImageHorizontalStandard4KHList = append(vars.ImageHorizontalStandard4KHList, currentImagePath) + return + } + // 7680×4320—— 超高清,用于专业影视或高端设备 if width == 7680 && height == 4320 { - horizontalStandard8KImageList = append(horizontalStandard8KImageList, currentImagePath) + vars.ImageHorizontalStandard8KList = append(vars.ImageHorizontalStandard8KList, currentImagePath) return } // 非标规格 if width < 1000 { - horizontalNormalImageList = append(horizontalNormalImageList, currentImagePath) + vars.ImageHorizontalNormalList = append(vars.ImageHorizontalNormalList, currentImagePath) } else if width < 2000 { - horizontal1KImageList = append(horizontal1KImageList, currentImagePath) + vars.ImageHorizontal1KList = append(vars.ImageHorizontal1KList, currentImagePath) } else if width < 3000 { - horizontal2KImageList = append(horizontal2KImageList, currentImagePath) + vars.ImageHorizontal2KList = append(vars.ImageHorizontal2KList, currentImagePath) } else if width < 4000 { - horizontal3KImageList = append(horizontal3KImageList, currentImagePath) + vars.ImageHorizontal3KList = append(vars.ImageHorizontal3KList, currentImagePath) } else if width < 5000 { - horizontal4KImageList = append(horizontal4KImageList, currentImagePath) + vars.ImageHorizontal4KList = append(vars.ImageHorizontal4KList, currentImagePath) } else if width < 6000 { - horizontal5KImageList = append(horizontal5KImageList, currentImagePath) + vars.ImageHorizontal5KList = append(vars.ImageHorizontal5KList, currentImagePath) } else if width < 7000 { - horizontal6KImageList = append(horizontal6KImageList, currentImagePath) + vars.ImageHorizontal6KList = append(vars.ImageHorizontal6KList, currentImagePath) } else if width < 8000 { - horizontal7KImageList = append(horizontal7KImageList, currentImagePath) + vars.ImageHorizontal7KList = append(vars.ImageHorizontal7KList, currentImagePath) } else if width < 9000 { - horizontal8KImageList = append(horizontal8KImageList, currentImagePath) + vars.ImageHorizontal8KList = append(vars.ImageHorizontal8KList, currentImagePath) } else if width < 10000 { - horizontal9KImageList = append(horizontal9KImageList, currentImagePath) + vars.ImageHorizontal9KList = append(vars.ImageHorizontal9KList, currentImagePath) } else if width >= 10000 { // 提示请忽略 - horizontalHKImageList = append(horizontalHKImageList, currentImagePath) + vars.ImageHorizontalHKList = append(vars.ImageHorizontalHKList, currentImagePath) } } @@ -290,27 +236,27 @@ func handleHorizontalImage(currentImagePath string, width int, height int) { func handleSquareImage(currentImagePath string, width int) { // 非标规格 if width < 1000 { - squareNormalImageList = append(squareNormalImageList, currentImagePath) + vars.ImageSquareNormalList = append(vars.ImageSquareNormalList, currentImagePath) } else if width < 2000 { - square1KImageList = append(square1KImageList, currentImagePath) + vars.ImageSquare1KList = append(vars.ImageSquare1KList, currentImagePath) } else if width < 3000 { - square2KImageList = append(square2KImageList, currentImagePath) + vars.ImageSquare2KList = append(vars.ImageSquare2KList, currentImagePath) } else if width < 4000 { - square3KImageList = append(square3KImageList, currentImagePath) + vars.ImageSquare3KList = append(vars.ImageSquare3KList, currentImagePath) } else if width < 5000 { - square4KImageList = append(square4KImageList, currentImagePath) + vars.ImageSquare4KList = append(vars.ImageSquare4KList, currentImagePath) } else if width < 6000 { - square5KImageList = append(square5KImageList, currentImagePath) + vars.ImageSquare5KList = append(vars.ImageSquare5KList, currentImagePath) } else if width < 7000 { - square6KImageList = append(square6KImageList, currentImagePath) + vars.ImageSquare6KList = append(vars.ImageSquare6KList, currentImagePath) } else if width < 8000 { - square7KImageList = append(square7KImageList, currentImagePath) + vars.ImageSquare7KList = append(vars.ImageSquare7KList, currentImagePath) } else if width < 9000 { - square8KImageList = append(square8KImageList, currentImagePath) + vars.ImageSquare8KList = append(vars.ImageSquare8KList, currentImagePath) } else if width < 10000 { - square9KImageList = append(square9KImageList, currentImagePath) + vars.ImageSquare9KList = append(vars.ImageSquare9KList, currentImagePath) } else if width > 10000 { - squareHKImageList = append(squareHKImageList, currentImagePath) + vars.ImageSquareHKList = append(vars.ImageSquareHKList, currentImagePath) } } @@ -318,81 +264,116 @@ func handleSquareImage(currentImagePath string, width int) { func moveHorizontalImage(rootDir string, uid string) { pathSeparator := string(os.PathSeparator) // 标准 - if len(horizontalStandard720PImageList) > 0 { - horizontalStandard720PImagePath := rootDir + pathSeparator + uid + "-图片_横屏_720P" - util.CreateDir(horizontalStandard720PImagePath) - doMoveFileToDir(horizontalStandard720PImageList, horizontalStandard720PImagePath) + if len(vars.ImageHorizontalStandard720PList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_720P" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard720PList, imageDirPath) } - if len(horizontalStandard1080PImageList) > 0 { - horizontalStandard1080PImagePath := rootDir + pathSeparator + uid + "-图片_横屏_1080P" - util.CreateDir(horizontalStandard1080PImagePath) - doMoveFileToDir(horizontalStandard1080PImageList, horizontalStandard1080PImagePath) + if len(vars.ImageHorizontalStandard1D5KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_1D5KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard1D5KList, imageDirPath) } - if len(horizontalStandard4KImageList) > 0 { - horizontalStandard4KImagePath := rootDir + pathSeparator + uid + "-图片_横屏_4KP" - util.CreateDir(horizontalStandard4KImagePath) - doMoveFileToDir(horizontalStandard4KImageList, horizontalStandard4KImagePath) + if len(vars.ImageHorizontalStandard1080PList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_1080P" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard1080PList, imageDirPath) } - if len(horizontalStandard8KImageList) > 0 { - horizontalStandard8KImagePath := rootDir + pathSeparator + uid + "-图片_横屏_8KP" - util.CreateDir(horizontalStandard8KImagePath) - doMoveFileToDir(horizontalStandard8KImageList, horizontalStandard8KImagePath) + if len(vars.ImageHorizontalStandard2DKList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_2DKP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard2DKList, imageDirPath) + } + if len(vars.ImageHorizontalStandard2D5KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_2D5KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard2D5KList, imageDirPath) + } + if len(vars.ImageHorizontalStandardUltraWide2List) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_ultraWide2KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandardUltraWide2List, imageDirPath) + } + if len(vars.ImageHorizontalStandardUltraWide3List) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_ultraWide3KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandardUltraWide3List, imageDirPath) + } + if len(vars.ImageHorizontalStandardUltraWide4List) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_ultraWide4KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandardUltraWide4List, imageDirPath) + } + if len(vars.ImageHorizontalStandard4KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_4KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard4KList, imageDirPath) + } + if len(vars.ImageHorizontalStandard4KHList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_4KHP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard4KHList, imageDirPath) + } + if len(vars.ImageHorizontalStandard8KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_8KP" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalStandard8KList, imageDirPath) } // 非标准 - if len(horizontalNormalImageList) > 0 { - horizontalNormalImagePath := rootDir + pathSeparator + uid + "-图片_横屏_普通" - util.CreateDir(horizontalNormalImagePath) - doMoveFileToDir(horizontalNormalImageList, horizontalNormalImagePath) + if len(vars.ImageHorizontalNormalList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_普通" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalNormalList, imageDirPath) } - if len(horizontal1KImageList) > 0 { - horizontal1kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_1K" - util.CreateDir(horizontal1kImagePath) - doMoveFileToDir(horizontal1KImageList, horizontal1kImagePath) + if len(vars.ImageHorizontal1KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_1K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal1KList, imageDirPath) } - if len(horizontal2KImageList) > 0 { - horizontal2kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_2K" - util.CreateDir(horizontal2kImagePath) - doMoveFileToDir(horizontal2KImageList, horizontal2kImagePath) + if len(vars.ImageHorizontal2KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_2K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal2KList, imageDirPath) } - if len(horizontal3KImageList) > 0 { - horizontal3kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_3K" - util.CreateDir(horizontal3kImagePath) - doMoveFileToDir(horizontal3KImageList, horizontal3kImagePath) + if len(vars.ImageHorizontal3KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_3K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal3KList, imageDirPath) } - if len(horizontal4KImageList) > 0 { - horizontal4kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_4K" - util.CreateDir(horizontal4kImagePath) - doMoveFileToDir(horizontal4KImageList, horizontal4kImagePath) + if len(vars.ImageHorizontal4KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_4K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal4KList, imageDirPath) } - if len(horizontal5KImageList) > 0 { - horizontal5kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_5K" - util.CreateDir(horizontal5kImagePath) - doMoveFileToDir(horizontal5KImageList, horizontal5kImagePath) + if len(vars.ImageHorizontal5KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_5K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal5KList, imageDirPath) } - if len(horizontal6KImageList) > 0 { - horizontal6kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_6K" - util.CreateDir(horizontal6kImagePath) - doMoveFileToDir(horizontal6KImageList, horizontal6kImagePath) + if len(vars.ImageHorizontal6KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_6K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal6KList, imageDirPath) } - if len(horizontal7KImageList) > 0 { - horizontal7KImagePath := rootDir + pathSeparator + uid + "-图片_横屏_7K" - util.CreateDir(horizontal7KImagePath) - doMoveFileToDir(horizontal7KImageList, horizontal7KImagePath) + if len(vars.ImageHorizontal7KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_7K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal7KList, imageDirPath) } - if len(horizontal8KImageList) > 0 { - horizontal8kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_8K" - util.CreateDir(horizontal8kImagePath) - doMoveFileToDir(horizontal8KImageList, horizontal8kImagePath) + if len(vars.ImageHorizontal8KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_8K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal8KList, imageDirPath) } - if len(horizontal9KImageList) > 0 { - horizontal9kImagePath := rootDir + pathSeparator + uid + "-图片_横屏_9K" - util.CreateDir(horizontal9kImagePath) - doMoveFileToDir(horizontal9KImageList, horizontal9kImagePath) + if len(vars.ImageHorizontal9KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_9K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontal9KList, imageDirPath) } - if len(horizontalHKImageList) > 0 { - horizontalHkImagePath := rootDir + pathSeparator + uid + "-图片_横屏_原图" - util.CreateDir(horizontalHkImagePath) - doMoveFileToDir(horizontalHKImageList, horizontalHkImagePath) + if len(vars.ImageHorizontalHKList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_横屏_原图" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageHorizontalHKList, imageDirPath) } } @@ -400,60 +381,60 @@ func moveHorizontalImage(rootDir string, uid string) { func moveVerticalImage(rootDir string, uid string) { pathSeparator := string(os.PathSeparator) // 非标准 - if len(verticalNormalImageList) > 0 { - verticalNormalImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_普通" - util.CreateDir(verticalNormalImagePath) - doMoveFileToDir(verticalNormalImageList, verticalNormalImagePath) + if len(vars.ImageVerticalNormalList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_普通" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVerticalNormalList, imageDirPath) } - if len(vertical1KImageList) > 0 { - vertical1kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_1K" - util.CreateDir(vertical1kImagePath) - doMoveFileToDir(vertical1KImageList, vertical1kImagePath) + if len(vars.ImageVertical1KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_1K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical1KList, imageDirPath) } - if len(vertical2KImageList) > 0 { - vertical2kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_2K" - util.CreateDir(vertical2kImagePath) - doMoveFileToDir(vertical2KImageList, vertical2kImagePath) + if len(vars.ImageVertical2KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_2K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical2KList, imageDirPath) } - if len(vertical3KImageList) > 0 { - vertical3kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_3K" - util.CreateDir(vertical3kImagePath) - doMoveFileToDir(vertical3KImageList, vertical3kImagePath) + if len(vars.ImageVertical3KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_3K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical3KList, imageDirPath) } - if len(vertical4KImageList) > 0 { - vertical4kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_4K" - util.CreateDir(vertical4kImagePath) - doMoveFileToDir(vertical4KImageList, vertical4kImagePath) + if len(vars.ImageVertical4KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_4K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical4KList, imageDirPath) } - if len(vertical5KImageList) > 0 { - vertical5kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_5K" - util.CreateDir(vertical5kImagePath) - doMoveFileToDir(vertical5KImageList, vertical5kImagePath) + if len(vars.ImageVertical5KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_5K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical5KList, imageDirPath) } - if len(vertical6KImageList) > 0 { - vertical6kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_6K" - util.CreateDir(vertical6kImagePath) - doMoveFileToDir(vertical6KImageList, vertical6kImagePath) + if len(vars.ImageVertical6KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_6K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical6KList, imageDirPath) } - if len(vertical7KImageList) > 0 { - vertical7KImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_7K" - util.CreateDir(vertical7KImagePath) - doMoveFileToDir(vertical7KImageList, vertical7KImagePath) + if len(vars.ImageVertical7KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_7K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical7KList, imageDirPath) } - if len(vertical8KImageList) > 0 { - vertical8kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_8K" - util.CreateDir(vertical8kImagePath) - doMoveFileToDir(vertical8KImageList, vertical8kImagePath) + if len(vars.ImageVertical8KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_8K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical8KList, imageDirPath) } - if len(vertical9KImageList) > 0 { - vertical9kImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_9K" - util.CreateDir(vertical9kImagePath) - doMoveFileToDir(vertical9KImageList, vertical9kImagePath) + if len(vars.ImageVertical9KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_9K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVertical9KList, imageDirPath) } - if len(verticalHKImageList) > 0 { - verticalHkImagePath := rootDir + pathSeparator + uid + "-图片_竖屏_原图" - util.CreateDir(verticalHkImagePath) - doMoveFileToDir(verticalHKImageList, verticalHkImagePath) + if len(vars.ImageVerticalHKList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_竖屏_原图" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageVerticalHKList, imageDirPath) } } @@ -461,59 +442,59 @@ func moveVerticalImage(rootDir string, uid string) { func moveSquareImage(rootDir string, uid string) { pathSeparator := string(os.PathSeparator) // 非标准 - if len(squareNormalImageList) > 0 { - squareNormalImagePath := rootDir + pathSeparator + uid + "-图片_等比_普通" - util.CreateDir(squareNormalImagePath) - doMoveFileToDir(squareNormalImageList, squareNormalImagePath) + if len(vars.ImageSquareNormalList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_普通" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquareNormalList, imageDirPath) } - if len(square1KImageList) > 0 { - square1kImagePath := rootDir + pathSeparator + uid + "-图片_等比_1K" - util.CreateDir(square1kImagePath) - doMoveFileToDir(square1KImageList, square1kImagePath) + if len(vars.ImageSquare1KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_1K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare1KList, imageDirPath) } - if len(square2KImageList) > 0 { - square2kImagePath := rootDir + pathSeparator + uid + "-图片_等比_2K" - util.CreateDir(square2kImagePath) - doMoveFileToDir(square2KImageList, square2kImagePath) + if len(vars.ImageSquare2KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_2K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare2KList, imageDirPath) } - if len(square3KImageList) > 0 { - square3kImagePath := rootDir + pathSeparator + uid + "-图片_等比_3K" - util.CreateDir(square3kImagePath) - doMoveFileToDir(square3KImageList, square3kImagePath) + if len(vars.ImageSquare3KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_3K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare3KList, imageDirPath) } - if len(square4KImageList) > 0 { - square4kImagePath := rootDir + pathSeparator + uid + "-图片_等比_4K" - util.CreateDir(square4kImagePath) - doMoveFileToDir(square4KImageList, square4kImagePath) + if len(vars.ImageSquare4KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_4K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare4KList, imageDirPath) } - if len(square5KImageList) > 0 { - square5kImagePath := rootDir + pathSeparator + uid + "-图片_等比_5K" - util.CreateDir(square5kImagePath) - doMoveFileToDir(square5KImageList, square5kImagePath) + if len(vars.ImageSquare5KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_5K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare5KList, imageDirPath) } - if len(square6KImageList) > 0 { - square6kImagePath := rootDir + pathSeparator + uid + "-图片_等比_6K" - util.CreateDir(square6kImagePath) - doMoveFileToDir(square6KImageList, square6kImagePath) + if len(vars.ImageSquare6KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_6K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare6KList, imageDirPath) } - if len(square7KImageList) > 0 { - square7KImagePath := rootDir + pathSeparator + uid + "-图片_等比_7K" - util.CreateDir(square7KImagePath) - doMoveFileToDir(square7KImageList, square7KImagePath) + if len(vars.ImageSquare7KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_7K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare7KList, imageDirPath) } - if len(square8KImageList) > 0 { - square8kImagePath := rootDir + pathSeparator + uid + "-图片_等比_8K" - util.CreateDir(square8kImagePath) - doMoveFileToDir(square8KImageList, square8kImagePath) + if len(vars.ImageSquare8KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_8K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare8KList, imageDirPath) } - if len(square9KImageList) > 0 { - square9kImagePath := rootDir + pathSeparator + uid + "-图片_等比_9K" - util.CreateDir(square9kImagePath) - doMoveFileToDir(square9KImageList, square9kImagePath) + if len(vars.ImageSquare9KList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_9K" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquare9KList, imageDirPath) } - if len(squareHKImageList) > 0 { - squareHkImagePath := rootDir + pathSeparator + uid + "-图片_等比_原图" - util.CreateDir(squareHkImagePath) - doMoveFileToDir(squareHKImageList, squareHkImagePath) + if len(vars.ImageSquareHKList) > 0 { + imageDirPath := rootDir + pathSeparator + uid + "-图片_等比_原图" + util.CreateDir(imageDirPath) + util.DoMoveFileToDir(vars.ImageSquareHKList, imageDirPath) } } diff --git a/core/handle_video.go b/core/handle_video.go index 7a3bc61..5ecd951 100644 --- a/core/handle_video.go +++ b/core/handle_video.go @@ -1,107 +1,22 @@ package core import ( - "OdMediaPicker/util" - "OdMediaPicker/vars" - "bytes" - _ "embed" + "ImageVideoResolutionPickerTool/util" + "ImageVideoResolutionPickerTool/vars" "fmt" - "github.com/redmask-hb/GoSimplePrint/goPrint" uuid "github.com/satori/go.uuid" - "math" "os" - "os/exec" - "strconv" "strings" "time" ) -//go:embed files/ffprobe.exe -var ffprobeWin64 []byte - -var videoTag = "[PickVideo]" // 标记文件已经被整理过 -var ignoreVideoPathList []string // 忽略的文件路径 -var readErrorVideoPathList []string // 读取信息异常的路径 -var videoPath2WidthHeightMap = make(map[string]string) // 视频路径和宽高比 -var videoPath2WidthHeightTagMap = make(map[string]string) // 视频路径和宽高比[640x480] -var videoPath2DurationMap = make(map[string]string) // 视频路径和时长 -// 支持的视频格式 -var supportVideoTypes = []string{ - ".ts", - ".flv", - ".rm", - ".avi", - ".mp4", - ".mov", - ".mpg", - ".mkv", - ".m4v", - ".rmvb", - ".3gp", - ".3g2", - ".webm", - ".wmv", -} - -// 水平视频 -var horizontalNormalVideoList []string -var horizontalGifVideoList []string -var horizontal1KVideoList []string -var horizontal2KVideoList []string -var horizontal3KVideoList []string -var horizontal4KVideoList []string -var horizontal5KVideoList []string -var horizontal6KVideoList []string -var horizontal7KVideoList []string -var horizontal8KVideoList []string -var horizontal9KVideoList []string -var horizontalHKVideoList []string - -// 标准横向视频 -var horizontalStandard720PVideoList []string -var horizontalStandard1080PVideoList []string -var horizontalStandard4KVideoList []string -var horizontalStandard8KVideoList []string - -// 垂直视频 -var verticalNormalVideoList []string -var verticalGifVideoList []string -var vertical1KVideoList []string -var vertical2KVideoList []string -var vertical3KVideoList []string -var vertical4KVideoList []string -var vertical5KVideoList []string -var vertical6KVideoList []string -var vertical7KVideoList []string -var vertical8KVideoList []string -var vertical9KVideoList []string -var verticalHKVideoList []string - -// 等比视频 -var squareNormalVideoList []string -var squareGifVideoList []string -var square1KVideoList []string -var square2KVideoList []string -var square3KVideoList []string -var square4KVideoList []string -var square5KVideoList []string -var square6KVideoList []string -var square7KVideoList []string -var square8KVideoList []string -var square9KVideoList []string -var squareHKVideoList []string -var squareStandard720PVideoList []string -var squareStandard1080PVideoList []string -var squareStandard4KVideoList []string -var squareStandard8KVideoList []string - func DoHandleVideo(rootDir string) { // 释放ffprobe readerFileName := "./ffprobe.exe" if util.CheckFileIsExist(readerFileName) { _ = os.Remove(readerFileName) } - err := util.WriteByteArraysToFile(ffprobeWin64, readerFileName) + err := util.WriteByteArraysToFile(vars.VideoDecodeToolWin64, readerFileName) if err != nil { fmt.Println("=== 释放解码器失败, 5秒后将自动退出", err) time.Sleep(time.Second * 5) @@ -113,44 +28,43 @@ func DoHandleVideo(rootDir string) { ignoreCount := 0 // 忽略数 for _, videoFilePath := range vars.GlobalVideoPathList { suffix := vars.GlobalFilePath2FileExtMap[videoFilePath] - if isSupportVideo(suffix) { - width, height, err := readVideoWidthHeight(videoFilePath) + if util.IsSupportVideo(suffix) { + width, height, err := util.ReadVideoWidthHeight(videoFilePath) if err == nil { successCount = successCount + 1 - videoPath2WidthHeightMap[videoFilePath] = fmt.Sprintf("%d-%d", width, height) - videoPath2WidthHeightTagMap[videoFilePath] = fmt.Sprintf("[%dx%d]", width, height) + vars.VideoPath2WidthHeightMap[videoFilePath] = fmt.Sprintf("%d-%d", width, height) + vars.VideoPath2WidthHeightTagMap[videoFilePath] = fmt.Sprintf("[%dx%d]", width, height) fmt.Printf("=== Video总数: %d, 已读取Info: %d, 成功数: %d, 失败数: %d \n", total, successCount+errorCount+ignoreCount, successCount, errorCount) - duration := readVideoDuration(videoFilePath) + duration := util.ReadVideoDuration(videoFilePath) if duration == 0 { - videoPath2DurationMap[videoFilePath] = "0H0M0S" + vars.VideoPath2DurationMap[videoFilePath] = "0H0M0S" } else { - videoPath2DurationMap[videoFilePath] = util.SecondsToHms(duration) + vars.VideoPath2DurationMap[videoFilePath] = util.SecondsToHms(duration) } } else { errorCount = errorCount + 1 - readErrorVideoPathList = append(readErrorVideoPathList, videoFilePath) + vars.VideoReadErrorPathList = append(vars.VideoReadErrorPathList, videoFilePath) fmt.Printf("=== 异常视频: %s \n", videoFilePath) } continue } // 其他的直接先忽略吧, 爱改改, 不改拉倒 ignoreCount = ignoreCount + 1 - ignoreVideoPathList = append(ignoreVideoPathList, videoFilePath) + vars.VideoIgnorePathList = append(vars.VideoIgnorePathList, videoFilePath) } - //uuid := strings.ReplaceAll(uuid.NewV4().String(), "-", "") - if len(readErrorVideoPathList) > 0 { + if len(vars.VideoReadErrorPathList) > 0 { readInfoErrorPath := rootDir + string(os.PathSeparator) + "读取异常" if util.CreateDir(readInfoErrorPath) { - doMoveFileToDir(readErrorVideoPathList, readInfoErrorPath) + util.DoMoveFileToDir(vars.VideoReadErrorPathList, readInfoErrorPath) } } - if len(ignoreVideoPathList) > 0 { + if len(vars.VideoIgnorePathList) > 0 { ignorePath := rootDir + string(os.PathSeparator) + "已忽略" if util.CreateDir(ignorePath) { - doMoveFileToDir(ignoreVideoPathList, ignorePath) + util.DoMoveFileToDir(vars.VideoIgnorePathList, ignorePath) } } - doPickVideoFile(rootDir, videoPath2WidthHeightMap) + doPickVideoFile(rootDir, vars.VideoPath2WidthHeightMap) // 删除ffprobe if util.CheckFileIsExist(readerFileName) { _ = os.Remove(readerFileName) @@ -158,100 +72,6 @@ func DoHandleVideo(rootDir string) { fmt.Printf("=== 视频处理完毕 \n\n") } -// getVideoDuration 使用ffprobe获取视频时长 -func getVideoDuration(ffmpegExecPath string, videoPath string) (float64, error) { - // ffprobe命令,-v error 用于减少输出信息,-show_entries format=duration -of compact=p=0,nk=1 用于只输出时长 - cmd := exec.Command(ffmpegExecPath, "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", videoPath) - var stderr bytes.Buffer - cmd.Stderr = &stderr - - output, err := cmd.Output() - if err != nil { - return 0, fmt.Errorf("ffprobe failed with error: %v, stderr: %q", err, stderr.String()) - } - - // 解析输出的时长字符串为浮点数 - durationStr := strings.TrimSpace(string(output)) - duration, err := strconv.ParseFloat(durationStr, 64) - if err != nil { - return 0, fmt.Errorf("failed to parse duration: %q, error: %v", durationStr, err) - } - - return duration, nil -} - -func getVideoResolution(ffmpegExecPath string, filePath string) (width int, height int, err error) { - // 构建ffprobe命令 - cmd := exec.Command(ffmpegExecPath, "-v", "error", "-show_entries", "stream=width,height", "-of", "csv=p=0:s=x", filePath) - // 执行命令并捕获输出 - output, err := cmd.Output() - if err != nil { - return 0, 0, fmt.Errorf("failed to run ffprobe: %w", err) - } - // 解析输出字符串,格式应为 "宽度,高度" - resolutionStr := strings.TrimSpace(string(output)) - parts := strings.Split(resolutionStr, ",") - if len(parts) == 2 { - width = util.String2int(parts[0]) - height = util.String2int(parts[1]) - return width, height, nil - } - parts = strings.Split(resolutionStr, "x") - if len(parts) == 2 { - width = util.String2int(parts[0]) - height = util.String2int(parts[1]) - return width, height, nil - } - parts = strings.Split(resolutionStr, "\r\n\r\n\r\n\r\n") - if len(parts) == 2 { - tempHw := parts[0] - parts = strings.Split(tempHw, "x") - if len(parts) == 2 { - width = util.String2int(parts[0]) - height = util.String2int(parts[1]) - return width, height, nil - } - } - parts = strings.Split(resolutionStr, "x") - if len(parts) == 3 { - width = util.String2int(parts[0]) - height = util.String2int(parts[1]) - return width, height, nil - } - resolutionStr = strings.ReplaceAll(resolutionStr, "\r", "") - resolutionStr = strings.ReplaceAll(resolutionStr, "\n", "") - resolutionStr = strings.ReplaceAll(resolutionStr, "N/AxN/A", "") - parts = strings.Split(resolutionStr, "x") - if len(parts) == 2 { - width = util.String2int(parts[0]) - height = util.String2int(parts[1]) - return width, height, nil - } - return 0, 0, fmt.Errorf("invalid resolution format: %s", resolutionStr) -} - -// 获取视频的时长,单位秒 -func readVideoDuration(videoFilePath string) int { - duration, err := getVideoDuration("./ffprobe.exe", videoFilePath) - if err != nil { - fmt.Println("=== Error getting video duration:", err) - return 0 - } - //fmt.Printf("=== Video duration: %.2f seconds\n", duration) - return int(math.Floor(duration)) // 向下取整 -} - -// 获取视频的分辨率 -func readVideoWidthHeight(videoFilePath string) (int, int, error) { - width, height, err := getVideoResolution("./ffprobe.exe", videoFilePath) - if err != nil { - fmt.Printf("=== Error getting resolution: %v\n", err) - return 0, 0, err - } - //fmt.Printf("=== Video resolution: %dx%d\n", width, height) - return width, height, nil -} - // 条件视频并分组存放 func doPickVideoFile(rootDir string, videoPath2WidthHeightMap map[string]string) { if len(videoPath2WidthHeightMap) == 0 { @@ -287,465 +107,388 @@ func doPickVideoFile(rootDir string, videoPath2WidthHeightMap map[string]string) // 移动垂直视频 func moveVerticalVideo(uid string, rootDir string) { pathSeparator := string(os.PathSeparator) - if len(vertical1KVideoList) > 0 { - vertical1KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_1k" - util.CreateDir(vertical1KVideoPath) - doMoveFileToDir(vertical1KVideoList, vertical1KVideoPath) + if len(vars.VideoVertical1KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_1k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical1KList, videoDirPath) } - if len(vertical2KVideoList) > 0 { - vertical2KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_2k" - util.CreateDir(vertical2KVideoPath) - doMoveFileToDir(vertical2KVideoList, vertical2KVideoPath) + if len(vars.VideoVertical2KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_2k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical2KList, videoDirPath) } - if len(vertical3KVideoList) > 0 { - vertical3KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_3k" - util.CreateDir(vertical3KVideoPath) - doMoveFileToDir(vertical3KVideoList, vertical3KVideoPath) + if len(vars.VideoVertical3KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_3k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical3KList, videoDirPath) } - if len(vertical4KVideoList) > 0 { - vertical4KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_4k" - util.CreateDir(vertical4KVideoPath) - doMoveFileToDir(vertical4KVideoList, vertical4KVideoPath) + if len(vars.VideoVertical4KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_4k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical4KList, videoDirPath) } - if len(vertical5KVideoList) > 0 { - vertical5KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_5k" - util.CreateDir(vertical5KVideoPath) - doMoveFileToDir(vertical5KVideoList, vertical5KVideoPath) + if len(vars.VideoVertical5KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_5k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical5KList, videoDirPath) } - if len(vertical6KVideoList) > 0 { - vertical6KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_6k" - util.CreateDir(vertical6KVideoPath) - doMoveFileToDir(vertical6KVideoList, vertical6KVideoPath) + if len(vars.VideoVertical6KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_6k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical6KList, videoDirPath) } - if len(vertical7KVideoList) > 0 { - vertical7KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_7k" - util.CreateDir(vertical7KVideoPath) - doMoveFileToDir(vertical7KVideoList, vertical7KVideoPath) + if len(vars.VideoVertical7KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_7k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical7KList, videoDirPath) } - if len(vertical8KVideoList) > 0 { - vertical8KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_8k" - util.CreateDir(vertical8KVideoPath) - doMoveFileToDir(vertical8KVideoList, vertical8KVideoPath) + if len(vars.VideoVertical8KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_8k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical8KList, videoDirPath) } - if len(vertical9KVideoList) > 0 { - vertical9KVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_9k" - util.CreateDir(vertical9KVideoPath) - doMoveFileToDir(vertical9KVideoList, vertical9KVideoPath) + if len(vars.VideoVertical9KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_9k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVertical9KList, videoDirPath) } - if len(verticalHKVideoList) > 0 { - verticalHKVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_原画质" - util.CreateDir(verticalHKVideoPath) - doMoveFileToDir(verticalHKVideoList, verticalHKVideoPath) + if len(vars.VideoVerticalHKList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_原画质" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVerticalHKList, videoDirPath) } } -// 移动文件到根目录 -func renameFile(rootDir string, modelType string, videoList []string, pathSeparator string) { - total := len(videoList) - var count = 0 - bar := goPrint.NewBar(100) - bar.SetNotice("=== 重命名文件:") - bar.SetGraph(">") - for _, videoFilePath := range videoList { - wh := videoPath2WidthHeightTagMap[videoFilePath] - fileName := vars.GlobalFilePath2FileNameMap[videoFilePath] - if strings.Contains(fileName, videoTag) { // 处理过了 - fileNames := strings.Split(fileName, videoTag) - if len(fileNames) == 2 { - fileName = fileNames[1] - targetFilePath := rootDir + pathSeparator + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + fileName - err := os.Rename(videoFilePath, targetFilePath) - if err != nil { - fmt.Printf("=== 重命名异常: %s \n", videoFilePath) - } - } - } else { - targetFilePath := rootDir + pathSeparator + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + " - " + fileName - err := os.Rename(videoFilePath, targetFilePath) - if err != nil { - fmt.Printf("=== 重命名异常: %s \n", videoFilePath) - } - } - count = count + 1 - bar.PrintBar(util.CalcPercentage(count, total)) - } - bar.PrintEnd("=== Finish") -} - -// 移动文件到原目录 -func renameFileV2(modelType string, videoList []string) { - total := len(videoList) - var count = 0 - bar := goPrint.NewBar(100) - bar.SetNotice("=== 重命名文件:") - bar.SetGraph(">") - for _, videoFilePath := range videoList { - wh := videoPath2WidthHeightTagMap[videoFilePath] - fileName := vars.GlobalFilePath2FileNameMap[videoFilePath] - filePath := util.GetFileDirectory(videoFilePath) - if strings.Contains(fileName, videoTag) { // 处理过了 - fileNames := strings.Split(fileName, videoTag) - if len(fileNames) == 2 { - fileName = fileNames[1] - targetFilePath := filePath + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + fileName - err := os.Rename(videoFilePath, targetFilePath) - if err != nil { - fmt.Printf("=== 重命名异常: %s \n", videoFilePath) - } - } - } else { - targetFilePath := filePath + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + " - " + fileName - err := os.Rename(videoFilePath, targetFilePath) - if err != nil { - fmt.Printf("=== 重命名异常: %s \n", videoFilePath) - } - } - count = count + 1 - bar.PrintBar(util.CalcPercentage(count, total)) - } - bar.PrintEnd("=== Finish") -} - // 移动水平视频 func moveHorizontalVideo(uid string, rootDir string) { pathSeparator := string(os.PathSeparator) - if len(horizontal1KVideoList) > 0 { - horizontal1KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_1k" - util.CreateDir(horizontal1KVideoPath) - doMoveFileToDir(horizontal1KVideoList, horizontal1KVideoPath) + if len(vars.VideoHorizontal1KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_1k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal1KList, videoDirPath) } - if len(horizontal2KVideoList) > 0 { - horizontal2KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_2k" - util.CreateDir(horizontal2KVideoPath) - doMoveFileToDir(horizontal2KVideoList, horizontal2KVideoPath) + if len(vars.VideoHorizontal2KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_2k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal2KList, videoDirPath) } - if len(horizontal3KVideoList) > 0 { - horizontal3KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_3k" - util.CreateDir(horizontal3KVideoPath) - doMoveFileToDir(horizontal3KVideoList, horizontal3KVideoPath) + if len(vars.VideoHorizontal3KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_3k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal3KList, videoDirPath) } - if len(horizontal4KVideoList) > 0 { - horizontal4KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_4k" - util.CreateDir(horizontal4KVideoPath) - doMoveFileToDir(horizontal4KVideoList, horizontal4KVideoPath) + if len(vars.VideoHorizontal4KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_4k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal4KList, videoDirPath) } - if len(horizontal5KVideoList) > 0 { - horizontal5KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_5k" - util.CreateDir(horizontal5KVideoPath) - doMoveFileToDir(horizontal5KVideoList, horizontal5KVideoPath) + if len(vars.VideoHorizontal5KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_5k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal5KList, videoDirPath) } - if len(horizontal6KVideoList) > 0 { - horizontal6KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_6k" - util.CreateDir(horizontal6KVideoPath) - doMoveFileToDir(horizontal6KVideoList, horizontal6KVideoPath) + if len(vars.VideoHorizontal6KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_6k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal6KList, videoDirPath) } - if len(horizontal7KVideoList) > 0 { - horizontal7KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_7k" - util.CreateDir(horizontal7KVideoPath) - doMoveFileToDir(horizontal7KVideoList, horizontal7KVideoPath) + if len(vars.VideoHorizontal7KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_7k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal7KList, videoDirPath) } - if len(horizontal8KVideoList) > 0 { - horizontal8KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_8k" - util.CreateDir(horizontal8KVideoPath) - doMoveFileToDir(horizontal8KVideoList, horizontal8KVideoPath) + if len(vars.VideoHorizontal8KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_8k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal8KList, videoDirPath) } - if len(horizontal9KVideoList) > 0 { - horizontal9KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_9k" - util.CreateDir(horizontal9KVideoPath) - doMoveFileToDir(horizontal9KVideoList, horizontal9KVideoPath) + if len(vars.VideoHorizontal9KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_9k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontal9KList, videoDirPath) } - if len(horizontalHKVideoList) > 0 { - horizontalHKVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_原画质" - util.CreateDir(horizontalHKVideoPath) - doMoveFileToDir(horizontalHKVideoList, horizontalHKVideoPath) + if len(vars.VideoHorizontalHKList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_原画质" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalHKList, videoDirPath) } - if len(horizontalStandard720PVideoList) > 0 { - horizontal720PVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_720P" - util.CreateDir(horizontal720PVideoPath) - doMoveFileToDir(horizontalStandard720PVideoList, horizontal720PVideoPath) + if len(vars.VideoHorizontalStandard720PList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_720P" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard720PList, videoDirPath) } - if len(horizontalStandard1080PVideoList) > 0 { - horizontal1080PVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_1080P" - util.CreateDir(horizontal1080PVideoPath) - doMoveFileToDir(horizontalStandard1080PVideoList, horizontal1080PVideoPath) + if len(vars.VideoHorizontalStandard1D5PList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_1D5KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard1D5PList, videoDirPath) } - if len(horizontalStandard4KVideoList) > 0 { - horizontal4KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_4K" - util.CreateDir(horizontal4KVideoPath) - doMoveFileToDir(horizontalStandard4KVideoList, horizontal4KVideoPath) + if len(vars.VideoHorizontalStandard1080PList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_1080P" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard1080PList, videoDirPath) } - if len(horizontalStandard8KVideoList) > 0 { - horizontal8KVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_8K" - util.CreateDir(horizontal8KVideoPath) - doMoveFileToDir(horizontalStandard8KVideoList, horizontal8KVideoPath) + if len(vars.VideoHorizontalStandard2DKList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_2DKP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard2DKList, videoDirPath) + } + if len(vars.VideoHorizontalStandard2D5KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_2D5KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard2D5KList, videoDirPath) + } + if len(vars.VideoHorizontalStandardUltraWide2List) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_UltraWide2KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandardUltraWide2List, videoDirPath) + } + if len(vars.VideoHorizontalStandardUltraWide3List) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_UltraWide3KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandardUltraWide3List, videoDirPath) + } + if len(vars.VideoHorizontalStandardUltraWide4List) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_UltraWide4KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandardUltraWide4List, videoDirPath) + } + if len(vars.VideoHorizontalStandard4KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_4KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard4KList, videoDirPath) + } + if len(vars.VideoHorizontalStandard4KHList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_4KHP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard4KHList, videoDirPath) + } + if len(vars.VideoHorizontalStandard8KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_8KP" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalStandard8KList, videoDirPath) } } // 移动等比视频 func moveSquareVideo(uid string, rootDir string) { pathSeparator := string(os.PathSeparator) - if len(square1KVideoList) > 0 { - square1KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_1k" - util.CreateDir(square1KVideoPath) - doMoveFileToDir(square1KVideoList, square1KVideoPath) + if len(vars.VideoSquare1KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_1k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare1KList, videoDirPath) } - if len(square2KVideoList) > 0 { - square2KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_2k" - util.CreateDir(square2KVideoPath) - doMoveFileToDir(square2KVideoList, square2KVideoPath) + if len(vars.VideoSquare2KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_2k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare2KList, videoDirPath) } - if len(square3KVideoList) > 0 { - square3KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_3k" - util.CreateDir(square3KVideoPath) - doMoveFileToDir(square3KVideoList, square3KVideoPath) + if len(vars.VideoSquare3KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_3k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare3KList, videoDirPath) } - if len(square4KVideoList) > 0 { - square4KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_4k" - util.CreateDir(square4KVideoPath) - doMoveFileToDir(square4KVideoList, square4KVideoPath) + if len(vars.VideoSquare4KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_4k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare4KList, videoDirPath) } - if len(square5KVideoList) > 0 { - square5KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_5k" - util.CreateDir(square5KVideoPath) - doMoveFileToDir(square5KVideoList, square5KVideoPath) + if len(vars.VideoSquare5KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_5k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare5KList, videoDirPath) } - if len(square6KVideoList) > 0 { - square6KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_6k" - util.CreateDir(square6KVideoPath) - doMoveFileToDir(square6KVideoList, square6KVideoPath) + if len(vars.VideoSquare6KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_6k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare6KList, videoDirPath) } - if len(square7KVideoList) > 0 { - square7KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_7k" - util.CreateDir(square7KVideoPath) - doMoveFileToDir(square7KVideoList, square7KVideoPath) + if len(vars.VideoSquare7KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_7k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare7KList, videoDirPath) } - if len(square8KVideoList) > 0 { - square8KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_8k" - util.CreateDir(square8KVideoPath) - doMoveFileToDir(square8KVideoList, square8KVideoPath) + if len(vars.VideoSquare8KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_8k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare8KList, videoDirPath) } - if len(square9KVideoList) > 0 { - square9KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_9k" - util.CreateDir(square9KVideoPath) - doMoveFileToDir(square9KVideoList, square9KVideoPath) + if len(vars.VideoSquare9KList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_9k" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquare9KList, videoDirPath) } - if len(squareHKVideoList) > 0 { - squareHKVideoPath := rootDir + pathSeparator + uid + "-视频_等比_原画质" - util.CreateDir(squareHKVideoPath) - doMoveFileToDir(squareHKVideoList, squareHKVideoPath) - } - if len(squareStandard720PVideoList) > 0 { - square720PVideoPath := rootDir + pathSeparator + uid + "-视频_等比_720P" - util.CreateDir(square720PVideoPath) - doMoveFileToDir(squareStandard720PVideoList, square720PVideoPath) - } - if len(squareStandard1080PVideoList) > 0 { - square1080PVideoPath := rootDir + pathSeparator + uid + "-视频_等比_1080P" - util.CreateDir(square1080PVideoPath) - doMoveFileToDir(squareStandard1080PVideoList, square1080PVideoPath) - } - if len(squareStandard4KVideoList) > 0 { - square4KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_4K" - util.CreateDir(square4KVideoPath) - doMoveFileToDir(squareStandard4KVideoList, square4KVideoPath) - } - if len(squareStandard8KVideoList) > 0 { - square8KVideoPath := rootDir + pathSeparator + uid + "-视频_等比_8K" - util.CreateDir(square8KVideoPath) - doMoveFileToDir(squareStandard8KVideoList, square8KVideoPath) + if len(vars.VideoSquareHKList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_原画质" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquareHKList, videoDirPath) } } // 移动普通视频 func moveNormalVideo(uid string, rootDir string) { pathSeparator := string(os.PathSeparator) - if len(horizontalNormalVideoList) > 0 { - horizontalNormalVideoPath := rootDir + pathSeparator + uid + "-视频_横屏_普通" - util.CreateDir(horizontalNormalVideoPath) - doMoveFileToDir(horizontalNormalVideoList, horizontalNormalVideoPath) + if len(vars.VideoHorizontalNormalList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_横屏_普通" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoHorizontalNormalList, videoDirPath) } - if len(verticalNormalVideoList) > 0 { - verticalNormalVideoPath := rootDir + pathSeparator + uid + "-视频_竖屏_普通" - util.CreateDir(verticalNormalVideoPath) - doMoveFileToDir(verticalNormalVideoList, verticalNormalVideoPath) + if len(vars.VideoVerticalNormalList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_竖屏_普通" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoVerticalNormalList, videoDirPath) } - if len(squareNormalVideoList) > 0 { - squareNormalVideoPath := rootDir + pathSeparator + uid + "-视频_等比_普通" - util.CreateDir(squareNormalVideoPath) - doMoveFileToDir(squareNormalVideoList, squareNormalVideoPath) + if len(vars.VideoSquareNormalList) > 0 { + videoDirPath := rootDir + pathSeparator + uid + "-视频_等比_普通" + util.CreateDir(videoDirPath) + util.DoMoveFileToDir(vars.VideoSquareNormalList, videoDirPath) } } // 处理垂直视频 func handleVerticalVideo(currentVideoPath string, height int, suffix string) { if strings.EqualFold(suffix, ".gif") { - verticalGifVideoList = append(verticalGifVideoList, currentVideoPath) + vars.VideoVerticalGifList = append(vars.VideoVerticalGifList, currentVideoPath) return } if height < 1000 { - verticalNormalVideoList = append(verticalNormalVideoList, currentVideoPath) + vars.VideoVerticalNormalList = append(vars.VideoVerticalNormalList, currentVideoPath) } else if height < 2000 { - vertical1KVideoList = append(vertical1KVideoList, currentVideoPath) + vars.VideoVertical1KList = append(vars.VideoVertical1KList, currentVideoPath) } else if height < 3000 { - vertical2KVideoList = append(vertical2KVideoList, currentVideoPath) + vars.VideoVertical2KList = append(vars.VideoVertical2KList, currentVideoPath) } else if height < 4000 { - vertical3KVideoList = append(vertical3KVideoList, currentVideoPath) + vars.VideoVertical3KList = append(vars.VideoVertical3KList, currentVideoPath) } else if height < 5000 { - vertical4KVideoList = append(vertical4KVideoList, currentVideoPath) + vars.VideoVertical4KList = append(vars.VideoVertical4KList, currentVideoPath) } else if height < 6000 { - vertical5KVideoList = append(vertical5KVideoList, currentVideoPath) + vars.VideoVertical5KList = append(vars.VideoVertical5KList, currentVideoPath) } else if height < 7000 { - vertical6KVideoList = append(vertical6KVideoList, currentVideoPath) + vars.VideoVertical6KList = append(vars.VideoVertical6KList, currentVideoPath) } else if height < 8000 { - vertical7KVideoList = append(vertical7KVideoList, currentVideoPath) + vars.VideoVertical7KList = append(vars.VideoVertical7KList, currentVideoPath) } else if height < 9000 { - vertical8KVideoList = append(vertical8KVideoList, currentVideoPath) + vars.VideoVertical8KList = append(vars.VideoVertical8KList, currentVideoPath) } else if height < 10000 { - vertical9KVideoList = append(vertical9KVideoList, currentVideoPath) + vars.VideoVertical9KList = append(vars.VideoVertical9KList, currentVideoPath) } else if height > 10000 { - verticalHKVideoList = append(verticalHKVideoList, currentVideoPath) + vars.VideoVerticalHKList = append(vars.VideoVerticalHKList, currentVideoPath) } } // 处理横向视频 func handleHorizontalVideo(currentVideoPath string, width int, height int, suffix string) { if strings.EqualFold(suffix, ".gif") { - horizontalGifVideoList = append(horizontalGifVideoList, currentVideoPath) + vars.VideoHorizontalGifList = append(vars.VideoHorizontalGifList, currentVideoPath) return } + // 1280×720(720p)—— 标准高清(HD),常用于早期高清视频或小型屏幕 + if width == 1280 && height == 720 { + vars.VideoHorizontalStandard720PList = append(vars.VideoHorizontalStandard720PList, currentVideoPath) + return + } + // 1600×900—— 介于HD和FHD之间 + if width == 1600 && height == 900 { + vars.VideoHorizontalStandard1D5PList = append(vars.VideoHorizontalStandard1D5PList, currentVideoPath) + return + } + // 1920×1080(1080p)—— 全高清,主流显示器、电视和视频的分辨率 + if width == 1920 && height == 1080 { + vars.VideoHorizontalStandard1080PList = append(vars.VideoHorizontalStandard1080PList, currentVideoPath) + return + } + // 2048×1080(2dk)—— 影院2k + if width == 2048 && height == 1080 { + vars.VideoHorizontalStandard2DKList = append(vars.VideoHorizontalStandard2DKList, currentVideoPath) + return + } + // 2560×1440(1440p)—— 俗称“2.5K”,电竞显示器或高端手机屏幕 + if width == 2560 && height == 1440 { + vars.VideoHorizontalStandard2D5KList = append(vars.VideoHorizontalStandard2D5KList, currentVideoPath) + return + } + // 2560×1080—— 带鱼屏显示器(超宽屏) + if width == 2560 && height == 1080 { + vars.VideoHorizontalStandardUltraWide2List = append(vars.VideoHorizontalStandardUltraWide2List, currentVideoPath) + return + } + // 3440×1440—— 带鱼屏显示器(超宽屏) + if width == 3440 && height == 1440 { + vars.VideoHorizontalStandardUltraWide3List = append(vars.VideoHorizontalStandardUltraWide3List, currentVideoPath) + return + } + // 5120×2160—— 带鱼屏显示器(超宽屏) + if width == 5120 && height == 2160 { + vars.VideoHorizontalStandardUltraWide4List = append(vars.VideoHorizontalStandardUltraWide4List, currentVideoPath) + return + } + // 3840×2160(主流4K)—— 超高清,现代高端显示器、电视和影视制作 + if width == 3840 && height == 2160 { + vars.VideoHorizontalStandard4KList = append(vars.VideoHorizontalStandard4KList, currentVideoPath) + return + } + // 4096×2160(DCI 4K)—— 电影行业标准 + if width == 4096 && height == 2160 { + vars.VideoHorizontalStandard4KHList = append(vars.VideoHorizontalStandard4KHList, currentVideoPath) + return + } + // 7680×4320—— 超高清,用于专业影视或高端设备 + if width == 7680 && height == 4320 { + vars.VideoHorizontalStandard8KList = append(vars.VideoHorizontalStandard8KList, currentVideoPath) + return + } + // 非标规格 if width < 1000 { - // 160 × 120 - // 320 × 180 - // 320 × 240 - // 640 × 360 - // 640 × 480 - horizontalNormalVideoList = append(horizontalNormalVideoList, currentVideoPath) + vars.VideoHorizontalNormalList = append(vars.VideoHorizontalNormalList, currentVideoPath) } else if width < 2000 { - // 1280 x 720 -> 720p - if width == 1280 && height == 720 { - horizontalStandard720PVideoList = append(horizontalStandard720PVideoList, currentVideoPath) - return - } - // 1920 x 1080 -> 1080p - if width == 1920 && height == 1080 { - horizontalStandard1080PVideoList = append(horizontalStandard1080PVideoList, currentVideoPath) - return - } - horizontal1KVideoList = append(horizontal1KVideoList, currentVideoPath) + vars.VideoHorizontal1KList = append(vars.VideoHorizontal1KList, currentVideoPath) } else if width < 3000 { - horizontal2KVideoList = append(horizontal2KVideoList, currentVideoPath) + vars.VideoHorizontal2KList = append(vars.VideoHorizontal2KList, currentVideoPath) } else if width < 4000 { - // 3840 x 2160 -> 4k - if width == 3840 && height == 2160 { - horizontalStandard4KVideoList = append(horizontalStandard4KVideoList, currentVideoPath) - return - } - horizontal3KVideoList = append(horizontal3KVideoList, currentVideoPath) + vars.VideoHorizontal3KList = append(vars.VideoHorizontal3KList, currentVideoPath) } else if width < 5000 { - horizontal4KVideoList = append(horizontal4KVideoList, currentVideoPath) + vars.VideoHorizontal4KList = append(vars.VideoHorizontal4KList, currentVideoPath) } else if width < 6000 { - horizontal5KVideoList = append(horizontal5KVideoList, currentVideoPath) + vars.VideoHorizontal5KList = append(vars.VideoHorizontal5KList, currentVideoPath) } else if width < 7000 { - horizontal6KVideoList = append(horizontal6KVideoList, currentVideoPath) + vars.VideoHorizontal6KList = append(vars.VideoHorizontal6KList, currentVideoPath) } else if width < 8000 { - // 7680 x 4320 -> 8k - if width == 7680 && height == 4320 { - horizontalStandard8KVideoList = append(horizontalStandard8KVideoList, currentVideoPath) - return - } - horizontal7KVideoList = append(horizontal7KVideoList, currentVideoPath) + vars.VideoHorizontal7KList = append(vars.VideoHorizontal7KList, currentVideoPath) } else if width < 9000 { - horizontal8KVideoList = append(horizontal8KVideoList, currentVideoPath) + vars.VideoHorizontal8KList = append(vars.VideoHorizontal8KList, currentVideoPath) } else if width < 10000 { - horizontal9KVideoList = append(horizontal9KVideoList, currentVideoPath) - } else if width > 10000 { - horizontalHKVideoList = append(horizontalHKVideoList, currentVideoPath) + vars.VideoHorizontal9KList = append(vars.VideoHorizontal9KList, currentVideoPath) + } else if width >= 10000 { // 提示请忽略 + vars.VideoHorizontalHKList = append(vars.VideoHorizontalHKList, currentVideoPath) } } // 处理等比视频 func handleSquareVideo(currentVideoPath string, width int, height int, suffix string) { if strings.EqualFold(suffix, ".gif") { - squareGifVideoList = append(squareGifVideoList, currentVideoPath) - return - } - // 1280 x 720 -> 720p - if width == 1280 && height == 720 { - squareStandard720PVideoList = append(squareStandard720PVideoList, currentVideoPath) - return - } - // 1920 x 1080 -> 1080p - if width == 1920 && height == 1080 { - squareStandard1080PVideoList = append(squareStandard1080PVideoList, currentVideoPath) - return - } - // 3840 x 2160 -> 4k - if width == 3840 && height == 2160 { - squareStandard4KVideoList = append(squareStandard4KVideoList, currentVideoPath) - return - } - // 7680 x 4320 -> 8k - if width == 7680 && height == 4320 { - squareStandard8KVideoList = append(squareStandard8KVideoList, currentVideoPath) + vars.VideoSquareGifList = append(vars.VideoSquareGifList, currentVideoPath) return } if width < 1000 { - squareNormalVideoList = append(squareNormalVideoList, currentVideoPath) + vars.VideoSquareNormalList = append(vars.VideoSquareNormalList, currentVideoPath) } else if width < 2000 { - square1KVideoList = append(square1KVideoList, currentVideoPath) + vars.VideoSquare1KList = append(vars.VideoSquare1KList, currentVideoPath) } else if width < 3000 { - square2KVideoList = append(square2KVideoList, currentVideoPath) + vars.VideoSquare2KList = append(vars.VideoSquare2KList, currentVideoPath) } else if width < 4000 { - square3KVideoList = append(square3KVideoList, currentVideoPath) + vars.VideoSquare3KList = append(vars.VideoSquare3KList, currentVideoPath) } else if width < 5000 { - square4KVideoList = append(square4KVideoList, currentVideoPath) + vars.VideoSquare4KList = append(vars.VideoSquare4KList, currentVideoPath) } else if width < 6000 { - square5KVideoList = append(square5KVideoList, currentVideoPath) + vars.VideoSquare5KList = append(vars.VideoSquare5KList, currentVideoPath) } else if width < 7000 { - square6KVideoList = append(square6KVideoList, currentVideoPath) + vars.VideoSquare6KList = append(vars.VideoSquare6KList, currentVideoPath) } else if width < 8000 { - square7KVideoList = append(square7KVideoList, currentVideoPath) + vars.VideoSquare7KList = append(vars.VideoSquare7KList, currentVideoPath) } else if width < 9000 { - square8KVideoList = append(square8KVideoList, currentVideoPath) + vars.VideoSquare8KList = append(vars.VideoSquare8KList, currentVideoPath) } else if width < 10000 { - square9KVideoList = append(square9KVideoList, currentVideoPath) + vars.VideoSquare9KList = append(vars.VideoSquare9KList, currentVideoPath) } else if width > 10000 { - squareHKVideoList = append(squareHKVideoList, currentVideoPath) + vars.VideoSquareHKList = append(vars.VideoSquareHKList, currentVideoPath) } } - -// 判断是否属于支持的视频 -func isSupportVideo(videoType string) bool { - for _, supportVideoType := range supportVideoTypes { - if strings.EqualFold(videoType, supportVideoType) { - return true - } - } - return false -} - -// 批量移动文件到目录 -func doMoveFileToDir(filePatnList []string, videoDirPath string) { - total := len(filePatnList) - var count = 0 - bar := goPrint.NewBar(100) - bar.SetNotice("=== 移动文件到目录:") - bar.SetGraph(">") - pathSeparator := string(os.PathSeparator) - for _, videoFilePath := range filePatnList { - moveFileToDir(videoFilePath, videoDirPath+pathSeparator) - count = count + 1 - bar.PrintBar(util.CalcPercentage(count, total)) - } - bar.PrintEnd("=== Finish") -} - -// 移动文件到目录 -func moveFileToDir(sourceFilePath string, targetDirectory string) bool { - splits := strings.Split(sourceFilePath, string(os.PathSeparator)) - fileName := splits[len(splits)-1] - targetFilePath := targetDirectory + fileName - err := os.Rename(sourceFilePath, targetFilePath) - //fmt.Printf("=== 移动文件, 源: %s, 目标: %s \n", sourceFilePath, targetFilePath) - return err == nil -} diff --git a/core/webp.go b/core/webp.go index cce8693..4dcf4ab 100644 --- a/core/webp.go +++ b/core/webp.go @@ -6,8 +6,8 @@ import ( "os" ) -// 读取webp格式的图片信息 -func readWebpTypeImage(webpFilePath string) (err error, width int, height int) { +// ReadWebpImage 读取webp格式的图片信息 +func ReadWebpImage(webpFilePath string) (err error, width int, height int) { // 打开WebP文件 file, err := os.Open(webpFilePath) if err != nil { diff --git a/doc/ffmpeg-master-latest-win64-gpl.zip b/doc/ffmpeg-master-latest-win64-gpl.zip new file mode 100644 index 0000000..30a0e34 --- /dev/null +++ b/doc/ffmpeg-master-latest-win64-gpl.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6080e34165fcb0261f979bb1cef26c5fce616e2a416384b50bcce956aa265018 +size 140416365 diff --git a/doc/upx-4.2.3-win64.zip b/doc/upx-4.2.3-win64.zip new file mode 100644 index 0000000..472fcf3 --- /dev/null +++ b/doc/upx-4.2.3-win64.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f0458eb44ef2a9f8a3d02946e2d1382b1dac3e4a95d4dacf662ede567abfc59 +size 612889 diff --git a/go.mod b/go.mod index 502361a..edf9b73 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module OdMediaPicker +module ImageVideoResolutionPickerTool go 1.19 diff --git a/main.go b/main.go index 46c9ea8..3ad8e49 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,8 @@ package main import ( - "OdMediaPicker/core" - "OdMediaPicker/vars" + "ImageVideoResolutionPickerTool/core" + "ImageVideoResolutionPickerTool/vars" _ "embed" "fmt" _ "image/gif" // 导入gif支持 @@ -13,11 +13,14 @@ import ( ) func main() { + fmt.Println("=== 警告:该程序会改变目录结构,将在5秒后开始执行") + time.Sleep(time.Second * 5) rootDir, err := os.Getwd() if err != nil { fmt.Println("=== 获取当前路径异常", err) return } + rootDir = "E:\\DGD\\d20250424\\video" scanner := core.FileScanner{} scanner.DoScan(rootDir) scanner.DoFilter() @@ -27,6 +30,4 @@ func main() { if len(vars.GlobalVideoPathList) > 0 { core.DoHandleVideo(rootDir) } - fmt.Println("=== 5s后自动退出") - time.Sleep(time.Second * 5) } diff --git a/upx.exe b/upx.exe index d039224..fe94469 100644 Binary files a/upx.exe and b/upx.exe differ diff --git a/util/cale.go b/util/cale.go new file mode 100644 index 0000000..7105688 --- /dev/null +++ b/util/cale.go @@ -0,0 +1,32 @@ +package util + +import ( + "fmt" + "strconv" + "time" +) + +// String2int 字符串转int +func String2int(str string) int { + intValue, err := strconv.Atoi(str) + if err != nil { + return 0 + } + return intValue +} + +// SecondsToHms 将秒数转换为小时、分钟、秒的格式 +func SecondsToHms(seconds int) string { + t := time.Duration(seconds) * time.Second + h := t / time.Hour + t -= h * time.Hour + m := t / time.Minute + t -= m * time.Minute + s := t / time.Second + return fmt.Sprintf("%02d-%02d-%02d", h, m, s) +} + +// CalcPercentage 计算percentage相对于total的百分比 +func CalcPercentage(percentage int, total int) int { + return int(float64(percentage) / float64(total) * 100) +} diff --git a/util/file.go b/util/file.go new file mode 100644 index 0000000..422ee2a --- /dev/null +++ b/util/file.go @@ -0,0 +1,111 @@ +package util + +import ( + "github.com/gabriel-vasile/mimetype" + "io/ioutil" + "log" + "os" + "path/filepath" +) + +// CreateDir 创建目录 +func CreateDir(dirPath string) bool { + err := os.Mkdir(dirPath, 0755) + return err == nil +} + +// GetFileDirectory 获取文件所在文件夹 +func GetFileDirectory(filePath string) string { + directoryPath, _ := filepath.Split(filePath) + return directoryPath +} + +// ReadFileMimeInfo 获取文件mime信息 +func ReadFileMimeInfo(filepath string) *mimetype.MIME { + mt, err := mimetype.DetectFile(filepath) + if err != nil { + log.Fatal(err) + } + return mt +} + +// CheckFileIsExist 判断文件是否存在,存在返回 true,不存在返回false +func CheckFileIsExist(filename string) bool { + var exist = true + if _, err := os.Stat(filename); os.IsNotExist(err) { + exist = false + } + return exist +} + +// WriteByteArraysToFile 写字节数组到文件 +func WriteByteArraysToFile(content []byte, filename string) error { + return ioutil.WriteFile(filename, content, 0777) +} + +//// 移动文件到根目录 +//func renameFile(rootDir string, modelType string, videoList []string, pathSeparator string) { +// total := len(videoList) +// var count = 0 +// bar := goPrint.NewBar(100) +// bar.SetNotice("=== 重命名文件:") +// bar.SetGraph(">") +// for _, videoFilePath := range videoList { +// wh := videoPath2WidthHeightTagMap[videoFilePath] +// fileName := vars.GlobalFilePath2FileNameMap[videoFilePath] +// if strings.Contains(fileName, videoTag) { // 处理过了 +// fileNames := strings.Split(fileName, videoTag) +// if len(fileNames) == 2 { +// fileName = fileNames[1] +// targetFilePath := rootDir + pathSeparator + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + fileName +// err := os.Rename(videoFilePath, targetFilePath) +// if err != nil { +// fmt.Printf("=== 重命名异常: %s \n", videoFilePath) +// } +// } +// } else { +// targetFilePath := rootDir + pathSeparator + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + " - " + fileName +// err := os.Rename(videoFilePath, targetFilePath) +// if err != nil { +// fmt.Printf("=== 重命名异常: %s \n", videoFilePath) +// } +// } +// count = count + 1 +// bar.PrintBar(util.CalcPercentage(count, total)) +// } +// bar.PrintEnd("=== Finish") +//} +// +//// 移动文件到原目录 +//func renameFileV2(modelType string, videoList []string) { +// total := len(videoList) +// var count = 0 +// bar := goPrint.NewBar(100) +// bar.SetNotice("=== 重命名文件:") +// bar.SetGraph(">") +// for _, videoFilePath := range videoList { +// wh := videoPath2WidthHeightTagMap[videoFilePath] +// fileName := vars.GlobalFilePath2FileNameMap[videoFilePath] +// filePath := util.GetFileDirectory(videoFilePath) +// if strings.Contains(fileName, videoTag) { // 处理过了 +// fileNames := strings.Split(fileName, videoTag) +// if len(fileNames) == 2 { +// fileName = fileNames[1] +// targetFilePath := filePath + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + fileName +// err := os.Rename(videoFilePath, targetFilePath) +// if err != nil { +// fmt.Printf("=== 重命名异常: %s \n", videoFilePath) +// } +// } +// } else { +// targetFilePath := filePath + "[" + videoPath2DurationMap[videoFilePath] + "]" + modelType + wh + videoTag + " - " + fileName +// err := os.Rename(videoFilePath, targetFilePath) +// if err != nil { +// fmt.Printf("=== 重命名异常: %s \n", videoFilePath) +// } +// } +// count = count + 1 +// bar.PrintBar(util.CalcPercentage(count, total)) +// } +// bar.PrintEnd("=== Finish") +//} diff --git a/util/image.go b/util/image.go new file mode 100644 index 0000000..dae7c7e --- /dev/null +++ b/util/image.go @@ -0,0 +1,43 @@ +package util + +import ( + "image" + "os" + "strings" +) + +var supportImageTypes = []string{ + ".bmp", + ".gif", + ".jpg", + ".jpeg", + ".jpe", + ".png", + ".webp", + ".psb", + ".jfif", +} + +// IsSupportImage 判断是否属于支持的图片文件 +func IsSupportImage(imageType string) bool { + for _, supportImageType := range supportImageTypes { + if strings.EqualFold(supportImageType, strings.ToLower(imageType)) { + return true + } + } + return false +} + +// ReadImageInfo 读取一般图片文件信息 +func ReadImageInfo(filePath string) (err error, width int, height int) { + file, err := os.Open(filePath) // 图片文件路径 + if err != nil { + return err, 0, 0 + } + defer file.Close() + img, _, err := image.DecodeConfig(file) + if err != nil { + return err, 0, 0 + } + return nil, img.Width, img.Height +} diff --git a/util/init.go b/util/init.go deleted file mode 100644 index 8cf333c..0000000 --- a/util/init.go +++ /dev/null @@ -1,72 +0,0 @@ -package util - -import ( - "fmt" - "github.com/gabriel-vasile/mimetype" - "io/ioutil" - "log" - "os" - "path/filepath" - "strconv" - "time" -) - -// CheckFileIsExist 判断文件是否存在,存在返回 true,不存在返回false -func CheckFileIsExist(filename string) bool { - var exist = true - if _, err := os.Stat(filename); os.IsNotExist(err) { - exist = false - } - return exist -} - -// WriteByteArraysToFile 写字节数组到文件 -func WriteByteArraysToFile(content []byte, filename string) error { - return ioutil.WriteFile(filename, content, 0777) -} - -// String2int 字符串转int -func String2int(str string) int { - intValue, err := strconv.Atoi(str) - if err != nil { - return 0 - } - return intValue -} - -// CreateDir 创建目录 -func CreateDir(dirPath string) bool { - err := os.Mkdir(dirPath, 0755) - return err == nil -} - -// ReadFileMimeInfo 获取文件mime信息 -func ReadFileMimeInfo(filepath string) *mimetype.MIME { - mt, err := mimetype.DetectFile(filepath) - if err != nil { - log.Fatal(err) - } - return mt -} - -// SecondsToHms 将秒数转换为小时、分钟、秒的格式 -func SecondsToHms(seconds int) string { - t := time.Duration(seconds) * time.Second - h := t / time.Hour - t -= h * time.Hour - m := t / time.Minute - t -= m * time.Minute - s := t / time.Second - return fmt.Sprintf("%02d-%02d-%02d", h, m, s) -} - -// CalcPercentage 计算percentage相对于total的百分比 -func CalcPercentage(percentage int, total int) int { - return int(float64(percentage) / float64(total) * 100) -} - -// 获取文件所在文件夹 -func GetFileDirectory(filePath string) string { - directoryPath, _ := filepath.Split(filePath) - return directoryPath -} diff --git a/util/video.go b/util/video.go new file mode 100644 index 0000000..5c48861 --- /dev/null +++ b/util/video.go @@ -0,0 +1,158 @@ +package util + +import ( + "bytes" + "fmt" + "github.com/redmask-hb/GoSimplePrint/goPrint" + "math" + "os" + "os/exec" + "strconv" + "strings" +) + +var supportVideoTypes = []string{ + ".ts", + ".flv", + ".rm", + ".avi", + ".mp4", + ".mov", + ".mpg", + ".mkv", + ".m4v", + ".rmvb", + ".3gp", + ".3g2", + ".webm", + ".wmv", +} + +func getVideoDuration(ffmpegExecPath string, videoPath string) (float64, error) { + // ffprobe命令,-v error 用于减少输出信息,-show_entries format=duration -of compact=p=0,nk=1 用于只输出时长 + cmd := exec.Command(ffmpegExecPath, "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", videoPath) + var stderr bytes.Buffer + cmd.Stderr = &stderr + + output, err := cmd.Output() + if err != nil { + return 0, fmt.Errorf("ffprobe failed with error: %v, stderr: %q", err, stderr.String()) + } + + // 解析输出的时长字符串为浮点数 + durationStr := strings.TrimSpace(string(output)) + duration, err := strconv.ParseFloat(durationStr, 64) + if err != nil { + return 0, fmt.Errorf("failed to parse duration: %q, error: %v", durationStr, err) + } + + return duration, nil +} + +func getVideoResolution(ffmpegExecPath string, filePath string) (width int, height int, err error) { + // 构建ffprobe命令 + cmd := exec.Command(ffmpegExecPath, "-v", "error", "-show_entries", "stream=width,height", "-of", "csv=p=0:s=x", filePath) + // 执行命令并捕获输出 + output, err := cmd.Output() + if err != nil { + return 0, 0, fmt.Errorf("failed to run ffprobe: %w", err) + } + // 解析输出字符串,格式应为 "宽度,高度" + resolutionStr := strings.TrimSpace(string(output)) + parts := strings.Split(resolutionStr, ",") + if len(parts) == 2 { + width = String2int(parts[0]) + height = String2int(parts[1]) + return width, height, nil + } + parts = strings.Split(resolutionStr, "x") + if len(parts) == 2 { + width = String2int(parts[0]) + height = String2int(parts[1]) + return width, height, nil + } + parts = strings.Split(resolutionStr, "\r\n\r\n\r\n\r\n") + if len(parts) == 2 { + tempHw := parts[0] + parts = strings.Split(tempHw, "x") + if len(parts) == 2 { + width = String2int(parts[0]) + height = String2int(parts[1]) + return width, height, nil + } + } + parts = strings.Split(resolutionStr, "x") + if len(parts) == 3 { + width = String2int(parts[0]) + height = String2int(parts[1]) + return width, height, nil + } + resolutionStr = strings.ReplaceAll(resolutionStr, "\r", "") + resolutionStr = strings.ReplaceAll(resolutionStr, "\n", "") + resolutionStr = strings.ReplaceAll(resolutionStr, "N/AxN/A", "") + parts = strings.Split(resolutionStr, "x") + if len(parts) == 2 { + width = String2int(parts[0]) + height = String2int(parts[1]) + return width, height, nil + } + return 0, 0, fmt.Errorf("invalid resolution format: %s", resolutionStr) +} + +// ReadVideoDuration 获取视频的时长,单位秒 +func ReadVideoDuration(videoFilePath string) int { + duration, err := getVideoDuration("./ffprobe.exe", videoFilePath) + if err != nil { + fmt.Println("=== Error getting video duration:", err) + return 0 + } + //fmt.Printf("=== Video duration: %.2f seconds\n", duration) + return int(math.Floor(duration)) // 向下取整 +} + +// ReadVideoWidthHeight 获取视频的分辨率 +func ReadVideoWidthHeight(videoFilePath string) (int, int, error) { + width, height, err := getVideoResolution("./ffprobe.exe", videoFilePath) + if err != nil { + fmt.Printf("=== Error getting resolution: %v\n", err) + return 0, 0, err + } + //fmt.Printf("=== Video resolution: %dx%d\n", width, height) + return width, height, nil +} + +// IsSupportVideo 判断是否属于支持的视频 +func IsSupportVideo(videoType string) bool { + for _, supportVideoType := range supportVideoTypes { + if strings.EqualFold(videoType, supportVideoType) { + return true + } + } + return false +} + +// DoMoveFileToDir 批量移动文件到目录 +func DoMoveFileToDir(filePathList []string, videoDirPath string) { + total := len(filePathList) + var count = 0 + bar := goPrint.NewBar(100) + bar.SetNotice("=== 移动文件到目录:") + bar.SetGraph(">") + pathSeparator := string(os.PathSeparator) + for _, videoFilePath := range filePathList { + moveFileToDir(videoFilePath, videoDirPath+pathSeparator) + count = count + 1 + bar.PrintBar(CalcPercentage(count, total)) + } + bar.PrintEnd("=== Finish") +} + +// 移动文件到目录 +func moveFileToDir(sourceFilePath string, targetDirectory string) bool { + splits := strings.Split(sourceFilePath, string(os.PathSeparator)) + fileName := splits[len(splits)-1] + targetFilePath := targetDirectory + fileName + err := os.Rename(sourceFilePath, targetFilePath) + //fmt.Printf("=== 移动文件, 源: %s, 目标: %s \n", sourceFilePath, targetFilePath) + return err == nil +} diff --git a/vars/ffprobe.exe b/vars/ffprobe.exe new file mode 100644 index 0000000..985f013 --- /dev/null +++ b/vars/ffprobe.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fc77ae031fd4e01b8a2840a37be6ae10bcf62430b4e8601a2fcc05669179fec +size 122363392 diff --git a/vars/init.go b/vars/global.go similarity index 100% rename from vars/init.go rename to vars/global.go diff --git a/vars/image.go b/vars/image.go new file mode 100644 index 0000000..831f0ca --- /dev/null +++ b/vars/image.go @@ -0,0 +1,51 @@ +package vars + +var ImageIgnorePathList []string // 忽略的文件路径 +var ImageReadErrorPathList []string // 读取信息异常的路径 +var ImagePath2WidthHeightMap = make(map[string]string) // 图片路径和宽高比 +var ImageGifList []string +var ImagePsdList []string +var ImageHorizontalNormalList []string +var ImageHorizontal1KList []string +var ImageHorizontal2KList []string +var ImageHorizontal3KList []string +var ImageHorizontal4KList []string +var ImageHorizontal5KList []string +var ImageHorizontal6KList []string +var ImageHorizontal7KList []string +var ImageHorizontal8KList []string +var ImageHorizontal9KList []string +var ImageHorizontalHKList []string +var ImageHorizontalStandard720PList []string +var ImageHorizontalStandard1D5KList []string +var ImageHorizontalStandard1080PList []string +var ImageHorizontalStandard2DKList []string +var ImageHorizontalStandard2D5KList []string +var ImageHorizontalStandardUltraWide2List []string +var ImageHorizontalStandardUltraWide3List []string +var ImageHorizontalStandardUltraWide4List []string +var ImageHorizontalStandard4KList []string +var ImageHorizontalStandard4KHList []string +var ImageHorizontalStandard8KList []string +var ImageVerticalNormalList []string +var ImageVertical1KList []string +var ImageVertical2KList []string +var ImageVertical3KList []string +var ImageVertical4KList []string +var ImageVertical5KList []string +var ImageVertical6KList []string +var ImageVertical7KList []string +var ImageVertical8KList []string +var ImageVertical9KList []string +var ImageVerticalHKList []string +var ImageSquareNormalList []string +var ImageSquare1KList []string +var ImageSquare2KList []string +var ImageSquare3KList []string +var ImageSquare4KList []string +var ImageSquare5KList []string +var ImageSquare6KList []string +var ImageSquare7KList []string +var ImageSquare8KList []string +var ImageSquare9KList []string +var ImageSquareHKList []string diff --git a/vars/video.go b/vars/video.go new file mode 100644 index 0000000..8be6ceb --- /dev/null +++ b/vars/video.go @@ -0,0 +1,60 @@ +package vars + +import ( + _ "embed" // 内嵌文件支持 +) + +//go:embed ffprobe.exe +var VideoDecodeToolWin64 []byte +var VideoIgnorePathList []string // 忽略的文件路径 +var VideoReadErrorPathList []string // 读取信息异常的路径 +var VideoPath2WidthHeightMap = make(map[string]string) // 视频路径和宽高比 +var VideoPath2WidthHeightTagMap = make(map[string]string) // 视频路径和宽高比[640x480] +var VideoPath2DurationMap = make(map[string]string) // 视频路径和时长 +var VideoHorizontalNormalList []string +var VideoHorizontalGifList []string +var VideoHorizontal1KList []string +var VideoHorizontal2KList []string +var VideoHorizontal3KList []string +var VideoHorizontal4KList []string +var VideoHorizontal5KList []string +var VideoHorizontal6KList []string +var VideoHorizontal7KList []string +var VideoHorizontal8KList []string +var VideoHorizontal9KList []string +var VideoHorizontalHKList []string +var VideoHorizontalStandard720PList []string +var VideoHorizontalStandard1D5PList []string +var VideoHorizontalStandard1080PList []string +var VideoHorizontalStandard2DKList []string +var VideoHorizontalStandard2D5KList []string +var VideoHorizontalStandardUltraWide2List []string +var VideoHorizontalStandardUltraWide3List []string +var VideoHorizontalStandardUltraWide4List []string +var VideoHorizontalStandard4KList []string +var VideoHorizontalStandard4KHList []string +var VideoHorizontalStandard8KList []string +var VideoVerticalNormalList []string +var VideoVerticalGifList []string +var VideoVertical1KList []string +var VideoVertical2KList []string +var VideoVertical3KList []string +var VideoVertical4KList []string +var VideoVertical5KList []string +var VideoVertical6KList []string +var VideoVertical7KList []string +var VideoVertical8KList []string +var VideoVertical9KList []string +var VideoVerticalHKList []string +var VideoSquareNormalList []string +var VideoSquareGifList []string +var VideoSquare1KList []string +var VideoSquare2KList []string +var VideoSquare3KList []string +var VideoSquare4KList []string +var VideoSquare5KList []string +var VideoSquare6KList []string +var VideoSquare7KList []string +var VideoSquare8KList []string +var VideoSquare9KList []string +var VideoSquareHKList []string