feat: update video cut and extract head image job
This commit is contained in:
111
backend/app/jobs/video_store_short.go
Normal file
111
backend/app/jobs/video_store_short.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package jobs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"quyun/app/models"
|
||||
"quyun/database/fields"
|
||||
"quyun/database/schemas/public/model"
|
||||
"quyun/pkg/utils"
|
||||
"quyun/providers/ali"
|
||||
"quyun/providers/app"
|
||||
"quyun/providers/job"
|
||||
|
||||
. "github.com/riverqueue/river"
|
||||
log "github.com/sirupsen/logrus"
|
||||
_ "go.ipao.vip/atom"
|
||||
"go.ipao.vip/atom/contracts"
|
||||
)
|
||||
|
||||
var _ contracts.JobArgs = (*VideoStoreShort)(nil)
|
||||
|
||||
type VideoStoreShort struct {
|
||||
MediaID int64 `json:"media_id"`
|
||||
FilePath string `json:"file_path"`
|
||||
}
|
||||
|
||||
func (s VideoStoreShort) InsertOpts() InsertOpts {
|
||||
return InsertOpts{
|
||||
Queue: QueueDefault,
|
||||
Priority: PriorityDefault,
|
||||
}
|
||||
}
|
||||
|
||||
func (s VideoStoreShort) Kind() string { return "video_store_short" }
|
||||
func (a VideoStoreShort) UniqueID() string { return a.Kind() }
|
||||
|
||||
var _ Worker[VideoStoreShort] = (*VideoStoreShortWorker)(nil)
|
||||
|
||||
// @provider(job)
|
||||
type VideoStoreShortWorker struct {
|
||||
WorkerDefaults[VideoStoreShort]
|
||||
|
||||
oss *ali.OSSClient
|
||||
job *job.Job
|
||||
app *app.Config
|
||||
}
|
||||
|
||||
func (w *VideoStoreShortWorker) NextRetry(job *Job[VideoStoreShort]) time.Time {
|
||||
return time.Now().Add(30 * time.Second)
|
||||
}
|
||||
|
||||
func (w *VideoStoreShortWorker) Work(ctx context.Context, job *Job[VideoStoreShort]) error {
|
||||
log := log.WithField("job", job.Args.Kind())
|
||||
|
||||
log.Infof("[Start] Working on job with strings: %+v", job.Args)
|
||||
defer log.Infof("[End] Finished %s", job.Args.Kind())
|
||||
|
||||
media, err := models.Medias.GetByID(ctx, job.Args.MediaID)
|
||||
if err != nil {
|
||||
log.Errorf("Error getting media by ID: %v", err)
|
||||
return JobCancel(err)
|
||||
}
|
||||
|
||||
duration, err := utils.GetMediaDuration(job.Args.FilePath)
|
||||
if err != nil {
|
||||
log.Errorf("Error getting media duration: %v", err)
|
||||
return JobCancel(err)
|
||||
}
|
||||
|
||||
// get file md5
|
||||
fileMd5, err := utils.GetFileMd5(job.Args.FilePath)
|
||||
if err != nil {
|
||||
log.Errorf("Error getting file md5: %v", err)
|
||||
return JobCancel(err)
|
||||
}
|
||||
|
||||
filePath := w.oss.GetSavePath(fileMd5 + filepath.Ext(job.Args.FilePath))
|
||||
|
||||
// get file size
|
||||
fileSize, err := utils.GetFileSize(job.Args.FilePath)
|
||||
if err != nil {
|
||||
log.Errorf("Error getting file size: %v", err)
|
||||
return JobCancel(err)
|
||||
}
|
||||
|
||||
// save to db and relate to master
|
||||
mediaModel := &model.Medias{
|
||||
CreatedAt: time.Now(),
|
||||
Name: "[试听]" + media.Name,
|
||||
MimeType: media.MimeType,
|
||||
Size: fileSize,
|
||||
Path: filePath,
|
||||
Hash: fileMd5,
|
||||
Metas: fields.ToJson(fields.MediaMetas{
|
||||
ParentHash: media.Hash,
|
||||
Short: true,
|
||||
Duration: duration,
|
||||
}),
|
||||
}
|
||||
|
||||
if err := models.Medias.Create(ctx, mediaModel); err != nil {
|
||||
log.Errorf("Error saving media record: %v data: %+v", err, mediaModel)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Infof("Media record created with path: %s and hash: %s", filePath, fileMd5)
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user