53246 Commits

Author SHA1 Message Date
Fabian Schuller
7b4840f54e
Update recipe for My Zeit EPUB subscription 2026-03-26 22:18:38 +01:00
Kovid Goyal
bf047369aa
string changes 2026-03-26 19:23:20 +05:30
Kovid Goyal
2694316480
... 2026-03-26 19:22:54 +05:30
Kovid Goyal
a0b8337305
Cleanup previous PR 2026-03-26 16:42:01 +05:30
Kovid Goyal
a282b84522
Merge branch 'completion-extra_word_break_chars' of https://github.com/un-pogaz/calibre 2026-03-26 16:39:28 +05:30
un-pogaz
56544fd826 add tweak extra_word_break_chars to completion mode 2026-03-26 09:58:51 +01:00
Kovid Goyal
ce7a4bb490
Cleanup previous PR
Fixes #2146404 [Changing lookup name clears all custom notes](https://bugs.launchpad.net/calibre/+bug/2146404)
2026-03-26 08:30:26 +05:30
Kovid Goyal
b5f6a9ae7e
Merge branch 'copilot/fix-column-lookup-name-bug' of https://github.com/kovidgoyal/calibre 2026-03-26 08:28:43 +05:30
copilot-swe-agent[bot]
fcd1a00660 Handle column deletion notes cleanup and add rename/delete tests
Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com>
Agent-Logs-Url: https://github.com/kovidgoyal/calibre/sessions/5be45f66-584e-4aa4-9598-3ef2020d7fef
2026-03-26 02:50:43 +00:00
copilot-swe-agent[bot]
58275cb151 Fix notes loss when changing custom column lookup name
Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com>
Agent-Logs-Url: https://github.com/kovidgoyal/calibre/sessions/9a307edd-abb8-421b-a419-6d8f435a0148
2026-03-26 02:28:16 +00:00
Kovid Goyal
ff1d6ba2cd
When completing in word-prefix mode treat hierarchy separators as word delimiters 2026-03-26 06:14:19 +05:30
Kovid Goyal
026906075c
Added another test 2026-03-26 05:58:02 +05:30
copilot-swe-agent[bot]
0695b719fa
Disable hyphen-joining when hyphen is an extra break char
- Add hyphen_is_extra_break flag to icu_BreakIterator struct
- Set flag at creation time by checking if any extra break char is
  a hyphen (0x2d or 0x2010) via IS_HYPHEN_CHAR
- Move IS_HYPHEN_CHAR macro before struct definition so it's usable
  in the constructor
- Guard all hyphen-joining logic (leading_hyphen, trailing_hyphen,
  is_hyphen_sep) and sub-segment trailing-hyphen detection behind
  !bi->hyphen_is_extra_break check
- Add test: BreakIterator with '-' extra break splits 'out-of-the-box'
  into ['out', 'of', 'the', 'box']

Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com>
Agent-Logs-Url: https://github.com/kovidgoyal/calibre/sessions/b439270b-8a40-4b51-96f2-8f869de7983d
2026-03-26 05:56:33 +05:30
copilot-swe-agent[bot]
95fa8f2ada
Modify ICU break iterator API to support extra word-break characters
- Add optional extra_word_break_chars field (sorted UChar32[]) to
  icu_BreakIterator struct, stored as a sorted array for efficient lookup
- icu_BreakIterator_new accepts optional 3rd argument (Python str) that is
  parsed into a sorted UChar32[] via insertion sort; only applies to UBRK_WORD
- icu_BreakIterator_dealloc frees the extra chars array
- New find_extra_word_break() inline helper scans a UTF-16 segment for the
  first matching extra-break codepoint using U16_NEXT + linear search
- BreakIterState gains extra_break_active/seg_start/seg_end sub-segmentation
  state fields (zero-initialized by memset in break_iter_state_init)
- break_iter_state_next refactored from while loop to for(;;) to drain
  sub-segments before fetching more ICU data; extra break within an ICU word
  segment causes the piece before it to flow through normal hyphen-joining
  logic while the tail is deferred; trailing-hyphen detection on sub-segments
  enables hyphen-joining with subsequent ICU segments
- Fast path: num_extra_word_break_chars == 0 → single comparison, zero overhead
- Tests added covering: letter extra break char, count_words/split2, adjacent
  breaks, multiple chars, None arg, surrogate-pair extra break char

Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com>
Agent-Logs-Url: https://github.com/kovidgoyal/calibre/sessions/c003ae42-1e56-4dbb-9ef2-9f1645b76c70
2026-03-26 05:56:33 +05:30
Kovid Goyal
9fc0ea9121
Initial definition automate browser class 2026-03-26 05:29:04 +05:30
Kovid Goyal
2070699dfb
Ignore inapplicable CVE in python 2026-03-25 20:21:50 +05:30
Kovid Goyal
bc6c818a18
Update bundled rapydscript 2026-03-24 21:30:17 +05:30
Kovid Goyal
c97e98e60b
Move some function definitions out of branches 2026-03-24 21:26:02 +05:30
Kovid Goyal
404ee855f1
Cleanup previous PR 2026-03-24 21:22:30 +05:30
Kovid Goyal
1424c17944
Merge branch 'businessline-recipe-update' of https://github.com/typhoons01/calibre 2026-03-24 21:20:14 +05:30
typhoons01
61c7aff889 cover image addition 2026-03-24 21:00:41 +05:30
typhoons01
aa564ddce8 Updated recipe for BusinessLine 2026-03-24 20:54:53 +05:30
Kovid Goyal
bf70e6fc34
String changes
Fixes #2145828 [Calibre Manual Typo](https://bugs.launchpad.net/calibre/+bug/2145828)
2026-03-24 18:58:35 +05:30
Kovid Goyal
bb286f660f
Tweak book: File list: Allow using ctrl+Left/Right to move an item to top/bottom of the list 2026-03-24 08:42:32 +05:30
Kovid Goyal
a1bba6a788
Merge branch 'feat/app-kill-state-management' of https://github.com/Victor239/calibre 2026-03-23 08:35:29 +05:30
Victor239
ba5555303e E-book viewer: track pending annotation uploads per-book in IDB
Previously a single 'pending-annot-upload' IDB key was used, so only
the last-annotated book's pending upload survived an app kill. With
multiple books annotated offline (or across multiple tabs), earlier
books' uploads were silently dropped from the queue. A related bug
caused stale in-memory state from a previous book to be used on Sync
after navigating between books in the same tab, potentially sending the
wrong annotations to the wrong book endpoint.

Changes:
- IDB key is now 'pending-annot-upload:{library_id}/{book_id}/{fmt}',
  one entry per book, so all books' pending uploads survive independently
- New get_all_pending_annot_uploads() uses an IDB cursor range query to
  retrieve every pending entry
- clear_pending_annot_upload() now takes book identity params and a
  completion callback so the next upload starts only after the IDB
  delete has committed
- _make_annot_upload_done() returns a per-book closure used as the ajax
  callback, replacing the single _annot_upload_done method
- After each successful upload, _upload_next_from_idb() fetches and
  uploads the next pending entry, draining the queue sequentially
- _on_network_restored() no longer requires a book to be open, so
  pending uploads from other books are flushed even from the homepage
- load_book() clears unsynced_amap and the indicator timer/state so
  stale in-memory state from the previous book is never used
2026-03-22 14:15:42 +00:00
Victor239
215caf3525 E-book viewer: use Web Locks to prevent duplicate storage.persist() prompts
When multiple tabs open simultaneously, coordinate with navigator.locks
using ifAvailable so only the first tab calls persist(). Tabs that lose
the lock skip the call entirely, preventing the browser from showing
redundant permission prompts. Falls back to the persisted() check for
browsers without Web Locks support.
2026-03-22 12:24:43 +00:00
Victor239
466e357975 E-book viewer: skip storage.persist() if persistence already granted
Check navigator.storage.persisted() before calling persist(), so tabs
opened after permission was already granted do not trigger a redundant
browser prompt.
2026-03-22 12:13:37 +00:00
Victor239
9826040725 E-book viewer: use builtin highlight yellow for unsynced sync button tint
Replace hardcoded #d4a017 with builtin_color('yellow', is_dark_theme()),
which resolves to #ffeb6b (light theme) or #906e00 (dark theme) — the
same values used for yellow text highlights. Single source of truth in
calibre/constants.py.
2026-03-22 11:24:12 +00:00
Victor239
f5197fc6c0 Revert: remove resend on auth failure 2026-03-22 11:12:38 +00:00
Kovid Goyal
16edb6a5d2
Cleanup previous PR 2026-03-22 08:20:51 +05:30
copilot-swe-agent[bot]
246933bd6a
Bookshelves: Add option to have the height of books be constant per group
Fixes #3059
2026-03-22 08:02:37 +05:30
Victor239
b3c2191022 E-book viewer: retry annotation upload every 5s after 401 auth
Replace the single 1.5s one-shot retry with a repeating 5s timer loop.
Each 401 response cancels any pending retry and schedules a new one 5s
later, so auth retries continue indefinitely until the upload succeeds —
regardless of how long the user takes to submit credentials in the
browser auth dialog.

On success the retry timer is cancelled. A manually triggered
upload_pending_annotations call also cancels any pending retry before
firing its own request.
2026-03-22 01:07:48 +00:00
Victor239
0969737df7 E-book viewer: retry annotation upload once after 401 auth challenge
When the calibre server restarts with user/password auth, an in-flight
annotation upload receives a 401. The browser shows the auth dialog and
the user provides credentials, but nothing retried the upload afterward.

Fix: on a 401 response, schedule one retry 1.5s later (giving the
browser time to process the auth dialog and store credentials). A flag
prevents cascading retries — if the second attempt also fails the
indicator stays on and the user can sync manually via the Sync button.
The flag resets on success or at the start of any new upload attempt.
2026-03-22 00:51:33 +00:00
Victor239
049b91580a E-book viewer: fix unsynced indicator missing after Android app kill
When the page reloads after an app kill, upload_pending_annotations
finds the surviving IDB entry and sets unsynced_amap, but never called
_reschedule_unsynced_indicator — so the 60s timer never started and
the indicator never appeared even if the upload failed.

Fix: call _reschedule_unsynced_indicator after loading unsynced_amap
from IDB, giving the same behaviour as a fresh annotation upload.
2026-03-22 00:49:58 +00:00
Victor239
0d9371bd62 E-book viewer: show unsynced changes indicator after 60s
- Tint the Sync button icon amber (#d4a017) when annotation uploads
  have been failing for >60s
- Show persistent "Unsynced changes" text in the bottom footer margin
  at the same 60s threshold, using the existing current_status_message
  override slot in update_header_footer
- Track indicator state with a reschedulable timer in ReadUI so rapid
  annotation saves don't flicker the indicator; cleared automatically
  on successful upload
2026-03-22 00:35:40 +00:00
Victor239
530b42b748 E-book viewer: survive Android app kills without losing annotations
- Request persistent IDB storage so Firefox Android never evicts origin data
- Persist pending annotation uploads to IDB so they survive page reloads
- Auto-retry upload on network recovery and on book open
- Fix SyncBook race: upload annotations and position before downloading
2026-03-21 22:39:50 +00:00
Kovid Goyal
2c9af589ed
Update Naked Capitalism 2026-03-21 17:25:54 +05:30
copilot-swe-agent[bot]
f23369204d
E-book viewer: Do not store searches performed via the --open-at command line flag in search history
Fixes #3056
2026-03-21 06:22:17 +05:30
Kovid Goyal
a18618015c
Bump preview version 2026-03-21 05:54:18 +05:30
copilot-swe-agent[bot]
fbb043698b
Fix FTS snippet highlight off-by-one: suppress colocated tokens in AUX mode
Fixes #3055
2026-03-21 05:50:41 +05:30
Kovid Goyal
6ae23bf06c
... 2026-03-21 05:03:48 +05:30
Kovid Goyal
d3e78c3fdd
Ignore shutdown error on re-render 2026-03-21 04:34:35 +05:30
Kovid Goyal
3e5e170156
Exit with exit code 0 when killed by hangcheck 2026-03-20 15:13:46 +05:30
Kovid Goyal
d81c6ed0cc
Make test a bit more robust
Use a fixed exit code to communicate parent process was killed
2026-03-20 15:09:12 +05:30
copilot-swe-agent[bot]
101f4c0e62
Make workaround_windows_shutdown_hang more robust against PID reuse
Use a process handle instead of PIDs

Fixes #3054
2026-03-20 15:02:56 +05:30
Kovid Goyal
500958021e
... 2026-03-20 14:05:51 +05:30
Kovid Goyal
d9bee21a51
Windows: Force kill calibre.exe on quit to workaround hang in interpreter shutdown on some systems 2026-03-20 14:03:28 +05:30
Kovid Goyal
6d02a8161a
FTS dialog: Allow sorting by any column 2026-03-20 12:36:17 +05:30
Kovid Goyal
62150573cb
Only show most pages sort option if page counting is enabled 2026-03-20 12:09:48 +05:30