You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 9b2bee0
Browse filesBrowse the repository at this point in the historyBrowse files
feat: WebDAV server to mount the SD card as a network drive (disabled)
Adds a self-contained WebDAV/1,2 server (own FreeRTOS task on core 0, port 81)
exposing the SD card read/write so a PC/Mac can copy audio over Finder/Explorer:
OPTIONS/PROPFIND/GET+ranges/PUT/DELETE/MKCOL/MOVE/COPY/LOCK, optional HTTP-Basic
auth, a settings sub-tab + control-tab toggle, command 188, MQTT `webdav` (plus
a Home Assistant switch) and Bonjour (_webdav._tcp) discovery.
Gated behind WEBDAV_ENABLE, currently OFF: the single-threaded server doesn't
browse reliably under macOS Finder's persistent/parallel connections (needs
proper HTTP keep-alive / concurrency). Kept in the tree for that follow-up.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -110,6 +110,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
110
110
|**Password protection**: single password (no username), 90-day session cookie, brute-force lockout, logout entry; off in hotspot mode. Scripts/API clients authenticate with the password as an **API key** (`X-API-Key` header / `apikey` query param) |[`e74e712`](../../commit/e74e712)|
111
111
|**One-click OTA + version badge**: a Tools-tab button (also bindable command **186** / MQTT `firmware_update`) pulls the rolling `latest` GitHub release and flashes it over OTA; a navbar badge shows the running build and turns amber when an update is available (passive `/version` check) — click it to install |[`8527f5e`](../../commit/8527f5e) · [`b736abc`](../../commit/b736abc)|
112
112
|**HTTP file sync**: pull audio files from a web server onto the SD card from a JSON manifest — additive, streamed in chunks straight to SD, background task with live progress + stop, abort-on-button, stall watchdog, auto-pauses playback and keeps the device awake mid-transfer. The manifest is streamed into the parser to halve peak RAM |[`ac24bbc`](../../commit/ac24bbc) · [`42d2c46`](../../commit/42d2c46)|
113
+
|**WebDAV server**: mount the SD card as a network drive (`http://<ip>:81/`) to copy audio on/off it straight from Finder/Explorer — no FTP client needed. Self-contained server (OPTIONS/PROPFIND/GET/HEAD+ranges/PUT/DELETE/MKCOL/MOVE/COPY/LOCK) running in its own task pinned to core 0 so transfers never disturb the audio pipeline; optional HTTP-Basic credentials. Configure + auto-start on boot in its own **WebDAV** settings sub-tab; start/stop live from the Control tab, command **188** or MQTT `webdav` (Home Assistant switch included). With auto-start on, the share is announced over **Bonjour/mDNS** (`_webdav._tcp`, `path=/`) so it pops up by itself in the Finder/Explorer network sidebar — no manual "Connect to Server" needed |[`WEBDAV`](../../commits/master)|
113
114
|**RFID-tag syncing (central server + peer-to-peer)**: keep tag assignments in sync across a PHP server *and* other ESPuinos — newest-wins by timestamp, deletions propagate via tombstones, automatic catch-up after coming online so a player used offline/outdoors keeps working. Run from the Tools tab, command **187** or MQTT `rfid_sync`|[`99ffb5b`](../../commit/99ffb5b)|
114
115
|**Equalizer profiles**: Flat / Music / Audiobook-Speech / Deep-voices / Custom presets on the 3-band tone control (speech presets keep deep narrator voices intelligible); assignable per file/folder, cycle via command **154** / MQTT `equalizer`. An over-full per-path rule set is now rejected with a clear error instead of silently failing |[`11ade33`](../../commit/11ade33) · [`addff5c`](../../commit/addff5c)|
115
116
|**Audiobook resume hardening**: the play-position is checkpointed to flash every ~30 s while playing, so a dead-battery / hard power-off only loses a few seconds instead of the whole track; the learned-cards list shows each tag's resume point with a restart-from-start button |[`a9f498f`](../../commit/a9f498f)|
Copy file name to clipboardExpand all lines: html/locales/de.json
+27Lines changed: 27 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -37,6 +37,7 @@
37
37
"wifi": "WLAN",
38
38
"mqtt": "MQTT",
39
39
"ftp": "FTP",
40
+
"webdav": "WebDAV",
40
41
"sync": "Sync",
41
42
"bluetooth": "Bluetooth",
42
43
"general": "Allgemein",
@@ -196,6 +197,8 @@
196
197
"nightOff": "Nacht Aus",
197
198
"ftpOn": "FTP An",
198
199
"ftpOff": "FTP Aus",
200
+
"webdavOn": "WebDAV An",
201
+
"webdavOff": "WebDAV Aus",
199
202
"repeatOff": "Aus",
200
203
"repeatPlaylist": "Playlist",
201
204
"repeatTrack": "Titel",
@@ -229,6 +232,7 @@
229
232
"sleep": "Sleep-Timer",
230
233
"night": "Nachtmodus",
231
234
"ftp": "FTP-Server",
235
+
"webdav": "WebDAV-Server",
232
236
"bluetooth": "Bluetooth-Modus",
233
237
"lock": "Tasten sperren"
234
238
}
@@ -454,6 +458,29 @@
454
458
"stopButton": "FTP-Server stoppen"
455
459
}
456
460
},
461
+
"webdav": {
462
+
"title": "WebDAV-Einstellungen",
463
+
"desc": "Bindet die SD-Karte als Netzlaufwerk ein, sodass du am PC/Mac Audiodateien direkt darauf kopieren kannst (im Finder/Explorer als WebDAV-Server verbinden).",
464
+
"enable": "WebDAV beim Start automatisch aktivieren",
465
+
"user": {
466
+
"title": "WebDAV-Benutzername",
467
+
"placeholder": "Benutzername"
468
+
},
469
+
"pwd": {
470
+
"title": "WebDAV-Passwort",
471
+
"placeholder": "Passwort",
472
+
"show": "Passwort anzeigen/verbergen"
473
+
},
474
+
"auth": {
475
+
"hint": "Benutzername und Passwort leer lassen, um ohne Anmeldung zuzugreifen."
476
+
},
477
+
"start": {
478
+
"title": "WebDAV-Server starten",
479
+
"desc": "Aktiviert den WebDAV-Server bis zum Neustart des Geräts.",
480
+
"button": "WebDAV-Server starten",
481
+
"stopButton": "WebDAV-Server stoppen"
482
+
}
483
+
},
457
484
"sync": {
458
485
"title": "Datei-Synchronisation",
459
486
"intro": "Lädt Dateien von einem Webserver (z.B. nginx) auf die SD-Karte. Der ESPuino holt ein <b>JSON-Manifest</b> von der angegebenen URL und lädt alle darin gelisteten Dateien, die lokal fehlen oder eine andere Größe haben. Es wird <b>nur hinzugefügt</b> – lokale Dateien werden nie gelöscht. Die Synchronisation läuft nur, wenn gerade nichts von der SD-Karte abgespielt wird.",
Copy file name to clipboardExpand all lines: html/locales/en.json
+27Lines changed: 27 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -37,6 +37,7 @@
37
37
"wifi": "WiFi",
38
38
"mqtt": "MQTT",
39
39
"ftp": "FTP",
40
+
"webdav": "WebDAV",
40
41
"sync": "Sync",
41
42
"bluetooth": "Bluetooth",
42
43
"general": "General",
@@ -196,6 +197,8 @@
196
197
"nightOff": "Night Off",
197
198
"ftpOn": "FTP On",
198
199
"ftpOff": "FTP Off",
200
+
"webdavOn": "WebDAV On",
201
+
"webdavOff": "WebDAV Off",
199
202
"repeatOff": "Off",
200
203
"repeatPlaylist": "Playlist",
201
204
"repeatTrack": "Track",
@@ -229,6 +232,7 @@
229
232
"sleep": "Sleep timer",
230
233
"night": "Night mode",
231
234
"ftp": "FTP server",
235
+
"webdav": "WebDAV server",
232
236
"bluetooth": "Bluetooth mode",
233
237
"lock": "Lock controls"
234
238
}
@@ -454,6 +458,29 @@
454
458
"stopButton": "Stop FTP server"
455
459
}
456
460
},
461
+
"webdav": {
462
+
"title": "WebDAV settings",
463
+
"desc": "Mounts the SD card as a network drive so you can copy audio files onto it straight from your PC/Mac (connect to it as a WebDAV server in Finder/Explorer).",
464
+
"enable": "Start WebDAV automatically on boot",
465
+
"user": {
466
+
"title": "WebDAV username",
467
+
"placeholder": "username"
468
+
},
469
+
"pwd": {
470
+
"title": "WebDAV password",
471
+
"placeholder": "password",
472
+
"show": "Show/hide password"
473
+
},
474
+
"auth": {
475
+
"hint": "Leave username and password empty to allow access without a login."
476
+
},
477
+
"start": {
478
+
"title": "Start WebDAV server",
479
+
"desc": "Enables the WebDAV server until the device is restarted.",
480
+
"button": "Start WebDAV server",
481
+
"stopButton": "Stop WebDAV server"
482
+
}
483
+
},
457
484
"sync": {
458
485
"title": "File synchronization",
459
486
"intro": "Downloads files from a web server (e.g. nginx) onto the SD card. The ESPuino fetches a <b>JSON manifest</b> from the URL below and downloads every file listed in it that is missing locally or has a different size. It is <b>additive only</b> – local files are never deleted. Syncing only runs while nothing is being played from the SD card.",
Copy file name to clipboardExpand all lines: html/locales/fr.json
+27Lines changed: 27 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -37,6 +37,7 @@
37
37
"wifi": "WiFi",
38
38
"mqtt": "MQTT",
39
39
"ftp": "FTP",
40
+
"webdav": "WebDAV",
40
41
"sync": "Sync",
41
42
"bluetooth": "Bluetooth",
42
43
"general": "Général",
@@ -189,6 +190,8 @@
189
190
"nightOff": "Nuit Off",
190
191
"ftpOn": "FTP On",
191
192
"ftpOff": "FTP Off",
193
+
"webdavOn": "WebDAV On",
194
+
"webdavOff": "WebDAV Off",
192
195
"repeatOff": "Off",
193
196
"repeatPlaylist": "Playlist",
194
197
"repeatTrack": "Piste",
@@ -222,6 +225,7 @@
222
225
"sleep": "Minuterie de veille",
223
226
"night": "Mode nuit",
224
227
"ftp": "Serveur FTP",
228
+
"webdav": "Serveur WebDAV",
225
229
"bluetooth": "Mode Bluetooth",
226
230
"lock": "Verrouiller"
227
231
}
@@ -447,6 +451,29 @@
447
451
"stopButton": "Arrêter le serveur FTP"
448
452
}
449
453
},
454
+
"webdav": {
455
+
"title": "Paramètres WebDAV",
456
+
"desc": "Monte la carte SD comme lecteur réseau pour copier des fichiers audio directement depuis votre PC/Mac (connectez-vous en tant que serveur WebDAV dans le Finder/Explorateur).",
457
+
"enable": "Démarrer WebDAV automatiquement au démarrage",
458
+
"user": {
459
+
"title": "Nom d'utilisateur WebDAV",
460
+
"placeholder": "nom d'utilisateur"
461
+
},
462
+
"pwd": {
463
+
"title": "Mot de passe WebDAV",
464
+
"placeholder": "mot de passe",
465
+
"show": "Afficher/masquer le mot de passe"
466
+
},
467
+
"auth": {
468
+
"hint": "Laissez le nom d'utilisateur et le mot de passe vides pour un accès sans connexion."
469
+
},
470
+
"start": {
471
+
"title": "Démarrer serveur WebDAV",
472
+
"desc": "Active le serveur WebDAV jusqu'au redémarrage du périphérique.",
473
+
"button": "Démarrer le serveur WebDAV",
474
+
"stopButton": "Arrêter le serveur WebDAV"
475
+
}
476
+
},
450
477
"sync": {
451
478
"title": "Synchronisation de fichiers",
452
479
"intro": "Télécharge des fichiers depuis un serveur web (p.ex. nginx) vers la carte SD. L'ESPuino récupère un <b>manifeste JSON</b> à l'URL ci-dessous et télécharge tous les fichiers listés qui manquent localement ou ont une taille différente. C'est <b>uniquement additif</b> – aucun fichier local n'est supprimé. La synchronisation ne s'exécute que lorsqu'aucune lecture n'est en cours depuis la carte SD.",
0 commit comments