feat(storage): 更新存储结构以使用新的存储提供者并优化文件上传和下载逻辑

This commit is contained in:
2025-12-30 18:07:58 +08:00
parent d87eac7d94
commit 3952d80d30
2 changed files with 32 additions and 15 deletions

View File

@@ -5,13 +5,15 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"quyun/v2/app/services" "quyun/v2/providers/storage"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
) )
// @provider // @provider
type Storage struct{} type Storage struct {
storage *storage.Storage
}
// Upload file // Upload file
// //
@@ -28,12 +30,12 @@ type Storage struct{}
// @Bind expires query // @Bind expires query
// @Bind sign query // @Bind sign query
func (s *Storage) Upload(ctx fiber.Ctx, key, expires, sign string) (string, error) { 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()) return "", fiber.NewError(fiber.StatusForbidden, err.Error())
} }
// Save file // Save file
localPath := services.Storage.Config.LocalPath localPath := s.storage.Config.LocalPath
if localPath == "" { if localPath == "" {
localPath = "./storage" localPath = "./storage"
} }
@@ -70,11 +72,11 @@ func (s *Storage) Upload(ctx fiber.Ctx, key, expires, sign string) (string, erro
// @Bind expires query // @Bind expires query
// @Bind sign query // @Bind sign query
func (s *Storage) Download(ctx fiber.Ctx, key, expires, sign string) error { 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()) return fiber.NewError(fiber.StatusForbidden, err.Error())
} }
localPath := services.Storage.Config.LocalPath localPath := s.storage.Config.LocalPath
if localPath == "" { if localPath == "" {
localPath = "./storage" localPath = "./storage"
} }

View File

@@ -2,17 +2,17 @@ package jobs
import ( import (
"context" "context"
"fmt"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"time" "time"
"github.com/riverqueue/river"
log "github.com/sirupsen/logrus"
"quyun/v2/app/jobs/args" "quyun/v2/app/jobs/args"
"quyun/v2/database/models" "quyun/v2/database/models"
"quyun/v2/pkg/consts" "quyun/v2/pkg/consts"
"quyun/v2/providers/storage" "quyun/v2/providers/storage"
"github.com/riverqueue/river"
log "github.com/sirupsen/logrus"
) )
// @provider(job) // @provider(job)
@@ -30,7 +30,9 @@ func (j *MediaProcessWorker) Work(ctx context.Context, job *river.Job[args.Media
} }
// 2. Update status to processing // 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 { if err != nil {
return err 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)) coverFile := filepath.Join(outputDir, filepath.Base(coverKey))
// Generate Cover // 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 { if out, err := cmd.CombinedOutput(); err != nil {
log.Errorf("ffmpeg failed: %s, output: %s", err, string(out)) log.Errorf("ffmpeg failed: %s, output: %s", err, string(out))
// Don't fail the job, just skip cover // 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 // 4. Update status to ready
_, err = models.MediaAssetQuery.WithContext(ctx).Where(models.MediaAssetQuery.ID.Eq(asset.ID)).Updates(&models.MediaAsset{ _, err = models.MediaAssetQuery.WithContext(ctx).
Status: consts.MediaAssetStatusReady, Where(models.MediaAssetQuery.ID.Eq(asset.ID)).
UpdatedAt: time.Now(), Updates(&models.MediaAsset{
}) Status: consts.MediaAssetStatusReady,
UpdatedAt: time.Now(),
})
return err return err
} }