Skip to content

v1.19

Choose a tag to compare

@trulow trulow released this 04 Sep 08:02
· 2 commits to main since this release

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
    in schema.sql returns 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 luacheck run 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