Diffstat (limited to 'config')
| -rw-r--r-- | config/config-b2.sample.json | 6 | ||||
| -rw-r--r-- | config/config-local-unix.sample.json | 2 | ||||
| -rw-r--r-- | config/config-s3.sample.json | 53 | ||||
| -rw-r--r-- | config/config.go | 56 |
4 files changed, 107 insertions, 10 deletions
diff --git a/config/config-b2.sample.json b/config/config-b2.sample.json index 372972e..60022dd 100644 --- a/config/config-b2.sample.json +++ b/config/config-b2.sample.json @@ -1,5 +1,4 @@ { - "ForceRewrite": false, "MaxProcessThreads": 4, "MaxPreProcessThreads": 12, "LogLevel": "info", @@ -33,6 +32,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "b2", "Config": { @@ -55,6 +55,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "b2", "Config": { @@ -77,6 +78,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "b2", "Config": { @@ -99,6 +101,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "b2", "Config": { @@ -121,6 +124,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "b2", "Config": { diff --git a/config/config-local-unix.sample.json b/config/config-local-unix.sample.json index 97f69f1..941d995 100644 --- a/config/config-local-unix.sample.json +++ b/config/config-local-unix.sample.json @@ -1,5 +1,4 @@ { - "ForceRewrite": false, "MaxProcessThreads": 4, "MaxPreProcessThreads": 12, "LogLevel": "debug", @@ -27,6 +26,7 @@ } }, "Output": { + "RewriteOn": "UnequalHashInCache", "Storage": { "Type": "local-unix", "Config": { diff --git a/config/config-s3.sample.json b/config/config-s3.sample.json new file mode 100644 index 0000000..5b067a5 --- /dev/null +++ b/config/config-s3.sample.json @@ -0,0 +1,53 @@ +{ + "MaxProcessThreads": 4, + "MaxPreProcessThreads": 12, + "LogLevel": "info", + "Input": { + "Storage": { + "Type": "s3", + "Config": { + "BucketName": "my-photos", + "Region": "", + "Prefix": "full/", + "Endpoint": "https://minio.local", + "UsePathStyle": true, + "AccessKeyID": "${AWS_ACCESS_KEY_ID}", + "SecretAccessKey": "${AWS_SECRET_ACCESS_KEY}" + } + }, + "KnownExtensions": [ + "jpg", + "jpeg", + "png" + ], + "CacheProcessed": true, + "CacheProcessedCsvPath": "cache.csv" + }, + "Converters": [ + { + "Type": "webp", + "Config": { + "Quality": 80, + "Size": { + "MaxWidth": 320, + "MaxHeight": 0 + } + }, + "Output": { + "RewriteOn": "UnequalHashInCache", + "Storage": { + "Type": "s3", + "Config": { + "BucketName": "my-photos", + "Region": "", + "Prefix": "webp-320p/", + "Endpoint": "https://minio.local", + "UsePathStyle": true, + "AccessKeyID": "${AWS_ACCESS_KEY_ID}", + "SecretAccessKey": "${AWS_SECRET_ACCESS_KEY}" + } + } + } + } + ] +} diff --git a/config/config.go b/config/config.go index 1620d75..06fa94f 100644 --- a/config/config.go +++ b/config/config.go @@ -14,7 +14,6 @@ type Config struct { Converters []ConverterConfig `json:"Converters" validate:"required"` MaxProcessThreads int `json:"MaxProcessThreads" validate:"required,min=1"` MaxPreProcessThreads int `json:"MaxPreProcessThreads" validate:"min=1;gtefield=MaxProcessThreads"` - ForceRewrite bool `json:"ForceRewrite" validate:"required"` LogLevel slog.Level `json:"LogLevel" validate:"required"` } @@ -26,7 +25,7 @@ type InputConfig struct { } type InputStorageConfig struct { - Type string `json:"Type" validate:"required,oneof=b2 local-unix"` + Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"` Config any `json:"Config" validate:"required"` } @@ -49,6 +48,12 @@ func (sc *InputStorageConfig) UnmarshalJSON(data []byte) error { return fmt.Errorf("unmarshal B2Config: %w", err) } sc.Config = &b2Config + case "s3": + var s3Config S3Config + if err := json.Unmarshal(tmp.Config, &s3Config); err != nil { + return fmt.Errorf("unmarshal S3Config: %w", err) + } + sc.Config = &s3Config case "local-unix": var localUnixConfig InputLocalUnixConfig if err := json.Unmarshal(tmp.Config, &localUnixConfig); err != nil { @@ -63,7 +68,7 @@ func (sc *InputStorageConfig) UnmarshalJSON(data []byte) error { } type ConverterConfig struct { - Type string `json:"Type" validate:"required,oneof=webp"` + Type string `json:"Type" validate:"required,oneof=webp jpeg"` Config any `json:"Config" validate:"required"` Output OutputConfig `json:"Output" validate:"required"` } @@ -89,6 +94,12 @@ func (pc *ConverterConfig) UnmarshalJSON(data []byte) error { return fmt.Errorf("unmarshal WebpConfig: %w", err) } pc.Config = &webpConfig + case "jpeg": + var jpegConfig JpegConfig + if err := json.Unmarshal(tmp.Config, &jpegConfig); err != nil { + return fmt.Errorf("unmarshal JpegConfig: %w", err) + } + pc.Config = &jpegConfig default: return fmt.Errorf("unsupported storage type: %s", tmp.Type) } @@ -98,16 +109,22 @@ func (pc *ConverterConfig) UnmarshalJSON(data []byte) error { type WebpConfig struct { Quality int `json:"Quality" validate:"required,min=1,max=100"` - Size SizeConfig `json:"Size" validate:"required"` + Size SizeConfig `json:"Size"` +} + +type JpegConfig struct { + ExtensionName string `json:"ExtensionName" validate:"alpha"` + Quality int `json:"Quality" validate:"required,min=1,max=100"` + Size SizeConfig `json:"Size"` } type SizeConfig struct { - MaxWidth int `json:"MaxWidth" validate:"required,min=0"` - MaxHeight int `json:"MaxHeight" validate:"required,min=0"` + MaxWidth int `json:"MaxWidth"` + MaxHeight int `json:"MaxHeight"` } type OutputStorageConfig struct { - Type string `json:"Type" validate:"required,oneof=b2 local-unix"` + Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"` Config any `json:"Config" validate:"required"` } @@ -130,6 +147,12 @@ func (sc *OutputStorageConfig) UnmarshalJSON(data []byte) error { return fmt.Errorf("unmarshal B2Config: %w", err) } sc.Config = &b2Config + case "s3": + var s3Config S3Config + if err := json.Unmarshal(tmp.Config, &s3Config); err != nil { + return fmt.Errorf("unmarshal S3Config: %w", err) + } + sc.Config = &s3Config case "local-unix": var localUnixConfig OutputLocalUnixConfig if err := json.Unmarshal(tmp.Config, &localUnixConfig); err != nil { @@ -151,13 +174,24 @@ type B2Config struct { ApplicationKey string `json:"ApplicationKey"` } +type S3Config struct { + BucketName string `json:"BucketName" validate:"required,min=1"` + Region string `json:"Region" validate:"required,min=1"` + Prefix string `json:"Prefix"` + Endpoint string `json:"Endpoint"` + UsePathStyle bool `json:"UsePathStyle"` + AccessKeyID string `json:"AccessKeyID"` + SecretAccessKey string `json:"SecretAccessKey"` +} + type InputLocalUnixConfig struct { MaxDepth int `json:"MaxDepth" validate:"required,min=0"` Path string `json:"Path" validate:"required,min=1"` } type OutputConfig struct { - Storage OutputStorageConfig `json:"Storage" validate:"required"` + RewriteOn string `json:"RewriteOn" validate:"oneof=Never UnequalHashInCache Always"` + Storage OutputStorageConfig `json:"Storage" validate:"required"` } type OutputLocalUnixConfig struct { @@ -179,6 +213,12 @@ func LoadConfig(path string, config *Config) error { return err } + for i := range config.Converters { + if config.Converters[i].Output.RewriteOn == "" { + config.Converters[i].Output.RewriteOn = "UnequalHashInCache" + } + } + return nil } |