Justin Mitchell 6e80153150 Mark on-device books by local library name match instead of downloading
The previous approach read each unknown book's metadata by downloading
it over HTTP. The device's web server streams whole files synchronously
and can't serve a partial/early-aborted read, so streaming just the OPF
stalled the single-threaded server and a connect with side-loaded books
took minutes.

Since a book can only be marked on-device if it exists in the library,
match locally instead: index the current library by normalized title and
resolve each device file by its file name, attaching the library book's
uuid so Calibre marks it. Same-title collisions are disambiguated by an
author appearing in the device path (order-independent, so author-sort
folders match); ambiguous files are left unmarked rather than mismatched.
No network transfer is involved.

The download path is kept only as an opt-in last resort (Fetch metadata,
off by default) for library books whose on-device name doesn't resemble
the title. Also adds per-book progress during books() and removes the
unused streaming reader.
2026-06-21 13:04:14 -04:00
2026-02-22 18:43:12 -05:00

Calibre Plugins

Calibre plugins for CrossPoint Reader.

Plugins

CrossPoint Reader

A wireless device plugin that uploads EPUB files to CrossPoint Reader over WebSocket. The plugin auto-discovers devices on the local network via UDP broadcast.

It can also optimize EPUBs before transfer — mirroring the optimizer built into the CrossPoint web server — by resizing images to the device screen (X4 480×800 / X3 528×792, auto-detected), converting them to grayscale JPEG, and rewriting the container. The optimizer is based on the initial work by @zgredex, ported here from the firmware. Enable it in the plugin's settings; see the usage instructions.

See crosspoint_reader/README.md for protocol details, the optimizer, and configuration.

Installation

Download the latest release from the releases page, then in Calibre: Preferences > Plugins > Load plugin from file.

Development

Setup

# Build and install the plugin into Calibre
make install

# List all installed plugins
make list

# Remove the plugin
make remove

See calibre-customize docs for more options.

Releasing

The version is read from the version tuple in crosspoint_reader/driver.py.

# Bump the version (updates driver.py in place)
make bump-patch   # 1.0.0 -> 1.0.1
make bump-minor   # 1.0.0 -> 1.1.0
make bump-major   # 1.0.0 -> 2.0.0

# Package the plugin into a zip (crosspoint_reader-vX.Y.Z.zip)
make zip

# Create a GitHub release with the zip attached (runs `make zip` first)
make release

make release uses the GitHub CLI (gh) to create a tagged release with auto-generated notes.

Typical workflow:

  1. make bump-patch (or bump-minor / bump-major)
  2. Commit the version change
  3. make release

Project structure

crosspoint_reader/
  __init__.py   # Plugin entry point
  driver.py     # Device driver (discovery, upload, delete)
  ws_client.py  # WebSocket client and UDP discovery
  config.py     # Settings UI and preferences
  log.py        # Logging utilities

License

MIT

S
Description
No description provided
Readme MIT
403 KiB
Languages
Python 98.7%
Makefile 1.3%