RAW: Add File Extension Blacklists for Darktable and RawTherapee #1362

This commit is contained in:
Michael Mayer 2021-09-21 15:33:46 +02:00
parent e8ac1abbe3
commit b081f27e17
9 changed files with 258 additions and 87 deletions

View file

@ -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())

View file

@ -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",

View file

@ -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:

View file

@ -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()

View file

@ -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())

View file

@ -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)))

View file

@ -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
View 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
View 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"))
})
}