mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-07 22:06:38 +08:00
优化,现有bug处理
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user