summaryrefslogtreecommitdiff
path: root/config
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/config-b2.sample.json141
-rw-r--r--config/config-local-unix.sample.json41
-rw-r--r--config/config-s3.sample.json53
-rw-r--r--config/config.go172
-rw-r--r--config/config.json31
5 files changed, 52 insertions, 386 deletions
diff --git a/config/config-b2.sample.json b/config/config-b2.sample.json
deleted file mode 100644
index 60022dd..0000000
--- a/config/config-b2.sample.json
+++ /dev/null
@@ -1,141 +0,0 @@
-{
- "MaxProcessThreads": 4,
- "MaxPreProcessThreads": 12,
- "LogLevel": "info",
- "Input": {
- "Storage": {
- "Type": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "full/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_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": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "webp-320p/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_KEY}"
- }
- }
- }
- },
- {
- "Type": "webp",
- "Config": {
- "Quality": 80,
- "Size": {
- "MaxWidth": 560,
- "MaxHeight": 0
- }
- },
- "Output": {
- "RewriteOn": "UnequalHashInCache",
- "Storage": {
- "Type": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "webp-560p/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_KEY}"
- }
- }
- }
- },
- {
- "Type": "webp",
- "Config": {
- "Quality": 80,
- "Size": {
- "MaxWidth": 800,
- "MaxHeight": 0
- }
- },
- "Output": {
- "RewriteOn": "UnequalHashInCache",
- "Storage": {
- "Type": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "webp-800p/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_KEY}"
- }
- }
- }
- },
- {
- "Type": "webp",
- "Config": {
- "Quality": 80,
- "Size": {
- "MaxWidth": 1200,
- "MaxHeight": 0
- }
- },
- "Output": {
- "RewriteOn": "UnequalHashInCache",
- "Storage": {
- "Type": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "webp-1200p/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_KEY}"
- }
- }
- }
- },
- {
- "Type": "webp",
- "Config": {
- "Quality": 80,
- "Size": {
- "MaxWidth": 1600,
- "MaxHeight": 0
- }
- },
- "Output": {
- "RewriteOn": "UnequalHashInCache",
- "Storage": {
- "Type": "b2",
- "Config": {
- "BucketName": "sayana-photos",
- "Region": "eu-central-003",
- "Prefix": "webp-1600p/",
- "KeyID": "${B2_KEY_ID}",
- "ApplicationKey": "${B2_APPLICATION_KEY}"
- }
- }
- }
- }
- ]
-} \ No newline at end of file
diff --git a/config/config-local-unix.sample.json b/config/config-local-unix.sample.json
deleted file mode 100644
index 941d995..0000000
--- a/config/config-local-unix.sample.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "MaxProcessThreads": 4,
- "MaxPreProcessThreads": 12,
- "LogLevel": "debug",
- "Input": {
- "Storage": {
- "Type": "local-unix",
- "Config": {
- "MaxDepth": 3,
- "Path": "/tmp/thumbnailing/full/"
- }
- },
- "KnownExtensions": [
- "jpg",
- "jpeg",
- "png"
- ]
- },
- "Converter": {
- "Type": "webp",
- "Config": {
- "Quality": 80,
- "Size": {
- "MaxWidth": 800,
- "MaxHeight": 0
- }
- },
- "Output": {
- "RewriteOn": "UnequalHashInCache",
- "Storage": {
- "Type": "local-unix",
- "Config": {
- "Path": "/tmp/thumbnailing/thumbnails/",
- "DirPermissionMode": "0755",
- "FilePermissionMode": "0644",
- "AttributesImplementation": "xattr"
- }
- }
- }
- }
-} \ No newline at end of file
diff --git a/config/config-s3.sample.json b/config/config-s3.sample.json
deleted file mode 100644
index 5b067a5..0000000
--- a/config/config-s3.sample.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "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 06fa94f..6d37904 100644
--- a/config/config.go
+++ b/config/config.go
@@ -3,132 +3,32 @@ package config
import (
"encoding/json"
"fmt"
- "log/slog"
"os"
"github.com/go-playground/validator/v10"
)
type Config struct {
- Input InputConfig `json:"Input" validate:"required"`
- Converters []ConverterConfig `json:"Converters" validate:"required"`
- MaxProcessThreads int `json:"MaxProcessThreads" validate:"required,min=1"`
- MaxPreProcessThreads int `json:"MaxPreProcessThreads" validate:"min=1;gtefield=MaxProcessThreads"`
- LogLevel slog.Level `json:"LogLevel" validate:"required"`
-}
-
-type InputConfig struct {
- Storage InputStorageConfig `json:"Storage" validate:"required"`
- KnownExtensions []string `json:"KnownExtensions" validate:"required,min=0,dive,min=1"`
- CacheProcessed bool `json:"CacheProcessed"`
- CacheProcessedCsvPath string `json:"CacheProcessedCsvPath" validate:"filepath"`
-}
-
-type InputStorageConfig struct {
- Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"`
- Config any `json:"Config" validate:"required"`
-}
-
-func (sc *InputStorageConfig) UnmarshalJSON(data []byte) error {
- var tmp struct {
- Type string `json:"Type"`
- Config json.RawMessage `json:"Config"`
- }
-
- if err := json.Unmarshal(data, &tmp); err != nil {
- return err
- }
-
- sc.Type = tmp.Type
-
- switch tmp.Type {
- case "b2":
- var b2Config B2Config
- if err := json.Unmarshal(tmp.Config, &b2Config); err != nil {
- 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 {
- return fmt.Errorf("unmarshal LocalUnixConfig: %w", err)
- }
- sc.Config = &localUnixConfig
- default:
- return fmt.Errorf("unsupported storage type: %s", tmp.Type)
- }
-
- return nil
-}
-
-type ConverterConfig struct {
- Type string `json:"Type" validate:"required,oneof=webp jpeg"`
- Config any `json:"Config" validate:"required"`
+ Input InputConfig `json:"Input" validate:"required"`
Output OutputConfig `json:"Output" validate:"required"`
}
-func (pc *ConverterConfig) UnmarshalJSON(data []byte) error {
- var tmp struct {
- Type string `json:"Type"`
- Config json.RawMessage `json:"Config"`
- Output OutputConfig `json:"Output"`
- }
-
- if err := json.Unmarshal(data, &tmp); err != nil {
- return err
- }
-
- pc.Type = tmp.Type
- pc.Output = tmp.Output
-
- switch tmp.Type {
- case "webp":
- var webpConfig WebpConfig
- if err := json.Unmarshal(tmp.Config, &webpConfig); err != nil {
- 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)
- }
-
- return nil
-}
-
-type WebpConfig struct {
- Quality int `json:"Quality" validate:"required,min=1,max=100"`
- 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 InputConfig struct {
+ Storage StorageConfig `json:"Storage" validate:"required"`
}
-type SizeConfig struct {
- MaxWidth int `json:"MaxWidth"`
- MaxHeight int `json:"MaxHeight"`
+type OutputConfig struct {
+ Storage StorageConfig `json:"Storage" validate:"required"`
+ Quality int `json:"Quality" validate:"required,min=1,max=100"`
+ Size SizeConfig `json:"Size" validate:"required"`
}
-type OutputStorageConfig struct {
- Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"`
+type StorageConfig struct {
+ Type string `json:"Type" validate:"required,oneof=b2 local"`
Config any `json:"Config" validate:"required"`
}
-func (sc *OutputStorageConfig) UnmarshalJSON(data []byte) error {
+func (sc *StorageConfig) UnmarshalJSON(data []byte) error {
var tmp struct {
Type string `json:"Type"`
Config json.RawMessage `json:"Config"`
@@ -146,19 +46,13 @@ func (sc *OutputStorageConfig) UnmarshalJSON(data []byte) error {
if err := json.Unmarshal(tmp.Config, &b2Config); err != nil {
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 = b2Config
+ case "local":
+ var localConfig LocalConfig
+ if err := json.Unmarshal(tmp.Config, &localConfig); err != nil {
+ return fmt.Errorf("unmarshal LocalConfig: %w", err)
}
- sc.Config = &s3Config
- case "local-unix":
- var localUnixConfig OutputLocalUnixConfig
- if err := json.Unmarshal(tmp.Config, &localUnixConfig); err != nil {
- return fmt.Errorf("unmarshal LocalUnixConfig: %w", err)
- }
- sc.Config = &localUnixConfig
+ sc.Config = localConfig
default:
return fmt.Errorf("unsupported storage type: %s", tmp.Type)
}
@@ -174,31 +68,13 @@ 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 {
- RewriteOn string `json:"RewriteOn" validate:"oneof=Never UnequalHashInCache Always"`
- Storage OutputStorageConfig `json:"Storage" validate:"required"`
+type LocalConfig struct {
+ Path string `json:"Path" validate:"required,min=1"`
}
-type OutputLocalUnixConfig struct {
- Path string `json:"Path" validate:"required,min=1,dirpath"`
- DirPermissionMode string `json:"DirPermissionMode" validate:"required,min=3"`
- FilePermissionMode string `json:"FilePermissionMode" validate:"required,min=3"`
- AttributesImplementation string `json:"AttributesImplementation" validate:"required,oneof=xattr none"`
+type SizeConfig struct {
+ MaxWidth int `json:"MaxWidth" validate:"required,min=0"`
+ MaxHeight int `json:"MaxHeight" validate:"required,min=0"`
}
func LoadConfig(path string, config *Config) error {
@@ -213,12 +89,6 @@ 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
}
diff --git a/config/config.json b/config/config.json
new file mode 100644
index 0000000..d818107
--- /dev/null
+++ b/config/config.json
@@ -0,0 +1,31 @@
+{
+ "Input": {
+ "Storage": {
+ "Type": "b2",
+ "Config": {
+ "BucketName": "sayana-photos",
+ "Region": "eu-central-003",
+ "Prefix": "full/",
+ "KeyID": "${B2_KEY_ID}",
+ "ApplicationKey": "${B2_APPLICATION_KEY}"
+ }
+ }
+ },
+ "Output": {
+ "Storage": {
+ "Type": "b2",
+ "Config": {
+ "BucketName": "sayana-photos",
+ "Region": "eu-central-003",
+ "Prefix": "thumbnails/",
+ "KeyID": "${B2_KEY_ID}",
+ "ApplicationKey": "${B2_APPLICATION_KEY}"
+ }
+ },
+ "Quality": 80,
+ "Size": {
+ "MaxWidth": 1280,
+ "MaxHeight": 0
+ }
+ }
+} \ No newline at end of file