diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..1495e77 Binary files /dev/null and b/.DS_Store differ diff --git a/backend/app/http/admin/provider.gen.go b/backend/app/http/admin/provider.gen.go index 938ed8e..3a01759 100755 --- a/backend/app/http/admin/provider.gen.go +++ b/backend/app/http/admin/provider.gen.go @@ -3,6 +3,7 @@ package admin import ( "quyun/providers/ali" "quyun/providers/app" + "quyun/providers/job" "quyun/providers/jwt" "go.ipao.vip/atom" @@ -74,10 +75,12 @@ func Provide(opts ...opt.Option) error { } if err := container.Container.Provide(func( app *app.Config, + job *job.Job, oss *ali.OSSClient, ) (*uploads, error) { obj := &uploads{ app: app, + job: job, oss: oss, } diff --git a/backend/app/http/admin/uploads.go b/backend/app/http/admin/uploads.go index 8ac89d6..3dae274 100644 --- a/backend/app/http/admin/uploads.go +++ b/backend/app/http/admin/uploads.go @@ -79,7 +79,7 @@ func (up *uploads) PostUploadedAction(ctx fiber.Ctx, body *PostUploadedForm) err } if m.MimeType == "video/mp4" { - if err := up.job.Add(&jobs.DownloadFromAliOSS{MediaID: m.ID}); err != nil { + if err := up.job.Add(&jobs.DownloadFromAliOSS{MediaHash: m.Hash}); err != nil { log.WithError(err).WithField("media", m).Errorf("add job failed") } } diff --git a/backend/app/jobs/download_from_alioss.go b/backend/app/jobs/download_from_alioss.go index d3d7157..12abcc4 100644 --- a/backend/app/jobs/download_from_alioss.go +++ b/backend/app/jobs/download_from_alioss.go @@ -22,7 +22,7 @@ import ( var _ contracts.JobArgs = (*WechatCallback)(nil) type DownloadFromAliOSS struct { - MediaID int64 `json:"media_id"` + MediaHash string `json:"media_hash"` } func (s DownloadFromAliOSS) InsertOpts() InsertOpts { @@ -56,7 +56,7 @@ func (w *DownloadFromAliOSSWorker) Work(ctx context.Context, job *Job[DownloadFr 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) + media, err := models.Medias.GetByHash(ctx, job.Args.MediaHash) if err != nil { log.Errorf("Error getting media by ID: %v", err) return JobCancel(err) @@ -73,15 +73,15 @@ func (w *DownloadFromAliOSSWorker) Work(ctx context.Context, job *Job[DownloadFr log.Errorf("Error creating directory: %v", err) return err } - } - - if st.Size() == media.Size { - return JobCancel(errors.New("file already downloaded")) } else { - // remove file - if err := os.Remove(dst); err != nil { - log.Errorf("Error removing file: %v", err) - return err + if st.Size() == media.Size { + return JobCancel(errors.New("file already downloaded")) + } else { + // remove file + if err := os.Remove(dst); err != nil { + log.Errorf("Error removing file: %v", err) + return err + } } } @@ -93,12 +93,12 @@ func (w *DownloadFromAliOSSWorker) Work(ctx context.Context, job *Job[DownloadFr log.Infof("Successfully downloaded file: %s", media.Path) - if err := w.job.Add(&VideoCut{MediaID: job.Args.MediaID}); err != nil { + if err := w.job.Add(&VideoCut{MediaHash: job.Args.MediaHash}); err != nil { log.Errorf("Error adding job: %v", err) return err } - if err := w.job.Add(&VideoExtractHeadImage{MediaID: job.Args.MediaID}); err != nil { + if err := w.job.Add(&VideoExtractHeadImage{MediaHash: job.Args.MediaHash}); err != nil { log.Errorf("Error adding job: %v", err) return err } diff --git a/backend/app/jobs/download_from_alioss_test.go b/backend/app/jobs/download_from_alioss_test.go index 6e7bd7c..2c2d2e3 100644 --- a/backend/app/jobs/download_from_alioss_test.go +++ b/backend/app/jobs/download_from_alioss_test.go @@ -46,7 +46,7 @@ func (t *DownloadFromAliOSSSuite) Test_Work() { Convey("step 1", func() { job := &Job[DownloadFromAliOSS]{ Args: DownloadFromAliOSS{ - MediaID: 3, + MediaHash: "959e5310105c96e653f10b74e5bdc36b", }, } diff --git a/backend/app/jobs/video_cut.go b/backend/app/jobs/video_cut.go index 1770a63..2886a45 100644 --- a/backend/app/jobs/video_cut.go +++ b/backend/app/jobs/video_cut.go @@ -21,7 +21,7 @@ import ( var _ contracts.JobArgs = (*VideoCut)(nil) type VideoCut struct { - MediaID int64 `json:"media_id"` + MediaHash string `json:"media_hash"` } func (s VideoCut) InsertOpts() InsertOpts { @@ -55,7 +55,7 @@ func (w *VideoCutWorker) Work(ctx context.Context, job *Job[VideoCut]) error { 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) + media, err := models.Medias.GetByHash(ctx, job.Args.MediaHash) if err != nil { log.Errorf("Error getting media by ID: %v", err) return JobCancel(err) @@ -89,7 +89,7 @@ func (w *VideoCutWorker) Work(ctx context.Context, job *Job[VideoCut]) error { // save to database return w.job.Add(&VideoStoreShort{ - MediaID: media.ID, - FilePath: output, + MediaHash: media.Hash, + FilePath: output, }) } diff --git a/backend/app/jobs/video_extract_head_image.go b/backend/app/jobs/video_extract_head_image.go index 4a372a3..6100adf 100644 --- a/backend/app/jobs/video_extract_head_image.go +++ b/backend/app/jobs/video_extract_head_image.go @@ -23,7 +23,7 @@ import ( var _ contracts.JobArgs = (*VideoExtractHeadImage)(nil) type VideoExtractHeadImage struct { - MediaID int64 `json:"media_id"` + MediaHash string `json:"media_hash"` } func (s VideoExtractHeadImage) InsertOpts() InsertOpts { @@ -57,7 +57,7 @@ func (w *VideoExtractHeadImageWorker) Work(ctx context.Context, job *Job[VideoEx 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) + media, err := models.Medias.GetByHash(ctx, job.Args.MediaHash) if err != nil { log.Errorf("Error getting media by ID: %v", err) return JobCancel(err) @@ -90,6 +90,7 @@ func (w *VideoExtractHeadImageWorker) Work(ctx context.Context, job *Job[VideoEx log.Errorf("Error getting file MD5: %v", err) return JobCancel(err) } + filename := fileMd5 + filepath.Ext(output) // create a new media record for the image imageMedia := &model.Medias{ @@ -97,7 +98,7 @@ func (w *VideoExtractHeadImageWorker) Work(ctx context.Context, job *Job[VideoEx Name: "[展示图]" + media.Name, MimeType: "image/jpeg", Size: fileSize, - Path: w.oss.GetSavePath(filepath.Base(output)), + Path: w.oss.GetSavePath(filename), Hash: fileMd5, Metas: fields.Json[fields.MediaMetas]{}, } diff --git a/backend/app/jobs/video_store_short.go b/backend/app/jobs/video_store_short.go index 6eb086e..df60a50 100644 --- a/backend/app/jobs/video_store_short.go +++ b/backend/app/jobs/video_store_short.go @@ -22,8 +22,8 @@ import ( var _ contracts.JobArgs = (*VideoStoreShort)(nil) type VideoStoreShort struct { - MediaID int64 `json:"media_id"` - FilePath string `json:"file_path"` + MediaHash string `json:"media_hash"` + FilePath string `json:"file_path"` } func (s VideoStoreShort) InsertOpts() InsertOpts { @@ -57,7 +57,7 @@ func (w *VideoStoreShortWorker) Work(ctx context.Context, job *Job[VideoStoreSho 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) + media, err := models.Medias.GetByHash(ctx, job.Args.MediaHash) if err != nil { log.Errorf("Error getting media by ID: %v", err) return JobCancel(err) diff --git a/backend/app/models/medias.go b/backend/app/models/medias.go index a7b6c98..2d426a3 100644 --- a/backend/app/models/medias.go +++ b/backend/app/models/medias.go @@ -174,7 +174,7 @@ func (m *mediasModel) Update(ctx context.Context, hash string, model *model.Medi m.log.Infof("sql: %s", stmt.DebugSql()) if _, err := stmt.ExecContext(ctx, db); err != nil { - m.log.Errorf("error updating media item: %v", err) + m.log.WithField("hash", hash).Errorf("error updating media item: %v", err) return err } diff --git a/backend/app/service/http/http.go b/backend/app/service/http/http.go index a080d09..047be72 100644 --- a/backend/app/service/http/http.go +++ b/backend/app/service/http/http.go @@ -97,6 +97,12 @@ func Serve(cmd *cobra.Command, args []string) error { route.Register(group) } + if err := svc.Job.Start(ctx); err != nil { + log.WithError(err).Error("job start failed") + return err + } + defer svc.Job.StopAndCancel(ctx) + return svc.Http.Serve() }) } diff --git a/backend/config.toml b/backend/config.toml index c2b6e6c..f4ff5fd 100644 --- a/backend/config.toml +++ b/backend/config.toml @@ -30,7 +30,6 @@ AccessKeySecret = "hV7spvJuWh8w0EEIXj8NFi2uBlF4aS" Bucket ="rogee-test" Host ="https://assets.jdwan.com" Region ="cn-beijing" -CallbackURL = "https://www.baidu.com" [WeChat] AppID = "wx47649361b6eba174" diff --git a/backend/pkg/utils/ffmpeg.go b/backend/pkg/utils/ffmpeg.go index 5916a49..fd4b37f 100644 --- a/backend/pkg/utils/ffmpeg.go +++ b/backend/pkg/utils/ffmpeg.go @@ -32,6 +32,9 @@ func GetMediaDuration(path string) (int64, error) { func CutMedia(input, output string, start, end int64) error { args := []string{ "-y", + "-hide_banner", + "-nostats", + "-v", "error", "-ss", strconv.FormatInt(start, 10), "-i", input, "-t", strconv.FormatInt(end, 10), @@ -46,6 +49,9 @@ func CutMedia(input, output string, start, end int64) error { func GetFrameImageFromVideo(input, output string, time int64) error { args := []string{ "-y", + "-hide_banner", + "-nostats", + "-v", "error", "-i", input, "-ss", strconv.FormatInt(time, 10), "-vframes", "1", diff --git a/backend/providers/ali/oss_client.go b/backend/providers/ali/oss_client.go index 752cebb..34f774b 100644 --- a/backend/providers/ali/oss_client.go +++ b/backend/providers/ali/oss_client.go @@ -38,7 +38,7 @@ func (c *OSSClient) Download(ctx context.Context, path, dest string) error { Key: oss.Ptr(path), } - _, err := c.client.GetObjectToFile(ctx, request, dest) + _, err := c.internalClient.GetObjectToFile(ctx, request, dest) if err != nil { return err } diff --git a/backend/providers/job/provider.go b/backend/providers/job/provider.go index 20a8641..d43b02c 100644 --- a/backend/providers/job/provider.go +++ b/backend/providers/job/provider.go @@ -97,14 +97,7 @@ func (q *Job) Start(ctx context.Context) error { return errors.Wrap(err, "get client failed") } - if err := client.Start(ctx); err != nil { - return err - } - defer client.StopAndCancel(ctx) - - <-ctx.Done() - - return nil + return client.Start(ctx) } func (q *Job) StopAndCancel(ctx context.Context) error { diff --git a/backend/quyun b/backend/quyun index ffd50f3..4cafe26 100755 Binary files a/backend/quyun and b/backend/quyun differ diff --git a/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b-short.mp4 b/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b-short.mp4 new file mode 100644 index 0000000..70a91c1 Binary files /dev/null and b/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b-short.mp4 differ diff --git a/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b.mp4 b/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b.mp4 new file mode 100644 index 0000000..adc14ed Binary files /dev/null and b/fixtures/quyun/959e5310105c96e653f10b74e5bdc36b.mp4 differ diff --git a/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4-short.mp4 b/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4-short.mp4 new file mode 100644 index 0000000..277026e Binary files /dev/null and b/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4-short.mp4 differ diff --git a/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4.mp4 b/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4.mp4 new file mode 100644 index 0000000..52db5eb Binary files /dev/null and b/fixtures/quyun/ce4cd071128cef282cf315dda75bdab4.mp4 differ