Use functions for all config values #50

Why? See https://github.com/photoprism/photoprism/issues/50#issuecomment-433856358
This commit is contained in:
Michael Mayer 2018-11-09 20:48:23 +01:00
parent 2cce8ded84
commit dd26ee0dca
26 changed files with 230 additions and 138 deletions

View file

@ -19,7 +19,7 @@ install-bin:
scripts/build.sh install /usr/local/bin/$(BINARY_NAME) scripts/build.sh install /usr/local/bin/$(BINARY_NAME)
install-assets: install-assets:
mkdir -p /srv/photoprism/photos mkdir -p /srv/photoprism/photos
mkdir -p /srv/photoprism/thumbnails mkdir -p /srv/photoprism/cache
mkdir -p /srv/photoprism/database mkdir -p /srv/photoprism/database
cp -r assets/server /srv/photoprism cp -r assets/server /srv/photoprism
cp -r assets/tensorflow /srv/photoprism cp -r assets/tensorflow /srv/photoprism

View file

@ -11,7 +11,7 @@ services:
- 2342:80 # left side is your local port (change if port 2342 is already used or you want to use port 80) - 2342:80 # left side is your local port (change if port 2342 is already used or you want to use port 80)
volumes: volumes:
- ~/Photos:/srv/photoprism/photos # change ~/Photos to whatever directory you want to use on your local computer - ~/Photos:/srv/photoprism/photos # change ~/Photos to whatever directory you want to use on your local computer
- photoprism-thumbnails:/srv/photoprism/thumbnails # keep this (thumbnail cache) - photoprism-cache:/srv/photoprism/cache # keep this (thumbnail cache)
environment: environment:
PHOTOPRISM_IMPORT_PATH: /srv/photoprism/photos/Import # ~/Photos/Import (files to be imported to originals) PHOTOPRISM_IMPORT_PATH: /srv/photoprism/photos/Import # ~/Photos/Import (files to be imported to originals)
PHOTOPRISM_EXPORT_PATH: /srv/photoprism/photos/Export # ~/Photos/Export (files exported from originals) PHOTOPRISM_EXPORT_PATH: /srv/photoprism/photos/Export # ~/Photos/Export (files exported from originals)
@ -30,7 +30,7 @@ services:
MYSQL_DATABASE: photoprism MYSQL_DATABASE: photoprism
volumes: # keep this volumes: # keep this
photoprism-thumbnails: photoprism-cache:
driver: local driver: local
photoprism-database: photoprism-database:
driver: local driver: local

View file

@ -1,7 +1,7 @@
debug: false debug: false
darktable-cli: /usr/bin/darktable-cli darktable-cli: /usr/bin/darktable-cli
assets-path: /srv/photoprism assets-path: /srv/photoprism
thumbnails-path: /srv/photoprism/thumbnails cache-path: /srv/photoprism/cache
originals-path: /srv/photoprism/photos/originals originals-path: /srv/photoprism/photos/originals
import-path: /srv/photoprism/photos/import import-path: /srv/photoprism/photos/import
export-path: /srv/photoprism/photos/export export-path: /srv/photoprism/photos/export

View file

@ -13,7 +13,7 @@ services:
PHOTOPRISM_DEBUG: "true" PHOTOPRISM_DEBUG: "true"
PHOTOPRISM_SERVER_MODE: "debug" PHOTOPRISM_SERVER_MODE: "debug"
PHOTOPRISM_ASSETS_PATH: "/go/src/github.com/photoprism/photoprism/assets" PHOTOPRISM_ASSETS_PATH: "/go/src/github.com/photoprism/photoprism/assets"
PHOTOPRISM_THUMBNAILS_PATH: "/go/src/github.com/photoprism/photoprism/assets/thumbnails" PHOTOPRISM_CACHE_PATH: "/go/src/github.com/photoprism/photoprism/assets/cache"
PHOTOPRISM_IMPORT_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/import" PHOTOPRISM_IMPORT_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/import"
PHOTOPRISM_EXPORT_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/export" PHOTOPRISM_EXPORT_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/export"
PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/originals" PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/originals"

View file

@ -29,7 +29,7 @@ func GetPhotos(router *gin.RouterGroup, conf *photoprism.Config) {
router.GET("/photos", func(c *gin.Context) { router.GET("/photos", func(c *gin.Context) {
var form forms.PhotoSearchForm var form forms.PhotoSearchForm
search := photoprism.NewSearch(conf.OriginalsPath, conf.GetDb()) search := photoprism.NewSearch(conf.GetOriginalsPath(), conf.GetDb())
c.MustBindWith(&form, binding.Form) c.MustBindWith(&form, binding.Form)
@ -52,7 +52,7 @@ func GetPhotos(router *gin.RouterGroup, conf *photoprism.Config) {
// photoId: int Photo ID as returned by the API // photoId: int Photo ID as returned by the API
func LikePhoto(router *gin.RouterGroup, conf *photoprism.Config) { func LikePhoto(router *gin.RouterGroup, conf *photoprism.Config) {
router.POST("/photos/:photoId/like", func(c *gin.Context) { router.POST("/photos/:photoId/like", func(c *gin.Context) {
search := photoprism.NewSearch(conf.OriginalsPath, conf.GetDb()) search := photoprism.NewSearch(conf.GetOriginalsPath(), conf.GetDb())
photoId, err := strconv.ParseUint(c.Param("photoId"), 10, 64) photoId, err := strconv.ParseUint(c.Param("photoId"), 10, 64)
@ -74,7 +74,7 @@ func LikePhoto(router *gin.RouterGroup, conf *photoprism.Config) {
// photoId: int Photo ID as returned by the API // photoId: int Photo ID as returned by the API
func DislikePhoto(router *gin.RouterGroup, conf *photoprism.Config) { func DislikePhoto(router *gin.RouterGroup, conf *photoprism.Config) {
router.DELETE("/photos/:photoId/like", func(c *gin.Context) { router.DELETE("/photos/:photoId/like", func(c *gin.Context) {
search := photoprism.NewSearch(conf.OriginalsPath, conf.GetDb()) search := photoprism.NewSearch(conf.GetOriginalsPath(), conf.GetDb())
photoId, err := strconv.ParseUint(c.Param("photoId"), 10, 64) photoId, err := strconv.ParseUint(c.Param("photoId"), 10, 64)

View file

@ -32,23 +32,23 @@ func GetThumbnail(router *gin.RouterGroup, conf *photoprism.Config) {
c.Data(400, "image/svg+xml", photoIconSvg) c.Data(400, "image/svg+xml", photoIconSvg)
} }
search := photoprism.NewSearch(conf.OriginalsPath, conf.GetDb()) search := photoprism.NewSearch(conf.GetOriginalsPath(), conf.GetDb())
file := search.FindFileByHash(fileHash) file := search.FindFileByHash(fileHash)
fileName := fmt.Sprintf("%s/%s", conf.OriginalsPath, file.FileName) fileName := fmt.Sprintf("%s/%s", conf.GetOriginalsPath(), file.FileName)
if mediaFile, err := photoprism.NewMediaFile(fileName); err == nil { if mediaFile, err := photoprism.NewMediaFile(fileName); err == nil {
switch thumbnailType { switch thumbnailType {
case "fit": case "fit":
if thumbnail, err := mediaFile.GetThumbnail(conf.ThumbnailsPath, size); err == nil { if thumbnail, err := mediaFile.GetThumbnail(conf.GetThumbnailsPath(), size); err == nil {
c.File(thumbnail.GetFilename()) c.File(thumbnail.GetFilename())
} else { } else {
log.Printf("could not create thumbnail: %s", err.Error()) log.Printf("could not create thumbnail: %s", err.Error())
c.Data(400, "image/svg+xml", photoIconSvg) c.Data(400, "image/svg+xml", photoIconSvg)
} }
case "square": case "square":
if thumbnail, err := mediaFile.GetSquareThumbnail(conf.ThumbnailsPath, size); err == nil { if thumbnail, err := mediaFile.GetSquareThumbnail(conf.GetThumbnailsPath(), size); err == nil {
c.File(thumbnail.GetFilename()) c.File(thumbnail.GetFilename())
} else { } else {
log.Printf("could not create square thumbnail: %s", err.Error()) log.Printf("could not create square thumbnail: %s", err.Error())

View file

@ -18,16 +18,16 @@ func configAction(context *cli.Context) error {
conf := photoprism.NewConfig(context) conf := photoprism.NewConfig(context)
fmt.Printf("NAME VALUE\n") fmt.Printf("NAME VALUE\n")
fmt.Printf("debug %t\n", conf.Debug) fmt.Printf("debug %t\n", conf.IsDebug())
fmt.Printf("config-file %s\n", conf.ConfigFile) fmt.Printf("config-file %s\n", conf.GetConfigFile())
fmt.Printf("assets-path %s\n", conf.AssetsPath) fmt.Printf("darktable-cli %s\n", conf.GetDarktableCli())
fmt.Printf("originals-path %s\n", conf.OriginalsPath) fmt.Printf("originals-path %s\n", conf.GetOriginalsPath())
fmt.Printf("thumbnails-path %s\n", conf.ThumbnailsPath) fmt.Printf("import-path %s\n", conf.GetImportPath())
fmt.Printf("import-path %s\n", conf.ImportPath) fmt.Printf("export-path %s\n", conf.GetExportPath())
fmt.Printf("export-path %s\n", conf.ExportPath) fmt.Printf("cache-path %s\n", conf.GetCachePath())
fmt.Printf("darktable-cli %s\n", conf.DarktableCli) fmt.Printf("assets-path %s\n", conf.GetAssetsPath())
fmt.Printf("database-driver %s\n", conf.DatabaseDriver) fmt.Printf("database-driver %s\n", conf.GetDatabaseDriver())
fmt.Printf("database-dsn %s\n", conf.DatabaseDsn) fmt.Printf("database-dsn %s\n", conf.GetDatabaseDsn())
return nil return nil
} }

View file

@ -22,11 +22,11 @@ func convertAction(context *cli.Context) error {
log.Fatal(err) log.Fatal(err)
} }
fmt.Printf("Converting RAW images in %s to JPEG...\n", conf.OriginalsPath) fmt.Printf("Converting RAW images in %s to JPEG...\n", conf.GetOriginalsPath())
converter := photoprism.NewConverter(conf.DarktableCli) converter := photoprism.NewConverter(conf.GetDarktableCli())
converter.ConvertAll(conf.OriginalsPath) converter.ConvertAll(conf.GetOriginalsPath())
fmt.Println("Done.") fmt.Println("Done.")

View file

@ -68,13 +68,13 @@ func exportAction(context *cli.Context) error {
} }
} }
exportPath := fmt.Sprintf("%s/%s", conf.ExportPath, name) exportPath := fmt.Sprintf("%s/%s", conf.GetExportPath(), name)
size := context.Int("size") size := context.Int("size")
originals := photoprism.FindOriginalsByDate(conf.OriginalsPath, afterDate, beforeDate) originals := photoprism.FindOriginalsByDate(conf.GetOriginalsPath(), afterDate, beforeDate)
fmt.Printf("Exporting photos to %s...\n", exportPath) fmt.Printf("Exporting photos to %s...\n", exportPath)
photoprism.ExportPhotosFromOriginals(originals, conf.ThumbnailsPath, exportPath, size) photoprism.ExportPhotosFromOriginals(originals, conf.GetThumbnailsPath(), exportPath, size)
fmt.Println("Done.") fmt.Println("Done.")

View file

@ -26,12 +26,6 @@ var GlobalFlags = []cli.Flag{
Value: "/srv/photoprism/photos/originals", Value: "/srv/photoprism/photos/originals",
EnvVar: "PHOTOPRISM_ORIGINALS_PATH", EnvVar: "PHOTOPRISM_ORIGINALS_PATH",
}, },
cli.StringFlag{
Name: "thumbnails-path",
Usage: "thumbnails `PATH`",
Value: "/srv/photoprism/photos/thumbnails",
EnvVar: "PHOTOPRISM_THUMBNAILS_PATH",
},
cli.StringFlag{ cli.StringFlag{
Name: "import-path", Name: "import-path",
Usage: "import `PATH`", Usage: "import `PATH`",
@ -44,6 +38,12 @@ var GlobalFlags = []cli.Flag{
Value: "/srv/photoprism/photos/export", Value: "/srv/photoprism/photos/export",
EnvVar: "PHOTOPRISM_EXPORT_PATH", EnvVar: "PHOTOPRISM_EXPORT_PATH",
}, },
cli.StringFlag{
Name: "cache-path",
Usage: "cache `PATH`",
Value: "/srv/photoprism/cache",
EnvVar: "PHOTOPRISM_CACHE_PATH",
},
cli.StringFlag{ cli.StringFlag{
Name: "assets-path", Name: "assets-path",
Usage: "assets `PATH`", Usage: "assets `PATH`",

View file

@ -24,17 +24,17 @@ func importAction(context *cli.Context) error {
conf.MigrateDb() conf.MigrateDb()
fmt.Printf("Importing photos from %s...\n", conf.ImportPath) fmt.Printf("Importing photos from %s...\n", conf.GetImportPath())
tensorFlow := photoprism.NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := photoprism.NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := photoprism.NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := photoprism.NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
converter := photoprism.NewConverter(conf.DarktableCli) converter := photoprism.NewConverter(conf.GetDarktableCli())
importer := photoprism.NewImporter(conf.OriginalsPath, indexer, converter) importer := photoprism.NewImporter(conf.GetOriginalsPath(), indexer, converter)
importer.ImportPhotosFromDirectory(conf.ImportPath) importer.ImportPhotosFromDirectory(conf.GetImportPath())
fmt.Println("Done.") fmt.Println("Done.")

View file

@ -24,11 +24,11 @@ func indexAction(context *cli.Context) error {
conf.MigrateDb() conf.MigrateDb()
fmt.Printf("Indexing photos in %s...\n", conf.OriginalsPath) fmt.Printf("Indexing photos in %s...\n", conf.GetOriginalsPath())
tensorFlow := photoprism.NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := photoprism.NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := photoprism.NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := photoprism.NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
indexer.IndexAll() indexer.IndexAll()

View file

@ -41,19 +41,7 @@ var startFlags = []cli.Flag{
func startAction(context *cli.Context) error { func startAction(context *cli.Context) error {
conf := photoprism.NewConfig(context) conf := photoprism.NewConfig(context)
if context.IsSet("server-host") || conf.ServerIP == "" { if conf.GetServerPort() < 1 {
conf.ServerIP = context.String("server-host")
}
if context.IsSet("server-port") || conf.ServerPort == 0 {
conf.ServerPort = context.Int("server-port")
}
if context.IsSet("server-mode") || conf.ServerMode == "" {
conf.ServerMode = context.String("server-mode")
}
if conf.ServerPort < 1 {
log.Fatal("Server port must be a positive integer") log.Fatal("Server port must be a positive integer")
} }

View file

@ -36,7 +36,7 @@ func thumbnailsAction(context *cli.Context) error {
log.Fatal(err) log.Fatal(err)
} }
fmt.Printf("Creating thumbnails in %s...\n", conf.ThumbnailsPath) fmt.Printf("Creating thumbnails in %s...\n", conf.GetThumbnailsPath())
sizes := context.IntSlice("size") sizes := context.IntSlice("size")
@ -50,7 +50,7 @@ func thumbnailsAction(context *cli.Context) error {
} }
for _, size := range sizes { for _, size := range sizes {
photoprism.CreateThumbnailsFromOriginals(conf.OriginalsPath, conf.ThumbnailsPath, size, context.Bool("square")) photoprism.CreateThumbnailsFromOriginals(conf.GetOriginalsPath(), conf.GetThumbnailsPath(), size, context.Bool("square"))
} }
fmt.Println("Done.") fmt.Println("Done.")

View file

@ -11,7 +11,7 @@ func TestMediaFile_GetColors(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
if mediaFile1, err := NewMediaFile(conf.ImportPath + "/dog.jpg"); err == nil { if mediaFile1, err := NewMediaFile(conf.GetImportPath() + "/dog.jpg"); err == nil {
names, vibrantHex, mutedHex := mediaFile1.GetColors() names, vibrantHex, mutedHex := mediaFile1.GetColors()
t.Log(names, vibrantHex, mutedHex) t.Log(names, vibrantHex, mutedHex)
@ -23,7 +23,7 @@ func TestMediaFile_GetColors(t *testing.T) {
t.Error(err) t.Error(err)
} }
if mediaFile2, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG"); err == nil { if mediaFile2, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG"); err == nil {
names, vibrantHex, mutedHex := mediaFile2.GetColors() names, vibrantHex, mutedHex := mediaFile2.GetColors()
@ -35,7 +35,7 @@ func TestMediaFile_GetColors(t *testing.T) {
t.Error(err) t.Error(err)
} }
if mediaFile3, err := NewMediaFile(conf.ImportPath + "/raw/20140717_154212_1EC48F8489.jpg"); err == nil { if mediaFile3, err := NewMediaFile(conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.jpg"); err == nil {
names, vibrantHex, mutedHex := mediaFile3.GetColors() names, vibrantHex, mutedHex := mediaFile3.GetColors()

View file

@ -27,6 +27,7 @@ type Config struct {
ServerPort int ServerPort int
ServerMode string ServerMode string
AssetsPath string AssetsPath string
CachePath string
ThumbnailsPath string ThumbnailsPath string
OriginalsPath string OriginalsPath string
ImportPath string ImportPath string
@ -83,8 +84,8 @@ func (c *Config) SetValuesFromFile(fileName string) error {
c.AssetsPath = GetExpandedFilename(assetsPath) c.AssetsPath = GetExpandedFilename(assetsPath)
} }
if thumbnailsPath, err := yamlConfig.Get("thumbnails-path"); err == nil { if cachePath, err := yamlConfig.Get("cache-path"); err == nil {
c.ThumbnailsPath = GetExpandedFilename(thumbnailsPath) c.CachePath = GetExpandedFilename(cachePath)
} }
if originalsPath, err := yamlConfig.Get("originals-path"); err == nil { if originalsPath, err := yamlConfig.Get("originals-path"); err == nil {
@ -125,8 +126,8 @@ func (c *Config) SetValuesFromCliContext(context *cli.Context) error {
c.AssetsPath = GetExpandedFilename(context.GlobalString("assets-path")) c.AssetsPath = GetExpandedFilename(context.GlobalString("assets-path"))
} }
if context.GlobalIsSet("thumbnails-path") || c.ThumbnailsPath == "" { if context.GlobalIsSet("cache-path") || c.CachePath == "" {
c.ThumbnailsPath = GetExpandedFilename(context.GlobalString("thumbnails-path")) c.CachePath = GetExpandedFilename(context.GlobalString("cache-path"))
} }
if context.GlobalIsSet("originals-path") || c.OriginalsPath == "" { if context.GlobalIsSet("originals-path") || c.OriginalsPath == "" {
@ -153,6 +154,18 @@ func (c *Config) SetValuesFromCliContext(context *cli.Context) error {
c.DatabaseDsn = context.GlobalString("database-dsn") c.DatabaseDsn = context.GlobalString("database-dsn")
} }
if context.IsSet("server-host") || c.ServerIP == "" {
c.ServerIP = context.String("server-host")
}
if context.IsSet("server-port") || c.ServerPort == 0 {
c.ServerPort = context.Int("server-port")
}
if context.IsSet("server-mode") || c.ServerMode == "" {
c.ServerMode = context.String("server-mode")
}
return nil return nil
} }
@ -162,19 +175,31 @@ func (c *Config) SetValuesFromCliContext(context *cli.Context) error {
// ImportPath // ImportPath
// ExportPath // ExportPath
func (c *Config) CreateDirectories() error { func (c *Config) CreateDirectories() error {
if err := os.MkdirAll(c.OriginalsPath, os.ModePerm); err != nil { if err := os.MkdirAll(c.GetOriginalsPath(), os.ModePerm); err != nil {
return err return err
} }
if err := os.MkdirAll(c.ThumbnailsPath, os.ModePerm); err != nil { if err := os.MkdirAll(c.GetImportPath(), os.ModePerm); err != nil {
return err return err
} }
if err := os.MkdirAll(c.ImportPath, os.ModePerm); err != nil { if err := os.MkdirAll(c.GetExportPath(), os.ModePerm); err != nil {
return err return err
} }
if err := os.MkdirAll(c.ExportPath, os.ModePerm); err != nil { if err := os.MkdirAll(c.GetThumbnailsPath(), os.ModePerm); err != nil {
return err
}
if err := os.MkdirAll(c.GetDatabasePath(), os.ModePerm); err != nil {
return err
}
if err := os.MkdirAll(c.GetTensorFlowModelPath(), os.ModePerm); err != nil {
return err
}
if err := os.MkdirAll(c.GetPublicBuildPath(), os.ModePerm); err != nil {
return err return err
} }
@ -207,6 +232,86 @@ func (c *Config) connectToDatabase() error {
return err return err
} }
// GetAppName returns the application name.
func (c *Config) GetAppName() string {
return c.AppName
}
// GetAppVersion returns the application version.
func (c *Config) GetAppVersion() string {
return c.AppVersion
}
// GetCopyright returns the application copyright.
func (c *Config) GetCopyright() string {
return c.Copyright
}
// IsDebug returns true if debug mode is on.
func (c *Config) IsDebug() bool {
return c.Debug
}
// GetConfigFile returns the config file name.
func (c *Config) GetConfigFile() string {
return c.ConfigFile
}
// GetServerIP returns the server IP address (empty for all).
func (c *Config) GetServerIP() string {
return c.ServerIP
}
// GetServerPort returns the server port.
func (c *Config) GetServerPort() int {
return c.ServerPort
}
// GetServerMode returns the server mode.
func (c *Config) GetServerMode() string {
return c.ServerMode
}
// GetOriginalsPath returns the originals.
func (c *Config) GetOriginalsPath() string {
return c.OriginalsPath
}
// GetImportPath returns the import directory.
func (c *Config) GetImportPath() string {
return c.ImportPath
}
// GetExportPath returns the export directory.
func (c *Config) GetExportPath() string {
return c.ExportPath
}
// GetDarktableCli returns the darktable-cli binary file name.
func (c *Config) GetDarktableCli() string {
return c.DarktableCli
}
// GetDatabaseDriver returns the database driver name.
func (c *Config) GetDatabaseDriver() string {
return c.DatabaseDriver
}
// GetDatabaseDsn returns the database data source name (DSN).
func (c *Config) GetDatabaseDsn() string {
return c.DatabaseDsn
}
// GetCachePath returns the path to the cache.
func (c *Config) GetCachePath() string {
return c.CachePath
}
// GetThumbnailsPath returns the path to the cached thumbnails.
func (c *Config) GetThumbnailsPath() string {
return c.GetCachePath() + "/thumbnails"
}
// GetAssetsPath returns the path to the assets. // GetAssetsPath returns the path to the assets.
func (c *Config) GetAssetsPath() string { func (c *Config) GetAssetsPath() string {
return c.AssetsPath return c.AssetsPath

View file

@ -25,7 +25,7 @@ const testConfigFile = "../../configs/photoprism.yml"
var darktableCli = "/usr/bin/darktable-cli" var darktableCli = "/usr/bin/darktable-cli"
var testDataZip = "/tmp/photoprism/testdata.zip" var testDataZip = "/tmp/photoprism/testdata.zip"
var assetsPath = GetExpandedFilename("../../assets") var assetsPath = GetExpandedFilename("../../assets")
var thumbnailsPath = GetExpandedFilename(testDataPath + "/thumbnails") var cachePath = GetExpandedFilename(testDataPath + "/cache")
var originalsPath = GetExpandedFilename(testDataPath + "/originals") var originalsPath = GetExpandedFilename(testDataPath + "/originals")
var importPath = GetExpandedFilename(testDataPath + "/import") var importPath = GetExpandedFilename(testDataPath + "/import")
var exportPath = GetExpandedFilename(testDataPath + "/export") var exportPath = GetExpandedFilename(testDataPath + "/export")
@ -38,10 +38,10 @@ func init() {
} }
func (c *Config) RemoveTestData(t *testing.T) { func (c *Config) RemoveTestData(t *testing.T) {
os.RemoveAll(c.ImportPath) os.RemoveAll(c.GetImportPath())
os.RemoveAll(c.ExportPath) os.RemoveAll(c.GetExportPath())
os.RemoveAll(c.OriginalsPath) os.RemoveAll(c.GetOriginalsPath())
os.RemoveAll(c.ThumbnailsPath) os.RemoveAll(c.GetCachePath())
} }
func (c *Config) DownloadTestData(t *testing.T) { func (c *Config) DownloadTestData(t *testing.T) {
@ -83,7 +83,7 @@ func NewTestConfig() *Config {
return &Config{ return &Config{
Debug: false, Debug: false,
AssetsPath: assetsPath, AssetsPath: assetsPath,
ThumbnailsPath: thumbnailsPath, CachePath: cachePath,
OriginalsPath: originalsPath, OriginalsPath: originalsPath,
ImportPath: importPath, ImportPath: importPath,
ExportPath: exportPath, ExportPath: exportPath,
@ -123,8 +123,8 @@ func TestNewConfig(t *testing.T) {
assert.IsType(t, &Config{}, c) assert.IsType(t, &Config{}, c)
assert.Equal(t, assetsPath, c.AssetsPath) assert.Equal(t, assetsPath, c.GetAssetsPath())
assert.False(t, c.Debug) assert.False(t, c.IsDebug())
} }
func TestConfig_SetValuesFromFile(t *testing.T) { func TestConfig_SetValuesFromFile(t *testing.T) {
@ -132,20 +132,19 @@ func TestConfig_SetValuesFromFile(t *testing.T) {
c.SetValuesFromFile(GetExpandedFilename(testConfigFile)) c.SetValuesFromFile(GetExpandedFilename(testConfigFile))
assert.Equal(t, "/srv/photoprism", c.AssetsPath) assert.Equal(t, "/srv/photoprism", c.GetAssetsPath())
assert.Equal(t, "/srv/photoprism/thumbnails", c.ThumbnailsPath) assert.Equal(t, "/srv/photoprism/cache", c.GetCachePath())
assert.Equal(t, "/srv/photoprism/photos/originals", c.OriginalsPath) assert.Equal(t, "/srv/photoprism/cache/thumbnails", c.GetThumbnailsPath())
assert.Equal(t, "/srv/photoprism/photos/import", c.ImportPath) assert.Equal(t, "/srv/photoprism/photos/originals", c.GetOriginalsPath())
assert.Equal(t, "/srv/photoprism/photos/export", c.ExportPath) assert.Equal(t, "/srv/photoprism/photos/import", c.GetImportPath())
assert.Equal(t, databaseDriver, c.DatabaseDriver) assert.Equal(t, "/srv/photoprism/photos/export", c.GetExportPath())
assert.Equal(t, databaseDsn, c.DatabaseDsn) assert.Equal(t, databaseDriver, c.GetDatabaseDriver())
assert.Equal(t, databaseDsn, c.GetDatabaseDsn())
} }
func TestConfig_ConnectToDatabase(t *testing.T) { func TestConfig_ConnectToDatabase(t *testing.T) {
c := NewTestConfig() c := NewTestConfig()
c.connectToDatabase()
db := c.GetDb() db := c.GetDb()
assert.IsType(t, &gorm.DB{}, db) assert.IsType(t, &gorm.DB{}, db)

View file

@ -10,7 +10,7 @@ import (
func TestNewConverter(t *testing.T) { func TestNewConverter(t *testing.T) {
conf := NewTestConfig() conf := NewTestConfig()
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
assert.IsType(t, &Converter{}, converter) assert.IsType(t, &Converter{}, converter)
} }
@ -20,9 +20,9 @@ func TestConverter_ConvertToJpeg(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
jpegFilename := conf.ImportPath + "/iphone/IMG_6788.JPG" jpegFilename := conf.GetImportPath() + "/iphone/IMG_6788.JPG"
assert.Truef(t, fileExists(jpegFilename), "file does not exist: %s", jpegFilename) assert.Truef(t, fileExists(jpegFilename), "file does not exist: %s", jpegFilename)
@ -46,7 +46,7 @@ func TestConverter_ConvertToJpeg(t *testing.T) {
assert.Equal(t, "iPhone SE", infoJpeg.CameraModel) assert.Equal(t, "iPhone SE", infoJpeg.CameraModel)
rawFilemame := conf.ImportPath + "/raw/IMG_1435.CR2" rawFilemame := conf.GetImportPath() + "/raw/IMG_1435.CR2"
t.Logf("Testing RAW to JPEG converter with %s", rawFilemame) t.Logf("Testing RAW to JPEG converter with %s", rawFilemame)
@ -56,7 +56,7 @@ func TestConverter_ConvertToJpeg(t *testing.T) {
imageRaw, _ := converter.ConvertToJpeg(rawMediaFile) imageRaw, _ := converter.ConvertToJpeg(rawMediaFile)
assert.True(t, fileExists(conf.ImportPath+"/raw/IMG_1435.jpg"), "Jpeg file was not found - is Darktable installed?") assert.True(t, fileExists(conf.GetImportPath()+"/raw/IMG_1435.jpg"), "Jpeg file was not found - is Darktable installed?")
assert.NotEqual(t, rawFilemame, imageRaw.filename) assert.NotEqual(t, rawFilemame, imageRaw.filename)
@ -72,11 +72,11 @@ func TestConverter_ConvertAll(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
converter.ConvertAll(conf.ImportPath) converter.ConvertAll(conf.GetImportPath())
jpegFilename := conf.ImportPath + "/raw/IMG_1435.jpg" jpegFilename := conf.GetImportPath() + "/raw/IMG_1435.jpg"
assert.True(t, fileExists(jpegFilename), "Jpeg file was not found - is Darktable installed?") assert.True(t, fileExists(jpegFilename), "Jpeg file was not found - is Darktable installed?")
@ -92,13 +92,13 @@ func TestConverter_ConvertAll(t *testing.T) {
assert.Equal(t, "Canon EOS M10", infoRaw.CameraModel, "Camera model should be Canon EOS M10") assert.Equal(t, "Canon EOS M10", infoRaw.CameraModel, "Camera model should be Canon EOS M10")
existingJpegFilename := conf.ImportPath + "/raw/20140717_154212_1EC48F8489.jpg" existingJpegFilename := conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.jpg"
oldHash := fileHash(existingJpegFilename) oldHash := fileHash(existingJpegFilename)
os.Remove(existingJpegFilename) os.Remove(existingJpegFilename)
converter.ConvertAll(conf.ImportPath) converter.ConvertAll(conf.GetImportPath())
newHash := fileHash(existingJpegFilename) newHash := fileHash(existingJpegFilename)

View file

@ -11,7 +11,7 @@ func TestMediaFile_GetExifData(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
image1, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") image1, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
@ -23,7 +23,7 @@ func TestMediaFile_GetExifData(t *testing.T) {
assert.Equal(t, "iPhone SE", info.CameraModel) assert.Equal(t, "iPhone SE", info.CameraModel)
image2, err := NewMediaFile(conf.ImportPath + "/raw/IMG_1435.CR2") image2, err := NewMediaFile(conf.GetImportPath() + "/raw/IMG_1435.CR2")
assert.Nil(t, err) assert.Nil(t, err)

View file

@ -11,11 +11,11 @@ func TestNewImporter(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
importer := NewImporter(conf.OriginalsPath, indexer, converter) importer := NewImporter(conf.GetOriginalsPath(), indexer, converter)
assert.IsType(t, &Importer{}, importer) assert.IsType(t, &Importer{}, importer)
} }
@ -27,13 +27,13 @@ func TestImporter_ImportPhotosFromDirectory(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
importer := NewImporter(conf.OriginalsPath, indexer, converter) importer := NewImporter(conf.GetOriginalsPath(), indexer, converter)
importer.ImportPhotosFromDirectory(conf.ImportPath) importer.ImportPhotosFromDirectory(conf.GetImportPath())
} }
func TestImporter_GetDestinationFilename(t *testing.T) { func TestImporter_GetDestinationFilename(t *testing.T) {
@ -42,13 +42,13 @@ func TestImporter_GetDestinationFilename(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
importer := NewImporter(conf.OriginalsPath, indexer, converter) importer := NewImporter(conf.GetOriginalsPath(), indexer, converter)
rawFile, err := NewMediaFile(conf.ImportPath + "/raw/IMG_1435.CR2") rawFile, err := NewMediaFile(conf.GetImportPath() + "/raw/IMG_1435.CR2")
assert.Nil(t, err) assert.Nil(t, err)
@ -56,5 +56,5 @@ func TestImporter_GetDestinationFilename(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, conf.OriginalsPath+"/2018/02/20180204_170813_863A6248DCCA.cr2", filename) assert.Equal(t, conf.GetOriginalsPath()+"/2018/02/20180204_170813_863A6248DCCA.cr2", filename)
} }

View file

@ -11,11 +11,11 @@ func TestMediaFile_GetRelatedFiles(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
mediaFile, err := NewMediaFile(conf.ImportPath + "/raw/20140717_154212_1EC48F8489.cr2") mediaFile, err := NewMediaFile(conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.cr2")
assert.Nil(t, err) assert.Nil(t, err)
expectedBaseFilename := conf.ImportPath + "/raw/20140717_154212_1EC48F8489" expectedBaseFilename := conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489"
related, _, err := mediaFile.GetRelatedFiles() related, _, err := mediaFile.GetRelatedFiles()
@ -41,7 +41,7 @@ func TestMediaFile_GetRelatedFiles_Ordering(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
mediaFile, err := NewMediaFile(conf.ImportPath + "/20130203_193332_0AE340D280.jpg") mediaFile, err := NewMediaFile(conf.GetImportPath() + "/20130203_193332_0AE340D280.jpg")
assert.Nil(t, err) assert.Nil(t, err)
@ -62,9 +62,9 @@ func TestMediaFile_GetEditedFilename(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
mediaFile1, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") mediaFile1, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, conf.ImportPath+"/iphone/IMG_E6788.JPG", mediaFile1.GetEditedFilename()) assert.Equal(t, conf.GetImportPath()+"/iphone/IMG_E6788.JPG", mediaFile1.GetEditedFilename())
/* TODO: Add example files to import.zip /* TODO: Add example files to import.zip
mediaFile2, err := NewMediaFile("/foo/bar/IMG_E1234.jpg") mediaFile2, err := NewMediaFile("/foo/bar/IMG_E1234.jpg")
@ -72,7 +72,7 @@ func TestMediaFile_GetEditedFilename(t *testing.T) {
assert.Equal(t, "", mediaFile2.GetEditedFilename()) assert.Equal(t, "", mediaFile2.GetEditedFilename())
*/ */
mediaFile3, err := NewMediaFile(conf.ImportPath + "/raw/20140717_154212_1EC48F8489.jpg") mediaFile3, err := NewMediaFile(conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.jpg")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "", mediaFile3.GetEditedFilename()) assert.Equal(t, "", mediaFile3.GetEditedFilename())
} }
@ -82,13 +82,13 @@ func TestMediaFile_GetPerceptiveHash(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
mediaFile1, err := NewMediaFile(conf.ImportPath + "/20130203_193332_0AE340D280.jpg") mediaFile1, err := NewMediaFile(conf.GetImportPath() + "/20130203_193332_0AE340D280.jpg")
assert.Nil(t, err) assert.Nil(t, err)
hash1, _ := mediaFile1.GetPerceptualHash() hash1, _ := mediaFile1.GetPerceptualHash()
assert.Equal(t, "ef95", hash1) assert.Equal(t, "ef95", hash1)
mediaFile2, err := NewMediaFile(conf.ImportPath + "/20130203_193332_0AE340D280_V2.jpg") mediaFile2, err := NewMediaFile(conf.GetImportPath() + "/20130203_193332_0AE340D280_V2.jpg")
assert.Nil(t, err) assert.Nil(t, err)
hash2, _ := mediaFile2.GetPerceptualHash() hash2, _ := mediaFile2.GetPerceptualHash()
@ -98,7 +98,7 @@ func TestMediaFile_GetPerceptiveHash(t *testing.T) {
assert.Equal(t, 1, distance) assert.Equal(t, 1, distance)
mediaFile3, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") mediaFile3, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
hash3, _ := mediaFile3.GetPerceptualHash() hash3, _ := mediaFile3.GetPerceptualHash()
@ -114,11 +114,11 @@ func TestMediaFile_GetMimeType(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
image1, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") image1, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "image/jpeg", image1.GetMimeType()) assert.Equal(t, "image/jpeg", image1.GetMimeType())
image2, err := NewMediaFile(conf.ImportPath + "/raw/20140717_154212_1EC48F8489.cr2") image2, err := NewMediaFile(conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.cr2")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "application/octet-stream", image2.GetMimeType()) assert.Equal(t, "application/octet-stream", image2.GetMimeType())
} }
@ -126,12 +126,12 @@ func TestMediaFile_GetMimeType(t *testing.T) {
func TestMediaFile_Exists(t *testing.T) { func TestMediaFile_Exists(t *testing.T) {
conf := NewTestConfig() conf := NewTestConfig()
mediaFile, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") mediaFile, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, mediaFile) assert.NotNil(t, mediaFile)
assert.True(t, mediaFile.Exists()) assert.True(t, mediaFile.Exists())
mediaFile, err = NewMediaFile(conf.ImportPath + "/iphone/IMG_6788_XYZ.JPG") mediaFile, err = NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788_XYZ.JPG")
assert.NotNil(t, err) assert.NotNil(t, err)
assert.Nil(t, mediaFile) assert.Nil(t, mediaFile)
} }

View file

@ -13,7 +13,7 @@ func TestSearch_Photos_Query(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
search := NewSearch(conf.OriginalsPath, conf.GetDb()) search := NewSearch(conf.GetOriginalsPath(), conf.GetDb())
var form forms.PhotoSearchForm var form forms.PhotoSearchForm
@ -46,7 +46,7 @@ func TestSearch_Photos_Camera(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
search := NewSearch(conf.OriginalsPath, conf.GetDb()) search := NewSearch(conf.GetOriginalsPath(), conf.GetDb())
var form forms.PhotoSearchForm var form forms.PhotoSearchForm

View file

@ -14,7 +14,7 @@ func TestTensorFlow_GetImageTags(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
if imageBuffer, err := ioutil.ReadFile(conf.ImportPath + "/iphone/IMG_6788.JPG"); err != nil { if imageBuffer, err := ioutil.ReadFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG"); err != nil {
t.Error(err) t.Error(err)
} else { } else {
result, err := tensorFlow.GetImageTags(string(imageBuffer)) result, err := tensorFlow.GetImageTags(string(imageBuffer))
@ -38,7 +38,7 @@ func TestTensorFlow_GetImageTagsFromFile(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
result, err := tensorFlow.GetImageTagsFromFile(conf.ImportPath + "/iphone/IMG_6788.JPG") result, err := tensorFlow.GetImageTagsFromFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.NotNil(t, result) assert.NotNil(t, result)
assert.Nil(t, err) assert.Nil(t, err)

View file

@ -13,10 +13,10 @@ func TestMediaFile_GetThumbnail(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
image1, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") image1, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
thumbnail1, err := image1.GetThumbnail(conf.ThumbnailsPath, 350) thumbnail1, err := image1.GetThumbnail(conf.GetThumbnailsPath(), 350)
assert.Empty(t, err) assert.Empty(t, err)
@ -30,10 +30,10 @@ func TestMediaFile_GetSquareThumbnail(t *testing.T) {
conf.InitializeTestData(t) conf.InitializeTestData(t)
image1, err := NewMediaFile(conf.ImportPath + "/iphone/IMG_6788.JPG") image1, err := NewMediaFile(conf.GetImportPath() + "/iphone/IMG_6788.JPG")
assert.Nil(t, err) assert.Nil(t, err)
thumbnail1, err := image1.GetSquareThumbnail(conf.ThumbnailsPath, 350) thumbnail1, err := image1.GetSquareThumbnail(conf.GetThumbnailsPath(), 350)
assert.Empty(t, err) assert.Empty(t, err)
@ -49,15 +49,15 @@ func TestCreateThumbnailsFromOriginals(t *testing.T) {
tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath()) tensorFlow := NewTensorFlow(conf.GetTensorFlowModelPath())
indexer := NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) indexer := NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb())
converter := NewConverter(conf.DarktableCli) converter := NewConverter(conf.GetDarktableCli())
importer := NewImporter(conf.OriginalsPath, indexer, converter) importer := NewImporter(conf.GetOriginalsPath(), indexer, converter)
importer.ImportPhotosFromDirectory(conf.ImportPath) importer.ImportPhotosFromDirectory(conf.GetImportPath())
CreateThumbnailsFromOriginals(conf.OriginalsPath, conf.ThumbnailsPath, 600, false) CreateThumbnailsFromOriginals(conf.GetOriginalsPath(), conf.GetThumbnailsPath(), 600, false)
CreateThumbnailsFromOriginals(conf.OriginalsPath, conf.ThumbnailsPath, 300, true) CreateThumbnailsFromOriginals(conf.GetOriginalsPath(), conf.GetThumbnailsPath(), 300, true)
} }

View file

@ -9,8 +9,8 @@ import (
// Start the REST API server using the configuration provided // Start the REST API server using the configuration provided
func Start(conf *photoprism.Config) { func Start(conf *photoprism.Config) {
if conf.ServerMode != "" { if conf.GetServerMode() != "" {
gin.SetMode(conf.ServerMode) gin.SetMode(conf.GetServerMode())
} else if conf.Debug == false { } else if conf.Debug == false {
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
} }
@ -22,5 +22,5 @@ func Start(conf *photoprism.Config) {
registerRoutes(app, conf) registerRoutes(app, conf)
app.Run(fmt.Sprintf("%s:%d", conf.ServerIP, conf.ServerPort)) app.Run(fmt.Sprintf("%s:%d", conf.GetServerIP(), conf.GetServerPort()))
} }