diff --git a/internal/service/scan.go b/internal/service/scan.go index bf074c6..5474962 100644 --- a/internal/service/scan.go +++ b/internal/service/scan.go @@ -348,7 +348,7 @@ func (s *ScanService) runMove(ctx context.Context) { // 执行移动 mv := &mover.Mover{} - mv.MoveAll(jobs, func(doneCount int) { + moved := mv.MoveAll(jobs, func(doneCount int) { s.setProgress(stageMove, doneCount, len(jobs)) if ctx.Err() != nil { return @@ -360,6 +360,13 @@ func (s *ScanService) runMove(ctx context.Context) { return } + // 更新 media_info 中的 file_path 为新路径 + if len(moved) > 0 { + if err := s.store.UpdateMediaFilePaths(moved); err != nil { + fmt.Printf("=== 更新媒体文件路径失败: %v\n", err) + } + } + // 移动完成后清空续传记录 if err := s.store.ClearScanLog(); err != nil { fmt.Printf("=== 清空续传记录失败: %v\n", err) diff --git a/internal/store/store.go b/internal/store/store.go index 09018ba..15d836c 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -198,6 +198,27 @@ func (s *Store) ClearScanLog() error { return err } +// UpdateMediaFilePaths 批量更新 media_info 的 file_path。 +// moved 的 key 是源路径,value 是新路径。 +func (s *Store) UpdateMediaFilePaths(moved map[string]string) error { + if s == nil || s.engine == nil || len(moved) == 0 { + return nil + } + sess := s.engine.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + for oldPath, newPath := range moved { + if _, err := sess.Where("file_path = ?", oldPath). + Update(&MediaInfo{FilePath: newPath}); err != nil { + _ = sess.Rollback() + return err + } + } + return sess.Commit() +} + // ============================ 媒体记录的新增/更新 ============================ // SaveMedia 保存/更新一条媒体记录:按 MD5 找,有就更新,没有就新增。