release / govulncheck (push) Successful in 17s
release / web (push) Successful in 1m25s
release / go (push) Successful in 1m40s
release / integration (push) Successful in 5m19s
release / android (push) Successful in 5m32s
release / Build signed APK (releases and dev) (push) Successful in 5m51s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 15s
release / Verify release artifacts (tag releases only) (push) Skipped
README: logo header, short summary, a compose quick start with one-line comments, first-run steps, a configuration table, setup pitfalls, updating and backups, then features grouped by what you do. The Specs section (it called the Android client the "Flutter companion app"), the dated tag-history sentence and the Fable pointer are gone. Feature lines were checked against the code: radio seeds from a track only, and the Android app plays from its cache rather than offering downloads. .env.example used the SMARTMUSIC_ prefix, which the config loader has not read for a long time, so copying it set nothing. It now uses MINSTREL_. config.example.yaml is also the config the image bakes in at /etc/smartmusic/config.yaml. It listed five recommendation weights (base_weight, like_boost, recency_weight, skip_penalty, jitter_magnitude) that moved to Admin > Tuning; yaml.Unmarshal ignored them silently. They are removed, and the file parses to exactly Default(), so the running server is unchanged. coverart_from_mbcaa is not listed: nothing reads it. docker-compose.yml, the Makefile and the spec banners lose their task and milestone ids. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
2.3 KiB
YAML
55 lines
2.3 KiB
YAML
# Minstrel example configuration. In the container image, mount it at
|
||
# /etc/smartmusic/config.yaml. Every field is optional; the values below are
|
||
# the defaults. Each MINSTREL_* variable named here overrides its field.
|
||
|
||
server:
|
||
address: ":4533" # MINSTREL_SERVER_ADDRESS
|
||
|
||
storage:
|
||
# Artwork, caches and the stream-signing key. Use persistent storage.
|
||
data_dir: "./data" # MINSTREL_STORAGE_DATA_DIR (the image sets /app/data)
|
||
|
||
database:
|
||
# e.g. postgres://minstrel:minstrel@localhost:5432/minstrel?sslmode=disable
|
||
url: "" # MINSTREL_DATABASE_URL
|
||
|
||
log:
|
||
level: "info" # debug | info | warn | error. MINSTREL_LOG_LEVEL
|
||
format: "text" # text | json. MINSTREL_LOG_FORMAT
|
||
|
||
library:
|
||
# Library folders, walked recursively. Used on first start only: once they
|
||
# are changed in Admin › Library, the saved ones win. Changing a folder there
|
||
# moves its tracks with it, so plays, likes and playlists survive a new mount.
|
||
scan_paths: [] # MINSTREL_LIBRARY_SCAN_PATHS (colon-separated)
|
||
# Scan on startup. Scans are incremental, so a restart only walks the folders.
|
||
scan_on_startup: true # MINSTREL_LIBRARY_SCAN_ON_STARTUP
|
||
# Contact sent to the Cover Art Archive in the User-Agent. Empty sends
|
||
# the project's URL.
|
||
contact_email: "" # MINSTREL_CONTACT_EMAIL
|
||
|
||
branding:
|
||
app_name: "Minstrel" # MINSTREL_BRANDING_APP_NAME
|
||
description: "Self-hosted music server with Subsonic compatibility, smart shuffle, and music acquisition." # MINSTREL_BRANDING_DESCRIPTION
|
||
|
||
subsonic:
|
||
# Accept the plaintext `p=` password on /rest/*. Leave off unless a client
|
||
# needs it; apiKey and token auth work without it.
|
||
allow_plaintext_password: false # MINSTREL_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD
|
||
|
||
events:
|
||
# Minutes of silence that end a listening session.
|
||
session_timeout_minutes: 30
|
||
# A play is a skip when it stops before this fraction of the track AND
|
||
# before this many milliseconds.
|
||
skip_max_completion_ratio: 0.5
|
||
skip_max_duration_played_ms: 30000
|
||
|
||
recommendation:
|
||
# Scoring weights are tuned in Admin › Tuning, not here.
|
||
# Tracks played within this many hours are left out of radio.
|
||
recently_played_hours: 1
|
||
# Radio length when ?limit= is not given, and the most ?limit= may ask for.
|
||
radio_size: 50
|
||
radio_size_max: 200
|