upd
This commit is contained in:
parent
4ab99fa0cb
commit
ecd08d31d9
|
@ -1,3 +1,11 @@
|
|||
### IDEA ###
|
||||
~/*
|
||||
.idea/*
|
||||
*.iml
|
||||
*/target/*
|
||||
*/*.iml
|
||||
/.gradle/
|
||||
/application.pid
|
||||
# ---> Go
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
|
|
17
README.md
17
README.md
|
@ -1,6 +1,15 @@
|
|||
# media-picker
|
||||
# 根据视频/图片分辨率分组工具
|
||||
|
||||
双击快速整理视频和图片
|
||||
- 依赖ffmpeg, https://ffmpeg.org/download.html
|
||||
- https://github.com/BtbN/FFmpeg-Builds/releases
|
||||
|
||||
# 演示视频
|
||||
xxxxxx
|
||||
## 构建编译
|
||||
```shell
|
||||
sh build.sh
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
```text
|
||||
# 双击有风险, 双击需谨慎
|
||||
讲OdMediaPickerRelease.exe拖拽到需要整理的文件夹内,双击运行即可
|
||||
```
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
rm -f OdMediaPicker.exe
|
||||
rm -f OdMediaPickerRelease.exe
|
||||
# build
|
||||
go build -o OdMediaPicker.exe main.go
|
||||
# upx compress
|
||||
./upx -o OdMediaPickerRelease.exe OdMediaPicker.exe
|
||||
rm -f OdMediaPicker.exe
|
|
@ -0,0 +1,79 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
// BMPFileHeader represents the bitmap file header structure.
|
||||
type BMPFileHeader struct {
|
||||
FileType [2]byte
|
||||
FileSize uint32
|
||||
Reserved1 uint16
|
||||
Reserved2 uint16
|
||||
DataOffset uint32
|
||||
}
|
||||
|
||||
// BMPInfoHeader represents the bitmap info header structure.
|
||||
type BMPInfoHeader struct {
|
||||
Size uint32
|
||||
Width int32
|
||||
Height int32
|
||||
Planes uint16
|
||||
BitsPerPixel uint16
|
||||
Compression uint32
|
||||
SizeImage uint32
|
||||
XPelsPerMeter int32
|
||||
YPelsPerMeter int32
|
||||
ColorsUsed uint32
|
||||
ColorsImportant uint32
|
||||
}
|
||||
|
||||
func readBmpInfo(filePath string) (error, int32, int32) {
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
fmt.Printf("=== Failed to open file: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// Read the file header.
|
||||
var fileHeader BMPFileHeader
|
||||
if err := binary.Read(file, binary.LittleEndian, &fileHeader); err != nil {
|
||||
fmt.Printf("=== Failed to Read file: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
|
||||
// Check if it's a valid BMP file by verifying the file type.
|
||||
if string(fileHeader.FileType[:]) != "BM" {
|
||||
fmt.Printf("=== Not a valid BMP file: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
|
||||
// Read the info header.
|
||||
var infoHeader BMPInfoHeader
|
||||
if err := binary.Read(file, binary.LittleEndian, &infoHeader); err != nil {
|
||||
fmt.Printf("=== Failed to Read file: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
return err, infoHeader.Width, infoHeader.Height
|
||||
//fmt.Printf("=== File size: %d bytes\n", fileHeader.FileSize)
|
||||
//fmt.Printf("=== Image dimensions: %dx%d\n", )
|
||||
//fmt.Printf("=== Bits per pixel: %d\n", infoHeader.BitsPerPixel)
|
||||
|
||||
// At this point, you would typically read the pixel data into a slice,
|
||||
// taking into account any padding required for alignment and the specific
|
||||
// pixel format (e.g., RGB, RGBA, indexed color). This part is omitted here.
|
||||
|
||||
// You may also need to skip over a possible color palette if present.
|
||||
// The size of the palette can be inferred from the number of colors used and
|
||||
// the bits per pixel value.
|
||||
|
||||
// For simplicity, we'll just read the rest of the file as raw bytes.
|
||||
//data, err := ioutil.ReadAll(file)
|
||||
//if err != nil {
|
||||
// panic(err)
|
||||
//}
|
||||
//fmt.Printf("=== Read %d bytes of pixel data.\n", len(data))
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"OdMediaPicker/util"
|
||||
"OdMediaPicker/vars"
|
||||
"fmt"
|
||||
"github.com/redmask-hb/GoSimplePrint/goPrint"
|
||||
"log"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type FileScanner struct {
|
||||
}
|
||||
|
||||
func (FileScanner) DoScan(rootDir string) {
|
||||
fmt.Printf("=== 开始扫描文件 \n")
|
||||
if err := filepath.Walk(rootDir, visit); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
doReadFileMimeInfo()
|
||||
}
|
||||
|
||||
func doReadFileMimeInfo() {
|
||||
total := len(vars.GlobalFilePathList)
|
||||
fmt.Printf("=== 文件总数: %d \n", total)
|
||||
// 扫描文件mime信息
|
||||
var count = 0
|
||||
bar := goPrint.NewBar(100)
|
||||
bar.SetNotice("=== 扫描文件Mime:")
|
||||
bar.SetGraph(">")
|
||||
bar.SetNoticeColor(goPrint.FontColor.Red)
|
||||
for _, currentPath := range vars.GlobalFilePathList {
|
||||
// mime
|
||||
vars.GlobalFilePath2MimeInfoMap[currentPath] = util.ReadFileMimeInfo(currentPath).String()
|
||||
count = count + 1
|
||||
bar.PrintBar(util.CalcPercentage(count, total))
|
||||
}
|
||||
bar.PrintEnd("=== Finish")
|
||||
}
|
||||
|
||||
func (FileScanner) DoFilter() {
|
||||
total := len(vars.GlobalFilePathList)
|
||||
var count = 0
|
||||
bar := goPrint.NewBar(100)
|
||||
bar.SetNotice("=== 过滤已支持的媒体:")
|
||||
bar.SetGraph(">")
|
||||
for _, globalFilePath := range vars.GlobalFilePathList {
|
||||
fileMime := vars.GlobalFilePath2MimeInfoMap[globalFilePath]
|
||||
count = count + 1
|
||||
if strings.Contains(fileMime, "video/") { // 视频
|
||||
vars.GlobalVideoPathList = append(vars.GlobalVideoPathList, globalFilePath)
|
||||
bar.PrintBar(util.CalcPercentage(count, total))
|
||||
continue
|
||||
}
|
||||
// mime格式为application/octet-stream的视频
|
||||
ext := path.Ext(globalFilePath)
|
||||
if isSupportVideo(ext) {
|
||||
vars.GlobalVideoPathList = append(vars.GlobalVideoPathList, globalFilePath)
|
||||
bar.PrintBar(util.CalcPercentage(count, total))
|
||||
continue
|
||||
}
|
||||
if strings.Contains(fileMime, "image/") { // 图片
|
||||
vars.GlobalImagePathList = append(vars.GlobalImagePathList, globalFilePath)
|
||||
bar.PrintBar(util.CalcPercentage(count, total))
|
||||
continue
|
||||
}
|
||||
if isSupportImage(ext) {
|
||||
vars.GlobalImagePathList = append(vars.GlobalImagePathList, globalFilePath)
|
||||
bar.PrintBar(util.CalcPercentage(count, total))
|
||||
continue
|
||||
}
|
||||
// 其他的文件不处理
|
||||
}
|
||||
bar.PrintEnd("=== Finish")
|
||||
}
|
||||
|
||||
// 定义walkFn回调函数visit
|
||||
func visit(currentPath string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err // 如果有错误,直接返回
|
||||
}
|
||||
if !info.IsDir() {
|
||||
vars.GlobalFilePathList = append(vars.GlobalFilePathList, currentPath)
|
||||
// filename, include ext
|
||||
vars.GlobalFilePath2FileNameMap[currentPath] = filepath.Base(currentPath)
|
||||
// file ext
|
||||
vars.GlobalFilePath2FileExtMap[currentPath] = path.Ext(currentPath)
|
||||
}
|
||||
return nil
|
||||
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,547 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"OdMediaPicker/util"
|
||||
"OdMediaPicker/vars"
|
||||
"fmt"
|
||||
uuid "github.com/satori/go.uuid"
|
||||
"image"
|
||||
_ "image/gif" // 导入gif支持
|
||||
_ "image/jpeg" // 导入jpeg支持
|
||||
_ "image/png" // 导入png支持
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ignoreImagePathList []string // 忽略的文件路径
|
||||
var readErrorImagePathList []string // 读取信息异常的路径
|
||||
var imagePath2WidthHeightMap = make(map[string]string) // 图片路径和宽高比
|
||||
var supportImageTypes = []string{
|
||||
".bmp",
|
||||
".gif",
|
||||
".jpg",
|
||||
".jpeg",
|
||||
".jpe",
|
||||
".png",
|
||||
".webp",
|
||||
}
|
||||
|
||||
// 水平图片
|
||||
var normalImageList []string
|
||||
var horizontalGifImageList []string
|
||||
var horizontal2KImageList []string
|
||||
var horizontal1KImageList []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 verticalGifImageList []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 squareGifImageList []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
|
||||
|
||||
// 标准等比图片
|
||||
var squareStandard720PImageList []string
|
||||
var squareStandard1080PImageList []string
|
||||
var squareStandard4KImageList []string
|
||||
var squareStandard8KImageList []string
|
||||
|
||||
var psdImageList []string
|
||||
|
||||
func DoHandleImage(rootDir string) {
|
||||
total := len(vars.GlobalImagePathList) // 总数
|
||||
successCount := 0 // 成功数
|
||||
errorCount := 0 // 失败数
|
||||
ignoreCount := 0 // 忽略数
|
||||
for _, imageFilePath := range vars.GlobalImagePathList {
|
||||
suffix := vars.GlobalFilePath2FileExtMap[imageFilePath]
|
||||
if isSupportImage(suffix) {
|
||||
err, width, height := readImageInfo(imageFilePath)
|
||||
if err == nil {
|
||||
successCount = successCount + 1
|
||||
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)
|
||||
fmt.Printf("=== 异常图片: %s \n", imageFilePath)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.EqualFold(suffix, ".webp") { // 特殊文件处理, webp为网络常用图片格式
|
||||
webpErr, webpWidth, webpHeight := readWebpTypeImage(imageFilePath)
|
||||
if webpErr == nil {
|
||||
imagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", webpWidth, webpHeight)
|
||||
successCount = successCount + 1
|
||||
} else {
|
||||
errorCount = errorCount + 1
|
||||
fmt.Printf("=== 异常图片: %s \n", imageFilePath)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.EqualFold(suffix, ".bmp") { // 特殊文件处理
|
||||
bpmErr, bmpWidth, bmpHeight := readBmpInfo(imageFilePath)
|
||||
if bpmErr == nil {
|
||||
imagePath2WidthHeightMap[imageFilePath] = fmt.Sprintf("%d-%d", bmpWidth, bmpHeight)
|
||||
successCount = successCount + 1
|
||||
} else {
|
||||
errorCount = errorCount + 1
|
||||
fmt.Printf("=== 异常图片: %s \n", imageFilePath)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.EqualFold(suffix, ".psd") { // 特殊文件处理
|
||||
psdImageList = append(psdImageList, imageFilePath)
|
||||
successCount = successCount + 1
|
||||
continue
|
||||
}
|
||||
// 其他的直接先忽略吧, 爱改改, 不改拉倒
|
||||
ignoreCount = ignoreCount + 1
|
||||
ignoreImagePathList = append(ignoreImagePathList, imageFilePath)
|
||||
}
|
||||
uid := strings.ReplaceAll(uuid.NewV4().String(), "-", "")
|
||||
if len(psdImageList) > 0 {
|
||||
psdImagePath := rootDir + string(os.PathSeparator) + uid + "_图片_PSD"
|
||||
if util.CreateDir(psdImagePath) {
|
||||
doMoveFileToDir(psdImageList, psdImagePath)
|
||||
}
|
||||
}
|
||||
if len(readErrorImagePathList) > 0 {
|
||||
readInfoErrorPath := rootDir + string(os.PathSeparator) + uid + "_图片_读取异常"
|
||||
if util.CreateDir(readInfoErrorPath) {
|
||||
doMoveFileToDir(readErrorImagePathList, readInfoErrorPath)
|
||||
}
|
||||
}
|
||||
if len(ignoreImagePathList) > 0 {
|
||||
ignorePath := rootDir + string(os.PathSeparator) + uid + "_图片_已忽略"
|
||||
if util.CreateDir(ignorePath) {
|
||||
doMoveFileToDir(ignoreImagePathList, ignorePath)
|
||||
}
|
||||
}
|
||||
doPickImageFile(uid, rootDir, imagePath2WidthHeightMap)
|
||||
fmt.Printf("=== 图片处理完毕(UID): %s \n\n", uid)
|
||||
}
|
||||
|
||||
// 条件图片并分组存放
|
||||
func doPickImageFile(uid string, rootDir string, imagePath2WidthHeightMap map[string]string) {
|
||||
if len(imagePath2WidthHeightMap) == 0 {
|
||||
fmt.Printf("=== 当前目录下没有扫描到图片文件, %s \n", rootDir)
|
||||
return
|
||||
}
|
||||
for currentImagePath, infoStr := range imagePath2WidthHeightMap {
|
||||
width2Height := strings.Split(infoStr, "-")
|
||||
width := util.String2int(width2Height[0])
|
||||
height := util.String2int(width2Height[1])
|
||||
suffix := vars.GlobalFilePath2FileExtMap[currentImagePath]
|
||||
if width > height {
|
||||
handleHorizontalImage(currentImagePath, width, height, suffix)
|
||||
continue
|
||||
}
|
||||
if width < height {
|
||||
handleVerticalImage(currentImagePath, height, suffix)
|
||||
continue
|
||||
}
|
||||
handleSquareImage(currentImagePath, width, height, suffix)
|
||||
}
|
||||
moveNormalImage(rootDir, uid)
|
||||
moveHorizontalImage(rootDir, uid)
|
||||
moveVerticalImage(rootDir, uid)
|
||||
moveSquareImage(rootDir, uid)
|
||||
}
|
||||
|
||||
func moveSquareImage(rootDir string, uid string) {
|
||||
pathSeparator := string(os.PathSeparator)
|
||||
squareGifImagePath := rootDir + pathSeparator + uid + "_图片_等比_GIF"
|
||||
square1KImagePath := rootDir + pathSeparator + uid + "_图片_等比_1k"
|
||||
square2KImagePath := rootDir + pathSeparator + uid + "_图片_等比_2k"
|
||||
square3KImagePath := rootDir + pathSeparator + uid + "_图片_等比_3k"
|
||||
square4KImagePath := rootDir + pathSeparator + uid + "_图片_等比_4k"
|
||||
square5KImagePath := rootDir + pathSeparator + uid + "_图片_等比_5k"
|
||||
square6KImagePath := rootDir + pathSeparator + uid + "_图片_等比_6k"
|
||||
square7KImagePath := rootDir + pathSeparator + uid + "_图片_等比_7k"
|
||||
square8KImagePath := rootDir + pathSeparator + uid + "_图片_等比_8k"
|
||||
square9KImagePath := rootDir + pathSeparator + uid + "_图片_等比_9k"
|
||||
squareHKImagePath := rootDir + pathSeparator + uid + "_图片_等比_原图"
|
||||
if len(squareGifImageList) > 0 {
|
||||
util.CreateDir(squareGifImagePath)
|
||||
doMoveFileToDir(squareGifImageList, squareGifImagePath)
|
||||
}
|
||||
if len(square1KImageList) > 0 {
|
||||
util.CreateDir(square1KImagePath)
|
||||
doMoveFileToDir(square1KImageList, square1KImagePath)
|
||||
}
|
||||
if len(square2KImageList) > 0 {
|
||||
util.CreateDir(square2KImagePath)
|
||||
doMoveFileToDir(square2KImageList, square2KImagePath)
|
||||
}
|
||||
if len(square3KImageList) > 0 {
|
||||
util.CreateDir(square3KImagePath)
|
||||
doMoveFileToDir(square3KImageList, square3KImagePath)
|
||||
}
|
||||
if len(square4KImageList) > 0 {
|
||||
util.CreateDir(square4KImagePath)
|
||||
doMoveFileToDir(square4KImageList, square4KImagePath)
|
||||
}
|
||||
if len(square5KImageList) > 0 {
|
||||
util.CreateDir(square5KImagePath)
|
||||
doMoveFileToDir(square5KImageList, square5KImagePath)
|
||||
}
|
||||
if len(square6KImageList) > 0 {
|
||||
util.CreateDir(square6KImagePath)
|
||||
doMoveFileToDir(square6KImageList, square6KImagePath)
|
||||
}
|
||||
if len(square7KImageList) > 0 {
|
||||
util.CreateDir(square7KImagePath)
|
||||
doMoveFileToDir(square7KImageList, square7KImagePath)
|
||||
}
|
||||
if len(square8KImageList) > 0 {
|
||||
util.CreateDir(square8KImagePath)
|
||||
doMoveFileToDir(square8KImageList, square8KImagePath)
|
||||
}
|
||||
if len(square9KImageList) > 0 {
|
||||
util.CreateDir(square9KImagePath)
|
||||
doMoveFileToDir(square9KImageList, square9KImagePath)
|
||||
}
|
||||
if len(squareHKImageList) > 0 {
|
||||
util.CreateDir(squareHKImagePath)
|
||||
doMoveFileToDir(squareHKImageList, squareHKImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
func handleSquareImage(currentImagePath string, width int, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
squareGifImageList = append(squareGifImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
if width < 1000 {
|
||||
normalImageList = append(normalImageList, currentImagePath)
|
||||
} else if width >= 1000 && width < 2000 {
|
||||
// 1280 x 720 -> 720p
|
||||
if width == 1280 && height == 720 {
|
||||
squareStandard720PImageList = append(squareStandard720PImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
// 1920 x 1080 -> 1080p
|
||||
if width == 1920 && height == 1080 {
|
||||
squareStandard1080PImageList = append(squareStandard1080PImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
square1KImageList = append(square1KImageList, currentImagePath)
|
||||
} else if width >= 2000 && width < 3000 {
|
||||
square2KImageList = append(square2KImageList, currentImagePath)
|
||||
} else if width >= 3000 && width < 4000 {
|
||||
// 3840 x 2160 -> 4k
|
||||
if width == 3840 && height == 2160 {
|
||||
squareStandard4KImageList = append(squareStandard4KImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
square3KImageList = append(square3KImageList, currentImagePath)
|
||||
} else if width >= 4000 && width < 5000 {
|
||||
square4KImageList = append(square4KImageList, currentImagePath)
|
||||
} else if width >= 5000 && width < 6000 {
|
||||
square5KImageList = append(square5KImageList, currentImagePath)
|
||||
} else if width >= 6000 && width < 7000 {
|
||||
square6KImageList = append(square6KImageList, currentImagePath)
|
||||
} else if width >= 7000 && width < 8000 {
|
||||
// 7680 x 4320 -> 8k
|
||||
if width == 7680 && height == 4320 {
|
||||
squareStandard8KImageList = append(squareStandard8KImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
square7KImageList = append(square7KImageList, currentImagePath)
|
||||
} else if width >= 8000 && width < 9000 {
|
||||
square8KImageList = append(square8KImageList, currentImagePath)
|
||||
} else if width >= 9000 && width < 10000 {
|
||||
square9KImageList = append(square9KImageList, currentImagePath)
|
||||
} else if width >= 10000 {
|
||||
squareHKImageList = append(squareHKImageList, currentImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动垂直图片
|
||||
func moveVerticalImage(rootDir string, uid string) {
|
||||
pathSeparator := string(os.PathSeparator)
|
||||
verticalGifImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_GIF"
|
||||
vertical1KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_1k"
|
||||
vertical2KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_2k"
|
||||
vertical3KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_3k"
|
||||
vertical4KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_4k"
|
||||
vertical5KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_5k"
|
||||
vertical6KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_6k"
|
||||
vertical7KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_7k"
|
||||
vertical8KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_8k"
|
||||
vertical9KImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_9k"
|
||||
verticalHKImagePath := rootDir + pathSeparator + uid + "_图片_竖屏_原图"
|
||||
if len(verticalGifImageList) > 0 {
|
||||
util.CreateDir(verticalGifImagePath)
|
||||
doMoveFileToDir(verticalGifImageList, verticalGifImagePath)
|
||||
}
|
||||
if len(vertical1KImageList) > 0 {
|
||||
util.CreateDir(vertical1KImagePath)
|
||||
doMoveFileToDir(vertical1KImageList, vertical1KImagePath)
|
||||
}
|
||||
if len(vertical2KImageList) > 0 {
|
||||
util.CreateDir(vertical2KImagePath)
|
||||
doMoveFileToDir(vertical2KImageList, vertical2KImagePath)
|
||||
}
|
||||
if len(vertical3KImageList) > 0 {
|
||||
util.CreateDir(vertical3KImagePath)
|
||||
doMoveFileToDir(vertical3KImageList, vertical3KImagePath)
|
||||
}
|
||||
if len(vertical4KImageList) > 0 {
|
||||
util.CreateDir(vertical4KImagePath)
|
||||
doMoveFileToDir(vertical4KImageList, vertical4KImagePath)
|
||||
}
|
||||
if len(vertical5KImageList) > 0 {
|
||||
util.CreateDir(vertical5KImagePath)
|
||||
doMoveFileToDir(vertical5KImageList, vertical5KImagePath)
|
||||
}
|
||||
if len(vertical6KImageList) > 0 {
|
||||
util.CreateDir(vertical6KImagePath)
|
||||
doMoveFileToDir(vertical6KImageList, vertical6KImagePath)
|
||||
}
|
||||
if len(vertical7KImageList) > 0 {
|
||||
util.CreateDir(vertical7KImagePath)
|
||||
doMoveFileToDir(vertical7KImageList, vertical7KImagePath)
|
||||
}
|
||||
if len(vertical8KImageList) > 0 {
|
||||
util.CreateDir(vertical8KImagePath)
|
||||
doMoveFileToDir(vertical8KImageList, vertical8KImagePath)
|
||||
}
|
||||
if len(vertical9KImageList) > 0 {
|
||||
util.CreateDir(vertical9KImagePath)
|
||||
doMoveFileToDir(vertical9KImageList, vertical9KImagePath)
|
||||
}
|
||||
if len(verticalHKImageList) > 0 {
|
||||
util.CreateDir(verticalHKImagePath)
|
||||
doMoveFileToDir(verticalHKImageList, verticalHKImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动水平图片
|
||||
func moveHorizontalImage(rootDir string, uid string) {
|
||||
pathSeparator := string(os.PathSeparator)
|
||||
horizontalGifImagePath := rootDir + pathSeparator + uid + "_图片_横屏_GIF"
|
||||
horizontal1KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_1k"
|
||||
horizontal2KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_2k"
|
||||
horizontal3KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_3k"
|
||||
horizontal4KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_4k"
|
||||
horizontal5KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_5k"
|
||||
horizontal6KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_6k"
|
||||
horizontal7KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_7k"
|
||||
horizontal8KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_8k"
|
||||
horizontal9KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_9k"
|
||||
horizontalHKImagePath := rootDir + pathSeparator + uid + "_图片_横屏_原图"
|
||||
horizontalStandard720PImagePath := rootDir + pathSeparator + uid + "_图片_横屏_720P"
|
||||
horizontalStandard1080PImagePath := rootDir + pathSeparator + uid + "_图片_横屏_1080P"
|
||||
horizontalStandard4KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_4KP"
|
||||
horizontalStandard8KImagePath := rootDir + pathSeparator + uid + "_图片_横屏_8KP"
|
||||
if len(horizontalGifImageList) > 0 {
|
||||
util.CreateDir(horizontalGifImagePath)
|
||||
doMoveFileToDir(horizontalGifImageList, horizontalGifImagePath)
|
||||
}
|
||||
if len(horizontal1KImageList) > 0 {
|
||||
util.CreateDir(horizontal1KImagePath)
|
||||
doMoveFileToDir(horizontal1KImageList, horizontal1KImagePath)
|
||||
}
|
||||
if len(horizontal2KImageList) > 0 {
|
||||
util.CreateDir(horizontal2KImagePath)
|
||||
doMoveFileToDir(horizontal2KImageList, horizontal2KImagePath)
|
||||
}
|
||||
if len(horizontal3KImageList) > 0 {
|
||||
util.CreateDir(horizontal3KImagePath)
|
||||
doMoveFileToDir(horizontal3KImageList, horizontal3KImagePath)
|
||||
}
|
||||
if len(horizontal4KImageList) > 0 {
|
||||
util.CreateDir(horizontal4KImagePath)
|
||||
doMoveFileToDir(horizontal4KImageList, horizontal4KImagePath)
|
||||
}
|
||||
if len(horizontal5KImageList) > 0 {
|
||||
util.CreateDir(horizontal5KImagePath)
|
||||
doMoveFileToDir(horizontal5KImageList, horizontal5KImagePath)
|
||||
}
|
||||
if len(horizontal6KImageList) > 0 {
|
||||
util.CreateDir(horizontal6KImagePath)
|
||||
doMoveFileToDir(horizontal6KImageList, horizontal6KImagePath)
|
||||
}
|
||||
if len(horizontal7KImageList) > 0 {
|
||||
util.CreateDir(horizontal7KImagePath)
|
||||
doMoveFileToDir(horizontal7KImageList, horizontal7KImagePath)
|
||||
}
|
||||
if len(horizontal8KImageList) > 0 {
|
||||
util.CreateDir(horizontal8KImagePath)
|
||||
doMoveFileToDir(horizontal8KImageList, horizontal8KImagePath)
|
||||
}
|
||||
if len(horizontal9KImageList) > 0 {
|
||||
util.CreateDir(horizontal9KImagePath)
|
||||
doMoveFileToDir(horizontal9KImageList, horizontal9KImagePath)
|
||||
}
|
||||
if len(horizontalHKImageList) > 0 {
|
||||
util.CreateDir(horizontalHKImagePath)
|
||||
doMoveFileToDir(horizontalHKImageList, horizontalHKImagePath)
|
||||
}
|
||||
if len(horizontalStandard720PImageList) > 0 {
|
||||
util.CreateDir(horizontalStandard720PImagePath)
|
||||
doMoveFileToDir(horizontalStandard720PImageList, horizontalStandard720PImagePath)
|
||||
}
|
||||
if len(horizontalStandard1080PImageList) > 0 {
|
||||
util.CreateDir(horizontalStandard1080PImagePath)
|
||||
doMoveFileToDir(horizontalStandard1080PImageList, horizontalStandard1080PImagePath)
|
||||
}
|
||||
if len(horizontalStandard4KImageList) > 0 {
|
||||
util.CreateDir(horizontalStandard4KImagePath)
|
||||
doMoveFileToDir(horizontalStandard4KImageList, horizontalStandard4KImagePath)
|
||||
}
|
||||
if len(horizontalStandard8KImageList) > 0 {
|
||||
util.CreateDir(horizontalStandard8KImagePath)
|
||||
doMoveFileToDir(horizontalStandard8KImageList, horizontalStandard8KImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动图片
|
||||
func moveNormalImage(rootDir string, uid string) {
|
||||
pathSeparator := string(os.PathSeparator)
|
||||
allNormalImagePath := rootDir + pathSeparator + uid + "_图片_普通"
|
||||
if len(normalImageList) > 0 {
|
||||
util.CreateDir(allNormalImagePath)
|
||||
doMoveFileToDir(normalImageList, allNormalImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理垂直图片
|
||||
func handleVerticalImage(currentImagePath string, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
verticalGifImageList = append(verticalGifImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
if height < 1000 {
|
||||
normalImageList = append(normalImageList, currentImagePath)
|
||||
} else if height >= 1000 && height < 2000 {
|
||||
vertical1KImageList = append(vertical1KImageList, currentImagePath)
|
||||
} else if height >= 2000 && height < 3000 {
|
||||
vertical2KImageList = append(vertical2KImageList, currentImagePath)
|
||||
} else if height >= 3000 && height < 4000 {
|
||||
vertical3KImageList = append(vertical3KImageList, currentImagePath)
|
||||
} else if height >= 4000 && height < 5000 {
|
||||
vertical4KImageList = append(vertical4KImageList, currentImagePath)
|
||||
} else if height >= 5000 && height < 6000 {
|
||||
vertical5KImageList = append(vertical5KImageList, currentImagePath)
|
||||
} else if height >= 6000 && height < 7000 {
|
||||
vertical6KImageList = append(vertical6KImageList, currentImagePath)
|
||||
} else if height >= 7000 && height < 8000 {
|
||||
vertical7KImageList = append(vertical7KImageList, currentImagePath)
|
||||
} else if height >= 8000 && height < 9000 {
|
||||
vertical8KImageList = append(vertical8KImageList, currentImagePath)
|
||||
} else if height >= 9000 && height < 10000 {
|
||||
vertical9KImageList = append(vertical9KImageList, currentImagePath)
|
||||
} else if height >= 10000 {
|
||||
verticalHKImageList = append(verticalHKImageList, currentImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理横向图片
|
||||
func handleHorizontalImage(currentImagePath string, width int, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
horizontalGifImageList = append(horizontalGifImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
if width < 1000 {
|
||||
normalImageList = append(normalImageList, currentImagePath)
|
||||
} else if width >= 1000 && width < 2000 {
|
||||
// 1280 x 720 -> 720p
|
||||
if width == 1280 && height == 720 {
|
||||
horizontalStandard720PImageList = append(horizontalStandard720PImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
// 1920 x 1080 -> 1080p
|
||||
if width == 1920 && height == 1080 {
|
||||
horizontalStandard1080PImageList = append(horizontalStandard1080PImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
horizontal1KImageList = append(horizontal1KImageList, currentImagePath)
|
||||
} else if width >= 2000 && width < 3000 {
|
||||
horizontal2KImageList = append(horizontal2KImageList, currentImagePath)
|
||||
} else if width >= 3000 && width < 4000 {
|
||||
// 3840 x 2160 -> 4k
|
||||
if width == 3840 && height == 2160 {
|
||||
horizontalStandard4KImageList = append(horizontalStandard4KImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
horizontal3KImageList = append(horizontal3KImageList, currentImagePath)
|
||||
} else if width >= 4000 && width < 5000 {
|
||||
horizontal4KImageList = append(horizontal4KImageList, currentImagePath)
|
||||
} else if width >= 5000 && width < 6000 {
|
||||
horizontal5KImageList = append(horizontal5KImageList, currentImagePath)
|
||||
} else if width >= 6000 && width < 7000 {
|
||||
horizontal6KImageList = append(horizontal6KImageList, currentImagePath)
|
||||
} else if width >= 7000 && width < 8000 {
|
||||
// 7680 x 4320 -> 8k
|
||||
if width == 7680 && height == 4320 {
|
||||
horizontalStandard8KImageList = append(horizontalStandard8KImageList, currentImagePath)
|
||||
return
|
||||
}
|
||||
horizontal7KImageList = append(horizontal7KImageList, currentImagePath)
|
||||
} else if width >= 8000 && width < 9000 {
|
||||
horizontal8KImageList = append(horizontal8KImageList, currentImagePath)
|
||||
} else if width >= 9000 && width < 10000 {
|
||||
horizontal9KImageList = append(horizontal9KImageList, currentImagePath)
|
||||
} else if width >= 10000 {
|
||||
horizontalHKImageList = append(horizontalHKImageList, currentImagePath)
|
||||
}
|
||||
}
|
||||
|
||||
// 判断是否属于支持的图片文件
|
||||
func isSupportImage(imageType string) bool {
|
||||
for _, supportImageType := range supportImageTypes {
|
||||
if strings.EqualFold(supportImageType, 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
|
||||
}
|
|
@ -0,0 +1,655 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"OdMediaPicker/util"
|
||||
"OdMediaPicker/vars"
|
||||
"bytes"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"github.com/redmask-hb/GoSimplePrint/goPrint"
|
||||
"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)
|
||||
if err != nil {
|
||||
fmt.Println("=== 释放解码器失败, 5秒后将自动退出", err)
|
||||
time.Sleep(time.Second * 5)
|
||||
return
|
||||
}
|
||||
total := len(vars.GlobalVideoPathList) // 总数
|
||||
successCount := 0 // 成功数
|
||||
errorCount := 0 // 失败数
|
||||
ignoreCount := 0 // 忽略数
|
||||
for _, videoFilePath := range vars.GlobalVideoPathList {
|
||||
suffix := vars.GlobalFilePath2FileExtMap[videoFilePath]
|
||||
if isSupportVideo(suffix) {
|
||||
width, height, err := readVideoWidthHeight(videoFilePath)
|
||||
if err == nil {
|
||||
successCount = successCount + 1
|
||||
videoPath2WidthHeightMap[videoFilePath] = fmt.Sprintf("%d-%d", width, height)
|
||||
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)
|
||||
if duration == 0 {
|
||||
videoPath2DurationMap[videoFilePath] = "0H0M0S"
|
||||
} else {
|
||||
videoPath2DurationMap[videoFilePath] = util.SecondsToHms(duration)
|
||||
}
|
||||
} else {
|
||||
errorCount = errorCount + 1
|
||||
readErrorVideoPathList = append(readErrorVideoPathList, videoFilePath)
|
||||
fmt.Printf("=== 异常视频: %s \n", videoFilePath)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// 其他的直接先忽略吧, 爱改改, 不改拉倒
|
||||
ignoreCount = ignoreCount + 1
|
||||
ignoreVideoPathList = append(ignoreVideoPathList, videoFilePath)
|
||||
}
|
||||
//uuid := strings.ReplaceAll(uuid.NewV4().String(), "-", "")
|
||||
if len(readErrorVideoPathList) > 0 {
|
||||
readInfoErrorPath := rootDir + string(os.PathSeparator) + "读取异常"
|
||||
if util.CreateDir(readInfoErrorPath) {
|
||||
doMoveFileToDir(readErrorVideoPathList, readInfoErrorPath)
|
||||
}
|
||||
}
|
||||
if len(ignoreVideoPathList) > 0 {
|
||||
ignorePath := rootDir + string(os.PathSeparator) + "已忽略"
|
||||
if util.CreateDir(ignorePath) {
|
||||
doMoveFileToDir(ignoreVideoPathList, ignorePath)
|
||||
}
|
||||
}
|
||||
doPickVideoFile(rootDir, videoPath2WidthHeightMap)
|
||||
if util.CheckFileIsExist(readerFileName) {
|
||||
_ = os.Remove(readerFileName)
|
||||
}
|
||||
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
|
||||
}
|
||||
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 {
|
||||
fmt.Printf("=== 当前目录下没有扫描到视频文件, %s \n", rootDir)
|
||||
readerFileName := "./ffprobe.exe"
|
||||
if util.CheckFileIsExist(readerFileName) {
|
||||
_ = os.Remove(readerFileName)
|
||||
}
|
||||
return
|
||||
}
|
||||
for currentVideoPath, infoStr := range videoPath2WidthHeightMap {
|
||||
width2Height := strings.Split(infoStr, "-")
|
||||
width := util.String2int(width2Height[0])
|
||||
height := util.String2int(width2Height[1])
|
||||
suffix := vars.GlobalFilePath2FileExtMap[currentVideoPath]
|
||||
if width > height {
|
||||
handleHorizontalVideo(currentVideoPath, width, height, suffix)
|
||||
continue
|
||||
}
|
||||
if width < height {
|
||||
handleVerticalVideo(currentVideoPath, height, suffix)
|
||||
continue
|
||||
}
|
||||
handleSquareVideo(currentVideoPath, width, height, suffix)
|
||||
}
|
||||
moveNormalVideo(rootDir)
|
||||
moveHorizontalVideo(rootDir)
|
||||
moveVerticalVideo(rootDir)
|
||||
moveSquareVideo(rootDir)
|
||||
}
|
||||
|
||||
// 移动垂直视频
|
||||
func moveVerticalVideo(rootDir string) {
|
||||
if len(vertical1KVideoList) > 0 {
|
||||
renameFileV2("[V][1k]", vertical1KVideoList)
|
||||
}
|
||||
if len(vertical2KVideoList) > 0 {
|
||||
renameFileV2("[V][2k]", vertical2KVideoList)
|
||||
}
|
||||
if len(vertical3KVideoList) > 0 {
|
||||
renameFileV2("[V][3k]", vertical3KVideoList)
|
||||
}
|
||||
if len(vertical4KVideoList) > 0 {
|
||||
renameFileV2("[V][4k]", vertical4KVideoList)
|
||||
}
|
||||
if len(vertical5KVideoList) > 0 {
|
||||
renameFileV2("[V][5k]", vertical5KVideoList)
|
||||
}
|
||||
if len(vertical6KVideoList) > 0 {
|
||||
renameFileV2("[V][6k]", vertical6KVideoList)
|
||||
}
|
||||
if len(vertical7KVideoList) > 0 {
|
||||
renameFileV2("[V][7k]", vertical7KVideoList)
|
||||
}
|
||||
if len(vertical8KVideoList) > 0 {
|
||||
renameFileV2("[V][8k]", vertical8KVideoList)
|
||||
}
|
||||
if len(vertical9KVideoList) > 0 {
|
||||
renameFileV2("[V][9k]", vertical9KVideoList)
|
||||
}
|
||||
if len(verticalHKVideoList) > 0 {
|
||||
renameFileV2("[V][原]", verticalHKVideoList)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动文件到根目录
|
||||
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(rootDir string) {
|
||||
if len(horizontal1KVideoList) > 0 {
|
||||
renameFileV2("[H][1k]", horizontal1KVideoList)
|
||||
}
|
||||
if len(horizontal2KVideoList) > 0 {
|
||||
renameFileV2("[H][2k]", horizontal2KVideoList)
|
||||
}
|
||||
if len(horizontal3KVideoList) > 0 {
|
||||
renameFileV2("[H][3k]", horizontal3KVideoList)
|
||||
}
|
||||
if len(horizontal4KVideoList) > 0 {
|
||||
renameFileV2("[H][4k]", horizontal4KVideoList)
|
||||
}
|
||||
if len(horizontal5KVideoList) > 0 {
|
||||
renameFileV2("[H][5k]", horizontal5KVideoList)
|
||||
}
|
||||
if len(horizontal6KVideoList) > 0 {
|
||||
renameFileV2("[H][6k]", horizontal6KVideoList)
|
||||
}
|
||||
if len(horizontal7KVideoList) > 0 {
|
||||
renameFileV2("[H][7k]", horizontal7KVideoList)
|
||||
}
|
||||
if len(horizontal8KVideoList) > 0 {
|
||||
renameFileV2("[H][8k]", horizontal8KVideoList)
|
||||
}
|
||||
if len(horizontal9KVideoList) > 0 {
|
||||
renameFileV2("[H][9k]", horizontal9KVideoList)
|
||||
}
|
||||
if len(horizontalHKVideoList) > 0 {
|
||||
renameFileV2("[H][原]", horizontalHKVideoList)
|
||||
}
|
||||
if len(horizontalStandard720PVideoList) > 0 {
|
||||
renameFileV2("[H][720P]", horizontalStandard720PVideoList)
|
||||
}
|
||||
if len(horizontalStandard1080PVideoList) > 0 {
|
||||
renameFileV2("[H][1080P]", horizontalStandard1080PVideoList)
|
||||
}
|
||||
if len(horizontalStandard4KVideoList) > 0 {
|
||||
renameFileV2("[H][4KP]", horizontalStandard4KVideoList)
|
||||
}
|
||||
if len(horizontalStandard8KVideoList) > 0 {
|
||||
renameFileV2("[H][8KP]", horizontalStandard8KVideoList)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动等比视频
|
||||
func moveSquareVideo(rootDir string) {
|
||||
if len(square1KVideoList) > 0 {
|
||||
renameFileV2("[M][1k]", square1KVideoList)
|
||||
}
|
||||
if len(square2KVideoList) > 0 {
|
||||
renameFileV2("[M][2k]", square2KVideoList)
|
||||
}
|
||||
if len(square3KVideoList) > 0 {
|
||||
renameFileV2("[M][3k]", square3KVideoList)
|
||||
}
|
||||
if len(square4KVideoList) > 0 {
|
||||
renameFileV2("[M][4k]", square4KVideoList)
|
||||
}
|
||||
if len(square5KVideoList) > 0 {
|
||||
renameFileV2("[M][5k]", square5KVideoList)
|
||||
}
|
||||
if len(square6KVideoList) > 0 {
|
||||
renameFileV2("[M][6k]", square6KVideoList)
|
||||
}
|
||||
if len(square7KVideoList) > 0 {
|
||||
renameFileV2("[M][7k]", square7KVideoList)
|
||||
}
|
||||
if len(square8KVideoList) > 0 {
|
||||
renameFileV2("[M][8k]", square8KVideoList)
|
||||
}
|
||||
if len(square9KVideoList) > 0 {
|
||||
renameFileV2("[M][9k]", square9KVideoList)
|
||||
}
|
||||
if len(squareHKVideoList) > 0 {
|
||||
renameFileV2("[M][原]", squareHKVideoList)
|
||||
}
|
||||
if len(squareStandard720PVideoList) > 0 {
|
||||
renameFileV2("[M][720P]", squareStandard720PVideoList)
|
||||
}
|
||||
if len(squareStandard1080PVideoList) > 0 {
|
||||
renameFileV2("[M][1080P]", squareStandard1080PVideoList)
|
||||
}
|
||||
if len(squareStandard4KVideoList) > 0 {
|
||||
renameFileV2("[M][4KP]", squareStandard4KVideoList)
|
||||
}
|
||||
if len(squareStandard8KVideoList) > 0 {
|
||||
renameFileV2("[M][8KP]", squareStandard8KVideoList)
|
||||
}
|
||||
}
|
||||
|
||||
// 移动普通视频
|
||||
func moveNormalVideo(rootDir string) {
|
||||
//pathSeparator := string(os.PathSeparator)
|
||||
if len(horizontalNormalVideoList) > 0 {
|
||||
//renameFile(rootDir, "[L]", horizontalNormalVideoList, pathSeparator)
|
||||
renameFileV2("[L]", horizontalNormalVideoList)
|
||||
}
|
||||
if len(verticalNormalVideoList) > 0 {
|
||||
renameFileV2("[L]", verticalNormalVideoList)
|
||||
}
|
||||
if len(squareNormalVideoList) > 0 {
|
||||
renameFileV2("[L]", squareNormalVideoList)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理垂直视频
|
||||
func handleVerticalVideo(currentVideoPath string, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
verticalGifVideoList = append(verticalGifVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
if height < 1000 {
|
||||
verticalNormalVideoList = append(verticalNormalVideoList, currentVideoPath)
|
||||
} else if height >= 1000 && height < 2000 {
|
||||
vertical1KVideoList = append(vertical1KVideoList, currentVideoPath)
|
||||
} else if height >= 2000 && height < 3000 {
|
||||
vertical2KVideoList = append(vertical2KVideoList, currentVideoPath)
|
||||
} else if height >= 3000 && height < 4000 {
|
||||
vertical3KVideoList = append(vertical3KVideoList, currentVideoPath)
|
||||
} else if height >= 4000 && height < 5000 {
|
||||
vertical4KVideoList = append(vertical4KVideoList, currentVideoPath)
|
||||
} else if height >= 5000 && height < 6000 {
|
||||
vertical5KVideoList = append(vertical5KVideoList, currentVideoPath)
|
||||
} else if height >= 6000 && height < 7000 {
|
||||
vertical6KVideoList = append(vertical6KVideoList, currentVideoPath)
|
||||
} else if height >= 7000 && height < 8000 {
|
||||
vertical7KVideoList = append(vertical7KVideoList, currentVideoPath)
|
||||
} else if height >= 8000 && height < 9000 {
|
||||
vertical8KVideoList = append(vertical8KVideoList, currentVideoPath)
|
||||
} else if height >= 9000 && height < 10000 {
|
||||
vertical9KVideoList = append(vertical9KVideoList, currentVideoPath)
|
||||
} else if height >= 10000 {
|
||||
verticalHKVideoList = append(verticalHKVideoList, currentVideoPath)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理横向视频
|
||||
func handleHorizontalVideo(currentVideoPath string, width int, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
horizontalGifVideoList = append(horizontalGifVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
if width < 1000 {
|
||||
// 160 × 120
|
||||
// 320 × 180
|
||||
// 320 × 240
|
||||
// 640 × 360
|
||||
// 640 × 480
|
||||
horizontalNormalVideoList = append(horizontalNormalVideoList, currentVideoPath)
|
||||
} else if width >= 1000 && 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)
|
||||
} else if width >= 2000 && width < 3000 {
|
||||
horizontal2KVideoList = append(horizontal2KVideoList, currentVideoPath)
|
||||
} else if width >= 3000 && width < 4000 {
|
||||
// 3840 x 2160 -> 4k
|
||||
if width == 3840 && height == 2160 {
|
||||
horizontalStandard4KVideoList = append(horizontalStandard4KVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
horizontal3KVideoList = append(horizontal3KVideoList, currentVideoPath)
|
||||
} else if width >= 4000 && width < 5000 {
|
||||
horizontal4KVideoList = append(horizontal4KVideoList, currentVideoPath)
|
||||
} else if width >= 5000 && width < 6000 {
|
||||
horizontal5KVideoList = append(horizontal5KVideoList, currentVideoPath)
|
||||
} else if width >= 6000 && width < 7000 {
|
||||
horizontal6KVideoList = append(horizontal6KVideoList, currentVideoPath)
|
||||
} else if width >= 7000 && width < 8000 {
|
||||
// 7680 x 4320 -> 8k
|
||||
if width == 7680 && height == 4320 {
|
||||
horizontalStandard8KVideoList = append(horizontalStandard8KVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
horizontal7KVideoList = append(horizontal7KVideoList, currentVideoPath)
|
||||
} else if width >= 8000 && width < 9000 {
|
||||
horizontal8KVideoList = append(horizontal8KVideoList, currentVideoPath)
|
||||
} else if width >= 9000 && width < 10000 {
|
||||
horizontal9KVideoList = append(horizontal9KVideoList, currentVideoPath)
|
||||
} else if width >= 10000 {
|
||||
horizontalHKVideoList = append(horizontalHKVideoList, currentVideoPath)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理等比视频
|
||||
func handleSquareVideo(currentVideoPath string, width int, height int, suffix string) {
|
||||
if strings.EqualFold(suffix, ".gif") {
|
||||
squareGifVideoList = append(squareGifVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
if width < 1000 {
|
||||
squareNormalVideoList = append(squareNormalVideoList, currentVideoPath)
|
||||
} else if width >= 1000 && width < 2000 {
|
||||
// 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
|
||||
}
|
||||
square1KVideoList = append(square1KVideoList, currentVideoPath)
|
||||
} else if width >= 2000 && width < 3000 {
|
||||
square2KVideoList = append(square2KVideoList, currentVideoPath)
|
||||
} else if width >= 3000 && width < 4000 {
|
||||
// 3840 x 2160 -> 4k
|
||||
if width == 3840 && height == 2160 {
|
||||
squareStandard4KVideoList = append(squareStandard4KVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
square3KVideoList = append(square3KVideoList, currentVideoPath)
|
||||
} else if width >= 4000 && width < 5000 {
|
||||
square4KVideoList = append(square4KVideoList, currentVideoPath)
|
||||
} else if width >= 5000 && width < 6000 {
|
||||
square5KVideoList = append(square5KVideoList, currentVideoPath)
|
||||
} else if width >= 6000 && width < 7000 {
|
||||
square6KVideoList = append(square6KVideoList, currentVideoPath)
|
||||
} else if width >= 7000 && width < 8000 {
|
||||
// 7680 x 4320 -> 8k
|
||||
if width == 7680 && height == 4320 {
|
||||
squareStandard8KVideoList = append(squareStandard8KVideoList, currentVideoPath)
|
||||
return
|
||||
}
|
||||
square7KVideoList = append(square7KVideoList, currentVideoPath)
|
||||
} else if width >= 8000 && width < 9000 {
|
||||
square8KVideoList = append(square8KVideoList, currentVideoPath)
|
||||
} else if width >= 9000 && width < 10000 {
|
||||
square9KVideoList = append(square9KVideoList, currentVideoPath)
|
||||
} else if width >= 10000 {
|
||||
squareHKVideoList = append(squareHKVideoList, 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
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golang.org/x/image/webp"
|
||||
"os"
|
||||
)
|
||||
|
||||
// 读取webp格式的图片信息
|
||||
func readWebpTypeImage(webpFilePath string) (err error, width int, height int) {
|
||||
// 打开WebP文件
|
||||
file, err := os.Open(webpFilePath)
|
||||
if err != nil {
|
||||
fmt.Printf("=== Failed to open file: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
defer file.Close()
|
||||
// 使用webp.DecodeConfig解码WebP图片配置信息(不加载完整像素数据)
|
||||
imgConfig, err := webp.DecodeConfig(file)
|
||||
if err != nil {
|
||||
fmt.Printf("=== Failed to decode WebP image config: %v\n", err)
|
||||
return err, 0, 0
|
||||
}
|
||||
return nil, imgConfig.Width, imgConfig.Height
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
module OdMediaPicker
|
||||
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/gabriel-vasile/mimetype v1.4.3
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
golang.org/x/image v0.16.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/redmask-hb/GoSimplePrint v0.0.0-20210302075413-3a3af92bcb7d // indirect
|
||||
golang.org/x/net v0.17.0 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
)
|
|
@ -0,0 +1,17 @@
|
|||
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
|
||||
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
|
||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/redmask-hb/GoSimplePrint v0.0.0-20210302075413-3a3af92bcb7d h1:h/hohIqMUCML2Rp9BXXAu0I3ZR68d7eqMHLPNq7N2tg=
|
||||
github.com/redmask-hb/GoSimplePrint v0.0.0-20210302075413-3a3af92bcb7d/go.mod h1:LiYo3EFlYfk46Re4zgQysMo6yO3/kAXslB2fyMdl+uw=
|
||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw=
|
||||
golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs=
|
||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
@ -0,0 +1,32 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"OdMediaPicker/core"
|
||||
"OdMediaPicker/vars"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
_ "image/gif" // 导入gif支持
|
||||
_ "image/jpeg" // 导入jpeg支持
|
||||
_ "image/png" // 导入png支持
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rootDir, err := os.Getwd()
|
||||
if err != nil {
|
||||
fmt.Println("=== 获取当前路径异常", err)
|
||||
return
|
||||
}
|
||||
scanner := core.FileScanner{}
|
||||
scanner.DoScan(rootDir)
|
||||
scanner.DoFilter()
|
||||
if len(vars.GlobalImagePathList) > 0 {
|
||||
core.DoHandleImage(rootDir)
|
||||
}
|
||||
if len(vars.GlobalVideoPathList) > 0 {
|
||||
core.DoHandleVideo(rootDir)
|
||||
}
|
||||
fmt.Println("=== 5s后自动退出")
|
||||
time.Sleep(time.Second * 5)
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
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
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package vars
|
||||
|
||||
var GlobalFilePathList []string // 所有文件的路径
|
||||
var GlobalFilePath2MimeInfoMap = make(map[string]string) // 文件路径和mime信息的映射关系
|
||||
var GlobalFilePath2FileNameMap = make(map[string]string) // 文件路径和文件名称的映射关系
|
||||
var GlobalFilePath2FileExtMap = make(map[string]string) // 文件路径和文件扩展名的映射关系
|
||||
var GlobalVideoPathList []string // 所有视频文件的路径
|
||||
var GlobalImagePathList []string // 所有图片文件的路径
|
Loading…
Reference in New Issue