# Minstrel example configuration.
# Every field is optional; defaults shown below match Default() in internal/config.
# Each setting can be overridden at runtime via SMARTMUSIC_* environment variables
# (see internal/config/config.go for the full list).

server:
  address: ":4533"

database:
  # Postgres connection string, e.g. postgres://minstrel:minstrel@localhost:5432/minstrel?sslmode=disable
  url: ""

log:
  level: "info"    # debug | info | warn | error
  format: "text"   # text | json

auth:
  # One-shot admin bootstrap. Applied only when the users table is empty.
  # Set username to enable; leave password blank to have the server generate
  # one and log it to stderr on first start.
  # Env: SMARTMUSIC_AUTH_ADMIN_USERNAME, SMARTMUSIC_AUTH_ADMIN_PASSWORD
  admin_bootstrap:
    username: ""
    password: ""

library:
  # Filesystem roots to scan for music. Each path is walked recursively.
  # Env: SMARTMUSIC_LIBRARY_SCAN_PATHS (colon-separated, PATH-style)
  scan_paths: []
  # Kick off a scan on server startup. Env: SMARTMUSIC_LIBRARY_SCAN_ON_STARTUP
  scan_on_startup: false

subsonic:
  # Gate for the legacy `p=` plaintext password parameter on /rest/*.
  # Leave disabled unless a specific client requires it — Minstrel prefers
  # apiKey (OpenSubsonic) and falls back to u+t+s token auth.
  # Env: SMARTMUSIC_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD
  allow_plaintext_password: false

events:
  # Idle gap (minutes) between play_events that closes a play_session and
  # starts a new one. Spec §6.
  session_timeout_minutes: 30
  # Skip rule (spec §6): a play counts as a SKIP if completion ratio is below
  # this threshold AND duration played (ms) is below the next threshold.
  skip_max_completion_ratio: 0.5
  skip_max_duration_played_ms: 30000

recommendation:
  # Base score every candidate gets before adjustments. Spec §6.
  base_weight: 1.0
  # Bonus for tracks the user has liked (general_likes).
  like_boost: 2.0
  # Multiplier on recency_decay (1.0 for tracks ≥ 30 days stale, 0 for fresh).
  recency_weight: 1.0
  # Penalty multiplier on skip_ratio (skips/plays); 1.0 = full penalty.
  skip_penalty: 1.0
  # ± random jitter applied to every candidate; breaks ties without dominating.
  jitter_magnitude: 0.1
  # Hard-suppression window: tracks played within this many hours never appear.
  recently_played_hours: 1
  # Default radio size when ?limit= is not specified.
  radio_size: 50
  # Maximum allowed ?limit= (server caps to this regardless).
  radio_size_max: 200
