From e02531308e1bab7b5ab835d5cfbbb0ef90c61ba7 Mon Sep 17 00:00:00 2001 From: saltbo Date: Fri, 5 Jun 2026 23:12:54 -0400 Subject: [PATCH] fix(downloader): persist completed aria2 seeds --- downloader/internal/engine/aria2.go | 25 +++++++++++++++-------- downloader/internal/engine/engine_test.go | 19 +++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/downloader/internal/engine/aria2.go b/downloader/internal/engine/aria2.go index b46a8737..157b7e96 100644 --- a/downloader/internal/engine/aria2.go +++ b/downloader/internal/engine/aria2.go @@ -62,10 +62,24 @@ func (a Aria2) Start(ctx context.Context) (*exec.Cmd, error) { if err != nil { return nil, err } + args, err := a.startArgs(rpcURL.port) + if err != nil { + return nil, err + } + cmd := exec.Command(path, args...) + configureEngineProcess(cmd) + if err := cmd.Start(); err != nil { + return nil, err + } + go func() { _ = cmd.Wait() }() + return cmd, nil +} + +func (a Aria2) startArgs(rpcPort string) ([]string, error) { args := []string{ "--enable-rpc=true", "--rpc-listen-all=false", - "--rpc-listen-port=" + rpcURL.port, + "--rpc-listen-port=" + rpcPort, "--dir=" + a.Dir, "--continue=true", "--allow-overwrite=true", @@ -85,18 +99,13 @@ func (a Aria2) Start(ctx context.Context) (*exec.Cmd, error) { "--input-file="+sessionPath, "--save-session="+sessionPath, "--save-session-interval=30", + "--force-save=true", ) } if a.Secret != "" { args = append(args, "--rpc-secret="+a.Secret) } - cmd := exec.Command(path, args...) - configureEngineProcess(cmd) - if err := cmd.Start(); err != nil { - return nil, err - } - go func() { _ = cmd.Wait() }() - return cmd, nil + return args, nil } func (a Aria2) Check(ctx context.Context) error { diff --git a/downloader/internal/engine/engine_test.go b/downloader/internal/engine/engine_test.go index 60e720d7..592e492b 100644 --- a/downloader/internal/engine/engine_test.go +++ b/downloader/internal/engine/engine_test.go @@ -74,6 +74,25 @@ func TestHTTPRejectsMagnet(t *testing.T) { } } +func TestAria2StartArgsForceSaveCompletedSeeds(t *testing.T) { + stateDir := t.TempDir() + args, err := (Aria2{Dir: t.TempDir(), StateDir: stateDir}).startArgs("6800") + if err != nil { + t.Fatal(err) + } + joined := strings.Join(args, "\n") + for _, expected := range []string{ + "--input-file=" + filepath.Join(stateDir, "aria2.session"), + "--save-session=" + filepath.Join(stateDir, "aria2.session"), + "--save-session-interval=30", + "--force-save=true", + } { + if !strings.Contains(joined, expected) { + t.Fatalf("expected aria2 args to contain %q, got %v", expected, args) + } + } +} + func TestHTTPDownloadResumesExistingFile(t *testing.T) { var rangeHeader string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {