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 a9f498f
Browse filesBrowse the repository at this point in the historyBrowse files
Audiobook play-position was only persisted at track changes, on an RFID swap,
or on a graceful shutdown. An ungraceful power loss (dead battery, hard power
switch) mid-track therefore fell back to the start of the current track.
Checkpoint the position to NVS every ~30 s while an audiobook is playing
(AudioPlayer_Cyclic), gated by a new "savePosPeriodic" setting (default on,
exposed as the "Checkpoint audiobook position periodically" option). The write
reuses the existing NvsRfidWriteWrapper path and is throttled, so NVS wear
stays negligible.
Add a way to restart a finished/abandoned book from the beginning: the
learned-cards list shows each audiobook tag's saved resume point (track + pos)
and a reset button that calls the new POST /rfidresetpos?id=<tag>, which zeroes
the saved position/track while preserving the folder and play mode. i18n
de/en/fr, Swagger updated.
Verified on device: savePosPeriodic defaults to true; /rfidresetpos returns
200 (folder + mode preserved, position zeroed), 409 for a modification card,
400 without an id and 404 for an unknown tag.
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
@@ -101,6 +101,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
101
101
102
102
| Change | Commit |
103
103
| --- | --- |
104
+
|**Audiobook resume hardening**: while an audio book plays, the play-position is now checkpointed to flash every ~30 s (new **"Checkpoint audiobook position periodically"** option, on by default), so an *ungraceful* power-off (dead battery, hard power switch) only loses the last few seconds instead of falling back to the start of the track — the existing save points (track change / RFID swap / graceful shutdown) didn't cover a sudden loss of power mid-track. The learned-cards list shows each audiobook tag's saved resume point and adds a **restart-from-beginning** button (new `POST /rfidresetpos`) to clear it. i18n de/en/fr |[`PENDING4`](../../commit/PENDING4)|
104
105
|**EQ-rule store overflow guard**: per-path EQ rules are serialized into a single NVS string capped at ~4 KB; adding too many used to silently fail. The device now rejects an over-full save with `HTTP 413` (and reports a failed NVS write as `500`), and the Files tab surfaces a clear *"EQ rule storage is full"* toast instead of losing the rule without feedback |[`PENDING5`](../../commit/PENDING5)|
105
106
|**HTTP-sync robustness**: the file-sync manifest is now streamed straight from the network into the JSON parser (instead of buffering the whole payload in a `String` first), roughly halving peak RAM during the parse on large manifests; the cross-core sync progress message is guarded by a spinlock so the web UI can never read a half-written line |[`PENDING3`](../../commit/PENDING3)|
106
107
| PWA support: web app manifest + app icon, "add to home screen" with proper icon and name |[`b4287b9`](../../commit/b4287b9)|
"info": "Fortsetzen bei Titel {{track}} ({{pos}} s)",
297
+
"reset": "Von vorne beginnen"
298
+
},
295
299
"playmode": {
296
300
"title": "Abspielmodus",
297
301
"placeholder": "Modus auswählen",
@@ -608,6 +612,8 @@
608
612
"savePlayPosShutdownExp": "Beim Ausschalten der Box wird für Hörbücher die Abspielposition gespeichert. Mehr Infos <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>hier</a> unter <code>SAVE_PLAYPOS_BEFORE_SHUTDOWN</code>.",
609
613
"savePlayPosRfidChange": "Abspielposition bei RFID-Tag Wechsel merken",
610
614
"savePlayPosRfidChangeExp": "Beim Wechsel zu einem neuen RFID-Tag wird für Hörbücher die Abspielposition gespeichert. Betrifft keine Modifikations-Tags. Mehr Infos <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>hier</a> unter <code>SAVE_PLAYPOS_WHEN_RFID_CHANGE</code>.",
"savePlayPosPeriodicExp": "Während ein Hörbuch läuft, wird die Position alle ~30 s im Flash gesichert. So gehen bei einem unerwarteten Stromausfall (leerer Akku, harter Aus-Schalter) nur die letzten Sekunden verloren statt bis zum Anfang des Tracks zurückzuspringen. Fork-Funktion.",
611
617
"pauseIfRfidRemoved": "Pause wenn RFID-Tag entfernt",
612
618
"pauseIfRfidRemovedExp": "Pausieren wenn RFID-Tag entfernt wird. Mehr Infos <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>hier</a> unter <code>PAUSE_WHEN_RFID_REMOVED</code>.",
613
619
"dontAcceptRfidTwice": "Denselben RFID-Tag nicht erneut akzeptieren",
"savePlayPosShutdownExp": "When the box is switched off, the playback position for audio books is saved. More information <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>here</a> under <code>SAVE_PLAYPOS_BEFORE_SHUTDOWN</code>.",
609
613
"savePlayPosRfidChange": "Remember playback position at RFID tag change",
610
614
"savePlayPosRfidChangeExp": "When switching to a new RFID tag, the playback position is saved for audio books. Does not affect modification tags. More information <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>here</a> under <code>SAVE_PLAYPOS_WHEN_RFID_CHANGE</code>.",
615
+
"savePlayPosPeriodic": "Checkpoint audiobook position periodically",
616
+
"savePlayPosPeriodicExp": "While an audio book plays, the position is saved to flash every ~30 s. This way an unexpected power loss (dead battery, hard power-off) only loses the last few seconds instead of falling back to the start of the track. Fork feature.",
611
617
"pauseIfRfidRemoved": "Pause when RFID tag is removed",
612
618
"pauseIfRfidRemovedExp": "Playback is paused when the RFID tag is removed. More information <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>here</a> under <code>PAUSE_IF_RFID_REMOVED</code>.",
613
619
"dontAcceptRfidTwice": "Don't accept the same RFID twice",
Copy file name to clipboardExpand all lines: html/locales/fr.json
+6Lines changed: 6 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -285,6 +285,10 @@
285
285
"title": "Fichier, répertoire ou URL (^ et # ne sont pas autorisés comme caractères)",
286
286
"placeholder": "par exemple /mp3/Audiobook/Yakari/Yakari_and_Friends.mp3"
287
287
},
288
+
"resume": {
289
+
"info": "Reprendre à la piste {{track}} ({{pos}} s)",
290
+
"reset": "Recommencer depuis le début"
291
+
},
288
292
"playmode": {
289
293
"title": "Mode de lecture",
290
294
"placeholder": "Sélectionnez le mode",
@@ -597,6 +601,8 @@
597
601
"savePlayPosShutdownExp": "Lorsque la boîte est éteinte, la position de lecture est enregistrée pour les livres audio. Plus d'informations <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>ici</a> sous <code>SAVE_PLAYPOS_BEFORE_SHUTDOWN</code>.",
598
602
"savePlayPosRfidChange": "Mémoriser la position de lecture au changement de tag RFID",
599
603
"savePlayPosRfidChangeExp": "Lors du passage à une nouvelle balise RFID, la position de lecture est enregistrée pour les livres audio. Plus d'informations <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>ici</a> sous <code>SAVE_PLAYPOS_WHEN_RFID_CHANGE</code>.",
604
+
"savePlayPosPeriodic": "Sauvegarder régulièrement la position du livre audio",
605
+
"savePlayPosPeriodicExp": "Pendant la lecture d'un livre audio, la position est enregistrée dans la mémoire flash toutes les ~30 s. Ainsi, une coupure de courant inattendue (batterie vide, arrêt brutal) ne perd que les dernières secondes au lieu de revenir au début de la piste. Fonction du fork.",
600
606
"pauseIfRfidRemoved": "Mettre en pause si la balise RFID est retirée",
601
607
"pauseIfRfidRemovedExp": "Mettre en pause la lecture si la balise RFID est retirée. Plus d'informations <a href='https://forum.espuino.de/t/welche-optionen-beim-kompilieren-gibt-es/120' target='_blank'>ici</a> sous <code>PAUSE_IF_RFID_REMOVED</code>.",
602
608
"dontAcceptRfidTwice": "Ne pas accepter la balise RFID deux fois",
0 commit comments