优化缩略图

This commit is contained in:
truewhile
2026-09-20 14:13:49 +08:00
parent 9b2b592003
commit c24ebe181d
14 changed files with 119 additions and 43 deletions
@@ -9,6 +9,7 @@ import (
"os"
"path/filepath"
"testing"
"time"
"github.com/glebarez/sqlite"
"go.uber.org/zap"
@@ -62,6 +63,47 @@ func TestWriteArtworkDataToPathReplacesExistingSidecar(t *testing.T) {
}
}
// TestWriteArtworkDataToPathSkipsUnchangedSidecar 验证"内容一致就不重写":
// 缩略图缓存键包含源文件的大小与 mtime,无谓的重写会让该条目所有尺寸的缩略图
// 一起失效,下次浏览全部重新解码。
func TestWriteArtworkDataToPathSkipsUnchangedSidecar(t *testing.T) {
scraper := &ScraperService{log: zap.NewNop()}
mediaDir := t.TempDir()
dst := scraper.writeArtworkDataToPath(mediaDir, "poster", "image/jpeg", testJPEG)
if dst == "" {
t.Fatal("expected a written destination path")
}
// 把 mtime 拨回过去,再写入完全相同的字节:文件必须原样保留。
past := time.Now().Add(-2 * time.Hour)
if err := os.Chtimes(dst, past, past); err != nil {
t.Fatal(err)
}
if got := scraper.writeArtworkDataToPath(mediaDir, "poster", "image/jpeg", testJPEG); got != dst {
t.Fatalf("destination = %q, want %q", got, dst)
}
info, err := os.Stat(dst)
if err != nil {
t.Fatal(err)
}
if time.Since(info.ModTime()) < time.Minute {
t.Fatalf("mtime = %v, want the original past timestamp (identical artwork was rewritten)", info.ModTime())
}
// 内容变化时仍然必须覆盖。
changed := append([]byte(nil), testJPEG...)
changed[len(changed)-1] = 0x00
if got := scraper.writeArtworkDataToPath(mediaDir, "poster", "image/jpeg", changed); got != dst {
t.Fatalf("destination = %q, want %q", got, dst)
}
data, err := os.ReadFile(dst)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(data, changed) {
t.Fatal("changed artwork was not written")
}
}
func TestShouldCropAdultPosterWhenTMDbArtworkMatchedCodePath(t *testing.T) {
media := &model.Media{
Path: filepath.Join(t.TempDir(), "IPX-235.mp4"),