package core import ( "fmt" "kenaito-media-picker/store" "kenaito-media-picker/util" "kenaito-media-picker/vars" "os" ) // saveMediaRecord 将媒体信息写入数据库;大文件优先用指纹(头尾采样)复用已入库的MD5,避免全量读取 func saveMediaRecord(filePath string, mediaType string, width int, height int, duration float64, codec string, format string, rawInfo string) { st, err := os.Stat(filePath) if err != nil { fmt.Printf("=== 读取文件信息失败: %s, 错误: %v\n", filePath, err) return } size := st.Size() md5Str := "" headMd5, tailMd5 := "", "" if size > util.FingerprintThreshold { if head, tail, ferr := util.CalcFileFingerprint(filePath, size); ferr == nil { headMd5, tailMd5 = head, tail if existing, ok := store.FindMediaByFingerprint(size, head, tail); ok && existing.FileMd5 != "" { md5Str = existing.FileMd5 // 指纹命中,复用MD5,跳过全量读取 } } } if md5Str == "" { if md5Str, err = util.CalcFileMd5(filePath); err != nil { fmt.Printf("=== 计算MD5失败: %s, 错误: %v\n", filePath, err) return } } info := &store.MediaInfo{ FileMd5: md5Str, FilePath: filePath, FileName: vars.GlobalFilePath2FileNameMap[filePath], FileExt: vars.GlobalFilePath2FileExtMap[filePath], FileSize: size, MimeType: vars.GlobalFilePath2MimeInfoMap[filePath], MediaType: mediaType, Width: width, Height: height, Duration: duration, Codec: codec, Format: format, RawInfo: rawInfo, HeadMd5: headMd5, TailMd5: tailMd5, } if err := store.SaveMedia(info); err != nil { fmt.Printf("=== 保存媒体信息失败: %s, 错误: %v\n", filePath, err) } }