Commit graph

643 commits

Author SHA1 Message Date
Chmouel Boudjnah
dbcde0bf13 fix: Keep BookOrbit sign-in details on the server they belong to
Some checks are pending
Build / build (push) Waiting to run
When a BookOrbit server answered a request by pointing somewhere else,
the app followed it and could send the reader's session, and sometimes
what was being saved, to an address it had never checked. Only saving
a reading place or status was protected. Every BookOrbit request now
refuses to be pointed elsewhere.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
5a797265b6 fix: Stop a settings test from tripping over its own leftovers
The home-network settings test left the account screen's background
work running after each case finished. Now and then that work woke up
just as the test was putting things back, and the test failed for no
reason of its own. Each case now stops that work before tidying up.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
3c08c3fe5f docs: Fold the BookOrbit sync notes into the developer guide
The separate BookOrbit position sync notes now live in the BookOrbit
section of the developer guide, next to the rest of the provider rules,
and describe the new catch-up for places saved without a CFI.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
d777688e12 feat: Offer BookOrbit places saved without a CFI while reading
A place saved on BookOrbit as a plain percentage, for example by an
import, used to stop that book from syncing for good unless the book
had just been opened at it. The open reader now offers it with the
"Continue near page" pill, whether it was saved while reading, never
matched this device, or landed while this device was sending. Following
it and reading on sends the new page with an exact place; dismissing it
or going back lets this device's place replace it.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
b3e83b81dc fix: Save the first page turn after a chapter is fitted
When a new chapter loads, the reader tidies wide content such as tables
and puts the reader back on the same spot. If that spot was already on
screen, a leftover marker stayed behind and the next real page turn was
mistaken for the tidy-up, so that page was neither saved nor synced. The
marker is now dropped once the reader has been put back.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
7aac5ab9bc feat: Sync BookOrbit places on every page turn
The reader used to send its place to BookOrbit only after the book was
closed, so a phone put down with the book still open never told the web
reader where it had got to. It now sends on every page turn and when
the phone is locked or the app is left, and it makes sure each page has
the exact place BookOrbit needs. Reading status is now shared too.

When someone else moves the place while a book is open, the reader
offers to follow it with the page, an excerpt and when it was saved.
Following it goes there; declining keeps this phone's place and sends it
over the server's. A book opened at the server's place and read on from
there no longer asks which place to keep on the next open.

The choice between two different places no longer closes and reopens
the book and asks again in a loop. It is answered inside the reader and
shows the page, percentage, chapter and time for both places.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
8000ddfecd docs: Rewrite the BookOrbit sync notes as a current reference
The BookOrbit position notes had grown into a long dated diary of each
step, with many statements that stopped being true once sync was turned
on. They now describe how syncing with BookOrbit works today: what the
server stores, how Liseur proves a reading place before trusting it,
how a save is sent once and confirmed, what happens with places saved
without an exact passage, the agreed rule for competing writes, the
reading status work still waiting for its live check, and a short table
of what was tested. The developer guide and the design record no longer
claim that position sync is missing or disabled.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
fff58268b6 fix: Sync BookOrbit places saved without a CFI
Books whose BookOrbit place was saved as a plain percentage, such as
those read in the web reader, never synced in either direction. Liseur
now opens such a book at that percentage when it is safe to do so: when
the book has no place on this device, when this device's place was
already in agreement and has not moved since, or when this device's
place was never matched and the server is further ahead. In the last
two cases a way back to the old place is offered. Turning a page
accepts the server's place, and the next sync sends the new place with
its exact passage. Taking the way back, or any other jump such as a
bookmark, the contents or the scrubber, turns it down and leaves the
server untouched. A server place that changed again is never
overwritten, and accepting the place is saved together with the page
turn so a crash cannot lose it.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
4822e6b220 feat: Sync BookOrbit reading status
Liseur can now exchange a book's read or unread status with BookOrbit
separately from the reading position, so marking a book read no longer
disturbs a position both sides already agree on. The app sends a status
change once and confirms it by reading it back rather than repeating a
request whose answer was lost. It adopts only statuses someone set by
hand on the server, and it leaves alone books that belong to another
account. Opening a book could also stop accepting the server's position
after the book had been marked read or unread, and that is fixed.
Automatic status sync stays switched off until it has been tried
against a real server.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
21b7e4d9c0 feat: Refresh the server picker
Added a colored book-and-orbit icon for BookOrbit and replaced the old
liseur-sync symbol with its current open-book logo and purple and gold
colors. Included the upstream MIT notice in the Licences screen.

Shortened the provider descriptions and reading-sync labels in all six
languages while keeping the distinction between exact positions,
percentage progress and optional KOReader sync.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
8a735fd613 feat: Give Custom connections a book-and-plug icon
Replaced the generic server symbol with an original purple book, teal
plug and amber bookmark. The drawing represented a user-configured
catalog or reading sync connection without suggesting a server brand.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
f77066a822 feat: Give Komga a colored comic-book icon
Replaced the generic server symbol with an original comic-book drawing
in red, blue and yellow. Kept the upstream artwork out of the app because
its icon credit did not establish a redistributable license. Recorded
the artwork decision alongside the server picker documentation.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
bdd23db62e feat: Enable automatic BookOrbit position sync
Enabled automatic saving of verified EPUB reading places when the reader
closed, with bounded background checks across the library. Conflicts and
unconfirmed saves still required a checked reader choice instead of an
automatic resend. Settings explained that the last server write won and
that reading status and annotations were not synchronized.

Recorded independent Android and web-reader acceptance, including two
Android installations, lost responses, interrupted saves and competing
writes. Updated the provider documentation and all six app languages.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
b7b94886b0 feat: Check whole BookOrbit accounts and recover interrupted saves
Syncing an account now walks its books in small batches that survive
restarts, and reports books that need a decision without hiding them.
A save that may have reached the server before the app was closed is
confirmed when the book is next opened, never sent again blindly, and a
failed save can be retried on request. Live checks with lost network
answers, app kills, rotation and changed accounts are recorded.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
822e7543a3 feat: Let the reader choose between two BookOrbit places
When this device and BookOrbit disagree about where you are, the reader
now asks whether to keep this device's place or take the server's, once
it has confirmed the server's passage exists in the book. The choice is
carried out after the book closes, and an outdated choice is refused if
anything changed in the meantime. The notes also record the remaining
case where two devices write at almost the same moment.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
d5e132e33c feat: Exchange reading places with BookOrbit safely
Liseur can now send its place to BookOrbit and pick up a newer place
from it. Each send is stored before it leaves, checked against the
server just before sending, and only counted as done when the server
reads back exactly what was sent. A newer place from BookOrbit is only
taken after the book is closed and nothing changed meanwhile. The
reader also double checks the passage really on screen, and saved
percentages now match the precision BookOrbit stores.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
0a404c92c0 feat: Open BookOrbit books at the place saved on the server
A book opened for the first time now starts at the place saved on
BookOrbit, once the reader has confirmed that exact passage is on
screen; otherwise it opens normally. Liseur also starts remembering the
last place both sides agreed on, so later changes can be told apart
from ones made on another device. Checks against the BookOrbit web
reader in both directions are recorded.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
8810e01acb feat: Capture exact BookOrbit places while reading
While you read a book that came from BookOrbit, Liseur now works out
the precise BookOrbit address of the words on screen and keeps it next
to its own saved position. An address is only kept when it points back
to the same words in the original book file, so a page turn that cannot
be checked simply saves no address. Tests cover the address shapes the
BookOrbit web reader produces.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
1b6637513e feat: Teach Liseur to read BookOrbit reading places
BookOrbit remembers where you stopped in a book as an EPUB "CFI", a
precise address inside the book, while Liseur uses its own reader
positions. This adds the groundwork to understand those addresses,
check that they belong to the exact file on your shelf, and read the
saved place from the server for one chosen file. It also adds a careful
way to send a place that never sends twice by accident, and records how
the live BookOrbit server really behaves, using sanitized examples.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
fb095bcf5e feat: Add BookOrbit as a remote book server provider
Added support for connecting to self-hosted BookOrbit servers to browse
catalogs and download books. Readers can now authenticate using native
session tokens managed through automatic rotation. Reading position sync
was excluded until EPUB CFI support is implemented, preventing loss of
precise reading locations recorded by the server.
2026-09-24 14:53:34 +02:00
Chmouel Boudjnah
1d1011c0cd fix: Prevent page turning gestures while text selection is active
Some checks failed
Build / build (push) Has been cancelled
Added a selection state tracker to prevent page turn gestures from
interfering with text selection handles as they move.

Fixes #206

Signed-off-by: Chmouel Boudjnah <chmouel@chmouel.com>
2026-09-22 11:39:53 +02:00
Chmouel Boudjnah
4867360e05 fix: Keep fixed-layout EPUB pages unchanged
The new Android text resizing now applies only to books that reflow.\nFixed-layout pages keep their original layout, so positioned text and\nimages are not enlarged or clipped.\n\nThe reader now records Readium's required opt-in and tests both reading\nlayouts.
2026-09-22 09:03:35 +02:00
Chmouel Boudjnah
789031a04b fix: Resize EPUB text with native Android zoom
Readers can now enlarge EPUB text even when a publisher fixed the\nsize of the page or a paragraph. The reader uses Android's text\nresizing path while preserving existing reading preferences.\n\nThe change adds a repeatable test book, records the emulator evidence,\nand explains which device checks still need coverage.
2026-09-22 09:03:35 +02:00
Chmouel Boudjnah
489613ddeb feat: Enable pinch to resize gesture by default
Pinch-to-resize was enabled by default to match reader expectations for
the gesture. Localized strings were updated to advise turning off the
setting if triggered accidentally, and new tests were added to ensure
proper default behavior and state preservation.

Signed-off-by: Chmouel Boudjnah <chmouel@chmouel.com>
2026-09-22 08:01:39 +02:00
Chmouel Boudjnah
d2e5b0ca4c feat: let each footer corner show what you choose
Some checks are pending
Build / build (push) Waiting to run
The line at the bottom of a reading page has three slots. Until now
only the middle one could be changed: the left corner always showed
how far through the book you were and the right always showed the page
number. Both corners are now settings of their own, with fourteen
figures to choose from, among them the pages and the time left in the
chapter, the reading location, the clock and the battery charge. The
two figures that were there before are the defaults, so nothing moves
for a reader who leaves them alone.

Tapping a corner steps it to the next figure, and a small label appears
above the footer for five seconds saying what that corner now shows.
Holding a corner opens a list to pick from directly, which is how the
middle slot already worked. A tap is never offered the one choice that
would empty the whole footer, because that would hide the thing being
tapped; the list can still do it, and all three slots can also be set
from the reading appearance screen.

A slot with nothing to report stays blank, so a corner can be empty
for a moment while a page is still being measured, or for as long as
it takes to learn how fast you read. A corner counting the time left
in the chapter also waits until the chapter itself is known, since
otherwise it would quietly count to the end of the book under a label
saying chapter. The two new figures that come from the phone rather
than the book are read when the page is drawn instead of being
watched, which keeps them from repainting the footer on their own
schedule, and they carry on while a page is still working out where
it is.

The label naming a corner's new figure floats at a height worked out
from the reader's own font size, so it stays clear of the figure it is
explaining for someone who has turned the system font up, and it goes
away when the footer does.

Two corners' worth of care went into the tapping. A corner with
nothing in it is a full-height target, because tapping it is the only
way to fill it back in. Two quick taps no longer land on the same
figure, since each tap reads and writes the setting in one go. And in
a right-to-left locale the corners trade places, so the setting named
for the left corner is the one on the left.

The list of figures reads correctly with a screen reader: each line is
announced as one choice among many with the current one marked, rather
than as a plain button beside a tick nobody describes.
2026-09-21 19:24:02 +02:00
Chmouel Boudjnah
71522c741a
Update README to remove abandoned project link
Some checks are pending
Build / build (push) Waiting to run
Removed the liseur-desktop project from the related projects section.
2026-09-21 09:21:59 +02:00
Chmouel Boudjnah
e5d04b2d8d
Update README to remove strikethrough on liseur-desktop
Removed strikethrough formatting from the liseur-desktop project link.
2026-09-21 09:21:25 +02:00
Chmouel Boudjnah
20666981f9
Update README to remove abandoned project reference
Removed mention of the abandoned liseur-desktop project from the related projects section.
2026-09-21 09:16:25 +02:00
Chmouel Boudjnah
84ed019cf8
Add Google Play badge to README
Some checks are pending
Build / build (push) Waiting to run
2026-09-21 08:09:33 +02:00
Chmouel Boudjnah
383cbbb10b fix: Skip cellular networks in local access checks
Some checks failed
Build / build (push) Has been cancelled
Android does not classify cellular connections as local networks. The
local-network preflight now ignores mobile interfaces while continuing to
check Wi-Fi and Ethernet addresses for home-network access.
2026-09-19 14:56:30 +02:00
Chmouel Boudjnah
5e86d5246e fix: Keep public catalogs reachable on mobile data
Liseur treated a gateway-less mobile default route as if every address
belonged to the reader's local network. This stopped Project Gutenberg
and other public servers before the app tried to contact them, while
showing a permission warning that could not help.

Use the same address-based rules as Android so public servers remain
reachable on cellular connections and home-network servers still prompt
for access when needed.
2026-09-19 14:56:30 +02:00
Chmouel Boudjnah
b00ee7896a
chore: release v0.18.0 2026-09-19 13:44:53 +02:00
Chmouel Boudjnah
c978913b07
chore: Prepare Play production release
Final releases now publish the Play build to production after the testing tracks, while RC releases stay limited to testing. The Play Store listing copy was expanded and localized so the first production release can send the staged launch changes for review with the build.
2026-09-19 13:39:05 +02:00
Chmouel Boudjnah
6533939207 fix: Let the book loading spinner keep your accent colour
Liseur lets you pick a colour for the page you read on, and since
version 0.17 it paints the whole reader in colours that go with that
paper rather than the colours the rest of the app uses. The spinner
shown while a book is opening got swept up in that, so anyone using
their wallpaper's colour for the app saw it turn brown the moment they
opened a book.

The spinner now keeps the app's own colour. It is shown before there is
a book to read at all, on a screen with no page on it, so the paper
colour has nothing to say about it. Everything else in the reader is
unchanged and still follows the page.

The one thing that can override this is legibility. If the colour taken
from your wallpaper is too close to the paper colour to be seen, the
spinner falls back to the reader's own colour rather than disappearing
into the background. The colour is also picked to suit the page it sits
on, so a dark page gets the lighter version of the same colour.

For anyone who has not turned wallpaper colours on, or who is reading on
an e-paper screen, nothing changes at all.

Closes #221
2026-09-19 11:10:40 +02:00
Chmouel Boudjnah
7939ec7820 fix: Stop the load-more retry from starving a stuck feed
Some checks are pending
Build / build (push) Waiting to run
The batch-request path that fetches more Gutenberg books had the same
ordering bug already fixed in the initial catalog walk: a page that
ran out of room mid-read was retried before an earlier feed that had
failed with a "try again later" answer, so a busy or slow feed could
keep losing its turn indefinitely. The retry order now matches the
initial walk, always trying the earlier failure first.
2026-09-19 08:58:41 +02:00
Chmouel Boudjnah
ba1f53553d fix: Close two more gaps in reconnecting to a Gutenberg shelf
A reader who disconnected and reconnected to the very same address
could still be affected by work left over from the connection before:
the app only checked the connection's key (built from the address and
username), which stays the same across a reconnect, so a stale
in-flight write or a stale "here's what happened" message could land
on the new connection. Both places that show or save this kind of
result now also check the moment the connection was made, which always
changes on a reconnect, closing that gap.

Separately, when fetching more books hit a page that could not be read
right away (a timeout or a "try again later" answer), that page was
kept for the next attempt, but a later part of the same batch that
merely ran long could end up retried first and crowd it out forever.
The retry order was fixed so the earlier failure is always attempted
before anything that follows it.

Both fixes came with new tests, and a pre-existing flaky test around
the reconnect scenario was made reliable in the process.
2026-09-19 08:58:41 +02:00
Chmouel Boudjnah
64239f2773 fix: Stop trusting book order in the Gutenberg load-more walk
GitHub's automatic review of the PR flagged two more problems in the
part that fetches additional Gutenberg books. First, a busy Gutenberg
server answering "slow down, try later" (HTTP 429) was being treated
the same as a permanent refusal, so a temporary rate limit could make a
shelf look like it had run out of books when it had not; it is now
retried like any other temporary failure. Second, resuming a feed that
had been cut off partway through used to skip ahead by a remembered
position in the list, but Gutenberg's book ordering can shift between
requests, so a book that moved earlier in the list could be silently
skipped forever. The app now re-reads the whole feed each time and
tells books apart by their identity instead of their position, so a
reshuffled list can no longer hide a book from it.

Added tests covering both cases, and removed the now-unused stored
position field along with its outdated documentation.
2026-09-19 08:58:41 +02:00
Chmouel Boudjnah
f1f46eb435 fix: Tighten up the new load-more books feature
Addressed three problems found in review of the "load more Gutenberg
books" feature. First, if a reader switched accounts right as a
load-more finished, the result could get tagged to the wrong account;
the app now records which account it was reading for at the exact
point it resolves that account, not from a separate, later check that
could see a different account. Second, the on-screen result could
briefly show a leftover answer from before an account switch, until
the app caught up; it now forgets that leftover answer as soon as the
screen stops watching it. Third, saving a starting point for the very
first "load more" tap could wrongly mark a shelf as fully read when a
feed was only skipped, not actually finished; that starting point is
now only saved when it is safe to reuse, so a shelf that could not be
fully read the first time still gets a real chance to catch up later
instead of being told there is nothing more to load.

Added test coverage for a shelf limit that cuts off partway through a
single feed instead of between feeds, and for the case where nothing
is safe to save after an incomplete first read.
2026-09-19 08:58:41 +02:00
Chmouel Boudjnah
e5ad5d18d8 feat: Let readers load more free Gutenberg books after setup
Readers who start a library from the free Gutenberg catalog used to be
stuck with whatever the initial setup pulled in (25 to 200 books) and
had no way to add more without reconnecting from scratch. The library
screen now shows a "Load 50 more books" action once the shelf is
populated, and tapping it fetches another batch in the same category
and language, growing the collection past the original limit.

Progress through the catalog is saved in the database, so a second tap
picks up where the last one left off instead of rereading the same
feeds, and a phone restart does not lose that progress either. A
refresh no longer removes books this shelf has already found, since a
partial refresh of a large, growing collection cannot prove a book is
really gone. Failures (a feed that is offline, or one the server will
never serve again) are told apart, are shown to the reader, and no
longer get stuck retrying something that will never succeed.
2026-09-19 08:58:41 +02:00
Chmouel Boudjnah
1720b5eaa8 docs: Restore synchronization safeguards
Restored the rules that keep older reading history, live updates,\nand retry identifiers consistent while contributors use the new\ndeveloper reference.
2026-09-19 06:34:34 +02:00
Chmouel Boudjnah
67b9118071 docs: Consolidate development guidance
Moved detailed engineering rules from the short agent guide into the\ndeveloper reference so contributors have one durable place to find them.\n\nKept the short guide focused on immediate working rules, updated related\nannotation and reader documentation, and removed the redundant Claude\ninstruction redirect.
2026-09-19 06:34:34 +02:00
Chmouel Boudjnah
0d91bb551f feat: Let readers choose the language of free books
Some checks are pending
Build / build (push) Waiting to run
The shelf of free Project Gutenberg books offered to an empty library
used to be English whatever the phone was set to. It now arrives in
the reader's own language, and a menu at the top of the sheet lets
them ask for one of the other sixteen languages Gutenberg publishes
in. Where a language turns out to have no books for the shelf that
was picked, Liseur connects the English one instead and says so,
rather than leaving the reader with an empty library. "Best books
ever" is a list compiled by hand at Project Gutenberg and exists only
in English, so it is offered only while English is chosen; every
other shelf is a subject that can be searched in any language.

Signed-off-by: Chmouel Boudjnah <chmouel@chmouel.com>
2026-09-19 00:36:50 +02:00
Chmouel Boudjnah
73fe94f55b feat: Add a dev-reset make target to reinstall the side-by-side app
Trying a change from a clean slate meant clearing the development
app's storage by hand, and the usual way of doing that is refused on
some phones, which withhold the permission from the debugging shell.
The new command removes the app and installs it again, which empties
its storage for the same reason a fresh install starts empty, then
opens it. A copy that is not there is simply installed; one that is
there and cannot be removed stops the command, since installing over
it would keep exactly the data the command is meant to drop.

Signed-off-by: Chmouel Boudjnah <chmouel@chmouel.com>
2026-09-19 00:36:50 +02:00
Chmouel Boudjnah
9daee7061e feat: Add italian translations across the entire application
Added complete Italian translations to make the application accessible
to Italian speakers. Migrated reading statistics strings to plural
resources across all supported locales to ensure proper grammatical
forms for varying counts. Documented localization guidelines for
contributors alongside helper targets for testing app locales.

Signed-off-by: Chmouel Boudjnah <chmouel@chmouel.com>
2026-09-19 00:36:50 +02:00
Chmouel Boudjnah
697bf85cb3 fix: stop the page number sticking on an implausibly long book
If the app ever measured a book as far longer than any real book, it
held the total at an upper limit and printed the same page number for
every turn. That is the exact stuck counter this change set out to fix,
so instead of holding the number still the footer now leaves both
figures out until a sensible measurement arrives.

Also corrects two comments that still described the footer in the older
wording, and drops a reference to an unrelated change.
2026-09-18 21:14:08 +02:00
Chmouel Boudjnah
14ecf40cf6 fix: make the reading footer page number move on every page turn
The footer used to show the same page number for several page turns in
a row before it finally ticked over. That happened because the app was
counting fixed-size chunks of the book file instead of actual screens,
so a real screen turn didn't always line up with a change in that
number.

Both footer numbers now count real screens instead. The middle counter
shows how many screens are left in the current chapter, going down by
one on every turn. The bottom right corner shows a page number for the
whole book, worked out from how many screens each part of the book has
been measured to take so far. That estimate gets more accurate as the
book is read and resets itself if the font size, margins, or screen
rotation change, since those change how many screens the same chapter
takes up.

The number can never go backward, even if the reader jumps around the
book or opens it partway through, and it never mixes measurements taken
before and after a font or layout change. Fixed-layout books, which
already had exact page numbers, and scrolling mode, which has no
footer, are unaffected.
2026-09-18 21:14:08 +02:00
Chmouel Boudjnah
c8264afc35 feat: Make Aa controls tappable
Readers can now tap the small and large A labels to change text size one
step at a time. The low and high brightness icons also work as step
buttons, which makes small changes easier than dragging the slider.
2026-09-18 17:36:32 +02:00
Chmouel Boudjnah
237e7c13f3 fix: measure what a cover asks for before drawing it
Some checks are pending
Build / build (push) Waiting to run
A cover file could still ask for far more memory than the size limit on
it suggests: by arriving compressed, which the drawing library unpacks by
itself, or by carrying a picture inside it that claims enormous
dimensions. A compressed cover is now refused, and an embedded picture is
measured before anything is drawn.

Also reads image references the way the drawing library does, ignoring
surrounding spaces, so a cover that wraps a photograph is not left blank
over a stray space.
2026-09-17 16:09:04 +02:00
Chmouel Boudjnah
a78b620522 fix: keep a tiny cover from asking for a huge bitmap
A cover may state a size so small that scaling it up to shelf size
overflowed the arithmetic and asked for the largest bitmap there is. The
scale is now worked out with more precision and each edge is capped.
2026-09-17 16:09:04 +02:00
Chmouel Boudjnah
2db386870b fix: tighten how a cover file is read and drawn
Refuse a file that will not say how large it is, instead of reading
whatever turns out to be there. Wait for the drawing library to be set up
before the first cover is drawn, rather than the moment setting it up
starts. Read both spellings of an image reference, so a cover that wraps
a photograph is not drawn empty because the wrong one was picked.
2026-09-17 16:09:04 +02:00