mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-01 03:56:38 +08:00
优化
This commit is contained in:
@@ -100,14 +100,21 @@ func (s *MediaService) ListLibrariesWithPreview(ctx context.Context, libraries [
|
||||
if len(items) == 0 {
|
||||
continue
|
||||
}
|
||||
cards := groupMediaSeriesCards(items)
|
||||
if len(cards) > cardLimit {
|
||||
cards = cards[:cardLimit]
|
||||
}
|
||||
if cards == nil {
|
||||
cards = []SeriesCard{}
|
||||
}
|
||||
out[i].Cards = cards
|
||||
cards := groupMediaSeriesCards(items)
|
||||
// 如果折叠后的作品部数不足 cardLimit,且该库总记录数大于当前提取的条目数,
|
||||
// 说明多集剧集折叠占满了提取窗口,调用 ListLibrarySeriesCards 补齐完整的影视部数。
|
||||
if len(cards) < cardLimit && out[i].Total > int64(len(items)) {
|
||||
if fullCards, _, err := s.ListLibrarySeriesCards(ctx, out[i].ID, visibility); err == nil && len(fullCards) > 0 {
|
||||
cards = fullCards
|
||||
}
|
||||
}
|
||||
if len(cards) > cardLimit {
|
||||
cards = cards[:cardLimit]
|
||||
}
|
||||
if cards == nil {
|
||||
cards = []SeriesCard{}
|
||||
}
|
||||
out[i].Cards = cards
|
||||
}
|
||||
|
||||
if s.cache != nil {
|
||||
|
||||
@@ -92,3 +92,66 @@ func TestListLibrariesWithPreview(t *testing.T) {
|
||||
t.Errorf("preview[1].Cards[0].Count = %d, want 12", previews[1].Cards[0].Count)
|
||||
}
|
||||
}
|
||||
|
||||
func TestListLibrariesWithPreviewLongSeriesCompletion(t *testing.T) {
|
||||
db := newServiceTestDB(t, &model.Library{}, &model.Media{})
|
||||
repos := repository.New(db)
|
||||
|
||||
lib := model.Library{Name: "剧集库", Path: "/media/tv", Type: "tv", Enabled: true}
|
||||
if err := repos.Library.Create(t.Context(), &lib); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
now := time.Date(2026, 7, 2, 12, 0, 0, 0, time.UTC)
|
||||
var rows []model.Media
|
||||
|
||||
// 1. 添加一部更早入库的短剧(2 集),如果按窗口 60 条限制,排在第 70 集之后,无法被初始窗口截取
|
||||
for i := 1; i <= 2; i++ {
|
||||
rows = append(rows, model.Media{
|
||||
Base: model.Base{ID: fmt.Sprintf("short-ep-%02d", i), CreatedAt: now.Add(-time.Duration(100-i) * time.Minute)},
|
||||
LibraryID: lib.ID,
|
||||
Title: fmt.Sprintf("经典短剧 第%d集", i),
|
||||
Path: fmt.Sprintf("/media/tv/经典短剧/Season 01/经典短剧.S01E%02d.mp4", i),
|
||||
SeasonNum: 1,
|
||||
EpisodeNum: i,
|
||||
})
|
||||
}
|
||||
|
||||
// 2. 添加一部最新入库的 70 集长篇连续剧,这 70 篇全在新入库时间线上
|
||||
for i := 1; i <= 70; i++ {
|
||||
rows = append(rows, model.Media{
|
||||
Base: model.Base{ID: fmt.Sprintf("long-ep-%02d", i), CreatedAt: now.Add(time.Duration(i) * time.Minute)},
|
||||
LibraryID: lib.ID,
|
||||
Title: fmt.Sprintf("大长篇连续剧 第%d集", i),
|
||||
Path: fmt.Sprintf("/media/tv/大长篇连续剧/Season 01/大长篇连续剧.S01E%02d.mp4", i),
|
||||
SeasonNum: 1,
|
||||
EpisodeNum: i,
|
||||
})
|
||||
}
|
||||
|
||||
if err := repos.DB.Create(&rows).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
svc := NewMediaService(&config.Config{}, zap.NewNop(), repos)
|
||||
|
||||
// 请求 10 部卡片
|
||||
previews, err := svc.ListLibrariesWithPreview(t.Context(), []model.Library{lib}, MediaVisibility{IncludeNSFW: true}, 10)
|
||||
if err != nil {
|
||||
t.Fatalf("ListLibrariesWithPreview failed: %v", err)
|
||||
}
|
||||
|
||||
if len(previews) != 1 {
|
||||
t.Fatalf("got %d previews, want 1", len(previews))
|
||||
}
|
||||
|
||||
// 总媒体行数是 72 行
|
||||
if previews[0].Total != 72 {
|
||||
t.Errorf("previews[0].Total = %d, want 72", previews[0].Total)
|
||||
}
|
||||
|
||||
// 验证自适应补全机制:必须包含 2 部剧集(长篇 + 短剧),而不是因为长篇 70 集占满窗口只显示 1 部
|
||||
if len(previews[0].Cards) != 2 {
|
||||
t.Fatalf("previews[0].Cards count = %d, want 2", len(previews[0].Cards))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user