From 1afc69baa0690c01868db4c14042e84ab35eb7e4 Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:48:53 +0800 Subject: [PATCH] feat: report STRM tree batch progress --- internal/service/strm_generate.go | 21 ++++++++++++--------- internal/service/strm_tree_import.go | 6 +++++- internal/service/strm_tree_import_test.go | 6 ++++++ web/src/api/strm.ts | 3 +++ web/src/pages/StrmGenerateSectionParts.tsx | 4 ++++ 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/internal/service/strm_generate.go b/internal/service/strm_generate.go index 012dd37..3a693b1 100644 --- a/internal/service/strm_generate.go +++ b/internal/service/strm_generate.go @@ -25,15 +25,18 @@ type GenerateSTRMOptions struct { } type GenerateSTRMResult struct { - LibraryID string `json:"library_id"` - OutputDir string `json:"output_dir"` - Generated int `json:"generated"` - Updated int `json:"updated"` - Skipped int `json:"skipped"` - Cleaned int `json:"cleaned"` - Previewed int `json:"previewed,omitempty"` - Errors []string `json:"errors,omitempty"` - Items []GenerateSTRMItem `json:"items,omitempty"` + LibraryID string `json:"library_id"` + OutputDir string `json:"output_dir"` + Generated int `json:"generated"` + Updated int `json:"updated"` + Skipped int `json:"skipped"` + Cleaned int `json:"cleaned"` + Total int `json:"total,omitempty"` + Remaining int `json:"remaining,omitempty"` + BatchLimited bool `json:"batch_limited,omitempty"` + Previewed int `json:"previewed,omitempty"` + Errors []string `json:"errors,omitempty"` + Items []GenerateSTRMItem `json:"items,omitempty"` } type GenerateSTRMItem struct { diff --git a/internal/service/strm_tree_import.go b/internal/service/strm_tree_import.go index 957cc75..e96821f 100644 --- a/internal/service/strm_tree_import.go +++ b/internal/service/strm_tree_import.go @@ -44,8 +44,10 @@ func (s *STRMService) GenerateFromTree(ctx context.Context, opts GenerateSTRMTre } } result := &GenerateSTRMResult{LibraryID: provider, OutputDir: outputDir} + sources := collectSTRMTreeSources(opts) + result.Total = len(sources) expectedFiles := make(map[string]struct{}) - for _, source := range collectSTRMTreeSources(opts) { + for i, source := range sources { select { case <-ctx.Done(): return result, ctx.Err() @@ -57,6 +59,8 @@ func (s *STRMService) GenerateFromTree(ctx context.Context, opts GenerateSTRMTre } result.addItem(item) if strmTreeBatchLimitReached(result, opts.BatchLimit) { + result.Remaining = len(sources) - i - 1 + result.BatchLimited = result.Remaining > 0 break } } diff --git a/internal/service/strm_tree_import_test.go b/internal/service/strm_tree_import_test.go index d576fa1..0af400b 100644 --- a/internal/service/strm_tree_import_test.go +++ b/internal/service/strm_tree_import_test.go @@ -155,6 +155,9 @@ func TestGenerateSTRMFromTreeBatchLimitContinuesAfterExistingFiles(t *testing.T) if first.Generated != 2 || first.Skipped != 0 { t.Fatalf("first batch = %#v, want two generated", first) } + if first.Total != 3 || first.Remaining != 1 || !first.BatchLimited { + t.Fatalf("first batch progress = total %d remaining %d limited %v, want 3/1/true", first.Total, first.Remaining, first.BatchLimited) + } if _, err := os.Stat(filepath.Join(outDir, "Movies", "C.strm")); !os.IsNotExist(err) { t.Fatalf("first batch should not write third item, stat err=%v", err) } @@ -166,6 +169,9 @@ func TestGenerateSTRMFromTreeBatchLimitContinuesAfterExistingFiles(t *testing.T) if second.Generated != 1 || second.Skipped != 2 { t.Fatalf("second batch = %#v, want two existing skips then next generated", second) } + if second.Total != 3 || second.Remaining != 0 || second.BatchLimited { + t.Fatalf("second batch progress = total %d remaining %d limited %v, want 3/0/false", second.Total, second.Remaining, second.BatchLimited) + } if got := readSTRM(t, filepath.Join(outDir, "Movies", "C.strm")); !strings.Contains(got, "C.mkv") { t.Fatalf("second batch C.strm = %q, want generated third item", got) } diff --git a/web/src/api/strm.ts b/web/src/api/strm.ts index d5ec36d..27cc27f 100644 --- a/web/src/api/strm.ts +++ b/web/src/api/strm.ts @@ -17,6 +17,9 @@ export type GenerateSTRMResult = { updated: number skipped: number cleaned: number + total?: number + remaining?: number + batch_limited?: boolean previewed?: number errors?: string[] items?: Array<{ diff --git a/web/src/pages/StrmGenerateSectionParts.tsx b/web/src/pages/StrmGenerateSectionParts.tsx index a840758..345b3fc 100644 --- a/web/src/pages/StrmGenerateSectionParts.tsx +++ b/web/src/pages/StrmGenerateSectionParts.tsx @@ -272,8 +272,12 @@ export function StrmGenerateResultPanel({ result }: { result: GenerateSTRMResult
{result.previewed ? `预检 ${result.previewed} · ` : ''} + {result.total ? `共 ${result.total} · ` : ''} 新增 {result.generated} · 更新 {result.updated} · 跳过 {result.skipped} · 清理 {result.cleaned || 0}
+ {result.batch_limited && ( +
本批已达到上限,剩余 {result.remaining || 0} 个可继续运行。
+ )} {result.errors && result.errors.length > 0 && (
失败 {result.errors.length} 条:{result.errors.slice(0, 3).join(';')}