优化,现有bug处理

This commit is contained in:
truewhile
2026-09-18 21:55:12 +08:00
parent 45f4763b0c
commit 61a7260eaf
42 changed files with 2429 additions and 92 deletions
+41
View File
@@ -122,11 +122,52 @@ func (s *ScannerService) localMediaScanState(in localMediaScanStateInput) (bool,
existing, exists := in.existingMedia[in.cleanPath]
isNewMedia := !exists
if exists && in.ext != ".strm" && existing.SizeBytes == in.size && !localMetadataNeedsRefresh(existing, in.localMeta) && !localDerivedMetadataNeedsRefresh(existing, in.incoming) {
// Unchanged rows are skipped, but a row that never received ffprobe data
// still needs a backfill probe so installing ffmpeg later repairs the library.
s.queueProbeBackfillIfNeeded(in.path, in.ext, existing)
return isNewMedia, true
}
return isNewMedia, false
}
// queueProbeBackfillIfNeeded re-queues ffprobe for an unchanged media row that
// still carries no technical metadata, reporting whether a probe was queued.
//
// The incremental skip above only compares file size and metadata, so a library
// scanned while ffprobe was unavailable kept duration/resolution/codec empty
// forever: installing ffmpeg and rescanning did nothing, and the only way out was
// a per-item manual "探测媒体轨". Only the probe is re-queued here — the row
// itself is not rewritten, so scraped metadata and titles stay untouched.
func (s *ScannerService) queueProbeBackfillIfNeeded(path, ext string, existing existingLocalMedia) bool {
if !mediaExtensionSupportsProbe(ext) || !localMediaProbeDataMissing(existing) {
return false
}
// Without a resolvable ffprobe/ffmpeg every queued probe would just fail, so
// only queue when probing is actually possible right now.
if s == nil || s.probe == nil || !s.probe.Available() {
return false
}
if !s.queueLocalMediaProbe(path) {
return false
}
if s.log != nil {
s.log.Debug("rescan queued ffprobe backfill for media without track metadata", zap.String("path", path))
}
return true
}
// localMediaProbeDataMissing reports whether a media row has none of the fields
// ffprobe fills in. Requiring every field to be empty keeps genuinely probed
// media (which always yields at least a codec or a duration) out of the backfill
// path.
func localMediaProbeDataMissing(existing existingLocalMedia) bool {
return existing.DurationSec <= 0 &&
existing.Width <= 0 &&
existing.Height <= 0 &&
strings.TrimSpace(existing.VideoCodec) == "" &&
strings.TrimSpace(existing.AudioCodec) == ""
}
type localScanMediaInput struct {
lib *model.Library
root *model.LibraryRoot