From 1cdccf5fc95aa7be432666e7f93ae95e02b61297 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 15 Jul 2025 14:11:42 +0800 Subject: [PATCH] feat(thumb): adding option to define custom input argument for FFmpeg (#2657) --- assets | 2 +- inventory/setting.go | 1 + pkg/setting/provider.go | 6 ++++++ pkg/thumb/ffmpeg.go | 20 +++++++++++++++++--- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/assets b/assets index a827cc6..0b49582 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a827cc60f232ed8fb95afa6d3d434ef1c41ed251 +Subproject commit 0b49582a07eccfd63896dd18f7d944f7e96ed47d diff --git a/inventory/setting.go b/inventory/setting.go index 4bbf3e9..fa09f59 100644 --- a/inventory/setting.go +++ b/inventory/setting.go @@ -430,6 +430,7 @@ var DefaultSettings = map[string]string{ "thumb_ffmpeg_max_size": "10737418240", // 10 GB "thumb_ffmpeg_exts": "3g2,3gp,asf,asx,avi,divx,flv,m2ts,m2v,m4v,mkv,mov,mp4,mpeg,mpg,mts,mxf,ogv,rm,swf,webm,wmv", "thumb_ffmpeg_seek": "00:00:01.00", + "thumb_ffmpeg_extra_args": "-hwaccel auto", "thumb_libreoffice_path": "soffice", "thumb_libreoffice_max_size": "78643200", // 75 MB "thumb_libreoffice_enabled": "0", diff --git a/pkg/setting/provider.go b/pkg/setting/provider.go index 0fc9534..1959433 100644 --- a/pkg/setting/provider.go +++ b/pkg/setting/provider.go @@ -202,6 +202,8 @@ type ( CustomNavItems(ctx context.Context) []CustomNavItem // CustomHTML returns the custom HTML settings. CustomHTML(ctx context.Context) *CustomHTML + // FFMpegExtraArgs returns the extra arguments of ffmpeg thumb generator. + FFMpegExtraArgs(ctx context.Context) string } UseFirstSiteUrlCtxKey = struct{} ) @@ -406,6 +408,10 @@ func (s *settingProvider) FFMpegThumbSeek(ctx context.Context) string { return s.getString(ctx, "thumb_ffmpeg_seek", "00:00:01.00") } +func (s *settingProvider) FFMpegExtraArgs(ctx context.Context) string { + return s.getString(ctx, "thumb_ffmpeg_extra_args", "") +} + func (s *settingProvider) FFMpegThumbMaxSize(ctx context.Context) int64 { return s.getInt64(ctx, "thumb_ffmpeg_max_size", 10737418240) } diff --git a/pkg/thumb/ffmpeg.go b/pkg/thumb/ffmpeg.go index c89371c..f016b3a 100644 --- a/pkg/thumb/ffmpeg.go +++ b/pkg/thumb/ffmpeg.go @@ -6,6 +6,7 @@ import ( "fmt" "os/exec" "path/filepath" + "strings" "time" "github.com/cloudreve/Cloudreve/v4/pkg/filemanager/driver" @@ -64,9 +65,22 @@ func (f *FfmpegGenerator) Generate(ctx context.Context, es entitysource.EntitySo // Invoke ffmpeg w, h := f.settings.ThumbSize(ctx) scaleOpt := fmt.Sprintf("scale=%d:%d:force_original_aspect_ratio=decrease", w, h) - cmd := exec.CommandContext(ctx, - f.settings.FFMpegPath(ctx), "-ss", f.settings.FFMpegThumbSeek(ctx), "-i", input, - "-vf", scaleOpt, "-vframes", "1", tempOutputPath) + args := []string{ + "-ss", f.settings.FFMpegThumbSeek(ctx), + } + + extraArgs := f.settings.FFMpegExtraArgs(ctx) + if extraArgs != "" { + args = append(args, strings.Split(extraArgs, " ")...) + } + + args = append(args, []string{ + "-i", input, + "-vf", scaleOpt, + "-vframes", "1", + tempOutputPath, + }...) + cmd := exec.CommandContext(ctx, f.settings.FFMpegPath(ctx), args...) // Redirect IO var stdErr bytes.Buffer