From 3952d80d30d25c57a88058748255cb8f86b8c49d Mon Sep 17 00:00:00 2001 From: Rogee Date: Tue, 30 Dec 2025 18:07:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(storage):=20=E6=9B=B4=E6=96=B0=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E7=BB=93=E6=9E=84=E4=BB=A5=E4=BD=BF=E7=94=A8=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E5=AD=98=E5=82=A8=E6=8F=90=E4=BE=9B=E8=80=85=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=92=8C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/http/v1/storage.go | 14 +++++++----- backend/app/jobs/media_process_job.go | 33 +++++++++++++++++++-------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/backend/app/http/v1/storage.go b/backend/app/http/v1/storage.go index aa73ff9..fe51803 100644 --- a/backend/app/http/v1/storage.go +++ b/backend/app/http/v1/storage.go @@ -5,13 +5,15 @@ import ( "os" "path/filepath" - "quyun/v2/app/services" + "quyun/v2/providers/storage" "github.com/gofiber/fiber/v3" ) // @provider -type Storage struct{} +type Storage struct { + storage *storage.Storage +} // Upload file // @@ -28,12 +30,12 @@ type Storage struct{} // @Bind expires query // @Bind sign query func (s *Storage) Upload(ctx fiber.Ctx, key, expires, sign string) (string, error) { - if err := services.Storage.Verify("PUT", key, expires, sign); err != nil { + if err := s.storage.Verify("PUT", key, expires, sign); err != nil { return "", fiber.NewError(fiber.StatusForbidden, err.Error()) } // Save file - localPath := services.Storage.Config.LocalPath + localPath := s.storage.Config.LocalPath if localPath == "" { localPath = "./storage" } @@ -70,11 +72,11 @@ func (s *Storage) Upload(ctx fiber.Ctx, key, expires, sign string) (string, erro // @Bind expires query // @Bind sign query func (s *Storage) Download(ctx fiber.Ctx, key, expires, sign string) error { - if err := services.Storage.Verify("GET", key, expires, sign); err != nil { + if err := s.storage.Verify("GET", key, expires, sign); err != nil { return fiber.NewError(fiber.StatusForbidden, err.Error()) } - localPath := services.Storage.Config.LocalPath + localPath := s.storage.Config.LocalPath if localPath == "" { localPath = "./storage" } diff --git a/backend/app/jobs/media_process_job.go b/backend/app/jobs/media_process_job.go index 6c91f7f..63ac223 100644 --- a/backend/app/jobs/media_process_job.go +++ b/backend/app/jobs/media_process_job.go @@ -2,17 +2,17 @@ package jobs import ( "context" - "fmt" "os/exec" "path/filepath" "time" - "github.com/riverqueue/river" - log "github.com/sirupsen/logrus" "quyun/v2/app/jobs/args" "quyun/v2/database/models" "quyun/v2/pkg/consts" "quyun/v2/providers/storage" + + "github.com/riverqueue/river" + log "github.com/sirupsen/logrus" ) // @provider(job) @@ -30,7 +30,9 @@ func (j *MediaProcessWorker) Work(ctx context.Context, job *river.Job[args.Media } // 2. Update status to processing - _, err = models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.ID.Eq(asset.ID)).UpdateSimple(models.MediaAssetQuery.Status.Value(consts.MediaAssetStatusProcessing)) + _, err = models.MediaAssetQuery.WithContext(ctx). + Where(models.MediaAssetQuery.ID.Eq(asset.ID)). + UpdateSimple(models.MediaAssetQuery.Status.Value(consts.MediaAssetStatusProcessing)) if err != nil { return err } @@ -50,7 +52,18 @@ func (j *MediaProcessWorker) Work(ctx context.Context, job *river.Job[args.Media coverFile := filepath.Join(outputDir, filepath.Base(coverKey)) // Generate Cover - cmd := exec.CommandContext(ctx, "ffmpeg", "-y", "-i", inputFile, "-ss", "00:00:01.000", "-vframes", "1", coverFile) + cmd := exec.CommandContext( + ctx, + "ffmpeg", + "-y", + "-i", + inputFile, + "-ss", + "00:00:01.000", + "-vframes", + "1", + coverFile, + ) if out, err := cmd.CombinedOutput(); err != nil { log.Errorf("ffmpeg failed: %s, output: %s", err, string(out)) // Don't fail the job, just skip cover @@ -64,9 +77,11 @@ func (j *MediaProcessWorker) Work(ctx context.Context, job *river.Job[args.Media } // 4. Update status to ready - _, err = models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.ID.Eq(asset.ID)).Updates(&models.MediaAsset{ - Status: consts.MediaAssetStatusReady, - UpdatedAt: time.Now(), - }) + _, err = models.MediaAssetQuery.WithContext(ctx). + Where(models.MediaAssetQuery.ID.Eq(asset.ID)). + Updates(&models.MediaAsset{ + Status: consts.MediaAssetStatusReady, + UpdatedAt: time.Now(), + }) return err }