config

package
v2.8.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 1, 2026 License: GPL-3.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	AppName              = "zaparoo"
	MediaDbFile          = "media.db"
	UserDbFile           = "user.db"
	LogFile              = "core.log"
	PidFile              = "core.pid"
	CfgFile              = "config.toml"
	AuthFile             = "auth.toml"
	UserDir              = "user"
	LogsDir              = "logs"
	APIRequestTimeout    = 30 * time.Second
	SuccessSoundFilename = "success.wav"
	FailSoundFilename    = "fail.wav"
	LimitSoundFilename   = "limit.wav"
	AssetsDir            = "assets"
	MappingsDir          = "mappings"
	LaunchersDir         = "launchers"
	MediaDir             = "media"
)
View Source
const (
	SchemaVersion = 1
	CfgEnv        = "ZAPAROO_CFG"
	AppEnv        = "ZAPAROO_APP"
	ScanModeTap   = "tap"
	ScanModeHold  = "hold"
)
View Source
const (
	DefaultGmcProxyPort           = 32106
	DefaultGmcProxyBeaconInterval = "2s"
)
View Source
const (
	DefaultAPIPort = 7497
	MinAPIPort     = 1024
	MaxAPIPort     = 65535
)

Variables

View Source
var AppVersion = "DEVELOPMENT"
View Source
var BaseDefaults = Values{
	ConfigSchema: SchemaVersion,
	Audio: Audio{
		ScanFeedback: true,
	},
	Readers: Readers{
		AutoDetect: true,
		Scan: ReadersScan{
			Mode: ScanModeTap,
		},
	},
}

Functions

func ClearAuthCfgForTesting

func ClearAuthCfgForTesting()

ClearAuthCfgForTesting clears the global auth config for testing purposes

func GetAuthCfg

func GetAuthCfg() map[string]CredentialEntry

func LoadAuthFromData added in v2.8.0

func LoadAuthFromData(data []byte) map[string]CredentialEntry

LoadAuthFromData parses auth.toml data supporting all three formats. Formats are merged, allowing users to mix formats in the same file.

Supported formats:

func SetAuthCfgForTesting

func SetAuthCfgForTesting(creds map[string]CredentialEntry)

SetAuthCfgForTesting sets the global auth config for testing purposes

Types

type Audio

type Audio struct {
	SuccessSound *string `toml:"success_sound,omitempty"`
	FailSound    *string `toml:"fail_sound,omitempty"`
	LimitSound   *string `toml:"limit_sound,omitempty"`
	ScanFeedback bool    `toml:"scan_feedback"`
}

type CredentialEntry

type CredentialEntry struct {
	Username string `toml:"username"`
	Password string `toml:"password"`
	Bearer   string `toml:"bearer"`
}

CredentialEntry holds authentication credentials for a URL.

func LookupAuth

func LookupAuth(creds map[string]CredentialEntry, reqURL string) *CredentialEntry

LookupAuth finds credentials for a URL using fallback matching.

The lookup tries 3 match types in order of decreasing specificity:

  1. Exact scheme match - scheme, host, and path prefix must match exactly
  2. Canonical scheme match - normalized schemes match (e.g., tcp://x matches mqtt://x config)
  3. Schemeless host:port match - for entries like "broker:1883" that match any scheme

This design allows:

  • Strict scheme matching for security-sensitive protocols (http vs https)
  • Flexible matching for protocols with multiple equivalent schemes (mqtt/tcp/ssl)
  • Simple host:port entries for services where scheme doesn't matter

type Discovery added in v2.8.0

type Discovery struct {
	Enabled      *bool  `toml:"enabled,omitempty"`
	InstanceName string `toml:"instance_name,omitempty"`
}

type DriverConfig

type DriverConfig struct {
	Enabled    *bool `toml:"enabled,omitempty"`
	AutoDetect *bool `toml:"auto_detect,omitempty"`
}

type DriverInfo added in v2.8.0

type DriverInfo struct {
	ID                string
	DefaultEnabled    bool
	DefaultAutoDetect bool
}

DriverInfo contains driver metadata needed for enabled/auto-detect checks. This is a subset of reader metadata to avoid circular imports.

type Groovy

type Groovy struct {
	GmcProxyBeaconInterval *string `toml:"gmc_proxy_beacon_interval,omitempty"`
	GmcProxyPort           *int    `toml:"gmc_proxy_port,omitempty"`
	GmcProxyEnabled        *bool   `toml:"gmc_proxy_enabled,omitempty"`
}

type Input added in v2.7.1

type Input struct {
	GamepadEnabled *bool `toml:"gamepad_enabled,omitempty"`
}

type Instance

type Instance struct {
	// contains filtered or unexported fields
}

func NewConfig

func NewConfig(configDir string, defaults Values) (*Instance, error)

func (*Instance) APIListen added in v2.7.0

func (c *Instance) APIListen() string

func (*Instance) APIPort

func (c *Instance) APIPort() int

func (*Instance) AllowedIPs added in v2.7.0

func (c *Instance) AllowedIPs() []string

func (*Instance) AllowedOrigins

func (c *Instance) AllowedOrigins() []string

func (*Instance) AudioFeedback

func (c *Instance) AudioFeedback() bool

func (*Instance) AutoDetect

func (c *Instance) AutoDetect() bool

func (*Instance) CustomLaunchers

func (c *Instance) CustomLaunchers() []LaunchersCustom

func (*Instance) DailyLimit added in v2.7.0

func (c *Instance) DailyLimit() time.Duration

DailyLimit returns the daily time limit as a duration. Returns 0 if not configured or if the duration cannot be parsed.

func (*Instance) DebugLogging

func (c *Instance) DebugLogging() bool

func (*Instance) DefaultLangs added in v2.7.0

func (c *Instance) DefaultLangs() []string

DefaultLangs returns the list of default languages for media matching.

func (*Instance) DefaultMediaDir

func (c *Instance) DefaultMediaDir() string

func (*Instance) DefaultRegions added in v2.7.0

func (c *Instance) DefaultRegions() []string

DefaultRegions returns the list of default regions for media matching.

func (*Instance) DeviceID added in v2.8.0

func (c *Instance) DeviceID() string

func (*Instance) DiscoveryEnabled added in v2.8.0

func (c *Instance) DiscoveryEnabled() bool

func (*Instance) DiscoveryInstanceName added in v2.8.0

func (c *Instance) DiscoveryInstanceName() string

func (*Instance) ErrorReporting added in v2.8.0

func (c *Instance) ErrorReporting() bool

ErrorReporting returns whether error reporting is enabled. Defaults to false (opt-in).

func (*Instance) FailSoundPath added in v2.7.0

func (c *Instance) FailSoundPath(dataDir string) (string, bool)

FailSoundPath returns the resolved path to the fail sound file and whether it's enabled. Returns ("", true) if nil (use embedded default), ("", false) if disabled (empty string), or (resolved_path, true) if a custom path is configured. For relative paths, dataDir is used as the base (typically helpers.DataDir(pl)).

func (*Instance) FilenameTags added in v2.7.0

func (c *Instance) FilenameTags() bool

FilenameTags returns whether filename tag parsing is enabled.

func (*Instance) GetMQTTPublishers added in v2.7.0

func (c *Instance) GetMQTTPublishers() []MQTTPublisher

func (*Instance) GmcProxyBeaconInterval

func (c *Instance) GmcProxyBeaconInterval() string

func (*Instance) GmcProxyEnabled

func (c *Instance) GmcProxyEnabled() bool

func (*Instance) GmcProxyPort

func (c *Instance) GmcProxyPort() int

func (*Instance) HoldModeEnabled

func (c *Instance) HoldModeEnabled() bool

func (*Instance) IndexRoots

func (c *Instance) IndexRoots() []string

func (*Instance) IsDriverAutoDetectEnabled

func (c *Instance) IsDriverAutoDetectEnabled(driverID string, defaultAutoDetect bool) bool

func (*Instance) IsDriverEnabled

func (c *Instance) IsDriverEnabled(driverID string, defaultEnabled bool) bool

func (*Instance) IsDriverEnabledForAutoDetect added in v2.8.0

func (c *Instance) IsDriverEnabledForAutoDetect(driver DriverInfo) bool

IsDriverEnabledForAutoDetect checks if a driver should be enabled for auto-detection. Uses the driver's DefaultEnabled if not explicitly configured.

func (*Instance) IsDriverEnabledForConnect added in v2.8.0

func (c *Instance) IsDriverEnabledForConnect(driver DriverInfo) bool

IsDriverEnabledForConnect checks if a driver should be enabled for a user-defined [[readers.connect]] entry. Returns true unless explicitly disabled. Having a connect entry implicitly enables the driver.

func (*Instance) IsExecuteAllowed

func (c *Instance) IsExecuteAllowed(s string) bool

func (*Instance) IsHoldModeIgnoredSystem

func (c *Instance) IsHoldModeIgnoredSystem(systemID string) bool

func (*Instance) IsLauncherFileAllowed

func (c *Instance) IsLauncherFileAllowed(s string) bool

func (*Instance) IsRunAllowed

func (c *Instance) IsRunAllowed(s string) bool

func (*Instance) LaunchersBeforeMediaStart added in v2.8.0

func (c *Instance) LaunchersBeforeMediaStart() string

func (*Instance) LaunchersOnMediaStart

func (c *Instance) LaunchersOnMediaStart() string

func (*Instance) LimitSoundPath added in v2.7.0

func (c *Instance) LimitSoundPath(dataDir string) (string, bool)

LimitSoundPath returns the resolved path to the limit sound file and whether it's enabled. Returns ("", true) if nil (use embedded default), ("", false) if disabled (empty string), or (resolved_path, true) if a custom path is configured. For relative paths, dataDir is used as the base (typically helpers.DataDir(pl)).

func (*Instance) Load

func (c *Instance) Load() error

func (*Instance) LoadCustomLaunchers

func (c *Instance) LoadCustomLaunchers(launchersDir string) error

func (*Instance) LoadMappings

func (c *Instance) LoadMappings(mappingsDir string) error

func (*Instance) LookupLauncherDefaults

func (c *Instance) LookupLauncherDefaults(launcherID string) (LaunchersDefault, bool)

func (*Instance) LookupSystemDefaults

func (c *Instance) LookupSystemDefaults(systemID string) (SystemsDefault, bool)

func (*Instance) Mappings

func (c *Instance) Mappings() []MappingsEntry

func (*Instance) PlaytimeLimitsEnabled added in v2.7.0

func (c *Instance) PlaytimeLimitsEnabled() bool

PlaytimeLimitsEnabled returns true if play time limits are enabled.

func (*Instance) PlaytimeRetention added in v2.7.0

func (c *Instance) PlaytimeRetention() int

PlaytimeRetention returns the number of days to retain play time history. Returns 0 if cleanup is disabled, or 365 (1 year) by default.

func (*Instance) Readers

func (c *Instance) Readers() Readers

func (*Instance) ReadersScan

func (c *Instance) ReadersScan() ReadersScan

func (*Instance) Save

func (c *Instance) Save() error

func (*Instance) ScanHistory added in v2.7.0

func (c *Instance) ScanHistory() int

func (*Instance) SessionLimit added in v2.7.0

func (c *Instance) SessionLimit() time.Duration

SessionLimit returns the per-session time limit as a duration. Returns 0 if not configured or if the duration cannot be parsed.

func (*Instance) SessionResetTimeout added in v2.7.0

func (c *Instance) SessionResetTimeout() time.Duration

SessionResetTimeout returns the idle timeout before a session resets. Returns 20 minutes by default if not configured (nil). Returns 0 if explicitly set to "0" (no timeout, session never resets).

func (*Instance) SetAPIPort added in v2.7.1

func (c *Instance) SetAPIPort(port int) error

func (*Instance) SetAudioFeedback

func (c *Instance) SetAudioFeedback(enabled bool)

func (*Instance) SetAutoDetect

func (c *Instance) SetAutoDetect(enabled bool)

func (*Instance) SetDailyLimit added in v2.7.0

func (c *Instance) SetDailyLimit(duration string) error

SetDailyLimit sets the daily time limit from a duration string (e.g., "2h30m"). Returns an error if the duration string is invalid. Pass empty string to disable daily limit.

func (*Instance) SetDebugLogging

func (c *Instance) SetDebugLogging(enabled bool)

func (*Instance) SetDiscoveryEnabled added in v2.8.0

func (c *Instance) SetDiscoveryEnabled(enabled bool)

func (*Instance) SetDiscoveryInstanceName added in v2.8.0

func (c *Instance) SetDiscoveryInstanceName(name string)

func (*Instance) SetErrorReporting added in v2.8.0

func (c *Instance) SetErrorReporting(enabled bool)

SetErrorReporting sets whether error reporting is enabled.

func (*Instance) SetExecuteAllowListForTesting added in v2.8.0

func (c *Instance) SetExecuteAllowListForTesting(allowList []string)

SetExecuteAllowListForTesting configures the execute allow list for tests.

func (*Instance) SetFilenameTags added in v2.7.0

func (c *Instance) SetFilenameTags(enabled bool)

SetFilenameTags sets whether filename tag parsing is enabled.

func (*Instance) SetLauncherDefaultsForTesting added in v2.8.0

func (c *Instance) SetLauncherDefaultsForTesting(defaults []LaunchersDefault)

SetLauncherDefaultsForTesting sets launcher defaults for testing purposes.

func (*Instance) SetPlaytimeLimitsEnabled added in v2.7.0

func (c *Instance) SetPlaytimeLimitsEnabled(enabled bool)

SetPlaytimeLimitsEnabled enables or disables playtime limits.

func (*Instance) SetPlaytimeRetention added in v2.7.0

func (c *Instance) SetPlaytimeRetention(days int)

SetPlaytimeRetention sets the number of days to retain play time history. Pass 0 to disable cleanup.

func (*Instance) SetReaderConnections

func (c *Instance) SetReaderConnections(rcs []ReadersConnect)

func (*Instance) SetScanExitDelay

func (c *Instance) SetScanExitDelay(exitDelay float32)

func (*Instance) SetScanIgnoreSystem

func (c *Instance) SetScanIgnoreSystem(ignoreSystem []string)

func (*Instance) SetScanMode

func (c *Instance) SetScanMode(mode string)

func (*Instance) SetSessionLimit added in v2.7.0

func (c *Instance) SetSessionLimit(duration string) error

SetSessionLimit sets the session time limit from a duration string (e.g., "45m"). Returns an error if the duration string is invalid. Pass empty string to disable session limit.

func (*Instance) SetSessionResetTimeout added in v2.7.0

func (c *Instance) SetSessionResetTimeout(duration *string) error

SetSessionResetTimeout sets the idle timeout before a session resets (e.g., "20m", "1h", "0"). Returns an error if the duration string is invalid. Pass nil to use default (20 minutes). Pass "0" to disable session reset timeout.

func (*Instance) SetSystemDefaultsForTesting added in v2.7.0

func (c *Instance) SetSystemDefaultsForTesting(defaults []SystemsDefault)

SetSystemDefaultsForTesting sets system defaults for testing purposes

func (*Instance) SetVirtualGamepadEnabled added in v2.7.1

func (c *Instance) SetVirtualGamepadEnabled(enabled bool)

SetVirtualGamepadEnabled sets whether virtual gamepad emulation is enabled.

func (*Instance) SetWarningIntervals added in v2.7.0

func (c *Instance) SetWarningIntervals(intervals []string) error

SetWarningIntervals sets the warning intervals from duration strings (e.g., ["10m", "5m", "2m"]). Returns an error if any duration string is invalid. Pass empty slice to use defaults [5m, 2m, 1m].

func (*Instance) SuccessSoundPath added in v2.7.0

func (c *Instance) SuccessSoundPath(dataDir string) (string, bool)

SuccessSoundPath returns the resolved path to the success sound file and whether it's enabled. Returns ("", true) if nil (use embedded default), ("", false) if disabled (empty string), or (resolved_path, true) if a custom path is configured. For relative paths, dataDir is used as the base (typically helpers.DataDir(pl)).

func (*Instance) SystemDefaults

func (c *Instance) SystemDefaults() []SystemsDefault

func (*Instance) TapModeEnabled

func (c *Instance) TapModeEnabled() bool

func (*Instance) VirtualGamepadEnabled added in v2.7.1

func (c *Instance) VirtualGamepadEnabled(defaultEnabled bool) bool

VirtualGamepadEnabled returns whether virtual gamepad emulation is enabled. The defaultEnabled parameter allows platforms to specify their own default.

func (*Instance) WarningIntervals added in v2.7.0

func (c *Instance) WarningIntervals() []time.Duration

WarningIntervals returns the warning intervals as durations. Returns default intervals [5m, 2m, 1m] if not configured. Skips any intervals that cannot be parsed.

type Launchers

type Launchers struct {
	IndexRoot []string `toml:"index_root,omitempty,multiline"`
	AllowFile []string `toml:"allow_file,omitempty,multiline"`

	MediaDir         string             `toml:"media_dir,omitempty"`
	BeforeMediaStart string             `toml:"before_media_start,omitempty"`
	OnMediaStart     string             `toml:"on_media_start,omitempty"`
	Default          []LaunchersDefault `toml:"default,omitempty"`
	Custom           []LaunchersCustom  `toml:"custom,omitempty"`
	// contains filtered or unexported fields
}

type LaunchersCustom

type LaunchersCustom struct {
	ID        string   `toml:"id"`
	System    string   `toml:"system"`
	Execute   string   `toml:"execute"`
	MediaDirs []string `toml:"media_dirs"`
	FileExts  []string `toml:"file_exts"`
}

type LaunchersDefault

type LaunchersDefault struct {
	Launcher   string `toml:"launcher"`
	InstallDir string `toml:"install_dir,omitempty"`
	ServerURL  string `toml:"server_url,omitempty"`
	// Action specifies the default launch action. Common values:
	// - "" or "run": Default behavior (launch/play the media)
	// - "details": Show media details/info page instead of launching
	Action string `toml:"action,omitempty"`
}

type MQTTPublisher added in v2.7.0

type MQTTPublisher struct {
	Enabled *bool    `toml:"enabled,omitempty"`
	Broker  string   `toml:"broker"`
	Topic   string   `toml:"topic"`
	Filter  []string `toml:"filter,omitempty,multiline"`
}

type Mappings

type Mappings struct {
	Entry []MappingsEntry `toml:"entry,omitempty"`
}

type MappingsEntry

type MappingsEntry struct {
	TokenKey     string `toml:"token_key,omitempty"`
	MatchPattern string `toml:"match_pattern"`
	ZapScript    string `toml:"zapscript"`
}

type Media added in v2.7.0

type Media struct {
	FilenameTags   *bool    `toml:"filename_tags,omitempty"`
	DefaultRegions []string `toml:"default_regions,omitempty,multiline"`
	DefaultLangs   []string `toml:"default_langs,omitempty,multiline"`
}

type Playtime added in v2.7.0

type Playtime struct {
	Retention *int           `toml:"retention,omitempty"`
	Limits    PlaytimeLimits `toml:"limits,omitempty"`
}

Playtime configures play time tracking and limits.

type PlaytimeLimits added in v2.7.0

type PlaytimeLimits struct {
	Enabled      *bool    `toml:"enabled,omitempty"`
	Daily        string   `toml:"daily,omitempty"`
	Session      string   `toml:"session,omitempty"`
	SessionReset *string  `toml:"session_reset,omitempty"`
	Warnings     []string `toml:"warnings,omitempty,multiline"`
}

PlaytimeLimits configures time limits and warnings for gameplay sessions.

type Publishers added in v2.7.0

type Publishers struct {
	MQTT []MQTTPublisher `toml:"mqtt,omitempty"`
}

type Readers

type Readers struct {
	Drivers     map[string]DriverConfig `toml:"drivers,omitempty"`
	ScanHistory *int                    `toml:"scan_history,omitempty"`
	Connect     []ReadersConnect        `toml:"connect,omitempty"`
	Scan        ReadersScan             `toml:"scan,omitempty"`
	AutoDetect  bool                    `toml:"auto_detect"`
}

type ReadersConnect

type ReadersConnect struct {
	Driver   string `toml:"driver"`
	Path     string `toml:"path,omitempty"`
	IDSource string `toml:"id_source,omitempty"`
}

func (ReadersConnect) ConnectionString

func (r ReadersConnect) ConnectionString() string

type ReadersScan

type ReadersScan struct {
	Mode         string   `toml:"mode"`
	OnScan       string   `toml:"on_scan,omitempty"`
	OnRemove     string   `toml:"on_remove,omitempty"`
	IgnoreSystem []string `toml:"ignore_system,omitempty"`
	ExitDelay    float32  `toml:"exit_delay,omitempty"`
}

type Service

type Service struct {
	APIPort   *int      `toml:"api_port,omitempty"`
	Discovery Discovery `toml:"discovery,omitempty"`
	DeviceID  string    `toml:"device_id"`
	APIListen string    `toml:"api_listen,omitempty"`
	AllowRun  []string  `toml:"allow_run,omitempty,multiline"`

	AllowedOrigins []string   `toml:"allowed_origins,omitempty"`
	AllowedIPs     []string   `toml:"allowed_ips,omitempty"`
	Publishers     Publishers `toml:"publishers,omitempty"`
	// contains filtered or unexported fields
}

type Systems

type Systems struct {
	Default []SystemsDefault `toml:"default,omitempty"`
}

type SystemsDefault

type SystemsDefault struct {
	System     string `toml:"system"`
	Launcher   string `toml:"launcher,omitempty"`
	BeforeExit string `toml:"before_exit,omitempty"`
}

type Values

type Values struct {
	Audio          Audio     `toml:"audio"`
	Input          Input     `toml:"input,omitempty"`
	Launchers      Launchers `toml:"launchers,omitempty"`
	Media          Media     `toml:"media,omitempty"`
	Playtime       Playtime  `toml:"playtime,omitempty"`
	ZapScript      ZapScript `toml:"zapscript,omitempty"`
	Systems        Systems   `toml:"systems,omitempty"`
	Mappings       Mappings  `toml:"mappings,omitempty"`
	Service        Service   `toml:"service,omitempty"`
	Groovy         Groovy    `toml:"groovy,omitempty"`
	Readers        Readers   `toml:"readers,omitempty"`
	ConfigSchema   int       `toml:"config_schema"`
	DebugLogging   bool      `toml:"debug_logging"`
	ErrorReporting bool      `toml:"error_reporting"`
}

type ZapScript

type ZapScript struct {
	AllowExecute []string `toml:"allow_execute,omitempty,multiline"`
	// contains filtered or unexported fields
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL