Repository navigation
Releases: trulow/suwayomi.plugin
Releases · trulow/suwayomi.plugin
Release list
v1.35
Everything since v1.19.
Fixed — sync
- A finished chapter never reached the server. Finishing a chapter queued
read, but a final page-progress record then replaced that queued row with
progress— carrying the read flag correctly, and then having it stripped on
the way out, because progress pushes deliberately omitisRead. The device
showed the chapter read, the queue drained successfully, and every sync
reported nothing to do.isReadis now withheld only when the queued change
does not know the chapter is read, and a progress record no longer overwrites
an explicitreadorunreadalready waiting to send. - Marking a chapter unread on the server was undone. Our sync metadata is
not removed when another client changes the read flag, so the plugin saw its
own last write beside a state that no longer matched, treated that as a tie,
and pushedreadstraight back. When there is nothing unsent locally, the
server now wins — in both directions. An unsent local change still takes
precedence, so a read you have just made is never lost. - Queued changes were never sent after reconnecting. The outbox only
drained on a manual sync or on opening a chapter list. It now also drains
when Wi-Fi returns and when the bookshelf opens. - Finishing a chapter did not mark it read in the list or the cache. Only
the long-press "Mark read" did that, so offline — where nothing refreshes —
a finished chapter went on showing unread. - An expired login was not renewed. The server reports authentication
failures inside a normal response rather than as an HTTP error, so the
automatic token refresh never triggered and pushes failed until you logged in
by hand. - Queue writes are now verified, so a change can no longer be recorded locally
while silently failing to queue.
Fixed — navigation
- KOReader could exit to the device home screen after reading, when closing
the chapter list and then the bookshelf. Opening a chapter closes all three
plugin views, so nothing remained underneath, and an empty screen ends the
application. The file browser is now restored before the last view closes. - Closing the chapter list returned to the bookshelf instead of the manga
you were reading. The way back is now chapter list → manga details →
bookshelf → file browser.
Fixed — bookshelf
- The chosen sort was silently reverted. Opening the shelf sorted the
cached list correctly, then a background refresh replaced it with the
server's own order — title ascending — while the header still named your
sort. - The header now names the sort that was actually applied, not the one
requested, in the rare case a library has no data to sort on.
Changed
- Sort the bookshelf by last read or by newest chapter. Sorting by date
added has been removed: for a library built months ago it answers no useful
question. A saved "Recent" preference becomes "Newest".
Added
- Debug → Sync diagnostics now reports the path index, the open document
and whether it is recognised, unsynced chapter states, the queued rows with
their recorded errors, and a warning when a change is marked unsynced but
never queued. It no longer requires a network connection to show local
findings, and it never writes to the server.
Performance
- Cover statistics were quadratic — the stale count scanned the whole cache
directory once per manga. Now a single pass. - Menu labels no longer recompute six filesystem, database and JSON operations
on every draw. - Chapter lists did one file check per chapter; a 500-chapter series meant 500
system calls each time the list opened. Now one directory listing.
Notes
- Upgrading is a straight folder replacement. Settings, covers, downloads and
queued sync changes are untouched. - 1135 assertions across 20 spec files, clean
luacheckrun across 42 files.
Full Changelog: v1.19...v1.35
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
v1.17 — first release
Added
- Bookshelf: paged cover grid with disk cache, or a left-aligned list view.
Search, sort by title / unread / recently-added, filter by category. - Manga details: cover, author, artist, status, genres, description, and a
Continue button that opens the chapter you stopped part-way through. - Chapter list: read state, chapter number, scanlator, upload date, reading
progress, and whether the file is on the device. Newest-first or oldest-first. - Download and read: chapters fetched page by page, assembled into a CBZ with
ComicInfo.xml, opened in KOReader's own reader. Resumable at the page level. - Bulk downloads: all missing chapters, unread only, or a typed range
(1-50). Pause and resume, with the queue persisted to disk. - Deleting: per-series (all, read only, or a range) or library-wide. Sizes and
counts shown before anything is removed; unread downloads never touched. - Bidirectional read-status sync with a SQLite outbox that survives restarts.
Page progress debounced at 25 seconds. Rules indocs/sync.md. - Offline support: bookshelf, cached details and chapter lists, and any
downloaded chapter work with Wi-Fi off. Save for offline… pre-fetches
metadata for the library. - Next chapter at end of book, downloading it if needed; back to chapter list
or bookshelf. Bindable as gestures. - Debug menu: sync, offline and cover diagnostics, library dump, reset local
sync state.
Notes
- Requires a Suwayomi-Server with the GraphQL API at
/api/graphql. Every
query was written against the committed introspection dump inschema/. - Do not also run Suwayomi's built-in KOReader sync — two systems writing the
same read state will make progress oscillate. - No stream mode, no source browsing, and no add/remove from library. Bookmarks
are not synced. - Pages download sequentially; parallel fetching is not achievable in pure Lua
with blocking sockets.
Full Changelog: https://github.com/trulow/suwayomi.plugin/commits/v1.17