From 668b542c5952447892f95af639b9c7267a311198 Mon Sep 17 00:00:00 2001 From: Mason Liu <108563824+MasonDye@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:24:38 +0800 Subject: [PATCH] feat: update reset thumbnail feature (#2854) * update reset thumbnail feature * consolidate supported thumbnail extensions into site config; remove dedicated API * allow patching thumb ; remove Reset Thumbnail API * fix code formatting --------- Co-authored-by: Aaron Liu --- pkg/filemanager/manager/metadata.go | 9 ++++++ pkg/thumb/builtin.go | 4 +++ routers/router.go | 2 +- service/basic/site.go | 48 +++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/pkg/filemanager/manager/metadata.go b/pkg/filemanager/manager/metadata.go index 69797fbf..a5293c18 100644 --- a/pkg/filemanager/manager/metadata.go +++ b/pkg/filemanager/manager/metadata.go @@ -97,6 +97,15 @@ var ( }, }, "dav": {}, + // Allow manipulating thumbnail metadata via public PatchMetadata API + "thumb": { + // Only supported thumb metadata currently is thumb:disabled + dbfs.ThumbDisabledKey: func(ctx context.Context, m *manager, patch *fs.MetadataPatch) error { + // Presence of this key disables thumbnails; value is ignored. + // We allow both setting and removing this key. + return nil + }, + }, customizeMetadataSuffix: { iconColorMetadataKey: validateColor(false), emojiIconMetadataKey: func(ctx context.Context, m *manager, patch *fs.MetadataPatch) error { diff --git a/pkg/thumb/builtin.go b/pkg/thumb/builtin.go index 3a9f2ff4..2081a9c2 100644 --- a/pkg/thumb/builtin.go +++ b/pkg/thumb/builtin.go @@ -19,6 +19,10 @@ import ( const thumbTempFolder = "thumb" +// BuiltinSupportedExts lists file extensions supported by the built-in +// thumbnail generator. Extensions are lowercased and do not include the dot. +var BuiltinSupportedExts = []string{"jpg", "jpeg", "png", "gif"} + // Thumb 缩略图 type Thumb struct { src image.Image diff --git a/routers/router.go b/routers/router.go index d474ccf3..7d388ce4 100644 --- a/routers/router.go +++ b/routers/router.go @@ -618,7 +618,7 @@ func initMasterRouter(dep dependency.Dep) *gin.Engine { controllers.ServeEntity, ) } - // 获取缩略图 + // get thumb file.GET("thumb", middleware.ContextHint(), controllers.FromQuery[explorer.FileThumbService](explorer.FileThumbParameterCtx{}), diff --git a/service/basic/site.go b/service/basic/site.go index 287c0ed1..474cd984 100644 --- a/service/basic/site.go +++ b/service/basic/site.go @@ -1,10 +1,14 @@ package basic import ( + "sort" + "strings" + "github.com/cloudreve/Cloudreve/v4/application/dependency" "github.com/cloudreve/Cloudreve/v4/inventory" "github.com/cloudreve/Cloudreve/v4/inventory/types" "github.com/cloudreve/Cloudreve/v4/pkg/setting" + "github.com/cloudreve/Cloudreve/v4/pkg/thumb" "github.com/cloudreve/Cloudreve/v4/service/user" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" @@ -49,6 +53,9 @@ type SiteConfig struct { ThumbnailHeight int `json:"thumbnail_height,omitempty"` CustomProps []types.CustomProps `json:"custom_props,omitempty"` + // Thumbnail section + ThumbExts []string `json:"thumb_exts,omitempty"` + // App settings AppPromotion bool `json:"app_promotion,omitempty"` @@ -118,6 +125,47 @@ func (s *GetSettingService) GetSiteConfig(c *gin.Context) (*SiteConfig, error) { return &SiteConfig{ AppPromotion: appSetting.Promotion, }, nil + case "thumb": + // Return supported thumbnail extensions from enabled generators. + exts := map[string]bool{} + if settings.BuiltinThumbGeneratorEnabled(c) { + for _, e := range thumb.BuiltinSupportedExts { + exts[e] = true + } + } + if settings.FFMpegThumbGeneratorEnabled(c) { + for _, e := range settings.FFMpegThumbExts(c) { + exts[strings.ToLower(e)] = true + } + } + if settings.VipsThumbGeneratorEnabled(c) { + for _, e := range settings.VipsThumbExts(c) { + exts[strings.ToLower(e)] = true + } + } + if settings.LibreOfficeThumbGeneratorEnabled(c) { + for _, e := range settings.LibreOfficeThumbExts(c) { + exts[strings.ToLower(e)] = true + } + } + if settings.MusicCoverThumbGeneratorEnabled(c) { + for _, e := range settings.MusicCoverThumbExts(c) { + exts[strings.ToLower(e)] = true + } + } + if settings.LibRawThumbGeneratorEnabled(c) { + for _, e := range settings.LibRawThumbExts(c) { + exts[strings.ToLower(e)] = true + } + } + + // map -> sorted slice + result := make([]string, 0, len(exts)) + for e := range exts { + result = append(result, e) + } + sort.Strings(result) + return &SiteConfig{ThumbExts: result}, nil default: break }