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 f8298d9
Browse filesBrowse the repository at this point in the historyBrowse files
feat: authenticate the API via HTTP Basic Auth + document fork endpoints
Web_IsAuthenticated now also accepts the web password sent per-request via
HTTP Basic Auth (fixed username "espuino"), so API clients, scripts and the
Swagger UI can authenticate without the cookie/login flow (e.g.
'curl -u espuino:<pw>'). The existing session-cookie path is unchanged, and
with no web password set the API stays open.
Also fills the OpenAPI spec (REST-API.yaml, served at /swagger.html): adds all
fork-added endpoints (/sync, /syncstop, /playlist, /githubupdate, /version,
/login, /logout, /security, /eqrule(s), /activeequalizer, /bluetooth*,
/sdclean) and declares a basicAuth security scheme so 'Authorize' works.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -115,7 +115,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
115
115
| SD card cleanup: removes macOS metadata (`.DS_Store`, `._*`, Spotlight/Trashes) with one click |[`4e68541`](../../commit/4e68541)|
116
116
| Live log: the log dialog refreshes every 2 s and follows the end of the log |[`5183e78`](../../commit/5183e78)|
117
117
| Drag & drop: upload files by dropping them from the file manager onto the file tree |[`f8b477b`](../../commit/f8b477b)|
118
-
| Password protection: single password (no username), 90-day session cookie, logout menu entry, brute-force lockout; inactive in hotspot mode |[`e74e712`](../../commit/e74e712)|
118
+
| Password protection: single password (no username), 90-day session cookie, logout menu entry, brute-force lockout; inactive in hotspot mode. API clients/scripts can also authenticate per-request via **HTTP Basic Auth** (username `espuino`, password = the web password, e.g. `curl -u espuino:<pw>`) instead of the cookie/login flow|[`e74e712`](../../commit/e74e712)|
119
119
| Log download as a text file |[`5d9d591`](../../commit/5d9d591)|
120
120
| Battery indicator in the navbar with a low-battery warning toast |[`4566ae0`](../../commit/4566ae0)|
121
121
| SD card capacity gauge in the files tab and the info dialog |[`45b340a`](../../commit/45b340a)|
@@ -135,6 +135,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
135
135
| **HTTP file sync**: pull audio files from a web server (e.g. nginx) onto the SD card. A new **Sync** settings sub-tab takes a manifest URL plus optional HTTP Basic Auth (user/password); the device fetches a JSON manifest (`{"files":[{"path","size"},…]}`) and downloads every listed file that is missing locally or differs in size, streaming each in small chunks straight to SD. Additive only (never deletes), runs in a background task, and shows live progress including the file currently being downloaded plus a stop button to cancel a running sync. The **Sync** settings sub-tab holds the config (manifest URL + Basic Auth) and documents the manifest format/nginx setup; the actual run button and live progress live in the **Tools** tab, with a shortcut button in the Sync sub-tab that jumps there. If audio is playing when a sync starts, playback is paused for the SD-writing phase and resumes automatically when the sync finishes; pressing play (or skipping a track) cancels the running sync and resumes playback immediately | [`ac24bbc`](../../commit/ac24bbc) |
136
136
|**Fully offline web interface**: all third-party libraries (jQuery, jQuery-UI, Bootstrap JS/CSS, jstree + themes, bootstrap-slider, Font Awesome + webfonts, i18next) and the Orbitron/Rajdhani/Share Tech Mono fonts are now vendored and served gzipped from the device instead of public CDNs. This fixes the ~2-minute first-load hang with empty (untranslated) text after a cold boot/flash, and makes the management UI work without any internet access (incl. AP mode). `processHtml.py` embeds the assets into flash (build size grows accordingly) and now derives unique header symbol names from the full asset path. The libs are concatenated into a single JS and a single CSS bundle (`tools/bundle_assets.py`) so the page makes only a handful of requests — many parallel requests to the ESP32's async web server made some browsers (Safari/Chrome) stall for minutes while Firefox coped |[`c618191`](../../commit/c618191)|
137
137
|**M3U playlist builder**: a "Create playlist" button in the Files tab opens a two-pane builder — browse the SD card on the left, an ordered (drag-to-reorder) track list on the right — to assemble an `.m3u` from SD files, whole folders, and webradio URLs (which `LOCAL_M3U` plays interchangeably). Saving writes `/Playlists/<name>.m3u` via a new `POST /playlist` endpoint; the file can then be assigned to an RFID tag with play mode 11. i18n de/en/fr |[`af041fc`](../../commit/af041fc)|
138
+
|**OpenAPI/Swagger spec updated**: the bundled `REST_API.yaml` (served at `/swagger.html`) now documents all fork-added endpoints (`/sync`, `/syncstop`, `/playlist`, `/githubupdate`, `/version`, `/login`, `/logout`, `/security`, `/eqrule(s)`, `/activeequalizer`, `/bluetooth*`, `/sdclean`) and declares a `basicAuth` security scheme so the Swagger "Authorize" button works (username `espuino`) |[`PENDING`](../../commit/PENDING)|
0 commit comments