Repository navigation
v1.19
Added
- Next unread… on a manga's Download menu. Choose a number and that many
unread chapters are fetched in reading order. Chapters you already have are
skipped rather than counted, so asking for five means five you do not have.
The last number you used is remembered and can be accepted as-is. - Download the next five offered at the end of a chapter, but only when the
next chapter is not already on the device. Accepting fetches them and then
opens the one you were about to read. Read state is ignored here: someone
re-reading a series wants the files regardless. - Refresh covers in the plugin menu, and Refresh on a manga's details
page, for replacing artwork deliberately. - Debug → Sweep stale covers, removing older versions and covers for manga
no longer in the library. It also runs after each library refresh, and the
stale count shows in the cover cache menu entry.
Changed
- A cover is downloaded once and then kept. The cache key previously
included the server's thumbnail timestamp, so every server-side refetch
produced a new key and the cover was downloaded again — repeatedly, for
artwork that had not meaningfully changed. Covers are now replaced only when
you ask. - Load covers while browsing is now Fetch missing covers while
browsing: only covers you do not already have are ever fetched.
Fixed
- KOReader could quit when closing the manga details view. Opening a
chapter closes the bookshelf, details and chapter list, so afterwards no
parent view remained. Closing a view then emptied KOReader's widget stack,
which it treats as "nothing left to show" and exits — indistinguishable from
a crash, and landing in the file browser when one happened to be underneath.
The plugin now reopens the bookshelf rather than leaving nothing on screen. - WAL was never enabled on the sync database.
PRAGMA journal_mode = WAL
inschema.sqlreturns a row, which the SQLite binding rejects, so the whole
schema failed and an inline fallback ran instead. Sync worked, so the only
symptom was a warning in a log nobody reads. Pragmas are now applied
separately and tolerated individually. - Superseded covers were never deleted. Each re-download left the previous
file behind. Those orphans counted towards the cover cache cap, and once it
was reached the eviction sweep could remove live covers while dead ones
survived. Old versions now go as soon as a new cover is written. - Refreshing could lose a cover. Refresh deleted the cached file and then
downloaded a replacement, so a server that had lost the cover left you with
nothing. It now downloads first and replaces only on success — a failed
refresh keeps what you had, and reports how many were kept. - Refresh on the details page did not fetch the new cover, leaving a title
placeholder. - Number pickers would not accept their current value. The confirm button
stayed disabled until the number changed, so accepting the remembered value
meant nudging it up and back down first. Affected the download count and the
cover cache limit.
Performance
Menu labels are recomputed every time the menu is drawn, and several needed
numbers that cost real work.
- Cover statistics were quadratic: the stale count scanned the whole cache
directory once per manga — 62 directory listings to answer one question. Now
a single pass. - Six filesystem, JSON and SQL operations per menu render are gathered once
and reused briefly, invalidated at every point that changes them. - Chapter lists did one file check per chapter. On a 500-chapter series
that was 500 syscalls each time the list opened; now one directory listing.
The new lookup was verified against the old one on real files — identical
answers for every chapter.
Testing
- Layout is validated across twelve screen geometries — Colorsoft,
Paperwhite 11 and 10, reMarkable, Scribe and a basic Kindle in both
orientations, plus two very small panels. Small screens matter because the
layout is derived arithmetic: they can drive a tile width or rows-per-page to
zero with no error raised. - 989 assertions across 18 spec files, clean
luacheckrun across 40 files.
Notes
- Upgrading is a straight folder replacement; settings, covers and downloaded
chapters are untouched. Existing covers are kept and will not be
re-downloaded. - The specs cover no widget rendering, gestures, repaints, real SQLite driver
or network calls — which is where every bug found on-device has lived.
Full Changelog: v1.17...v1.19