Drei Nachbesserungen am Annotationen-Feature nach Live-Test:
- Neuer Stift-Button (Marker-Modus) in der Kopfleiste: Textauswahl löst das
Highlight-Popup nur noch aus, wenn der Modus aktiv ist — vorher war die
Funktion unauffindbar (impliziter "einfach Text markieren"-Gestus ohne
sichtbaren Einstiegspunkt) und hätte jede Textauswahl (auch zum Kopieren)
gekapert.
- Freiform-Notizen bekommen keine Textdekoration mehr im Lesefluss — der
Anker dient nur der Positionierung im Rand, nicht der optischen Markierung.
- Die Margin-Sidebar zeigt Notiztext jetzt direkt lesbar als kleine
Post-it-Karte an der zugehörigen Stelle (mit Stapel-Logik gegen
Überlappung), statt nur ein abstraktes Symbol zum Anklicken. Reine
Highlights ohne Notiz bleiben ein kleiner Farbpunkt.
- Highlight-Popover/Tooltip klammern ihre Position jetzt hart an den
Viewport, damit eine Auswahl nahe Seitenrand nicht unsichtbar außerhalb
des sichtbaren Bereichs landet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Textauswahl→Highlight-Popover war implementiert, aber nie verdrahtet (kein
mouseup/touchend-Listener) — als Voraussetzung mit behoben. Neu: freiformige
Notizen ohne Textmarkierung, verankert per Klick in einer neuen linken
Margin-Sidebar (Notiz am ersten Wort der Zeile auf Klickhöhe); Sidebar zeigt
Marker für alle Highlights/Notizen im sichtbaren Bereich und schiebt den
Lesetext nach rechts. Export sammelt alle Markierungen/Notizen eines Buchs in
Lesereihenfolge, nach Kapitel gruppiert, als Textdatei. EPUB-only — PDFs haben
noch keinen Text-Layer (siehe Issue #10).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Books: Reader sprang beim Scroll+sofortigem Tap auf die alte Position
zurück (Anker-Tracking lief nur alle 2s über den Save-Debounce, jetzt
eigener 150ms-Tracker unabhängig davon)
- Books: +/- Buttons neben den Reader-Slidern (Font/Zeilenhöhe/Breite)
- Books: Sicherheitsnetz-Toast bei plötzlichen großen Scroll-Sprüngen
(Fling, aus Versehen 'G' gedrückt) mit Zurückspringen-Option; bewusste
Sprünge (TOC, Lesezeichen, Fortschritts-Eingabe, Suche) lösen ihn nicht aus
- Radio: Donation-Hinweis kam bei vielen Lieblingssendern gefühlt ständig —
jetzt zusätzlich auf ~1-von-10 Plays gedrosselt
- UI: farbige Emoji-Icons (🔍📻⏪⏩💡 etc.) durch monochrome Unicode-Symbole
ersetzt, die nicht mehr je nach OS/Browser-Font unterschiedlich aussehen;
Lesezeichen-Icon war zudem fast identisch zum TOC-Icon
- UI: native alert()/confirm()/prompt() durch eigenes Modal-System ersetzt
- UI: Hash-basiertes URL-Routing für Tabs (#radio/saved, #podcasts/feeds, …)
— Browser-Zurück/Vor und Deep-Links funktionieren jetzt
- Tests: Playwright e2e-Setup gegen isolierte Test-DB (DIORA_DB_NAME),
Smoke- und Auth-Specs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der am weitesten gelesene Wert hat immer Vorrang:
- Server: scroll_fraction = max(neu, aktuell) — ein afk-Fenster bei 10%
kann nicht mehr 80% überschreiben
- Client loadBookList: wenn lokaler Fortschritt > Server, wird gepusht
und für die Anzeige verwendet (deckt Offline-Lesen ab)
- Pending-Flag-Logik entfernt — nicht mehr nötig dank max-Semantik
- saveReaderProgress(force=true): neuer force-Parameter schreibt
Position unabhängig vom gespeicherten Maximum; Button ⚑ im
Reader-Header für den Ausnahmefall "zurück-zum-Anfang"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The 📻 button now opens a sidebar with the currently playing station/track,
play/stop + volume control, and the saved stations list. The old focus
station configuration UI (presets, custom URL input, save-to-server) and
the auto-play-on-book-open behavior are removed.
Closes#6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Python booleans (True/False) in saved_stations (is_favorite field) and
history (scrobbled field) were being rendered literally into JS via
|safe, causing 'True is not defined' ReferenceError that broke all JS
including book loading.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows live progress counter (↻ 3/42) while fetching feeds sequentially,
then reloads the current view when done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Annotates feed queryset with Max(episodes__pub_date) so feeds are sorted
by when their latest episode was published, not when the feed was last fetched.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-play next episode from queue when current episode ends
- Sleep timer (N minutes or end-of-episode) with countdown in button
- In-feed episode filter (client-side search)
- Auto-queue new episodes per feed (⚡Q toggle, inserts at top of queue)
- More playback speeds: 1¾× and 2½× added
- Progress bars + structured meta line in all episode list views (feed, inbox, queue)
- Queue drag-and-drop reorder
- Feed list search filter and sort options (A–Z, Z–A, recently added/refreshed)
- DB migration: PodcastFeed.auto_queue, EpisodeProgress.dismissed
- Inbox: dismiss episodes without marking played, checkboxes for multi-select,
bulk actions (add to queue, mark played, download, dismiss), load-more pagination
- Refresh button in single feed view header
- Hourly background refresh of all subscribed feeds
- Full Media Session API for radio and podcast: Windows taskbar thumbnail buttons
(play/pause/stop/next/seek) now work correctly for both modes
- Playing an episode auto-adds it to the queue if not already there
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- getOrCreateEncKey() now generates a random AES-GCM-256 key if none
found in localStorage, instead of throwing an error
- Removed enc-key-prompt div from player.html entirely
- Simplified initBookDropZone() — removed prompt show/hide logic
- book-upload-area always visible, no longer hidden behind prompt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bypasses unreliable login-form interception; user enters password once
per device to derive the same PBKDF2 key cross-device.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>