mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
98 lines
3.6 KiB
Markdown
98 lines
3.6 KiB
Markdown
# On-Speaker Spotify Boot Primer for Bose SoundTouch
|
|
Self-contained boot-time Spotify primer that runs directly on the speaker.
|
|
No Spotify credentials on the device — it fetches a fresh token from a
|
|
[Bose-SoundTouch](https://github.com/gesellix/Bose-SoundTouch) server at boot.
|
|
No jq, no rootfs modification — just files on persistent storage.
|
|
|
|
## How It Works
|
|
Bose SoundTouch speakers run embedded Linux with a persistent writable volume
|
|
at `/mnt/nv`. The init script `shelby_local` (S97) has a built-in hook:
|
|
```
|
|
[ -x /mnt/nv/rc.local ] && /mnt/nv/rc.local
|
|
```
|
|
This runs before SoundTouch itself (S99), so we background a primer script
|
|
that waits for the Spotify Connect ZeroConf endpoint (port 8200) to come up,
|
|
fetches a fresh Spotify token from the service, and primes the speaker — all
|
|
within ~30 seconds of boot.
|
|
|
|
## File Layout
|
|
```
|
|
/mnt/nv/
|
|
rc.local boot hook (S97 checks this)
|
|
.profile PATH setup for interactive SSH
|
|
bin/
|
|
spotify-boot-primer main script
|
|
BoseApp-Persistence/1/
|
|
spotify-primer.conf service credentials (mode 600)
|
|
Sources.xml, Presets.xml, ... existing speaker data
|
|
```
|
|
Scripts live in `/mnt/nv/bin/` (added to PATH via `.profile`), config lives
|
|
alongside the speaker's own persistence files in `/mnt/nv/BoseApp-Persistence/1/`.
|
|
|
|
## Speaker Environment
|
|
Tested on SoundTouch 20. Other SoundTouch models likely similar.
|
|
| Item | Detail |
|
|
|------|--------|
|
|
| OS | Linux 3.14.43+ ARM (hostname `spotty`) |
|
|
| Root FS | Read-only ubifs (can be remounted rw) |
|
|
| Persistent storage | `/mnt/nv` — writable ubifs, ~24M free |
|
|
| curl | 7.50.3 with OpenSSL (HTTPS works) |
|
|
| bash/grep/sed/awk | Available via busybox |
|
|
| jq | **Not available** (not needed) |
|
|
| Init | SysV, runlevel 5 |
|
|
| Production mode | Yes — cron is disabled |
|
|
|
|
## Prerequisites
|
|
1. **SSH access to the speaker**:
|
|
```
|
|
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@SPEAKER_IP
|
|
```
|
|
2. **A running [Bose-SoundTouch](https://github.com/gesellix/Bose-SoundTouch) server** with:
|
|
- A linked Spotify account (via the management API OAuth flow)
|
|
- The `GET /mgmt/spotify/token` endpoint (returns `{accessToken, username}`)
|
|
- Management API credentials (HTTP Basic Auth)
|
|
|
|
## Installation
|
|
SSH into the speaker and run:
|
|
```bash
|
|
# 1. Create bin directory
|
|
mkdir -p /mnt/nv/bin
|
|
# 2. Create the config file with your service connection info
|
|
cat > /mnt/nv/BoseApp-Persistence/1/spotify-primer.conf << 'EOF'
|
|
SOUNDTOUCH_URL=https://soundtouch.example.com
|
|
SOUNDTOUCH_USER=admin
|
|
SOUNDTOUCH_PASS=secret
|
|
EOF
|
|
chmod 600 /mnt/nv/BoseApp-Persistence/1/spotify-primer.conf
|
|
# 3. Copy spotify-boot-primer to the speaker
|
|
# From your local machine:
|
|
# cat scripts/spotify/spotify-boot-primer | ssh root@SPEAKER_IP "cat > /mnt/nv/bin/spotify-boot-primer"
|
|
chmod +x /mnt/nv/bin/spotify-boot-primer
|
|
# 4. Create the boot hook
|
|
cat > /mnt/nv/rc.local << 'EOF'
|
|
#!/bin/bash
|
|
/mnt/nv/bin/spotify-boot-primer &
|
|
EOF
|
|
chmod +x /mnt/nv/rc.local
|
|
# 5. Set up PATH for interactive SSH sessions (optional but convenient)
|
|
cat > /mnt/nv/.profile << 'EOF'
|
|
export PATH="/mnt/nv/bin:$PATH"
|
|
EOF
|
|
```
|
|
|
|
## Testing
|
|
```bash
|
|
# Manual test (speaker must be running):
|
|
/mnt/nv/bin/spotify-boot-primer
|
|
# Check logs:
|
|
logread | grep spotify-primer
|
|
# Full test — reboot the speaker:
|
|
reboot
|
|
# Wait ~30s, then SSH back in and check:
|
|
logread | grep spotify-primer
|
|
curl -s "http://localhost:8200/zc?action=getInfo" | grep activeUser
|
|
```
|
|
|
|
## Related
|
|
- [Bose-SoundTouch](https://github.com/gesellix/Bose-SoundTouch) — Comprehensive Go toolkit with migration automation
|