mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-11-01 00:57:15 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package driver
 | ||
| 
 | ||
| import (
 | ||
| 	"context"
 | ||
| 	"os"
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"github.com/cloudreve/Cloudreve/v4/pkg/boolset"
 | ||
| 	"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
 | ||
| )
 | ||
| 
 | ||
| const (
 | ||
| 	// HandlerCapabilityProxyRequired this handler requires Cloudreve's proxy to get file content
 | ||
| 	HandlerCapabilityProxyRequired HandlerCapability = iota
 | ||
| 	// HandlerCapabilityInboundGet this handler supports directly get file's RSCloser, usually
 | ||
| 	// indicates that the file is stored in the same machine as Cloudreve
 | ||
| 	HandlerCapabilityInboundGet
 | ||
| 	// HandlerCapabilityUploadSentinelRequired this handler does not support compliance callback mechanism,
 | ||
| 	// thus it requires Cloudreve's sentinel to guarantee the upload is under control. Cloudreve will try
 | ||
| 	// to delete the placeholder file and cancel the upload session if upload callback is not made after upload
 | ||
| 	// session expire.
 | ||
| 	HandlerCapabilityUploadSentinelRequired
 | ||
| )
 | ||
| 
 | ||
| type (
 | ||
| 	MetaType  string
 | ||
| 	MediaMeta struct {
 | ||
| 		Key   string   `json:"key"`
 | ||
| 		Value string   `json:"value"`
 | ||
| 		Type  MetaType `json:"type"`
 | ||
| 	}
 | ||
| 
 | ||
| 	HandlerCapability int
 | ||
| 
 | ||
| 	GetSourceArgs struct {
 | ||
| 		Expire      *time.Time
 | ||
| 		IsDownload  bool
 | ||
| 		Speed       int64
 | ||
| 		DisplayName string
 | ||
| 	}
 | ||
| 
 | ||
| 	// Handler 存储策略适配器
 | ||
| 	Handler interface {
 | ||
| 		// 上传文件, dst为文件存储路径,size 为文件大小。上下文关闭
 | ||
| 		// 时,应取消上传并清理临时文件
 | ||
| 		Put(ctx context.Context, file *fs.UploadRequest) error
 | ||
| 
 | ||
| 		// 删除一个或多个给定路径的文件,返回删除失败的文件路径列表及错误
 | ||
| 		Delete(ctx context.Context, files ...string) ([]string, error)
 | ||
| 
 | ||
| 		// Open physical files. Only implemented if HandlerCapabilityInboundGet capability is set.
 | ||
| 		// Returns file path and an os.File object.
 | ||
| 		Open(ctx context.Context, path string) (*os.File, error)
 | ||
| 
 | ||
| 		// LocalPath returns the local path of a file.
 | ||
| 		// Only implemented if HandlerCapabilityInboundGet capability is set.
 | ||
| 		LocalPath(ctx context.Context, path string) string
 | ||
| 
 | ||
| 		// Thumb returns the URL for a thumbnail of given entity.
 | ||
| 		Thumb(ctx context.Context, expire *time.Time, ext string, e fs.Entity) (string, error)
 | ||
| 
 | ||
| 		// 获取外链/下载地址,
 | ||
| 		// url - 站点本身地址,
 | ||
| 		// isDownload - 是否直接下载
 | ||
| 		Source(ctx context.Context, e fs.Entity, args *GetSourceArgs) (string, error)
 | ||
| 
 | ||
| 		// Token 获取有效期为ttl的上传凭证和签名
 | ||
| 		Token(ctx context.Context, uploadSession *fs.UploadSession, file *fs.UploadRequest) (*fs.UploadCredential, error)
 | ||
| 
 | ||
| 		// CancelToken 取消已经创建的有状态上传凭证
 | ||
| 		CancelToken(ctx context.Context, uploadSession *fs.UploadSession) error
 | ||
| 
 | ||
| 		// CompleteUpload completes a previously created upload session.
 | ||
| 		CompleteUpload(ctx context.Context, session *fs.UploadSession) error
 | ||
| 
 | ||
| 		// List 递归列取远程端path路径下文件、目录,不包含path本身,
 | ||
| 		// 返回的对象路径以path作为起始根目录.
 | ||
| 		// recursive - 是否递归列出
 | ||
| 		// List(ctx context.Context, path string, recursive bool) ([]response.Object, error)
 | ||
| 
 | ||
| 		// Capabilities returns the capabilities of this handler
 | ||
| 		Capabilities() *Capabilities
 | ||
| 
 | ||
| 		// MediaMeta extracts media metadata from the given file.
 | ||
| 		MediaMeta(ctx context.Context, path, ext string) ([]MediaMeta, error)
 | ||
| 	}
 | ||
| 
 | ||
| 	Capabilities struct {
 | ||
| 		StaticFeatures *boolset.BooleanSet
 | ||
| 		// MaxSourceExpire indicates the maximum allowed expiration duration of a source URL
 | ||
| 		MaxSourceExpire time.Duration
 | ||
| 		// MinSourceExpire indicates the minimum allowed expiration duration of a source URL
 | ||
| 		MinSourceExpire time.Duration
 | ||
| 		// MediaMetaSupportedExts indicates the extensions of files that support media metadata. Empty list
 | ||
| 		// indicates that no file supports extracting media metadata.
 | ||
| 		MediaMetaSupportedExts []string
 | ||
| 		// GenerateMediaMeta indicates whether to generate media metadata using local generators.
 | ||
| 		MediaMetaProxy bool
 | ||
| 		// ThumbSupportedExts indicates the extensions of files that support thumbnail generation. Empty list
 | ||
| 		// indicates that no file supports thumbnail generation.
 | ||
| 		ThumbSupportedExts []string
 | ||
| 		// ThumbSupportAllExts indicates whether to generate thumbnails for all files, regardless of their extensions.
 | ||
| 		ThumbSupportAllExts bool
 | ||
| 		// ThumbMaxSize indicates the maximum allowed size of a thumbnail. 0 indicates that no limit is set.
 | ||
| 		ThumbMaxSize int64
 | ||
| 		// ThumbProxy indicates whether to generate thumbnails using local generators.
 | ||
| 		ThumbProxy bool
 | ||
| 	}
 | ||
| )
 | ||
| 
 | ||
| const (
 | ||
| 	MetaTypeExif        MetaType = "exif"
 | ||
| 	MediaTypeMusic      MetaType = "music"
 | ||
| 	MetaTypeStreamMedia MetaType = "stream"
 | ||
| )
 | ||
| 
 | ||
| type ForceUsePublicEndpointCtx struct{}
 | ||
| 
 | ||
| // WithForcePublicEndpoint sets the context to force using public endpoint for supported storage policies.
 | ||
| func WithForcePublicEndpoint(ctx context.Context, value bool) context.Context {
 | ||
| 	return context.WithValue(ctx, ForceUsePublicEndpointCtx{}, value)
 | ||
| }
 | 
