Blocktext, Block-Index und Zeichenoffsets stimmen nun bei sechs echten Büchern exakt mit
parseEpub des Web-Readers überein. Grundlage für einen echten Fortschrittsanteil
(fraction_for_anchor) statt 0.0. Parser html5lib statt lxml, Rohinhalt statt
ebooklib-get_content (formatiert um), UTF-8 wie JSZip.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
HTML-Kommentare zählten als Text (1435 Blöcke in einem Testbuch), Leerraum wurde mit
Pythons statt JavaScripts \s zusammengezogen, Fußnotenmarker bekamen Leerzeichen.
Neu: tests/ (Blockliste, Anker, App-Start mit Textual-Pilot) und tools/parity/ – vergleicht
Anzahl und Tags der Blöcke mit parseEpub aus dem Web-Reader in headless Chromium
(6 Bücher, bis 25.798 Blöcke: gleich).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Die Folgen eines YouTube-Kanals werden gehört wie Podcasts; unterbrochen wird man
darin von der Werbung und vom Schluss. Beides markieren andere Hörer bei
SponsorBlock: podcasts/sponsor.py fragt je Folge einmal danach (nur sponsor und
outro, nur Teile, die übersprungen werden, kein „full“) und legt die Antwort an
der Folge ab (PodcastEpisode.sponsor); GET /podcasts/episodes/<id>/sponsor/
antwortet damit. Eine Antwort gilt eine Woche, ein Fehlschlag eine Stunde.
Der Player springt über solche Teile (podcasts-web.js für Browser und Desktop,
in der App später der eigene Player); der Schalter heißt skip_sponsor, steht bei
„Stille überspringen“ im Abspiel- und Tempomenü, ist an und wirkt nur bei
YouTube-Folgen (default on). e2e/sponsor.spec.js spielt es in Chromium durch;
sw v155
Der Aufruf an den Server war "abschicken und vergessen": scheiterte er (kein Netz, 5xx,
ein Proxy dazwischen), wurde er still verworfen und der Artikel war nach dem nächsten
Laden wieder ungelesen.
Jetzt wird auf dem Gerät markiert und der Aufruf gemerkt (localStorage
diora_feeds_read_pending) - wie die Hefte es mit diora_issue_pending schon tun. Er geht
nach, sobald das Gerät wieder online ist oder die Liste neu geladen wird. Eine
4xx-Antwort (der Artikel ist beim Server weg) wird nicht wiederholt, sonst würde die
Warteschlange nur wachsen.
sw v154.
Eine App mit alter Bücherliste (Desktop während des langsamen Syncs) hat beim Öffnen fünf
MEW-Bände mit ihrem alten Stand überschrieben – Titel, Autor, Ordner weg. base_iv sagt dem
Server, von welchem Stand eine Änderung ausgeht.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- GET /podcasts/episodes/?folder=<name> ('' = ohne Ordner)
- /podcasts/state/: interval_days je Feed (mittlerer Abstand der neuesten 10 Folgen,
eine Abfrage per Window, eine Stunde gemerkt)
- Podcast-Oberfläche aus diora-android bd98557 (Zeiträume, Ordner-Chips in „Folgen“)
- docs/library.md, sw v134
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Floskeln je Quelle (Spendenboxen u. ä.) verschwinden aus dem Artikel
- Überblick einer Meldung aus mehreren Quellen: Zusammenfassung (LexRank + MMR),
was nur ein Bericht sagt, Wortwahl je Quelle, dieselbe Meldung in der anderen Sprache
(GET /feeds/stories/<id>/overview/)
- Themen-Chips über den Nachrichten (topics auf der ersten Seite, ?ids= filtert)
- before= mit unkodiertem '+' gibt keinen 500 mehr
- sw v133
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ein MEW-Band mit 1000 Seiten bereitete vorher jede Seite vor und zeichnete alle, bevor er sich
zeigte – Minuten und Gigabytes. e2e/pdf.spec.js mit einem 400-Seiten-PDF (e2e/make_pdf.py, pypdf).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- YouTube antwortet auf Kanal-Feeds derzeit bei etwa zwei von drei Abrufen
grundlos mit 404 (Kanäle zeigten „lädt nicht: HTTP 404“): ein YouTube-Feed
wird bis zu 12-mal im Abstand von 0,25 s gefragt. Tests dazu.
- Erscheinungsbild „Automatisch“: in der Android-App folgt die WebView nicht
dem System, sondern dem (dunklen) App-Theme – die Seite fragt dort
DioraNative.systemScheme() und hört __dioraSystemScheme bei einem Wechsel.
sw.js: diora-v129.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- EPUB: ein Artikel ist eine Datei; die Einträge danach in dieselbe Datei
sind seine Abschnitte, gleich auf welcher Ebene (beim GegenStandpunkt
stehen Zwischenüberschriften teils ganz oben). Unterzeile = die Schlagzeile
unter dem Titel, nicht nummerierte Abschnitte.
- PDF: die meisten Hefte haben keine Lesezeichen – die Artikel kommen jetzt
aus dem gedruckten Inhaltsverzeichnis (Jacobin, NLR, LuXemburg,
manuskripte): Seitenzahl vorn oder hinten, Autor in eigener Spalte oder
darunter („Von …“), Titel in Versalien über mehrere Zeilen, Rubriken; die
gedruckten Seitenzahlen werden über die Titel auf die PDF-Seiten abgebildet.
- Index-Version 2: schon gebaute Indizes werden neu gebaut.
sw.js: diora-v128.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Das Heft bleibt das Dokument, der Artikel die Einheit, in der man sich
bewegt (docs/library.md):
- Artikel-Index auf dem Gerät aus dem Inhaltsverzeichnis des EPUB bzw. den
Lesezeichen des PDF (Rubriken, Anreißer, Lesezeit), verschlüsselt im Meta.
- Stand pro Artikel (gelesen / übersprungen, wo man war), verschlüsselt im
Meta, offline gepuffert.
- Bibliothek: Segmentbalken pro Heft, „7 von 23 gelesen“; ein Tipp öffnet den
Heft-Inhalt mit Rubriken, Stand je Artikel, „Im Heft weiterlesen“, „Heft
abschließen“.
- Reader: Kopfzeile „Artikel 8 von 23“, am Ende jedes Artikels eine Zäsur
(gelesen, Weiter im Heft, Zum Inhalt, überspringen); bei PDF eine Leiste
beim Weiterblättern. Durchgelesene Artikel zählen als gelesen, Sprünge nicht.
sw.js: diora-v127.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In der Ansicht eines Hörbuchs „↓ Herunterladen“: alle Kapitel, die noch
fehlen, ab dem nächsten (mit Fortschritt „Lädt … 12/56“, danach „Auf dem
Gerät“); je Kapitel ein Download-Zeichen (laden, Fortschritt, erneut
versuchen, löschen) und im ⋮-Menü „Vom Gerät löschen“. Nur wo der Host
Downloads kann (DioraNative.podcastDownload); sw.js: diora-v126.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>