photoprism/config.go

184 lines
4.3 KiB
Go

package photoprism
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mssql"
_ "github.com/jinzhu/gorm/dialects/mysql"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/kylelemons/go-gypsy/yaml"
"github.com/urfave/cli"
"log"
"os"
"path"
"time"
)
type Config struct {
Debug bool
ConfigFile string
DarktableCli string
OriginalsPath string
ThumbnailsPath string
ImportPath string
ExportPath string
ServerAssetsPath string
DatabaseDriver string
DatabaseDsn string
db *gorm.DB
}
type ConfigValues map[string]interface{}
func NewConfig() *Config {
return &Config{}
}
func (c *Config) SetValuesFromFile(fileName string) error {
yamlConfig, err := yaml.ReadFile(fileName)
if err != nil {
return err
}
c.ConfigFile = fileName
if OriginalsPath, err := yamlConfig.Get("originals-path"); err == nil {
c.OriginalsPath = GetExpandedFilename(OriginalsPath)
}
if ThumbnailsPath, err := yamlConfig.Get("thumbnails-path"); err == nil {
c.ThumbnailsPath = GetExpandedFilename(ThumbnailsPath)
}
if ImportPath, err := yamlConfig.Get("import-path"); err == nil {
c.ImportPath = GetExpandedFilename(ImportPath)
}
if ExportPath, err := yamlConfig.Get("export-path"); err == nil {
c.ExportPath = GetExpandedFilename(ExportPath)
}
if ServerAssetsPath, err := yamlConfig.Get("server-assets-path"); err == nil {
c.ServerAssetsPath = GetExpandedFilename(ServerAssetsPath)
}
if DarktableCli, err := yamlConfig.Get("darktable-cli"); err == nil {
c.DarktableCli = GetExpandedFilename(DarktableCli)
}
if DatabaseDriver, err := yamlConfig.Get("database-driver"); err == nil {
c.DatabaseDriver = DatabaseDriver
}
if DatabaseDsn, err := yamlConfig.Get("database-dsn"); err == nil {
c.DatabaseDsn = DatabaseDsn
}
return nil
}
func (c *Config) SetValuesFromCliContext(context *cli.Context) error {
c.Debug = context.GlobalBool("debug")
if context.GlobalIsSet("originals-path") {
c.OriginalsPath = GetExpandedFilename(context.GlobalString("originals-path"))
}
if context.GlobalIsSet("thumbnails-path") {
c.ThumbnailsPath = GetExpandedFilename(context.GlobalString("thumbnails-path"))
}
if context.GlobalIsSet("import-path") {
c.ImportPath = GetExpandedFilename(context.GlobalString("import-path"))
}
if context.GlobalIsSet("export-path") {
c.ExportPath = GetExpandedFilename(context.GlobalString("export-path"))
}
if context.GlobalIsSet("server-assets-path") {
c.ServerAssetsPath = GetExpandedFilename(context.GlobalString("server-assets-path"))
}
if context.GlobalIsSet("darktable-cli") {
c.DarktableCli = GetExpandedFilename(context.GlobalString("darktable-cli"))
}
if context.GlobalIsSet("database-driver") {
c.DatabaseDriver = context.GlobalString("database-driver")
}
if context.GlobalIsSet("database-dsn") {
c.DatabaseDsn = context.GlobalString("database-dsn")
}
return nil
}
func (c *Config) CreateDirectories() {
os.MkdirAll(path.Dir(c.OriginalsPath), os.ModePerm)
os.MkdirAll(path.Dir(c.ThumbnailsPath), os.ModePerm)
os.MkdirAll(path.Dir(c.ImportPath), os.ModePerm)
os.MkdirAll(path.Dir(c.ExportPath), os.ModePerm)
}
func (c *Config) ConnectToDatabase() error {
db, err := gorm.Open(c.DatabaseDriver, c.DatabaseDsn)
if err != nil || db == nil {
for i := 1; i <= 12; i++ {
time.Sleep(5 * time.Second)
db, err = gorm.Open(c.DatabaseDriver, c.DatabaseDsn)
if db != nil && err == nil {
break
}
}
if err != nil || db == nil {
log.Fatal(err)
}
}
c.db = db
return err
}
func (c *Config) GetDb() *gorm.DB {
if c.db == nil {
c.ConnectToDatabase()
}
return c.db
}
func (c *Config) MigrateDb() {
db := c.GetDb()
db.AutoMigrate(&File{}, &Photo{}, &Tag{}, &Album{}, &Location{}, &Camera{})
if !db.Dialect().HasIndex("photos", "photos_fulltext") {
db.Exec("CREATE FULLTEXT INDEX photos_fulltext ON photos (photo_title, photo_description, photo_artist, photo_colors)")
}
}
func (c *Config) GetClientConfig() ConfigValues {
db := c.GetDb()
var cameras []*Camera
// var countries map[string]string
db.Where("deleted_at IS NULL").Limit(1000).Order("camera_model").Find(&cameras)
result := ConfigValues{
"title": "PhotoPrism",
"debug": c.Debug,
"cameras": cameras,
}
return result
}