The offline pipeline stores the book body but not the cover:
book-offline-store.service.ts has IndexedDB stores for PDF blobs, EPUB pages, and EPUB resources — no cover store.
book-offline-download.service.ts downloads the PDF/EPUB body and inline epub resources, never the cover.
Covers render from short-lived presigned MinIO URLs (coverUrl / coverVariants[].url, ~1–2h TTL). So a book downloaded for offline reading shows a broken cover on the shelf as soon as the URL expires / the device goes offline — precisely the situation offline download exists for.
Fix
During offline download, fetch one cover rendition (largest coverVariants entry, else coverUrl) as a blob and persist it in a new IndexedDB covers store keyed by book id (schema version bump).
On the shelf (my-books-shelf), prefer the stored cover blob (object URL) for books that are downloaded; fall back to the presigned URL otherwise.
Delete the stored cover when the offline copy is removed.
## Problem
The offline pipeline stores the book **body** but not the cover:
- `book-offline-store.service.ts` has IndexedDB stores for PDF blobs, EPUB pages, and EPUB resources — no cover store.
- `book-offline-download.service.ts` downloads the PDF/EPUB body and inline epub resources, never the cover.
Covers render from short-lived presigned MinIO URLs (`coverUrl` / `coverVariants[].url`, ~1–2h TTL). So a book downloaded for offline reading shows a **broken cover** on the shelf as soon as the URL expires / the device goes offline — precisely the situation offline download exists for.
## Fix
1. During offline download, fetch one cover rendition (largest `coverVariants` entry, else `coverUrl`) as a blob and persist it in a new IndexedDB `covers` store keyed by book id (schema version bump).
2. On the shelf (`my-books-shelf`), prefer the stored cover blob (object URL) for books that are downloaded; fall back to the presigned URL otherwise.
3. Delete the stored cover when the offline copy is removed.
Related: #879 (SW dead-URL fallback), reader/Kavita-parity offline workstream (PR-8), spikersoft-backend#499.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
The offline pipeline stores the book body but not the cover:
book-offline-store.service.tshas IndexedDB stores for PDF blobs, EPUB pages, and EPUB resources — no cover store.book-offline-download.service.tsdownloads the PDF/EPUB body and inline epub resources, never the cover.Covers render from short-lived presigned MinIO URLs (
coverUrl/coverVariants[].url, ~1–2h TTL). So a book downloaded for offline reading shows a broken cover on the shelf as soon as the URL expires / the device goes offline — precisely the situation offline download exists for.Fix
coverVariantsentry, elsecoverUrl) as a blob and persist it in a new IndexedDBcoversstore keyed by book id (schema version bump).my-books-shelf), prefer the stored cover blob (object URL) for books that are downloaded; fall back to the presigned URL otherwise.Related: #879 (SW dead-URL fallback), reader/Kavita-parity offline workstream (PR-8), spikersoft-backend#499.