RAW: Add File Extension Blacklists for Darktable and RawTherapee #1362
This commit is contained in:
parent
e8ac1abbe3
commit
b081f27e17
|
@ -118,7 +118,9 @@ func configAction(ctx *cli.Context) error {
|
|||
// External binaries and sidecar configuration.
|
||||
fmt.Printf("%-25s %t\n", "raw-presets", conf.RawPresets())
|
||||
fmt.Printf("%-25s %s\n", "darktable-bin", conf.DarktableBin())
|
||||
fmt.Printf("%-25s %s\n", "darktable-blacklist", conf.DarktableBlacklist())
|
||||
fmt.Printf("%-25s %s\n", "rawtherapee-bin", conf.RawtherapeeBin())
|
||||
fmt.Printf("%-25s %s\n", "rawtherapee-blacklist", conf.RawtherapeeBlacklist())
|
||||
fmt.Printf("%-25s %s\n", "sips-bin", conf.SipsBin())
|
||||
fmt.Printf("%-25s %s\n", "heifconvert-bin", conf.HeifConvertBin())
|
||||
fmt.Printf("%-25s %s\n", "ffmpeg-bin", conf.FFmpegBin())
|
||||
|
|
|
@ -321,12 +321,24 @@ var GlobalFlags = []cli.Flag{
|
|||
Value: "darktable-cli",
|
||||
EnvVar: "PHOTOPRISM_DARKTABLE_BIN",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "darktable-blacklist",
|
||||
Usage: "Comma-separated file extension `BLACKLIST`",
|
||||
Value: "raf,cr3",
|
||||
EnvVar: "PHOTOPRISM_DARKTABLE_BLACKLIST",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "rawtherapee-bin",
|
||||
Usage: "RawTherapee CLI `COMMAND` for RAW file conversion",
|
||||
Value: "rawtherapee-cli",
|
||||
EnvVar: "PHOTOPRISM_RAWTHERAPEE_BIN",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "rawtherapee-blacklist",
|
||||
Usage: "Comma-separated file extension `BLACKLIST`",
|
||||
Value: "",
|
||||
EnvVar: "PHOTOPRISM_RAWTHERAPEE_BLACKLIST",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "sips-bin",
|
||||
Usage: "Sips `COMMAND` for RAW file conversion on macOS",
|
||||
|
|
|
@ -30,86 +30,88 @@ const (
|
|||
//
|
||||
// See https://github.com/photoprism/photoprism/issues/50#issuecomment-433856358
|
||||
type Options struct {
|
||||
Name string `json:"-"`
|
||||
Version string `json:"-"`
|
||||
Copyright string `json:"-"`
|
||||
Debug bool `yaml:"Debug" json:"Debug" flag:"debug"`
|
||||
Test bool `yaml:"-" json:"Test,omitempty" flag:"test"`
|
||||
Demo bool `yaml:"Demo" json:"-" flag:"demo"`
|
||||
Sponsor bool `yaml:"-" json:"-" flag:"sponsor"`
|
||||
Public bool `yaml:"Public" json:"-" flag:"public"`
|
||||
ReadOnly bool `yaml:"ReadOnly" json:"ReadOnly" flag:"read-only"`
|
||||
Experimental bool `yaml:"Experimental" json:"Experimental" flag:"experimental"`
|
||||
ConfigPath string `yaml:"ConfigPath" json:"-" flag:"config-path"`
|
||||
ConfigFile string `json:"-"`
|
||||
AdminPassword string `yaml:"AdminPassword" json:"-" flag:"admin-password"`
|
||||
OriginalsPath string `yaml:"OriginalsPath" json:"-" flag:"originals-path"`
|
||||
OriginalsLimit int64 `yaml:"OriginalsLimit" json:"OriginalsLimit" flag:"originals-limit"`
|
||||
ImportPath string `yaml:"ImportPath" json:"-" flag:"import-path"`
|
||||
StoragePath string `yaml:"StoragePath" json:"-" flag:"storage-path"`
|
||||
SidecarPath string `yaml:"SidecarPath" json:"-" flag:"sidecar-path"`
|
||||
TempPath string `yaml:"TempPath" json:"-" flag:"temp-path"`
|
||||
BackupPath string `yaml:"BackupPath" json:"-" flag:"backup-path"`
|
||||
AssetsPath string `yaml:"AssetsPath" json:"-" flag:"assets-path"`
|
||||
CachePath string `yaml:"CachePath" json:"-" flag:"cache-path"`
|
||||
Workers int `yaml:"Workers" json:"Workers" flag:"workers"`
|
||||
WakeupInterval int `yaml:"WakeupInterval" json:"WakeupInterval" flag:"wakeup-interval"`
|
||||
AutoIndex int `yaml:"AutoIndex" json:"AutoIndex" flag:"auto-index"`
|
||||
AutoImport int `yaml:"AutoImport" json:"AutoImport" flag:"auto-import"`
|
||||
DisableBackups bool `yaml:"DisableBackups" json:"DisableBackups" flag:"disable-backups"`
|
||||
DisableWebDAV bool `yaml:"DisableWebDAV" json:"DisableWebDAV" flag:"disable-webdav"`
|
||||
DisableSettings bool `yaml:"DisableSettings" json:"-" flag:"disable-settings"`
|
||||
DisablePlaces bool `yaml:"DisablePlaces" json:"DisablePlaces" flag:"disable-places"`
|
||||
DisableExifTool bool `yaml:"DisableExifTool" json:"DisableExifTool" flag:"disable-exiftool"`
|
||||
DisableTensorFlow bool `yaml:"DisableTensorFlow" json:"DisableTensorFlow" flag:"disable-tensorflow"`
|
||||
DisableFFmpeg bool `yaml:"DisableFFmpeg" json:"DisableFFmpeg" flag:"disable-ffmpeg"`
|
||||
DisableDarktable bool `yaml:"DisableDarktable" json:"DisableDarktable" flag:"disable-darktable"`
|
||||
DisableRawtherapee bool `yaml:"DisableRawtherapee" json:"DisableRawtherapee" flag:"disable-rawtherapee"`
|
||||
DisableSips bool `yaml:"DisableSips" json:"DisableSips" flag:"disable-sips"`
|
||||
DisableHeifConvert bool `yaml:"DisableHeifConvert" json:"DisableHeifConvert" flag:"disable-heifconvert"`
|
||||
DetectNSFW bool `yaml:"DetectNSFW" json:"DetectNSFW" flag:"detect-nsfw"`
|
||||
UploadNSFW bool `yaml:"UploadNSFW" json:"-" flag:"upload-nsfw"`
|
||||
LogLevel string `yaml:"LogLevel" json:"-" flag:"log-level"`
|
||||
LogFilename string `yaml:"LogFilename" json:"-" flag:"log-filename"`
|
||||
PIDFilename string `yaml:"PIDFilename" json:"-" flag:"pid-filename"`
|
||||
CdnUrl string `yaml:"CdnUrl" json:"CdnUrl" flag:"cdn-url"`
|
||||
SiteUrl string `yaml:"SiteUrl" json:"SiteUrl" flag:"site-url"`
|
||||
SitePreview string `yaml:"SitePreview" json:"SitePreview" flag:"site-preview"`
|
||||
SiteTitle string `yaml:"SiteTitle" json:"SiteTitle" flag:"site-title"`
|
||||
SiteCaption string `yaml:"SiteCaption" json:"SiteCaption" flag:"site-caption"`
|
||||
SiteDescription string `yaml:"SiteDescription" json:"SiteDescription" flag:"site-description"`
|
||||
SiteAuthor string `yaml:"SiteAuthor" json:"SiteAuthor" flag:"site-author"`
|
||||
DatabaseDriver string `yaml:"DatabaseDriver" json:"-" flag:"database-driver"`
|
||||
DatabaseDsn string `yaml:"DatabaseDsn" json:"-" flag:"database-dsn"`
|
||||
DatabaseServer string `yaml:"DatabaseServer" json:"-" flag:"database-server"`
|
||||
DatabaseName string `yaml:"DatabaseName" json:"-" flag:"database-name"`
|
||||
DatabaseUser string `yaml:"DatabaseUser" json:"-" flag:"database-user"`
|
||||
DatabasePassword string `yaml:"DatabasePassword" json:"-" flag:"database-password"`
|
||||
DatabaseConns int `yaml:"DatabaseConns" json:"-" flag:"database-conns"`
|
||||
DatabaseConnsIdle int `yaml:"DatabaseConnsIdle" json:"-" flag:"database-conns-idle"`
|
||||
HttpHost string `yaml:"HttpHost" json:"-" flag:"http-host"`
|
||||
HttpPort int `yaml:"HttpPort" json:"-" flag:"http-port"`
|
||||
HttpMode string `yaml:"HttpMode" json:"-" flag:"http-mode"`
|
||||
HttpCompression string `yaml:"HttpCompression" json:"-" flag:"http-compression"`
|
||||
RawPresets bool `yaml:"RawPresets" json:"RawPresets" flag:"raw-presets"`
|
||||
DarktableBin string `yaml:"DarktableBin" json:"-" flag:"darktable-bin"`
|
||||
RawtherapeeBin string `yaml:"RawtherapeeBin" json:"-" flag:"rawtherapee-bin"`
|
||||
SipsBin string `yaml:"SipsBin" json:"-" flag:"sips-bin"`
|
||||
HeifConvertBin string `yaml:"HeifConvertBin" json:"-" flag:"heifconvert-bin"`
|
||||
FFmpegBin string `yaml:"FFmpegBin" json:"-" flag:"ffmpeg-bin"`
|
||||
FFmpegEncoder string `yaml:"FFmpegEncoder" json:"FFmpegEncoder" flag:"ffmpeg-encoder"`
|
||||
FFmpegBitrate int `yaml:"FFmpegBitrate" json:"FFmpegBitrate" flag:"ffmpeg-bitrate"`
|
||||
FFmpegBuffers int `yaml:"FFmpegBuffers" json:"FFmpegBuffers" flag:"ffmpeg-buffers"`
|
||||
ExifToolBin string `yaml:"ExifToolBin" json:"-" flag:"exiftool-bin"`
|
||||
DetachServer bool `yaml:"DetachServer" json:"-" flag:"detach-server"`
|
||||
DownloadToken string `yaml:"DownloadToken" json:"-" flag:"download-token"`
|
||||
PreviewToken string `yaml:"PreviewToken" json:"-" flag:"preview-token"`
|
||||
ThumbFilter string `yaml:"ThumbFilter" json:"ThumbFilter" flag:"thumb-filter"`
|
||||
ThumbUncached bool `yaml:"ThumbUncached" json:"ThumbUncached" flag:"thumb-uncached"`
|
||||
ThumbSize int `yaml:"ThumbSize" json:"ThumbSize" flag:"thumb-size"`
|
||||
ThumbSizeUncached int `yaml:"ThumbSizeUncached" json:"ThumbSizeUncached" flag:"thumb-size-uncached"`
|
||||
JpegSize int `yaml:"JpegSize" json:"JpegSize" flag:"jpeg-size"`
|
||||
JpegQuality int `yaml:"JpegQuality" json:"JpegQuality" flag:"jpeg-quality"`
|
||||
Name string `json:"-"`
|
||||
Version string `json:"-"`
|
||||
Copyright string `json:"-"`
|
||||
Debug bool `yaml:"Debug" json:"Debug" flag:"debug"`
|
||||
Test bool `yaml:"-" json:"Test,omitempty" flag:"test"`
|
||||
Demo bool `yaml:"Demo" json:"-" flag:"demo"`
|
||||
Sponsor bool `yaml:"-" json:"-" flag:"sponsor"`
|
||||
Public bool `yaml:"Public" json:"-" flag:"public"`
|
||||
ReadOnly bool `yaml:"ReadOnly" json:"ReadOnly" flag:"read-only"`
|
||||
Experimental bool `yaml:"Experimental" json:"Experimental" flag:"experimental"`
|
||||
ConfigPath string `yaml:"ConfigPath" json:"-" flag:"config-path"`
|
||||
ConfigFile string `json:"-"`
|
||||
AdminPassword string `yaml:"AdminPassword" json:"-" flag:"admin-password"`
|
||||
OriginalsPath string `yaml:"OriginalsPath" json:"-" flag:"originals-path"`
|
||||
OriginalsLimit int64 `yaml:"OriginalsLimit" json:"OriginalsLimit" flag:"originals-limit"`
|
||||
ImportPath string `yaml:"ImportPath" json:"-" flag:"import-path"`
|
||||
StoragePath string `yaml:"StoragePath" json:"-" flag:"storage-path"`
|
||||
SidecarPath string `yaml:"SidecarPath" json:"-" flag:"sidecar-path"`
|
||||
TempPath string `yaml:"TempPath" json:"-" flag:"temp-path"`
|
||||
BackupPath string `yaml:"BackupPath" json:"-" flag:"backup-path"`
|
||||
AssetsPath string `yaml:"AssetsPath" json:"-" flag:"assets-path"`
|
||||
CachePath string `yaml:"CachePath" json:"-" flag:"cache-path"`
|
||||
Workers int `yaml:"Workers" json:"Workers" flag:"workers"`
|
||||
WakeupInterval int `yaml:"WakeupInterval" json:"WakeupInterval" flag:"wakeup-interval"`
|
||||
AutoIndex int `yaml:"AutoIndex" json:"AutoIndex" flag:"auto-index"`
|
||||
AutoImport int `yaml:"AutoImport" json:"AutoImport" flag:"auto-import"`
|
||||
DisableBackups bool `yaml:"DisableBackups" json:"DisableBackups" flag:"disable-backups"`
|
||||
DisableWebDAV bool `yaml:"DisableWebDAV" json:"DisableWebDAV" flag:"disable-webdav"`
|
||||
DisableSettings bool `yaml:"DisableSettings" json:"-" flag:"disable-settings"`
|
||||
DisablePlaces bool `yaml:"DisablePlaces" json:"DisablePlaces" flag:"disable-places"`
|
||||
DisableExifTool bool `yaml:"DisableExifTool" json:"DisableExifTool" flag:"disable-exiftool"`
|
||||
DisableTensorFlow bool `yaml:"DisableTensorFlow" json:"DisableTensorFlow" flag:"disable-tensorflow"`
|
||||
DisableFFmpeg bool `yaml:"DisableFFmpeg" json:"DisableFFmpeg" flag:"disable-ffmpeg"`
|
||||
DisableDarktable bool `yaml:"DisableDarktable" json:"DisableDarktable" flag:"disable-darktable"`
|
||||
DisableRawtherapee bool `yaml:"DisableRawtherapee" json:"DisableRawtherapee" flag:"disable-rawtherapee"`
|
||||
DisableSips bool `yaml:"DisableSips" json:"DisableSips" flag:"disable-sips"`
|
||||
DisableHeifConvert bool `yaml:"DisableHeifConvert" json:"DisableHeifConvert" flag:"disable-heifconvert"`
|
||||
DetectNSFW bool `yaml:"DetectNSFW" json:"DetectNSFW" flag:"detect-nsfw"`
|
||||
UploadNSFW bool `yaml:"UploadNSFW" json:"-" flag:"upload-nsfw"`
|
||||
LogLevel string `yaml:"LogLevel" json:"-" flag:"log-level"`
|
||||
LogFilename string `yaml:"LogFilename" json:"-" flag:"log-filename"`
|
||||
PIDFilename string `yaml:"PIDFilename" json:"-" flag:"pid-filename"`
|
||||
CdnUrl string `yaml:"CdnUrl" json:"CdnUrl" flag:"cdn-url"`
|
||||
SiteUrl string `yaml:"SiteUrl" json:"SiteUrl" flag:"site-url"`
|
||||
SitePreview string `yaml:"SitePreview" json:"SitePreview" flag:"site-preview"`
|
||||
SiteTitle string `yaml:"SiteTitle" json:"SiteTitle" flag:"site-title"`
|
||||
SiteCaption string `yaml:"SiteCaption" json:"SiteCaption" flag:"site-caption"`
|
||||
SiteDescription string `yaml:"SiteDescription" json:"SiteDescription" flag:"site-description"`
|
||||
SiteAuthor string `yaml:"SiteAuthor" json:"SiteAuthor" flag:"site-author"`
|
||||
DatabaseDriver string `yaml:"DatabaseDriver" json:"-" flag:"database-driver"`
|
||||
DatabaseDsn string `yaml:"DatabaseDsn" json:"-" flag:"database-dsn"`
|
||||
DatabaseServer string `yaml:"DatabaseServer" json:"-" flag:"database-server"`
|
||||
DatabaseName string `yaml:"DatabaseName" json:"-" flag:"database-name"`
|
||||
DatabaseUser string `yaml:"DatabaseUser" json:"-" flag:"database-user"`
|
||||
DatabasePassword string `yaml:"DatabasePassword" json:"-" flag:"database-password"`
|
||||
DatabaseConns int `yaml:"DatabaseConns" json:"-" flag:"database-conns"`
|
||||
DatabaseConnsIdle int `yaml:"DatabaseConnsIdle" json:"-" flag:"database-conns-idle"`
|
||||
HttpHost string `yaml:"HttpHost" json:"-" flag:"http-host"`
|
||||
HttpPort int `yaml:"HttpPort" json:"-" flag:"http-port"`
|
||||
HttpMode string `yaml:"HttpMode" json:"-" flag:"http-mode"`
|
||||
HttpCompression string `yaml:"HttpCompression" json:"-" flag:"http-compression"`
|
||||
RawPresets bool `yaml:"RawPresets" json:"RawPresets" flag:"raw-presets"`
|
||||
DarktableBin string `yaml:"DarktableBin" json:"-" flag:"darktable-bin"`
|
||||
DarktableBlacklist string `yaml:"DarktableBlacklist" json:"-" flag:"darktable-blacklist"`
|
||||
RawtherapeeBin string `yaml:"RawtherapeeBin" json:"-" flag:"rawtherapee-bin"`
|
||||
RawtherapeeBlacklist string `yaml:"RawtherapeeBlacklist" json:"-" flag:"rawtherapee-blacklist"`
|
||||
SipsBin string `yaml:"SipsBin" json:"-" flag:"sips-bin"`
|
||||
HeifConvertBin string `yaml:"HeifConvertBin" json:"-" flag:"heifconvert-bin"`
|
||||
FFmpegBin string `yaml:"FFmpegBin" json:"-" flag:"ffmpeg-bin"`
|
||||
FFmpegEncoder string `yaml:"FFmpegEncoder" json:"FFmpegEncoder" flag:"ffmpeg-encoder"`
|
||||
FFmpegBitrate int `yaml:"FFmpegBitrate" json:"FFmpegBitrate" flag:"ffmpeg-bitrate"`
|
||||
FFmpegBuffers int `yaml:"FFmpegBuffers" json:"FFmpegBuffers" flag:"ffmpeg-buffers"`
|
||||
ExifToolBin string `yaml:"ExifToolBin" json:"-" flag:"exiftool-bin"`
|
||||
DetachServer bool `yaml:"DetachServer" json:"-" flag:"detach-server"`
|
||||
DownloadToken string `yaml:"DownloadToken" json:"-" flag:"download-token"`
|
||||
PreviewToken string `yaml:"PreviewToken" json:"-" flag:"preview-token"`
|
||||
ThumbFilter string `yaml:"ThumbFilter" json:"ThumbFilter" flag:"thumb-filter"`
|
||||
ThumbUncached bool `yaml:"ThumbUncached" json:"ThumbUncached" flag:"thumb-uncached"`
|
||||
ThumbSize int `yaml:"ThumbSize" json:"ThumbSize" flag:"thumb-size"`
|
||||
ThumbSizeUncached int `yaml:"ThumbSizeUncached" json:"ThumbSizeUncached" flag:"thumb-size-uncached"`
|
||||
JpegSize int `yaml:"JpegSize" json:"JpegSize" flag:"jpeg-size"`
|
||||
JpegQuality int `yaml:"JpegQuality" json:"JpegQuality" flag:"jpeg-quality"`
|
||||
}
|
||||
|
||||
// NewOptions creates a new configuration entity by using two methods:
|
||||
|
|
|
@ -10,6 +10,11 @@ func (c *Config) DarktableBin() string {
|
|||
return findExecutable(c.options.DarktableBin, "darktable-cli")
|
||||
}
|
||||
|
||||
// DarktableBlacklist returns the darktable file extension blacklist.
|
||||
func (c *Config) DarktableBlacklist() string {
|
||||
return c.options.DarktableBlacklist
|
||||
}
|
||||
|
||||
// DarktableEnabled tests if Darktable is enabled for RAW conversion.
|
||||
func (c *Config) DarktableEnabled() bool {
|
||||
return !c.DisableDarktable()
|
||||
|
@ -20,6 +25,11 @@ func (c *Config) RawtherapeeBin() string {
|
|||
return findExecutable(c.options.RawtherapeeBin, "rawtherapee-cli")
|
||||
}
|
||||
|
||||
// RawtherapeeBlacklist returns the RawTherapee file extension blacklist.
|
||||
func (c *Config) RawtherapeeBlacklist() string {
|
||||
return c.options.RawtherapeeBlacklist
|
||||
}
|
||||
|
||||
// RawtherapeeEnabled tests if Rawtherapee is enabled for RAW conversion.
|
||||
func (c *Config) RawtherapeeEnabled() bool {
|
||||
return !c.DisableRawtherapee()
|
||||
|
|
|
@ -12,6 +12,15 @@ func TestConfig_RawtherapeeBin(t *testing.T) {
|
|||
assert.Equal(t, "/usr/bin/rawtherapee-cli", c.RawtherapeeBin())
|
||||
}
|
||||
|
||||
func TestConfig_RawtherapeeBlacklist(t *testing.T) {
|
||||
c := NewConfig(CliTestContext())
|
||||
|
||||
c.options.RawtherapeeBlacklist = "foo,bar"
|
||||
assert.Equal(t, "foo,bar", c.RawtherapeeBlacklist())
|
||||
c.options.RawtherapeeBlacklist = ""
|
||||
assert.Equal(t, "", c.RawtherapeeBlacklist())
|
||||
}
|
||||
|
||||
func TestConfig_RawtherapeeEnabled(t *testing.T) {
|
||||
c := NewConfig(CliTestContext())
|
||||
assert.True(t, c.RawtherapeeEnabled())
|
||||
|
@ -26,6 +35,12 @@ func TestConfig_DarktableBin(t *testing.T) {
|
|||
assert.Equal(t, "/usr/bin/darktable-cli", c.DarktableBin())
|
||||
}
|
||||
|
||||
func TestConfig_DarktableBlacklist(t *testing.T) {
|
||||
c := NewConfig(CliTestContext())
|
||||
|
||||
assert.Equal(t, "raf,cr3", c.DarktableBlacklist())
|
||||
}
|
||||
|
||||
func TestConfig_DarktablePresets(t *testing.T) {
|
||||
c := NewConfig(CliTestContext())
|
||||
|
||||
|
|
|
@ -169,6 +169,7 @@ func CliTestContext() *cli.Context {
|
|||
globalSet.String("temp-path", config.OriginalsPath, "doc")
|
||||
globalSet.String("cache-path", config.OriginalsPath, "doc")
|
||||
globalSet.String("darktable-cli", config.DarktableBin, "doc")
|
||||
globalSet.String("darktable-blacklist", config.DarktableBlacklist, "doc")
|
||||
globalSet.String("admin-password", config.DarktableBin, "doc")
|
||||
globalSet.Bool("detect-nsfw", config.DetectNSFW, "doc")
|
||||
globalSet.Int("auto-index", config.AutoIndex, "doc")
|
||||
|
@ -189,6 +190,7 @@ func CliTestContext() *cli.Context {
|
|||
LogError(c.Set("temp-path", config.TempPath))
|
||||
LogError(c.Set("cache-path", config.CachePath))
|
||||
LogError(c.Set("darktable-cli", config.DarktableBin))
|
||||
LogError(c.Set("darktable-blacklist", "raf,cr3"))
|
||||
LogError(c.Set("admin-password", config.AdminPassword))
|
||||
LogError(c.Set("detect-nsfw", "true"))
|
||||
LogError(c.Set("auto-index", strconv.Itoa(config.AutoIndex)))
|
||||
|
|
|
@ -23,18 +23,25 @@ import (
|
|||
"github.com/photoprism/photoprism/pkg/txt"
|
||||
)
|
||||
|
||||
// Default FFmpeg AVC software encoder.
|
||||
const DefaultAvcEncoder = "libx264"
|
||||
const DefaultAvcEncoder = "libx264" // Default FFmpeg AVC software encoder.
|
||||
|
||||
// Convert represents a converter that can convert RAW/HEIF images to JPEG.
|
||||
type Convert struct {
|
||||
conf *config.Config
|
||||
cmdMutex sync.Mutex
|
||||
conf *config.Config
|
||||
cmdMutex sync.Mutex
|
||||
darktableBlacklist fs.Blacklist
|
||||
rawtherapeeBlacklist fs.Blacklist
|
||||
}
|
||||
|
||||
// NewConvert returns a new converter and expects the config as argument.
|
||||
func NewConvert(conf *config.Config) *Convert {
|
||||
return &Convert{conf: conf}
|
||||
c := &Convert{
|
||||
conf: conf,
|
||||
darktableBlacklist: fs.NewBlacklist(conf.DarktableBlacklist()),
|
||||
rawtherapeeBlacklist: fs.NewBlacklist(conf.RawtherapeeBlacklist()),
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
// Start converts all files in a directory to JPEG if possible.
|
||||
|
@ -186,7 +193,7 @@ func (c *Convert) JpegConvertCommand(f *MediaFile, jpegName string, xmpName stri
|
|||
if f.IsRaw() {
|
||||
if c.conf.SipsEnabled() {
|
||||
result = exec.Command(c.conf.SipsBin(), "-Z", size, "-s", "format", "jpeg", "--out", jpegName, f.FileName())
|
||||
} else if c.conf.DarktableEnabled() && fileExt != fs.CanonCr3Ext && fileExt != fs.FujiRawExt {
|
||||
} else if c.conf.DarktableEnabled() && c.darktableBlacklist.Ok(fileExt) {
|
||||
var args []string
|
||||
|
||||
// Only one instance of darktable-cli allowed due to locking if presets are loaded.
|
||||
|
@ -205,7 +212,7 @@ func (c *Convert) JpegConvertCommand(f *MediaFile, jpegName string, xmpName stri
|
|||
}
|
||||
|
||||
result = exec.Command(c.conf.DarktableBin(), args...)
|
||||
} else if c.conf.RawtherapeeEnabled() {
|
||||
} else if c.conf.RawtherapeeEnabled() && c.rawtherapeeBlacklist.Ok(fileExt) {
|
||||
jpegQuality := fmt.Sprintf("-j%d", c.conf.JpegQuality())
|
||||
profile := filepath.Join(conf.AssetsPath(), "profiles", "raw.pp3")
|
||||
|
||||
|
|
77
pkg/fs/blacklist.go
Normal file
77
pkg/fs/blacklist.go
Normal file
|
@ -0,0 +1,77 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Blacklists represents multiple blacklists.
|
||||
type Blacklists map[string]Blacklist
|
||||
|
||||
// NewBlacklists creates and initializes file extension blacklists.
|
||||
func NewBlacklists() Blacklists {
|
||||
return make(Blacklists)
|
||||
}
|
||||
|
||||
// Blacklist represents a file extension blacklist.
|
||||
type Blacklist map[string]bool
|
||||
|
||||
// NewBlacklist creates and initializes a file extension blacklist.
|
||||
func NewBlacklist(extensions string) Blacklist {
|
||||
list := make(Blacklist)
|
||||
if extensions != "" {
|
||||
list.Set(extensions)
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
// Contains tests if a file extension is blacklisted.
|
||||
func (b Blacklist) Contains(ext string) bool {
|
||||
// Skip check if list is empty.
|
||||
if len(b) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Normalize extension string.
|
||||
ext = strings.ToLower(strings.Trim(ext, ".,;: "))
|
||||
|
||||
// Skip check if extension is empty.
|
||||
if ext == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
if _, ok := b[ext]; ok {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Ok tests if a file extension is NOT blacklisted.
|
||||
func (b Blacklist) Ok(ext string) bool {
|
||||
return !b.Contains(ext)
|
||||
}
|
||||
|
||||
// Set initializes the blacklist with a list of file extensions.
|
||||
func (b Blacklist) Set(extensions string) {
|
||||
if extensions == "" {
|
||||
return
|
||||
}
|
||||
|
||||
ext := strings.Split(extensions, ",")
|
||||
|
||||
for i := range ext {
|
||||
b.Add(ext[i])
|
||||
}
|
||||
}
|
||||
|
||||
// Add adds a file extension to the blacklist.
|
||||
func (b Blacklist) Add(ext string) {
|
||||
// Normalize extension string.
|
||||
ext = strings.ToLower(strings.Trim(ext, ".,;: "))
|
||||
|
||||
if ext == "" {
|
||||
return
|
||||
}
|
||||
|
||||
b[ext] = true
|
||||
}
|
44
pkg/fs/blacklist_test.go
Normal file
44
pkg/fs/blacklist_test.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package fs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNewBlacklists(t *testing.T) {
|
||||
t.Run("WithExtensions", func(t *testing.T) {
|
||||
lists := NewBlacklists()
|
||||
lists["foo"] = NewBlacklist("RAF, Cr3, aaf ")
|
||||
assert.True(t, lists["foo"].Contains(".raf"))
|
||||
assert.True(t, lists["foo"].Contains("cr3"))
|
||||
assert.True(t, lists["foo"].Contains("AAF"))
|
||||
assert.False(t, lists["foo"].Contains(""))
|
||||
assert.False(t, lists["foo"].Contains(".raw"))
|
||||
assert.False(t, lists["foo"].Contains("raw"))
|
||||
})
|
||||
}
|
||||
|
||||
func TestNewBlacklist(t *testing.T) {
|
||||
t.Run("WithExtensions", func(t *testing.T) {
|
||||
list := NewBlacklist("RAF, Cr3, aaf ")
|
||||
assert.True(t, list.Contains(".raf"))
|
||||
assert.True(t, list.Contains("cr3"))
|
||||
assert.True(t, list.Contains("AAF"))
|
||||
assert.False(t, list.Contains(""))
|
||||
assert.False(t, list.Contains(".raw"))
|
||||
assert.False(t, list.Contains("raw"))
|
||||
})
|
||||
}
|
||||
|
||||
func TestBlacklist_Ok(t *testing.T) {
|
||||
t.Run("Raw", func(t *testing.T) {
|
||||
list := NewBlacklist("RAF, Cr3, aaf ")
|
||||
assert.False(t, list.Ok(".raf"))
|
||||
assert.False(t, list.Ok("cr3"))
|
||||
assert.False(t, list.Ok("AAF"))
|
||||
assert.True(t, list.Ok(""))
|
||||
assert.True(t, list.Ok(".raw"))
|
||||
assert.True(t, list.Ok("raw"))
|
||||
})
|
||||
}
|
Loading…
Reference in a new issue