184 lines
4.3 KiB
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
|
|
}
|