diff --git a/Makefile b/Makefile index 17e01efd6..f48eaac87 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ install-bin: scripts/build.sh install /usr/local/bin/$(BINARY_NAME) install-assets: mkdir -p /srv/photoprism/photos - mkdir -p /srv/photoprism/thumbnails + mkdir -p /srv/photoprism/cache mkdir -p /srv/photoprism/database cp -r assets/server /srv/photoprism cp -r assets/tensorflow /srv/photoprism diff --git a/assets/thumbnails/.gitignore b/assets/cache/.gitignore similarity index 100% rename from assets/thumbnails/.gitignore rename to assets/cache/.gitignore diff --git a/configs/docker-compose.yml b/configs/docker-compose.yml index 54dd0b975..6887fbf55 100644 --- a/configs/docker-compose.yml +++ b/configs/docker-compose.yml @@ -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) volumes: - ~/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: 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) @@ -30,7 +30,7 @@ services: MYSQL_DATABASE: photoprism volumes: # keep this - photoprism-thumbnails: + photoprism-cache: driver: local photoprism-database: driver: local \ No newline at end of file diff --git a/configs/photoprism.yml b/configs/photoprism.yml index 21ac13321..12ebcaa56 100644 --- a/configs/photoprism.yml +++ b/configs/photoprism.yml @@ -1,7 +1,7 @@ debug: false darktable-cli: /usr/bin/darktable-cli assets-path: /srv/photoprism -thumbnails-path: /srv/photoprism/thumbnails +cache-path: /srv/photoprism/cache originals-path: /srv/photoprism/photos/originals import-path: /srv/photoprism/photos/import export-path: /srv/photoprism/photos/export diff --git a/docker-compose.yml b/docker-compose.yml index 89fa0bf16..85211d923 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: PHOTOPRISM_DEBUG: "true" PHOTOPRISM_SERVER_MODE: "debug" 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_EXPORT_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/export" PHOTOPRISM_ORIGINALS_PATH: "/go/src/github.com/photoprism/photoprism/assets/photos/originals" diff --git a/internal/api/photos.go b/internal/api/photos.go index 6f3e856bf..27123838f 100644 --- a/internal/api/photos.go +++ b/internal/api/photos.go @@ -29,7 +29,7 @@ func GetPhotos(router *gin.RouterGroup, conf *photoprism.Config) { router.GET("/photos", func(c *gin.Context) { var form forms.PhotoSearchForm - search := photoprism.NewSearch(conf.OriginalsPath, conf.GetDb()) + search := photoprism.NewSearch(conf.GetOriginalsPath(), conf.GetDb()) 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 func LikePhoto(router *gin.RouterGroup, conf *photoprism.Config) { 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) @@ -74,7 +74,7 @@ func LikePhoto(router *gin.RouterGroup, conf *photoprism.Config) { // photoId: int Photo ID as returned by the API func DislikePhoto(router *gin.RouterGroup, conf *photoprism.Config) { 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) diff --git a/internal/api/thumbnails.go b/internal/api/thumbnails.go index 3d1d0f315..459f098ec 100644 --- a/internal/api/thumbnails.go +++ b/internal/api/thumbnails.go @@ -32,23 +32,23 @@ func GetThumbnail(router *gin.RouterGroup, conf *photoprism.Config) { 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) - 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 { switch thumbnailType { 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()) } else { log.Printf("could not create thumbnail: %s", err.Error()) c.Data(400, "image/svg+xml", photoIconSvg) } 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()) } else { log.Printf("could not create square thumbnail: %s", err.Error()) diff --git a/internal/commands/config.go b/internal/commands/config.go index 345ec3fc7..3e5f95411 100644 --- a/internal/commands/config.go +++ b/internal/commands/config.go @@ -18,16 +18,16 @@ func configAction(context *cli.Context) error { conf := photoprism.NewConfig(context) fmt.Printf("NAME VALUE\n") - fmt.Printf("debug %t\n", conf.Debug) - fmt.Printf("config-file %s\n", conf.ConfigFile) - fmt.Printf("assets-path %s\n", conf.AssetsPath) - fmt.Printf("originals-path %s\n", conf.OriginalsPath) - fmt.Printf("thumbnails-path %s\n", conf.ThumbnailsPath) - fmt.Printf("import-path %s\n", conf.ImportPath) - fmt.Printf("export-path %s\n", conf.ExportPath) - fmt.Printf("darktable-cli %s\n", conf.DarktableCli) - fmt.Printf("database-driver %s\n", conf.DatabaseDriver) - fmt.Printf("database-dsn %s\n", conf.DatabaseDsn) + fmt.Printf("debug %t\n", conf.IsDebug()) + fmt.Printf("config-file %s\n", conf.GetConfigFile()) + fmt.Printf("darktable-cli %s\n", conf.GetDarktableCli()) + fmt.Printf("originals-path %s\n", conf.GetOriginalsPath()) + fmt.Printf("import-path %s\n", conf.GetImportPath()) + fmt.Printf("export-path %s\n", conf.GetExportPath()) + fmt.Printf("cache-path %s\n", conf.GetCachePath()) + fmt.Printf("assets-path %s\n", conf.GetAssetsPath()) + fmt.Printf("database-driver %s\n", conf.GetDatabaseDriver()) + fmt.Printf("database-dsn %s\n", conf.GetDatabaseDsn()) return nil } diff --git a/internal/commands/convert.go b/internal/commands/convert.go index 6a5e8221e..c44a34b6a 100644 --- a/internal/commands/convert.go +++ b/internal/commands/convert.go @@ -22,11 +22,11 @@ func convertAction(context *cli.Context) error { 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.") diff --git a/internal/commands/export.go b/internal/commands/export.go index 811036a3b..3a19240db 100644 --- a/internal/commands/export.go +++ b/internal/commands/export.go @@ -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") - originals := photoprism.FindOriginalsByDate(conf.OriginalsPath, afterDate, beforeDate) + originals := photoprism.FindOriginalsByDate(conf.GetOriginalsPath(), afterDate, beforeDate) 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.") diff --git a/internal/commands/flags.go b/internal/commands/flags.go index 27f8d3d8b..26d6799a5 100644 --- a/internal/commands/flags.go +++ b/internal/commands/flags.go @@ -26,12 +26,6 @@ var GlobalFlags = []cli.Flag{ Value: "/srv/photoprism/photos/originals", EnvVar: "PHOTOPRISM_ORIGINALS_PATH", }, - cli.StringFlag{ - Name: "thumbnails-path", - Usage: "thumbnails `PATH`", - Value: "/srv/photoprism/photos/thumbnails", - EnvVar: "PHOTOPRISM_THUMBNAILS_PATH", - }, cli.StringFlag{ Name: "import-path", Usage: "import `PATH`", @@ -44,6 +38,12 @@ var GlobalFlags = []cli.Flag{ Value: "/srv/photoprism/photos/export", EnvVar: "PHOTOPRISM_EXPORT_PATH", }, + cli.StringFlag{ + Name: "cache-path", + Usage: "cache `PATH`", + Value: "/srv/photoprism/cache", + EnvVar: "PHOTOPRISM_CACHE_PATH", + }, cli.StringFlag{ Name: "assets-path", Usage: "assets `PATH`", diff --git a/internal/commands/import.go b/internal/commands/import.go index 3c256acc7..47cd6f627 100644 --- a/internal/commands/import.go +++ b/internal/commands/import.go @@ -24,17 +24,17 @@ func importAction(context *cli.Context) error { 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()) - 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.") diff --git a/internal/commands/index.go b/internal/commands/index.go index d393e459d..d0b820aaf 100644 --- a/internal/commands/index.go +++ b/internal/commands/index.go @@ -24,11 +24,11 @@ func indexAction(context *cli.Context) error { 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()) - indexer := photoprism.NewIndexer(conf.OriginalsPath, tensorFlow, conf.GetDb()) + indexer := photoprism.NewIndexer(conf.GetOriginalsPath(), tensorFlow, conf.GetDb()) indexer.IndexAll() diff --git a/internal/commands/start.go b/internal/commands/start.go index 76de2d931..7e2aabff4 100644 --- a/internal/commands/start.go +++ b/internal/commands/start.go @@ -41,19 +41,7 @@ var startFlags = []cli.Flag{ func startAction(context *cli.Context) error { conf := photoprism.NewConfig(context) - if context.IsSet("server-host") || conf.ServerIP == "" { - 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 { + if conf.GetServerPort() < 1 { log.Fatal("Server port must be a positive integer") } diff --git a/internal/commands/thumbnails.go b/internal/commands/thumbnails.go index c4c7470a1..d43e2c39b 100644 --- a/internal/commands/thumbnails.go +++ b/internal/commands/thumbnails.go @@ -36,7 +36,7 @@ func thumbnailsAction(context *cli.Context) error { 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") @@ -50,7 +50,7 @@ func thumbnailsAction(context *cli.Context) error { } 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.") diff --git a/internal/photoprism/colors_test.go b/internal/photoprism/colors_test.go index b765f02ec..03c1a4d46 100644 --- a/internal/photoprism/colors_test.go +++ b/internal/photoprism/colors_test.go @@ -11,7 +11,7 @@ func TestMediaFile_GetColors(t *testing.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() t.Log(names, vibrantHex, mutedHex) @@ -23,7 +23,7 @@ func TestMediaFile_GetColors(t *testing.T) { 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() @@ -35,7 +35,7 @@ func TestMediaFile_GetColors(t *testing.T) { 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() diff --git a/internal/photoprism/config.go b/internal/photoprism/config.go index a45215d36..77ce796ff 100644 --- a/internal/photoprism/config.go +++ b/internal/photoprism/config.go @@ -27,6 +27,7 @@ type Config struct { ServerPort int ServerMode string AssetsPath string + CachePath string ThumbnailsPath string OriginalsPath string ImportPath string @@ -83,8 +84,8 @@ func (c *Config) SetValuesFromFile(fileName string) error { c.AssetsPath = GetExpandedFilename(assetsPath) } - if thumbnailsPath, err := yamlConfig.Get("thumbnails-path"); err == nil { - c.ThumbnailsPath = GetExpandedFilename(thumbnailsPath) + if cachePath, err := yamlConfig.Get("cache-path"); err == nil { + c.CachePath = GetExpandedFilename(cachePath) } 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")) } - if context.GlobalIsSet("thumbnails-path") || c.ThumbnailsPath == "" { - c.ThumbnailsPath = GetExpandedFilename(context.GlobalString("thumbnails-path")) + if context.GlobalIsSet("cache-path") || c.CachePath == "" { + c.CachePath = GetExpandedFilename(context.GlobalString("cache-path")) } 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") } + 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 } @@ -162,19 +175,31 @@ func (c *Config) SetValuesFromCliContext(context *cli.Context) error { // ImportPath // ExportPath 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 } - if err := os.MkdirAll(c.ThumbnailsPath, os.ModePerm); err != nil { + if err := os.MkdirAll(c.GetImportPath(), os.ModePerm); err != nil { return err } - if err := os.MkdirAll(c.ImportPath, os.ModePerm); err != nil { + if err := os.MkdirAll(c.GetExportPath(), os.ModePerm); err != nil { 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 } @@ -207,6 +232,86 @@ func (c *Config) connectToDatabase() error { 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. func (c *Config) GetAssetsPath() string { return c.AssetsPath diff --git a/internal/photoprism/config_test.go b/internal/photoprism/config_test.go index 33dd7aa8b..d2e1cfa33 100644 --- a/internal/photoprism/config_test.go +++ b/internal/photoprism/config_test.go @@ -25,7 +25,7 @@ const testConfigFile = "../../configs/photoprism.yml" var darktableCli = "/usr/bin/darktable-cli" var testDataZip = "/tmp/photoprism/testdata.zip" var assetsPath = GetExpandedFilename("../../assets") -var thumbnailsPath = GetExpandedFilename(testDataPath + "/thumbnails") +var cachePath = GetExpandedFilename(testDataPath + "/cache") var originalsPath = GetExpandedFilename(testDataPath + "/originals") var importPath = GetExpandedFilename(testDataPath + "/import") var exportPath = GetExpandedFilename(testDataPath + "/export") @@ -38,10 +38,10 @@ func init() { } func (c *Config) RemoveTestData(t *testing.T) { - os.RemoveAll(c.ImportPath) - os.RemoveAll(c.ExportPath) - os.RemoveAll(c.OriginalsPath) - os.RemoveAll(c.ThumbnailsPath) + os.RemoveAll(c.GetImportPath()) + os.RemoveAll(c.GetExportPath()) + os.RemoveAll(c.GetOriginalsPath()) + os.RemoveAll(c.GetCachePath()) } func (c *Config) DownloadTestData(t *testing.T) { @@ -83,7 +83,7 @@ func NewTestConfig() *Config { return &Config{ Debug: false, AssetsPath: assetsPath, - ThumbnailsPath: thumbnailsPath, + CachePath: cachePath, OriginalsPath: originalsPath, ImportPath: importPath, ExportPath: exportPath, @@ -123,8 +123,8 @@ func TestNewConfig(t *testing.T) { assert.IsType(t, &Config{}, c) - assert.Equal(t, assetsPath, c.AssetsPath) - assert.False(t, c.Debug) + assert.Equal(t, assetsPath, c.GetAssetsPath()) + assert.False(t, c.IsDebug()) } func TestConfig_SetValuesFromFile(t *testing.T) { @@ -132,20 +132,19 @@ func TestConfig_SetValuesFromFile(t *testing.T) { c.SetValuesFromFile(GetExpandedFilename(testConfigFile)) - assert.Equal(t, "/srv/photoprism", c.AssetsPath) - assert.Equal(t, "/srv/photoprism/thumbnails", c.ThumbnailsPath) - assert.Equal(t, "/srv/photoprism/photos/originals", c.OriginalsPath) - assert.Equal(t, "/srv/photoprism/photos/import", c.ImportPath) - assert.Equal(t, "/srv/photoprism/photos/export", c.ExportPath) - assert.Equal(t, databaseDriver, c.DatabaseDriver) - assert.Equal(t, databaseDsn, c.DatabaseDsn) + assert.Equal(t, "/srv/photoprism", c.GetAssetsPath()) + assert.Equal(t, "/srv/photoprism/cache", c.GetCachePath()) + assert.Equal(t, "/srv/photoprism/cache/thumbnails", c.GetThumbnailsPath()) + assert.Equal(t, "/srv/photoprism/photos/originals", c.GetOriginalsPath()) + assert.Equal(t, "/srv/photoprism/photos/import", c.GetImportPath()) + assert.Equal(t, "/srv/photoprism/photos/export", c.GetExportPath()) + assert.Equal(t, databaseDriver, c.GetDatabaseDriver()) + assert.Equal(t, databaseDsn, c.GetDatabaseDsn()) } func TestConfig_ConnectToDatabase(t *testing.T) { c := NewTestConfig() - c.connectToDatabase() - db := c.GetDb() assert.IsType(t, &gorm.DB{}, db) diff --git a/internal/photoprism/converter_test.go b/internal/photoprism/converter_test.go index 45aa18a3a..238475c5c 100644 --- a/internal/photoprism/converter_test.go +++ b/internal/photoprism/converter_test.go @@ -10,7 +10,7 @@ import ( func TestNewConverter(t *testing.T) { conf := NewTestConfig() - converter := NewConverter(conf.DarktableCli) + converter := NewConverter(conf.GetDarktableCli()) assert.IsType(t, &Converter{}, converter) } @@ -20,9 +20,9 @@ func TestConverter_ConvertToJpeg(t *testing.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) @@ -46,7 +46,7 @@ func TestConverter_ConvertToJpeg(t *testing.T) { 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) @@ -56,7 +56,7 @@ func TestConverter_ConvertToJpeg(t *testing.T) { 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) @@ -72,11 +72,11 @@ func TestConverter_ConvertAll(t *testing.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?") @@ -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") - existingJpegFilename := conf.ImportPath + "/raw/20140717_154212_1EC48F8489.jpg" + existingJpegFilename := conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489.jpg" oldHash := fileHash(existingJpegFilename) os.Remove(existingJpegFilename) - converter.ConvertAll(conf.ImportPath) + converter.ConvertAll(conf.GetImportPath()) newHash := fileHash(existingJpegFilename) diff --git a/internal/photoprism/exif_test.go b/internal/photoprism/exif_test.go index 02ee6cb52..bf70fa667 100644 --- a/internal/photoprism/exif_test.go +++ b/internal/photoprism/exif_test.go @@ -11,7 +11,7 @@ func TestMediaFile_GetExifData(t *testing.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) @@ -23,7 +23,7 @@ func TestMediaFile_GetExifData(t *testing.T) { 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) diff --git a/internal/photoprism/importer_test.go b/internal/photoprism/importer_test.go index 52baf32af..c98953646 100644 --- a/internal/photoprism/importer_test.go +++ b/internal/photoprism/importer_test.go @@ -11,11 +11,11 @@ func TestNewImporter(t *testing.T) { 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) } @@ -27,13 +27,13 @@ func TestImporter_ImportPhotosFromDirectory(t *testing.T) { 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) { @@ -42,13 +42,13 @@ func TestImporter_GetDestinationFilename(t *testing.T) { 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) @@ -56,5 +56,5 @@ func TestImporter_GetDestinationFilename(t *testing.T) { 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) } diff --git a/internal/photoprism/mediafile_test.go b/internal/photoprism/mediafile_test.go index 4a29ed344..18336adbc 100644 --- a/internal/photoprism/mediafile_test.go +++ b/internal/photoprism/mediafile_test.go @@ -11,11 +11,11 @@ func TestMediaFile_GetRelatedFiles(t *testing.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) - expectedBaseFilename := conf.ImportPath + "/raw/20140717_154212_1EC48F8489" + expectedBaseFilename := conf.GetImportPath() + "/raw/20140717_154212_1EC48F8489" related, _, err := mediaFile.GetRelatedFiles() @@ -41,7 +41,7 @@ func TestMediaFile_GetRelatedFiles_Ordering(t *testing.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) @@ -62,9 +62,9 @@ func TestMediaFile_GetEditedFilename(t *testing.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.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 mediaFile2, err := NewMediaFile("/foo/bar/IMG_E1234.jpg") @@ -72,7 +72,7 @@ func TestMediaFile_GetEditedFilename(t *testing.T) { 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.Equal(t, "", mediaFile3.GetEditedFilename()) } @@ -82,13 +82,13 @@ func TestMediaFile_GetPerceptiveHash(t *testing.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) hash1, _ := mediaFile1.GetPerceptualHash() 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) hash2, _ := mediaFile2.GetPerceptualHash() @@ -98,7 +98,7 @@ func TestMediaFile_GetPerceptiveHash(t *testing.T) { 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) hash3, _ := mediaFile3.GetPerceptualHash() @@ -114,11 +114,11 @@ func TestMediaFile_GetMimeType(t *testing.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.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.Equal(t, "application/octet-stream", image2.GetMimeType()) } @@ -126,12 +126,12 @@ func TestMediaFile_GetMimeType(t *testing.T) { func TestMediaFile_Exists(t *testing.T) { 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.NotNil(t, mediaFile) 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.Nil(t, mediaFile) } diff --git a/internal/photoprism/search_test.go b/internal/photoprism/search_test.go index ff46ba2f9..c9f42f46d 100644 --- a/internal/photoprism/search_test.go +++ b/internal/photoprism/search_test.go @@ -13,7 +13,7 @@ func TestSearch_Photos_Query(t *testing.T) { conf.InitializeTestData(t) - search := NewSearch(conf.OriginalsPath, conf.GetDb()) + search := NewSearch(conf.GetOriginalsPath(), conf.GetDb()) var form forms.PhotoSearchForm @@ -46,7 +46,7 @@ func TestSearch_Photos_Camera(t *testing.T) { conf.InitializeTestData(t) - search := NewSearch(conf.OriginalsPath, conf.GetDb()) + search := NewSearch(conf.GetOriginalsPath(), conf.GetDb()) var form forms.PhotoSearchForm diff --git a/internal/photoprism/tensorflow_test.go b/internal/photoprism/tensorflow_test.go index efc10a38c..bd9f658e0 100644 --- a/internal/photoprism/tensorflow_test.go +++ b/internal/photoprism/tensorflow_test.go @@ -14,7 +14,7 @@ func TestTensorFlow_GetImageTags(t *testing.T) { 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) } else { result, err := tensorFlow.GetImageTags(string(imageBuffer)) @@ -38,7 +38,7 @@ func TestTensorFlow_GetImageTagsFromFile(t *testing.T) { 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.Nil(t, err) diff --git a/internal/photoprism/thumbnails_test.go b/internal/photoprism/thumbnails_test.go index 58c3d52fe..112f72963 100644 --- a/internal/photoprism/thumbnails_test.go +++ b/internal/photoprism/thumbnails_test.go @@ -13,10 +13,10 @@ func TestMediaFile_GetThumbnail(t *testing.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) - thumbnail1, err := image1.GetThumbnail(conf.ThumbnailsPath, 350) + thumbnail1, err := image1.GetThumbnail(conf.GetThumbnailsPath(), 350) assert.Empty(t, err) @@ -30,10 +30,10 @@ func TestMediaFile_GetSquareThumbnail(t *testing.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) - thumbnail1, err := image1.GetSquareThumbnail(conf.ThumbnailsPath, 350) + thumbnail1, err := image1.GetSquareThumbnail(conf.GetThumbnailsPath(), 350) assert.Empty(t, err) @@ -49,15 +49,15 @@ func TestCreateThumbnailsFromOriginals(t *testing.T) { 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) } diff --git a/internal/server/server.go b/internal/server/server.go index f4402026e..040b29497 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -9,8 +9,8 @@ import ( // Start the REST API server using the configuration provided func Start(conf *photoprism.Config) { - if conf.ServerMode != "" { - gin.SetMode(conf.ServerMode) + if conf.GetServerMode() != "" { + gin.SetMode(conf.GetServerMode()) } else if conf.Debug == false { gin.SetMode(gin.ReleaseMode) } @@ -22,5 +22,5 @@ func Start(conf *photoprism.Config) { registerRoutes(app, conf) - app.Run(fmt.Sprintf("%s:%d", conf.ServerIP, conf.ServerPort)) + app.Run(fmt.Sprintf("%s:%d", conf.GetServerIP(), conf.GetServerPort())) }