Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
287 commits
Select commit Hold shift + click to select a range
74fbbc9
Fix template layout, encoding, update README with feature list
kiwipaulrob Jun 26, 2026
88cf790
Update setup guide with config page features, deploy template fixes
kiwipaulrob Jun 26, 2026
7c3dc3d
Installer: add moode-worker.service install, rsmafterss DB default
kiwipaulrob Jun 26, 2026
7af00f9
Installer: auto-install Python/uv/sendspin CLI prerequisites
kiwipaulrob Jun 26, 2026
a0a4b02
Add SENDSPIN_PR.md: comprehensive PR document for moOde maintainer re…
kiwipaulrob Jun 26, 2026
a3457c6
Fix SendSpin toggle persistence and deploy ssp-config page
kiwipaulrob Jun 27, 2026
0f74f50
Update installer: fix session ordering bug, deploy ssp-config, add Ed…
kiwipaulrob Jun 27, 2026
d4a4bc2
Fix: volume mode selector + ALSA card info in ssp-config; dynamic --h…
kiwipaulrob Jun 27, 2026
6b44345
Fix: move SendSpin ALSA config to separate sendspin-spspre.sh (avoids…
kiwipaulrob Jun 27, 2026
27292df
Remove Volume control and Static delay from config page (redundant)
kiwipaulrob Jun 27, 2026
8e1993e
Generic documentation update: README, PR doc, setup guide v2.0
kiwipaulrob Jun 27, 2026
0ed83ac
Update on-device setup guide to v2.0
kiwipaulrob Jun 27, 2026
8c8d1ac
Update all docs: code review, roadmap, PR doc, setup guide v2.0
kiwipaulrob Jun 27, 2026
f9b8eed
Merge branch 'moode-player:develop' into sendspin-advanced
kiwipaulrob Jun 27, 2026
a768e8d
Fix STRUCT-01 quote style, update README with installer syntax + SSH …
kiwipaulrob Jun 27, 2026
631b852
Deploy metadata pipeline: add overlay, API endpoints, metadata-sink d…
kiwipaulrob Jun 28, 2026
4cfdd89
Fix sendspin-display.js: use r.text() not r.json() for ~~~ delimited …
kiwipaulrob Jun 28, 2026
295e753
Fix overlay: ID selectors in CSS, MutationObserver protect, trim meta…
kiwipaulrob Jun 28, 2026
c5a43cf
Fix overlay blocking page: add pointer-events:none to overlay and con…
kiwipaulrob Jun 28, 2026
fc60560
Fix hook overwriting real metadata: hook checks for existing data bef…
kiwipaulrob Jun 28, 2026
67be915
Use moOde built-in inpsrc-indicator instead of custom overlay - minim…
kiwipaulrob Jun 28, 2026
be14f5a
Remove hook-start/stop from service - HA sink handles all metadata in…
kiwipaulrob Jun 28, 2026
f95b2b2
Add sendspin-display.js script tag to footer.php before PHP block
kiwipaulrob Jun 28, 2026
f7df96a
Fix SendSpin indicator: clear msg-text when metadata shown (matching …
kiwipaulrob Jun 28, 2026
5b5d481
Update docs: reflect simplified architecture (no hooks, native indica…
kiwipaulrob Jun 28, 2026
089b0d5
Update docs: backup system, CLI options, link to kiwipaulrob/memos-ba…
kiwipaulrob Jun 28, 2026
3bc191e
Fix backup utility references: replace memos-backup/hermes-config wit…
kiwipaulrob Jun 28, 2026
e40e207
[ren-config.html] Remove spurious double quotes
moodeaudio Jun 28, 2026
e3ddfcb
v4.1.0: Deploy commandw scripts, fix HTML nesting, add rsmafterss, pe…
kiwipaulrob Jun 28, 2026
b710022
moode-worker.service: check for existing moOde-provided service befor…
kiwipaulrob Jun 28, 2026
0a1b60a
Remove install_moode_worker_service and queue.php — both unnecessary
kiwipaulrob Jun 28, 2026
d40c308
Update docs: reflect removal of moode-worker.service and queue.php; f…
kiwipaulrob Jun 28, 2026
ee4d7d0
Fix: worker.php path (daemon/), sqlite3 newline stripping, set -e loc…
kiwipaulrob Jun 28, 2026
52895a3
Update SENDSPIN_PR.md: v4.1.0 changes — hook scripts, removals, DB fi…
kiwipaulrob Jun 28, 2026
79d56e7
Update SENDSPIN_PR.md: reflect current state — remove changelog histo…
kiwipaulrob Jun 28, 2026
fa6b723
Remove --hardware-volume and --static-delay-ms — duplicate moOde volu…
kiwipaulrob Jun 28, 2026
b1ff7a6
PR-ready fixes: reuse $dbh, move require_once, guard sed ops, dynamic…
kiwipaulrob Jun 28, 2026
e9c6c53
Remove configureAlsaForSendspin() — dead code; sync installer heredoc…
kiwipaulrob Jun 28, 2026
1ab6e01
SENDSPIN_PR.md: explain why no configureAlsaForSendspin() needed vs o…
kiwipaulrob Jun 28, 2026
4b12bf7
Fix installer header comment: sendspin-integration → sendspin-advanced
kiwipaulrob Jun 28, 2026
e05b13d
Switch to _audioout device, add renderer stop patterns, remove ALSA c…
kiwipaulrob Jun 28, 2026
883b56c
Remove stale sendspin.conf references: update spspre.sh for _audioout…
kiwipaulrob Jun 28, 2026
73deb98
Remove obsolete moode-sendspin-r2-installer.sh — all features merged …
kiwipaulrob Jun 28, 2026
f25fbe7
Remove r2-installer reference from README-sendspin.md
kiwipaulrob Jun 28, 2026
20ae037
Remove all Hermes references from documentation
kiwipaulrob Jun 28, 2026
213aef7
Clarify that installer automatically installs Python/uv/sendspin CLI …
kiwipaulrob Jun 28, 2026
4a884d4
Rewrite setup guide v2.1: installer CLI options, renderer controls, P…
kiwipaulrob Jun 28, 2026
deb873a
Fix ssp-config.html: replace stale sendspin device references with _a…
kiwipaulrob Jun 28, 2026
6ac9fea
Replace em dashes with ASCII double-hyphens in .txt and .sh files for…
kiwipaulrob Jun 28, 2026
428a027
Replace right-arrow (→) with ASCII -> in .txt/.sh files; sweep confir…
kiwipaulrob Jun 28, 2026
1adbfd1
Fix installer: regenerate service in bash (not PHP), remove moode-wor…
kiwipaulrob Jun 29, 2026
4416bb8
Fix installer prompts: confirm install, unambiguous yes/no, informati…
kiwipaulrob Jun 29, 2026
363c466
Clear post-install message: service NOT auto-started, explicit activa…
kiwipaulrob Jun 29, 2026
c692021
Clean MD files: remove stale sendspin.conf, duplex Buffer Tuning sect…
kiwipaulrob Jun 29, 2026
bacc253
Update/rename itunes cover search test program
moodeaudio Jun 29, 2026
4c1972b
Add Radio Cover+ option
moodeaudio Jun 29, 2026
6f081eb
Update relnotes.txt
moodeaudio Jun 29, 2026
69c78ea
Critical fixes: commandw path to /var/local/www, libportaudio2, remov…
kiwipaulrob Jun 30, 2026
5f3ee5b
[bluetooth] Fix A2DP sink silent in Standard ALSA output mode
Gjuju Jun 28, 2026
d15e69c
[playlist.php] Add import/export endpoints for saved playlists
Gjuju Jun 27, 2026
7bf1e31
[playerlib.js] Update volume display optimistically and guard reconci…
Gjuju Jun 27, 2026
c4729b0
[playlist UI] Add import, export and delete controls
Gjuju Jun 27, 2026
16590f8
[engine-mpd.php] Flag coalesced mixer changes so they aren't lost
Gjuju Jun 27, 2026
73c6763
[playlist.php] Add import path remapping and validation
Gjuju Jun 28, 2026
3a47474
[sys-config.php] Populate CPU governor list from the kernel
Gjuju Jun 28, 2026
702dd2d
[playerlib.js] Debounce volume knob commands while dragging
Gjuju Jun 27, 2026
5b5acd6
[pirev.py] Return -1 for unrecognised revision codes instead of crashing
Gjuju Jun 27, 2026
46ee514
[playlist UI] Add remap modal, cover fallback and Playlist-view import
Gjuju Jun 28, 2026
58ad5b9
[radiocover_plus] Remove commented out code
moodeaudio Jun 30, 2026
06ba5b5
[mpd.php] Comment out debug code
moodeaudio Jun 30, 2026
8f563a6
Merge branch 'pr/757' into develop
moodeaudio Jun 30, 2026
411432f
Merge branch 'pr/753' into develop
moodeaudio Jun 30, 2026
ea25382
Merge branch 'pr/754' into develop
moodeaudio Jun 30, 2026
732bd7d
Update relnotes.txt
moodeaudio Jun 30, 2026
bf1ea58
Update relnotes.txt
moodeaudio Jun 30, 2026
4c63ce0
Add phpSession('load_system') to ren-config.php — prevents blank page…
kiwipaulrob Jul 1, 2026
dfb45d1
Merge branch 'pr/758' into develop
moodeaudio Jul 1, 2026
28be7b5
Update relnotes.txt
moodeaudio Jul 1, 2026
01c01e4
[bluetooth] Always route A2DP sink via plug:_audioout (#758)
Gjuju Jul 1, 2026
769c3d4
[footer.php] Improve privacy statement
moodeaudio Jul 2, 2026
d3c6193
[itunescover.py] Add query timeout arg
moodeaudio Jul 2, 2026
3bc8555
Update relnotes.txt
moodeaudio Jul 2, 2026
7534c3f
Improve Radio Cover feature
moodeaudio Jul 2, 2026
4e7eadd
[itunescover.py] Remove debug prints
moodeaudio Jul 2, 2026
90e22e3
Improve Radio Cover feature - part 2
moodeaudio Jul 2, 2026
36bdf8e
Create V4-Revox B251 With Haas Effect.yml
moodeaudio Jul 3, 2026
5c77d0c
Update relnotes.txt
moodeaudio Jul 3, 2026
a035980
Merge branch 'pr/755' into develop
moodeaudio Jul 3, 2026
54ece8e
Revert "Merge branch 'pr/755' into develop"
moodeaudio Jul 3, 2026
a003c8c
Add playlist import/export and Browse-view management to the WebUI (#…
Gjuju Jul 3, 2026
b76491f
Updates for Playlist Import/Export
moodeaudio Jul 3, 2026
2c817c4
Update relnotes.txt
moodeaudio Jul 3, 2026
aa6bd2e
Update relnotes.txt
moodeaudio Jul 4, 2026
6f5f1fa
Update relnotes.txt
moodeaudio Jul 4, 2026
910bee7
radiobrowser: native radio-browser.info integration in the Radio view…
Gjuju Jul 5, 2026
703472d
radiobrowser: garbage-collect transient 'u' stations + fix favorite a…
Gjuju Jul 6, 2026
6be9c47
Improve Radio view Favorites
moodeaudio Jul 6, 2026
fd439ae
Radio browser style improvements
moodeaudio Jul 6, 2026
e0347d4
ux: folder view — Refresh honors saved-playlist listing (#763)
Gjuju Jul 6, 2026
6943bc5
Update quickhelp.html
moodeaudio Jul 7, 2026
5b9c937
Radio view / Radio Browser UX fixes (#762)
Gjuju Jul 7, 2026
da6b899
Radio browser fixes and refactors
moodeaudio Jul 8, 2026
0b35d66
ux: radio browser — unify favicon rendering via logo proxy (search + …
Gjuju Jul 8, 2026
1115985
Radio browser refactor script name
moodeaudio Jul 8, 2026
6c16fe9
Merge branch 'develop' of https://github.com/moode-player/moode into …
moodeaudio Jul 8, 2026
cb1e474
Radio browser revert combobox to standard select
moodeaudio Jul 8, 2026
748eb5c
Radio browser refactor cache and logo dir names
moodeaudio Jul 8, 2026
1be796c
Update relnotes.txt
moodeaudio Jul 8, 2026
55b4ec4
Radio browser add min/max logo size constants
moodeaudio Jul 8, 2026
19f4a36
[radio-browser.js] Fix station type
moodeaudio Jul 9, 2026
ac4c1bc
[queue.php] Fix comments
moodeaudio Jul 9, 2026
a486448
Radio browser add Manager modal
moodeaudio Jul 9, 2026
5f8c689
Radio Browser Manager updates
moodeaudio Jul 10, 2026
58c0928
[rb manager] hide messages upon open
moodeaudio Jul 12, 2026
8045d35
[scripts-panels.js] Improve Prefs alpha-blend MutationObserver
moodeaudio Jul 12, 2026
d733a82
[radio browser] Fix Country/Genre dropdowns
moodeaudio Jul 12, 2026
274cb47
[radio browser] Genre cleanup
moodeaudio Jul 12, 2026
07aa07b
[radio browser] Improve empty text
moodeaudio Jul 12, 2026
145912d
[radio browser] Fix rbEnsureLogo() permission issue
moodeaudio Jul 12, 2026
4e75f71
[radio browser] Remove commented out code
moodeaudio Jul 12, 2026
044bcac
[radio browser] Add section to Quickhelp
moodeaudio Jul 12, 2026
e52a51a
[radio brtowser] Update source headers with Copyright notices
moodeaudio Jul 12, 2026
f185cb0
Update relnotes.txt
moodeaudio Jul 12, 2026
3de9abe
Update relnotes.txt
moodeaudio Jul 12, 2026
7d083c4
Standardize default covers
moodeaudio Jul 13, 2026
d7ade30
Revert to standard no-cover default renderer backdrop
moodeaudio Jul 13, 2026
6c536c1
[playerlib.js] Remove leftover commented out code
moodeaudio Jul 13, 2026
b928fa6
Increase right padding of Folder view list entries (#766)
Gjuju Jul 13, 2026
4e1e5a3
[playerlib.js] Fix Spotify and AirPlay backdrops not being reset
moodeaudio Jul 13, 2026
0bfea13
Update relnotes.txt
moodeaudio Jul 13, 2026
27d68dd
Update relnotes.txt
moodeaudio Jul 13, 2026
b0bdbd2
Update release version
moodeaudio Jul 13, 2026
20edea3
Radio Browser: treat HLS streams like any other station (#767)
Gjuju Jul 14, 2026
35d2608
Update release date
moodeaudio Jul 14, 2026
cedf27b
Album/Radio/Playlist views: center thumbnails vertically (#768)
Gjuju Jul 14, 2026
67f4db1
Merge tag 'r1030' into sendspin-advanced
kiwipaulrob Jul 14, 2026
ed4e3b2
Bump to WIP r1031
moodeaudio Jul 15, 2026
3cbf778
Peppy: bind the softvol control to the hardware mixer element (remove…
Gjuju Jul 15, 2026
b875569
Display the dB volume when MPD software volume is used (#770)
Gjuju Jul 15, 2026
50d83e5
Update relnotes.txt
moodeaudio Jul 15, 2026
4a6d004
[queue.php] Fix comment
moodeaudio Jul 17, 2026
d03fe36
[lib-config.html] Fix typo in help
moodeaudio Jul 17, 2026
0742ef2
[radio-browser] Fixes and improvements
moodeaudio Jul 17, 2026
9986709
Update relnotes.txt
moodeaudio Jul 17, 2026
5bff983
[radio-browser.php] Fix country sort
moodeaudio Jul 17, 2026
be653d4
Update relnotes.txt
moodeaudio Jul 17, 2026
170bafb
Merge branch 'upstream/develop' (WIP r1031) into sendspin-advanced
kiwipaulrob Jul 18, 2026
7d20b3c
[devutl] Update sudo message
moodeaudio Jul 19, 2026
b6b4c21
Update install_renderers.txt
moodeaudio Jul 19, 2026
51ff8d0
Playqueue: extend the action menu hit area to the full row height (#771)
Gjuju Jul 19, 2026
2ce18fc
Update relnotes.txt
moodeaudio Jul 19, 2026
c366822
[playerlib.js] Fix Index search in Radio view
moodeaudio Jul 19, 2026
0931a70
Update relnotes.txt
moodeaudio Jul 19, 2026
bbbf913
[bluetooth] Route A2DP sink straight at the active LADSPA plugin (#774)
Gjuju Jul 19, 2026
e9a84da
[peppy] Guard Default output mode against the Peppy + LADSPA DSP cras…
Gjuju Jul 19, 2026
f72e3ae
[moode-sqlite3.db.sql] Delete duplicate row in cfg_rbgenres
moodeaudio Jul 20, 2026
4e0714a
Merge branch 'develop' of https://github.com/moode-player/moode into …
moodeaudio Jul 20, 2026
4b7a5eb
Update relnotes.txt
moodeaudio Jul 20, 2026
550f312
Update relnotes.txt
moodeaudio Jul 20, 2026
0cad916
Update peppymeter config.sed.txt
moodeaudio Jul 20, 2026
abaf0c6
Peppy: make the VU meter follow a hardware-volume knob (#773)
Gjuju Jul 20, 2026
eeafd69
[peppy-gain] Minor comment updates
moodeaudio Jul 20, 2026
6d6c565
Update relnotes.txt
moodeaudio Jul 20, 2026
0e975b5
Update relnotes.txt
moodeaudio Jul 21, 2026
48bac56
Peppy: don't leave the meter on a track change (#777)
Gjuju Jul 21, 2026
e871552
Fix Radio Manager hide/unhide actions set wrong station type for RB s…
moodeaudio Jul 21, 2026
f1e84a9
Update relnotes.txt
moodeaudio Jul 21, 2026
207210e
Merge branch 'develop' of https://github.com/moode-player/moode into …
moodeaudio Jul 21, 2026
9faf08f
Update release date
moodeaudio Jul 22, 2026
96facc2
Bump to WIP r1032
moodeaudio Jul 23, 2026
98b4e4d
Update for moOde r1031: lib.min.js → playerlib.js, re-add FEAT_SENDSP…
kiwipaulrob Jul 24, 2026
19f7e20
Support both playerlib.js (moOde r1031+) and lib.min.js (older moOde)
kiwipaulrob Jul 24, 2026
4f10fe5
Fix feat_bitmask duplicates: use UPDATE instead of INSERT OR REPLACE
kiwipaulrob Jul 24, 2026
2cc98ff
Update roadmap and README for r1031 merge, playerlib.js detection, fe…
kiwipaulrob Jul 24, 2026
454b508
Add missing advanced functions to renderer.php heredoc (getSendspinVe…
kiwipaulrob Jul 24, 2026
b4e5ac0
Add metadata display: sendspin-meta.php endpoint, deploy JS + header.…
kiwipaulrob Jul 24, 2026
6bb6f86
Update roadmap: metadata display feature, 17 installer components
kiwipaulrob Jul 24, 2026
fc1c91f
Complete metadata pipeline: JSON parse in renderer.php endpoint, sink…
kiwipaulrob Jul 24, 2026
4c6f66e
Rewrite metadata sink: protocol metadata@v1 primary, MA API fallback,…
kiwipaulrob Jul 24, 2026
29195e0
Daemon: detect+overwrite hook JSON; Hook: skip write when ~~~ metadat…
kiwipaulrob Jul 24, 2026
7177179
Hook defers to daemon via systemctl check; daemon corrects JSON on st…
kiwipaulrob Jul 24, 2026
d17e663
Update roadmap: multi-source metadata, hook/daemon coexistence, 19 co…
kiwipaulrob Jul 24, 2026
404c22e
Add device-based stream detection (fuser), server_connected flag, gra…
kiwipaulrob Jul 25, 2026
5d92fcb
Change streaming status title to 'Now Playing' so JS displays it
kiwipaulrob Jul 25, 2026
1f92206
Fix MA API: correct URL (192.168.214.159), POST /api format, Bearer a…
kiwipaulrob Jul 25, 2026
fc0f69a
Fix empty metadata file detection — daemon now writes on empty/0-byte…
kiwipaulrob Jul 25, 2026
26f7767
Add MA Token field to ssp-config UI; daemon reads token from DB (no e…
kiwipaulrob Jul 25, 2026
6d8de1b
Fix blocking sysCmd: run metadata sink restart in background to preve…
kiwipaulrob Jul 25, 2026
8bf692a
Update setup guide v2.2: MA Token UI docs, metadata troubleshooting, …
kiwipaulrob Jul 25, 2026
cdbbbfe
Cache PyPI version (1h) and local version (24h) to fix 3s pageload bo…
kiwipaulrob Jul 25, 2026
b1b9955
Tune PHP-FPM pool: 8 start servers, 4-12 idle children (was 2/1/3) fo…
kiwipaulrob Jul 25, 2026
d421848
Remove phpSession(load_system) from ren-config.php — causes DB lock c…
kiwipaulrob Jul 25, 2026
29117c7
Preserve feat_bitmask in shared session before close to prevent rende…
kiwipaulrob Jul 25, 2026
9c4e0ef
Add feat_bitmask preservation to ren-config.php installer patch
kiwipaulrob Jul 25, 2026
95d8646
Update docs: shared session fix troubleshooting, roadmap entry
kiwipaulrob Jul 25, 2026
9b77807
Fix MA poll: use players/all command, find source player via active_s…
kiwipaulrob Jul 25, 2026
3da3bf4
Fix protocol metadata parsing: pass-through when no 'metadata' attr, …
kiwipaulrob Jul 25, 2026
2aaa45b
Restore HA-polling metadata sink — proven working, MA protocol dorman…
kiwipaulrob Jul 25, 2026
f7c4b2a
Remove dead MA code: MA Token UI, MA_URL/MA_TOKEN from systemd servic…
kiwipaulrob Jul 25, 2026
176b1d4
Update docs: HA polling replaces MA, remove MA Token references
kiwipaulrob Jul 25, 2026
6b59020
Bluetooth: pairing confirmation via Numeric Comparison (#784)
Gjuju Jul 26, 2026
76506d3
Update relnotes.txt
moodeaudio Jul 26, 2026
421ae90
[bluetooth pair confirm] Minor updates
moodeaudio Jul 26, 2026
b2dd0bb
Update relnotes.txt
moodeaudio Jul 26, 2026
3b60c8a
[panels.css] Improve padding on renderer overlay buttons
moodeaudio Jul 26, 2026
406ca3c
[audioinfo.php] Use bluealsa-cli to get decoded_to
moodeaudio Jul 26, 2026
7ccb912
Update relnotes.txt
moodeaudio Jul 26, 2026
61dd226
Update relnotes.txt
moodeaudio Jul 27, 2026
cff14d0
Update relnotes.txt
moodeaudio Jul 27, 2026
231be0e
Update relnotes.txt
moodeaudio Jul 27, 2026
15f095a
[indextpl.html] Update help for "Scan mode"
moodeaudio Jul 27, 2026
d88fd66
[devutl] Fix function name
moodeaudio Jul 27, 2026
6e784de
Update relnotes.txt
moodeaudio Jul 28, 2026
ffbe92e
Update relnotes.txt
moodeaudio Jul 28, 2026
e07c3f2
[audio.php] Add SQL escape to OutputDeviceCache functions
moodeaudio Jul 30, 2026
6e2076e
[shairport-sync] Add "service_type" param for 5.2 shairport-sync
moodeaudio Jul 30, 2026
65b3efb
Add AirPlay protocol 1|2 option
moodeaudio Aug 1, 2026
6965d30
Update relnotes.txt
moodeaudio Aug 1, 2026
17ff7f3
Fix previous spotify cover shows after disconnect, start/restart
moodeaudio Aug 1, 2026
0e265ed
Update relnotes.txt
moodeaudio Aug 1, 2026
95974dc
Update relnotes.txt
moodeaudio Aug 2, 2026
3a7739a
[moode-sqlite3.db] Bump airplay plugin to 5.2.1-1moode1
moodeaudio Aug 2, 2026
32c7446
Update Soma FM - DEF CON Radio logo
moodeaudio Aug 2, 2026
8010815
Update relnotes.txt
moodeaudio Aug 2, 2026
a147633
[radio-browser.php] Filter sql inject and shell hack chars
moodeaudio Aug 3, 2026
c2a9aaf
Update relnotes.txt
moodeaudio Aug 3, 2026
3a6a0e9
Update relnotes.txt
moodeaudio Aug 3, 2026
e7aa043
Update relnotes.txt
moodeaudio Aug 3, 2026
3699fd9
Update release date
moodeaudio Aug 3, 2026
e4abd33
Bump to WIP r1033
moodeaudio Aug 5, 2026
004fd93
[radio.php] Fix duplicate entries in Radio Cover+ cache
moodeaudio Aug 5, 2026
85adbb4
Bluetooth: show the pairing modal on config pages too (#786)
Gjuju Aug 5, 2026
7dbc380
Update relnotes.txt
moodeaudio Aug 5, 2026
0646bbb
Update Default Playlist.m3u
moodeaudio Aug 6, 2026
2dd21a3
[common.php] Fix brightness cmd in updDSIScnBrightness()
moodeaudio Aug 6, 2026
533120c
Update relnotes.txt
moodeaudio Aug 6, 2026
cc09bd9
[common.php] Remove obsolete comment
moodeaudio Aug 6, 2026
ece8f58
[radio-browser] Fix registered stations not added to recents
moodeaudio Aug 6, 2026
93225ee
Update relnotes.txt
moodeaudio Aug 6, 2026
98874d9
[radio-browser] Improve notification messages
moodeaudio Aug 6, 2026
f6db85f
Update relnotes.txt
moodeaudio Aug 6, 2026
24a7317
Update relnotes.txt
moodeaudio Aug 10, 2026
21bafc9
Merge r1032 (moOde 10.3.2, Trixie) into sendspin-advanced
kiwipaulrob Aug 10, 2026
375c7c8
Merge remote-tracking branch 'upstream/develop' into sendspin-advanced
kiwipaulrob Aug 10, 2026
ccf7971
Installer v4.1.1: fix worker.php anchor + idempotent patching
kiwipaulrob Aug 10, 2026
f711c28
Installer v4.1.2: guard partial-install prompt with --force
kiwipaulrob Aug 10, 2026
a2efad6
Installer v4.1.3: seed cfg_system sendspin params with INSERT OR IGNORE
kiwipaulrob Aug 10, 2026
855045c
Installer v4.1.4: truly idempotent cfg_system seeding
kiwipaulrob Aug 10, 2026
21a1456
Docs: reflect v4.1.4 state — r1032/r1033 merge, boot-start fix, idemp…
kiwipaulrob Aug 11, 2026
cf7d5cb
Fix installer heredoc drift: renderer.php + ren-config.php patch bugs
kiwipaulrob Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
188 changes: 188 additions & 0 deletions README-sendspin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# SendSpin Multi-Room Audio for moOde

SendSpin is a synchronized multi-room audio receiver. This integration adds SendSpin as a full renderer in moOde's web UI, on par with AirPlay, Spotify, Bluetooth, and other existing renderers.

## Features

- **ON/OFF toggle** with auto-save in the Renderers page
- **Resume MPD** — optionally resume MPD playback after SendSpin disconnects
- **Config page** — configure audio format (codec/sample rate/bit depth), log level
- **Version info** — displays installed version and latest available on PyPI (cached hourly)
- **Update button** — upgrades SendSpin CLI in the background
- **Metadata overlay** — shows cover art, title, artist, album using moOde's built-in `#inpsrc-indicator` (same element used by AirPlay/Spotify)
- **Native volume** — uses moOde's `_audioout` ALSA device (same as AirPlay, Spotify, MPD); volume knob works natively
- **Auto-start on boot** — honors the Renderers-page toggle (worker.php boot-time startup block; systemd service enabled)
- **Status detection** — shows active/inactive/streaming

## Requirements

- moOde 9.x or later (tested through r1033 / moOde 10.3.2)
- Raspberry Pi 3/4/5
- Network connection to a SendSpin server (e.g., Music Assistant)
- Home Assistant (optional — for metadata display via HA polling)

The installer automatically installs Python 3, `uv` (Python package manager), and the `sendspin` CLI — no manual prerequisite installation is needed.

## Key Design Decisions

1. **No custom overlay HTML/CSS** — The metadata display uses moOde's built-in `#inpsrc-indicator` element (already in `header.php`), matching AirPlay/Spotify/Deezer display pattern exactly. Zero additional HTML/CSS footprint.
2. **Uses moOde's `_audioout` device** — Same ALSA path as AirPlay, Spotify, MPD. No separate ALSA config needed. Volume knob works natively without attenuation hacks.
3. **No modification to playerlib.js** — `sendspinactive` FECmd is unused. The frontend JS polls the metadata API directly instead.
4. **Stop/start matches other renderers** — Calls `vol.sh -restore`, CamillaDSP volume sync, and `sendFECmd('sspactive0')` on stop, exactly like AirPlay/Spotify/RoonBridge.

## Installer

**`moode-sendspin-installer.sh`** — Full-featured installer with backup, uninstall, 19-component detection, and all features. **Current version: v4.1.4** (moOde 10.3.2 / r1033 support; idempotent re-runs — safe to run repeatedly, no duplicate DB rows; partial installations detected and repaired automatically; boot-time auto-start honors the UI toggle).

### Installation

```bash
git clone https://github.com/kiwipaulrob/moode.git
cd moode
git checkout sendspin-advanced
sudo bash moode-sendspin-installer.sh
```

The installer auto-detects the PHP version and automatically installs Python 3, `uv`, and the `sendspin` CLI if not already present. It then creates all necessary files, configures the database, enables systemd services, and creates a timestamped backup of all modified files.

### Install from URL

```bash
curl -fsSL https://raw.githubusercontent.com/kiwipaulrob/moode/sendspin-advanced/moode-sendspin-installer.sh | sudo bash
```

### Command Line Options

| Option | Description |
|--------|-------------|
| *(no flag)* | Full install — all features, config page, metadata overlay |
| `--minimal` | Minimal install — ON/OFF toggle + Resume MPD only (no config page) |
| `--check` | Check current installation status of all components (flags partial installs) |
| `--uninstall` | Uninstall — restores original moOde files from the most recent backup |
| `--force` | Skip all confirmation prompts (for automated/scripted installs) |
| `--no-backup` | Skip creating backup (for testing) |

Examples:

```bash
# Minimal install
curl -fsSL https://raw.githubusercontent.com/kiwipaulrob/moode/sendspin-advanced/moode-sendspin-installer.sh | sudo bash -s -- --minimal

# Check status
sudo bash moode-sendspin-installer.sh --check

# Uninstall
sudo bash moode-sendspin-installer.sh --uninstall
```

### Running from moOde's Built-in SSH Terminal

moOde has a built-in SSH terminal (System → SSH Terminal). You can run the installer directly from there:

1. Open moOde web UI → System → SSH Terminal
2. Paste the commands above
3. Enter your password when prompted

## Backup System

Before modifying any moOde file, the installer creates a **timestamped backup** at `/var/backups/moode-sendspin-YYYYMMDD-HHMMSS/`. Files backed up include:

- `moode-sqlite3.db` — Database snapshot before schema changes
- `sendspin.service` — Original systemd unit
- `constants.php`, `renderer.php` — Original PHP files
- `ren-config.php`, `ren-config.html` — Original renderers page
- `worker.php` — Original worker daemon
- `lib.min.js` — Original JS library

The `--uninstall` command finds the **most recent** backup and restores all files, making uninstallation safe and reversible.

### Related Backup Utilities

- [**kiwipaulrob/moode-tools**](https://github.com/kiwipaulrob/moode-tools) — Backup and restore utilities for moOde (includes scripts for database snapshots, config bundling, and system state recovery)

## What the Installer Does

| Component | File |
|-----------|------|
| Feature bitmask | `inc/constants.php` — adds `FEAT_SENDSPIN` (bit 18) |
| Lifecycle functions | `inc/renderer.php` — adds `startSendspin()`, `stopSendspin()`, `getSendspinStatus()`, `getSendspinVersion()`, `updateSendspin()`, `generateSendspinService()` |
| Renderers page controller | `ren-config.php` — POST handlers, session variables |
| Renderers page template | `templates/ren-config.html` — SendSpin section |
| Dedicated config page | `ssp-config.php` + `templates/ssp-config.html` |
| Worker job handlers + boot startup | `daemon/worker.php` — `sendspinsvc`, `sendspinrestart` cases plus a boot-time startup block that honors the UI toggle |
| Metadata overlay | `js/sendspin-display.js` — uses native `#inpsrc-indicator` (no custom HTML/CSS) |
| Pre-start hook | `commandw/sendspin-spspre.sh` — validates `_audioout` device |
| Systemd service | `/etc/systemd/system/sendspin.service` — uses `_audioout`, same device as AirPlay/Spotify/MPD |
| Database | `cfg_sendspin` table (audio format, log level) + session vars |
| Backup | `/var/backups/moode-sendspin-*/` — timestamped backup of all modified files |

## Database Schema

### Session Variables

| Variable | Default | Purpose |
|----------|---------|---------|
| `sendspinsvc` | `0` | Service ON/OFF |
| `sendspinname` | `moode-sendspin` | Endpoint name |
| `sendspin_installed` | `yes` | Installation flag |
| `mpd_was_playing` | `0` | MPD state before SendSpin start |
| `rsmafterss` | `No` | Resume MPD after disconnect |

### `cfg_sendspin` Table

| Parameter | Default | Values |
|-----------|---------|--------|
| `audio_codec` | `flac` | flac, pcm |
| `audio_rate` | `48000` | 44100, 48000, 96000 |
| `audio_depth` | `16` | 16, 24, 32 |
| `log_level` | `INFO` | DEBUG, INFO, WARNING, ERROR |

## Usage

The installer deploys files but does NOT start the SendSpin service automatically.
After installation:

1. Restart PHP: `sudo systemctl restart php*-fpm`
2. Open moOde web UI → Configure → Renderers
3. Find the **SendSpin** section
4. Toggle **Service** ON and click the save arrow
5. Toggle **Resume MPD** if desired (restores MPD after SendSpin stops)
6. Click **Edit** for advanced settings (audio format, log level, updates)

Your SendSpin endpoint appears automatically via mDNS on your network. Controllers like Music Assistant discover it without additional configuration.

## Post-Install: moOde Updates

If you update moOde (via System → Check for Update), core files are replaced with stock moOde versions. Re-run the installer afterward:

```bash
cd moode && git pull && sudo bash moode-sendspin-installer.sh
```

The installer detects partial installations (components missing after a moOde update) and reinstalls **only** the missing components — including re-patching `worker.php` and repairing the boot-time startup block. Re-running is safe and idempotent: database settings and custom files (config page, metadata overlay) survive and are never duplicated or reset.

## Uninstall

```bash
sudo bash moode-sendspin-installer.sh --uninstall
```

Restores original moOde files from the most recent backup at `/var/backups/moode-sendspin-*/`. Also removes systemd service files, ALSA config, and the `cfg_sendspin` database table. Backups are preserved after uninstall so you can re-install later.

## Check Status

```bash
sudo bash moode-sendspin-installer.sh --check
```

Shows which components are installed and their status.

## Files

All integration code is on the `sendspin-advanced` branch of:
`https://github.com/kiwipaulrob/moode.git`

Key documents:
- `SENDSPIN_PR.md` — Design document for moOde maintainer review (includes CLI commands, backup system)
- `SENDSPIN_RELEASE2_ROADMAP.md` — Feature status and deferred items
- `README-sendspin.md` — This file
Loading