147 lines
3.5 KiB
Go
147 lines
3.5 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"rear/internal/utils"
|
|
"strings"
|
|
)
|
|
|
|
// ExifData EXIF 数据
|
|
type ExifData map[string]interface{}
|
|
|
|
// GetExifData 获取 EXIF 数据
|
|
func GetExifData(ctx context.Context, input string) (ExifData, error) {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result, err := utils.ExecuteCommand(ctx, utils.ExifToolPath, "-j", "-n", input)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("exiftool failed: %w, stderr: %s", err, string(result.Stderr))
|
|
}
|
|
|
|
// 解析 JSON 输出
|
|
var data []ExifData
|
|
if err := json.Unmarshal(result.Stdout, &data); err != nil {
|
|
return nil, fmt.Errorf("failed to parse exif data: %w", err)
|
|
}
|
|
|
|
if len(data) == 0 {
|
|
return nil, fmt.Errorf("no exif data found")
|
|
}
|
|
|
|
return data[0], nil
|
|
}
|
|
|
|
// GetExifField 获取特定的 EXIF 字段
|
|
func GetExifField(ctx context.Context, input string, fields ...string) (map[string]string, error) {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
args := []string{"-s", "-s", "-s"}
|
|
for _, field := range fields {
|
|
args = append(args, "-"+field)
|
|
}
|
|
args = append(args, input)
|
|
|
|
result, err := utils.ExecuteCommand(ctx, utils.ExifToolPath, args...)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("exiftool failed: %w, stderr: %s", err, string(result.Stderr))
|
|
}
|
|
|
|
// 解析输出
|
|
data := make(map[string]string)
|
|
lines := strings.Split(string(result.Stdout), "\n")
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if line != "" {
|
|
// 简单解析,假设最后一个字段是值
|
|
parts := strings.Fields(line)
|
|
if len(parts) > 0 {
|
|
field := fields[len(data)]
|
|
data[field] = parts[len(parts)-1]
|
|
}
|
|
}
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// RemoveExifData 移除 EXIF 数据
|
|
func RemoveExifData(ctx context.Context, input string, backup bool) error {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return err
|
|
}
|
|
|
|
args := []string{"-all="}
|
|
if !backup {
|
|
args = append(args, "-overwrite_original")
|
|
}
|
|
args = append(args, input)
|
|
|
|
result, err := utils.ExecuteCommand(ctx, utils.ExifToolPath, args...)
|
|
if err != nil {
|
|
return fmt.Errorf("remove exif failed: %w, stderr: %s", err, string(result.Stderr))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CopyExifData 复制 EXIF 数据从一个文件到另一个文件
|
|
func CopyExifData(ctx context.Context, source, target string) error {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return err
|
|
}
|
|
|
|
args := []string{
|
|
"-TagsFromFile", source,
|
|
"-all:all",
|
|
"-overwrite_original",
|
|
target,
|
|
}
|
|
|
|
result, err := utils.ExecuteCommand(ctx, utils.ExifToolPath, args...)
|
|
if err != nil {
|
|
return fmt.Errorf("copy exif failed: %w, stderr: %s", err, string(result.Stderr))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SetExifField 设置 EXIF 字段
|
|
func SetExifField(ctx context.Context, input string, fields map[string]string) error {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return err
|
|
}
|
|
|
|
args := []string{}
|
|
for key, value := range fields {
|
|
args = append(args, fmt.Sprintf("-%s=%s", key, value))
|
|
}
|
|
args = append(args, "-overwrite_original", input)
|
|
|
|
result, err := utils.ExecuteCommand(ctx, utils.ExifToolPath, args...)
|
|
if err != nil {
|
|
return fmt.Errorf("set exif failed: %w, stderr: %s", err, string(result.Stderr))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsExifToolAvailable 检查 ExifTool 是否可用
|
|
func IsExifToolAvailable() bool {
|
|
if err := utils.EnsureInitialized(); err != nil {
|
|
return false
|
|
}
|
|
return utils.ExifToolPath != ""
|
|
}
|
|
|
|
// GetToolPaths 获取工具路径(用于调试)
|
|
func GetToolPaths() (imageMagick, exifTool string) {
|
|
utils.EnsureInitialized()
|
|
return utils.ImageMagickPath, utils.ExifToolPath
|
|
}
|