Improve large library storage backends and scans

This commit is contained in:
ShukeBta
2026-06-15 18:16:34 +08:00
parent c9e6adf041
commit a5bf4bfdd4
36 changed files with 2340 additions and 93 deletions
+51
View File
@@ -1,6 +1,8 @@
package handler
import (
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
@@ -62,3 +64,52 @@ func TestStatsSnapshotHidesAdultRecentlyAddedForUser(t *testing.T) {
t.Fatalf("recently added should hide adult library, got %#v", snap.RecentlyAdded)
}
}
func TestStatsLibrariesCountsMergedCloudLibraryItems(t *testing.T) {
gin.SetMode(gin.TestMode)
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.User{}, &model.Library{}, &model.Media{}, &model.Setting{}, &model.PlayProfile{}); err != nil {
t.Fatal(err)
}
repos := repository.New(db)
local := model.Library{Name: "国产电影", Path: "/media/国产电影", Type: "movie", Enabled: true}
cloud := model.Library{Name: "OpenList · 国产电影", Path: service.BuildCloudLibraryPath("openlist", "/国产电影", "/国产电影"), Type: "movie", Enabled: true}
for _, lib := range []*model.Library{&local, &cloud} {
if err := repos.Library.Create(t.Context(), lib); err != nil {
t.Fatal(err)
}
}
if err := db.Create(&[]model.Media{
{LibraryID: local.ID, Title: "本地版本", Path: "/media/国产电影/local.mkv", SizeBytes: 100},
{LibraryID: cloud.ID, Title: "云盘版本", Path: "cloud://openlist/国产电影/cloud.mkv", SizeBytes: 200},
}).Error; err != nil {
t.Fatal(err)
}
svc := &service.Container{Repo: repos}
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest("GET", "/api/stats/libraries", nil)
statsLibrariesHandler(svc)(c)
if w.Code != http.StatusOK {
t.Fatalf("status = %d body=%s", w.Code, w.Body.String())
}
var payload struct {
Libraries []struct {
ItemCount int64 `json:"item_count"`
TotalSize int64 `json:"total_size"`
} `json:"libraries"`
}
if err := json.Unmarshal(w.Body.Bytes(), &payload); err != nil {
t.Fatal(err)
}
if len(payload.Libraries) != 1 {
t.Fatalf("libraries = %#v, want one merged display library", payload.Libraries)
}
if payload.Libraries[0].ItemCount != 2 || payload.Libraries[0].TotalSize != 300 {
t.Fatalf("merged stats = %#v, want count=2 size=300", payload.Libraries[0])
}
}