From ef86b6b79a5ea6903efc2f73774c67f73b4238dc Mon Sep 17 00:00:00 2001 From: MasonDye Date: Sat, 30 Aug 2025 16:56:26 +0800 Subject: [PATCH] allow patching thumb ; remove Reset Thumbnail API --- pkg/filemanager/manager/metadata.go | 9 +++ routers/controllers/file.go | 24 ------ routers/router.go | 7 +- service/explorer/thumb.go | 114 ---------------------------- 4 files changed, 10 insertions(+), 144 deletions(-) delete mode 100644 service/explorer/thumb.go 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/routers/controllers/file.go b/routers/controllers/file.go index 948a92fe..e09a95f1 100644 --- a/routers/controllers/file.go +++ b/routers/controllers/file.go @@ -412,27 +412,3 @@ func PatchView(c *gin.Context) { c.JSON(200, serializer.Response{}) } - -// ResetThumb resets thumbnail generation for files -func ResetThumb(c *gin.Context) { - service := ParametersFromContext[*explorer.ResetThumbService](c, explorer.ResetThumbParamCtx{}) - resp, err := service.Reset(c) - if err != nil { - c.JSON(200, serializer.Err(c, err)) - c.Abort() - return - } - - if resp != nil && len(resp.Errors) > 0 { - // Return error response with detailed errors - c.JSON(200, serializer.Response{ - Code: -1, - Msg: "Reset thumbnail error", - Data: resp, - }) - return - } - - c.JSON(200, serializer.Response{Data: resp}) -} - diff --git a/routers/router.go b/routers/router.go index 5f5002be..6a8ad629 100644 --- a/routers/router.go +++ b/routers/router.go @@ -620,12 +620,7 @@ func initMasterRouter(dep dependency.Dep) *gin.Engine { controllers.FromQuery[explorer.FileThumbService](explorer.FileThumbParameterCtx{}), controllers.Thumb, ) - // reset thumb - file.POST("thumb/reset", - controllers.FromJSON[explorer.ResetThumbService](explorer.ResetThumbParamCtx{}), - middleware.ValidateBatchFileCount(dep, explorer.ResetThumbParamCtx{}), - controllers.ResetThumb, - ) + // reset thumb removed; use metadata patch to re-enable thumbnails // Delete files file.DELETE("", controllers.FromJSON[explorer.DeleteFileService](explorer.DeleteFileParameterCtx{}), diff --git a/service/explorer/thumb.go b/service/explorer/thumb.go deleted file mode 100644 index ca3e15a6..00000000 --- a/service/explorer/thumb.go +++ /dev/null @@ -1,114 +0,0 @@ -package explorer - -import ( - "context" - "errors" - "fmt" - - "github.com/cloudreve/Cloudreve/v4/application/dependency" - "github.com/cloudreve/Cloudreve/v4/inventory" - "github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs" - "github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs/dbfs" - "github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager" - "github.com/cloudreve/Cloudreve/v4/pkg/serializer" - "github.com/cloudreve/Cloudreve/v4/pkg/thumb" -) - -type ( - // ResetThumbParamCtx defines context for ResetThumbService - ResetThumbParamCtx struct{} - - // ResetThumbService handles resetting thumbnail generation for files - ResetThumbService struct { - Uris []string `json:"uris" binding:"required,min=1"` - } - - // ResetThumbError represents an error for a specific URI - ResetThumbError struct { - URI string `json:"uri"` - Reason string `json:"reason"` - } - - // ResetThumbResponse represents the response for reset thumbnail operation - ResetThumbResponse struct { - Errors []ResetThumbError `json:"errors,omitempty"` - } -) - -func (s *ResetThumbService) GetUris() []string { - return s.Uris -} - -// Reset resets thumbnail generation for the specified files -func (s *ResetThumbService) Reset(c context.Context) (*ResetThumbResponse, error) { - dep := dependency.FromContext(c) - user := inventory.UserFromContext(c) - m := manager.NewFileManager(dep, user) - defer m.Recycle() - - uris, err := fs.NewUriFromStrings(s.Uris...) - if err != nil { - return nil, serializer.NewError(serializer.CodeParamErr, "unknown uri", err) - } - - var errs []ResetThumbError - - for _, uri := range uris { - // Get the file to check if it exists and get current metadata - file, err := m.Get(c, uri, dbfs.WithFilePublicMetadata()) - if err != nil { - errs = append(errs, ResetThumbError{ - URI: uri.String(), - Reason: fmt.Sprintf("Reset thumbnail error: File does not exist"), - }) - continue - } - - // Check if thumb:disabled metadata exists - metadata := file.Metadata() - if _, exists := metadata[dbfs.ThumbDisabledKey]; exists { - // Remove the disabled mark directly via FileClient to bypass metadata validation - fileClient := dep.FileClient() - if dbfsFile, ok := file.(*dbfs.File); ok { - if err := fileClient.RemoveMetadata(c, dbfsFile.Model, dbfs.ThumbDisabledKey); err != nil { - errs = append(errs, ResetThumbError{ - URI: uri.String(), - Reason: fmt.Sprintf("Reset thumbnail error: Failed to update metadata - %s", err.Error()), - }) - continue - } - } else { - errs = append(errs, ResetThumbError{ - URI: uri.String(), - Reason: "Reset thumbnail error: Failed to access file model", - }) - continue - } - } - - // Trigger thumbnail regeneration by accessing the thumbnail - _, err = m.Thumbnail(c, uri) - if err != nil { - // Unsupported or not available - if errors.Is(err, thumb.ErrNotAvailable) || errors.Is(err, fs.ErrEntityNotExist) { - errs = append(errs, ResetThumbError{ - URI: uri.String(), - Reason: "Reset thumbnail error: File does not support thumbnail generation", - }) - } else { - errs = append(errs, ResetThumbError{ - URI: uri.String(), - Reason: fmt.Sprintf("Reset thumbnail error: Failed to generate thumbnail - %s", err.Error()), - }) - } - } - } - - if len(errs) > 0 { - return &ResetThumbResponse{Errors: errs}, nil - } - - return &ResetThumbResponse{}, nil -} - -// (Thumb ext list API removed; use site config section "thumb")