1070 Commits

Author SHA1 Message Date
ACX
1b83ebadce Revamp the CBX reader layout for improved structure and usability (#2330)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-18 18:09:27 -07:00
WorldTeacher
6338ed13fc fix: Reading stats UI (#2322)
* part1 fix: reading days show duration

* part2 fix: Fix time formatting in favorite days chart

---------

Co-authored-by: WorldTeacher <coding_contact@pm.me>
2026-01-18 14:10:04 -07:00
ACX
c42918f05b Refactor metadata picker and parsers for Amazon, Goodreads, and Google (#2327)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-18 14:01:50 -07:00
acx10
0327ee802e eBook reader bug fixes 2026-01-18 11:35:26 -07:00
ACX
1889a04bac Dialog refactor 2 (#2321)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-18 02:36:24 -07:00
ACX
fda76eead7 Refactor common dialog header and footer components (#2318)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-17 23:59:42 -07:00
ACX
890d7cc230 Refactor the Book Browser to simplify and streamline the implementation (#2317)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-17 23:07:39 -07:00
ACX
cb85604863 Centralize book tag color definitions (#2314)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-17 22:43:54 -07:00
ACX
e5b1d33bf7 Add support for annotations and book notes in the new ebook reader (#2313)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-17 22:36:00 -07:00
ACX
d75e7e228a Bidirectional progress sync between koreader and booklore reader (#2312)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-17 22:29:02 -07:00
acx10
90e5365f42 Tweak UI 2026-01-16 19:51:38 -07:00
ACX
4dc5c0008c feat(metadata): add configurable enabled fields for metadata editor and picker + UI tweaks (#2299)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-16 19:13:17 -07:00
ACX
3a41e25aeb fix(chart-ui): resolve glitches in chart rendering (#2290)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-16 00:34:17 -07:00
acx10
d8e7e0b5cf Fix Angular tests 2026-01-15 21:24:39 -07:00
Chris Debenham
36d9f74864 Implement Public Shelves (#1969)
* Implement Public Shelves

Multiple changes to support shelves being marked as public.

- **Backend:**
    - Added 'isPublic' field the Shelves
    - Made it so that when looking for shelves it includes public ones
    - Allow admins to mark shelves are public
    - Added 'bookCount' to 'Shelf' so it shows for public shelves as
well
    - Added 'canReadShelf' to 'SecurityUtil' for checking read access to
public shelves.
    - Updated ShelfController to use this for getting shelf data

- **Frontend:**
    - Updated Shelf to include 'publicShelf', 'userId', and 'bookCount'
    - Updated components to allow admins to toggle shelf visibility.
    - Modified 'ShelfService' to:
        - Add 'getBooksOnShelf' method to fetch books from the API.
        - Update /getBookCount' to use 'Shelf.bookCount' for non-owners.
    - Restricted edit/delete options to shelf owners.

* Renumber Add_is_public_to_shelf.sql

Conflicted with another

---------

Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-15 21:19:05 -07:00
ACX
c20b1972f8 Remove support for the legacy ePub reader (#2287)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-15 21:12:13 -07:00
ACX
abceba349a chore: update Angular dependencies to latest minor/patch versions (#2285)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-15 21:01:44 -07:00
ACX
8c35f2415c Introduce a new eBook reader with support for EPUB, MOBI, AZW3, and FB2 formats (#2258)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-15 20:39:52 -07:00
Balázs Szücs
775887b55f feat(shelf): add shelf filtering options and integrate into book processing (#2268)
* feat(shelf): add shelf filtering options and integrate into book processing

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* fix(book-rule-evaluator): normalize array values to lowercase for rule comparisons

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(filter): enhance library and shelf filtering logic for 'or' and 'and' modes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(shelf): implement support for multiple shelf IDs in book retrieval and filtering

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-15 19:58:30 -07:00
Balázs Szücs
869bea9ca5 feat(metadata): add auto-save metadata feature in editor settings (#2274)
* feat(metadata): add auto-save metadata feature in editor settings

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(reader-preferences): add autoSaveMetadata property to user preferences

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(user-service): add autoSaveMetadata property to user preferences in tests

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-15 19:57:27 -07:00
Sergio Visinoni
2be02017d4 (Refactor) Extract file-specific information from book (#1734)
* refactor(book): extract file-specific information from book

First commit in a series aimed at refactoring the data model for books.
More specifically, the idea is to extract all file-specific information
from the `book` table and move it to the `book_file` table, previously named `book_additional_file`

The aim is to make it easier to:
* Improve support for books with multiple file formats (PDF, EPUB, etc) for all interactions (Read, Download, etc)
* Support for merging/unmerging books
* Add support for additional file types
* Specify preferred formats at the user level

Ref: #489

* refactor(book): ensure the API build and runs

Further work on the refactoring aimed at separating file-related details
from the `book` table.

With this commit all the missing changes that were prventing the API to build
or to book have been addressed.

TODO: test extensively, adjust existing unit tests and add new ones

* fix(read): add mapping for book format

This restores the read functionality which relies on the book format field
to decide which reader to use.

* fix: fix read, dowload and file upload

This commit fixes multiple issues either caused by the refactoring or pre-existing:

* Fix the Read button behaviour after the refactoring
* Unregister the watcher process when uploading additional formats
* Fix downloading of additional book formats (using the wrong ID)

* fix: adjust tests to use the new BookFileEntity class

All the tests that used to fecth file information from BookEntity
now need to get them from the relevant BookFileEntity

* fix: do not rely on AdditionalFileType

* Use the BookFileEntity bookFormat instead

* fix: use the relevant BookFileEntity class

* fix: call the right methods

* fix: Add missing mapping for the test

* fix: adapt the test to the new semantics

All book files, including the primary one, are treated as equal now.
The tests needs to take that into account when checking for additional
formats.

* fix: use mutable lists

* fix: fix syntax for droppung unique constraint

MariaDB uses indexes, not constraints

* fix: regression on book file ordering

We want to make this refactoring 100% compatible with the current behaviour (modulo a few bugs),
therefore we need to maintain the right order to ensure the "primary" book stays the same
after the migration.

* fix: allow download of supplementary files

* fix(opds): replace removed additionalFiles entity graph with bookFiles

- Update BookOpdsRepository @EntityGraph paths to use BookEntity.bookFiles after the refactor
- Add @DataJpaTest to validate BookOpdsRepository wiring and catch invalid EntityGraph attributes
- Add H2 as testRuntimeOnly dependency so the JPA slice test can run with an embedded DB

* chore(bookdrop): mount bookdrop folder from a local directory

It's consistent with the library dir, and makes debugging easier
when working on the local environment

* fix: rename migration after rebase

It's no longer 66, bumped to 73

* fix: handle BookEntity primary file NPEs after rebase

Adjust tests to always instanciate BookFileEntity when manipulating
BookEntity.

* chore: rename migration to avoid conflict

V73 is already taken on develop, V67 was left "unused"

* chore: rename again to ensure it's applied

* fix: make sure to flush the data to DB

Without the flush there is a high chance of leaving the DB in an inconsistent
state after a book move.

* fix: move all files belonging to a book

This fixes a pre-existing bug which has some nasty ramifications.
We never moved "additional files" when changing library for a book entity,
causing them to become effectively "unreacheable" from the UI.

* fix(migration): remove the unique index before importing data

* fix: fix build and test after rebase

* fix(migration): drop legacy table

* fix(upload): use the templetized name when storing on DB

* fix(rebase): Add logical fixes post rebase

* Adapt the code to properly handle the new `archive_type` field and logic
* Bump the version number for the DB migration
* Use `getPrimaryBookFile()` whenever trying to access book files

* fix(migration): Handle additional book formats

* Add support for FB2 files
* Corretly handle cb7 files as CBX

* fix(file mover): fix a regression when moving books across categories

The previous approach would trigger the JPA's `orphanRemoval` parameter on the
bookEntities, effetively triggering a delete on the DB.

This caused files to be moved but the data on the DB would get stale, also causing
additional formats to be treated as separate books upon a rescan.

* fix(rescan): do not delete alternative files on rescan

Upon library rescan, additional files such as images were removed from
book entities association when using the "Each file is a book" library structure.
2026-01-15 18:15:00 -07:00
WorldTeacher
f704e58b7d multiple small ui fixes (#2276)
Co-authored-by: WorldTeacher <coding_contact@pm.me>
2026-01-15 08:27:45 -07:00
Balázs Szücs
1f62e4cd26 fix(metadata-picker): handle null and empty values in fetched metadata processing (#2269)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-14 10:41:24 -07:00
acx10
e51343950a Update Angular dependencies 2026-01-10 10:54:13 -07:00
ACX
4543381814 Stream CBZ contents directly from the archive instead of unzipping and caching files (#2229)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-10 10:41:34 -07:00
Arden Rasmussen
4f012746c5 RanobeDB Light Novel metadata provider (#2221)
* feat(metadata): added ranobedb metadata provider for light novels

* fix(metadata): remove ranobedb review count and fix merge conflicts

* test(metadata): added unit tests for RanobeDB parser

* fix(metadata): add ranobedb to updated metadata searcher

---------

Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-10 10:21:39 -07:00
xcashy
a3cc878cb8 fix(ui): use view preference override for magic shelves (#2215) 2026-01-09 13:56:15 -07:00
acx10
810f3994d4 Cache epub fonts for faster page refresh 2026-01-09 09:33:25 -07:00
xcashy
34ac70c251 feat(ui): add series number overlay for More in Series (#2208)
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-08 19:25:18 -07:00
ACX
15007143f9 Add per-user font management permission (#2210)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-08 19:19:14 -07:00
acx10
9877182b67 Remove tests 2026-01-08 16:40:10 -07:00
acx10
a3b7f3cc0d Update hardcover sync information text 2026-01-08 16:35:52 -07:00
Giancarlo Perrone
77bb2904e3 Feature/koreader hardcover sync (#2204)
* feat(settings): add hardcover sync settings and integrate into device settings UI

* feat(hardcover): implement Hardcover sync settings API and UI integration

* test(hardcover): add unit tests for HardcoverSyncSettingsService and HardcoverSettingsComponent

* fix(hardcover-settings): correct API key copy function to handle null values properly

---------

Co-authored-by: akiraslingshot <akiraslingshot@gmail.com>
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-08 16:14:51 -07:00
acx10
20ed3e5b25 Revert changes 2026-01-08 15:56:01 -07:00
acx10
dde04d4cc1 FIx imports 2026-01-08 15:38:08 -07:00
Balázs Szücs
07c3affcd5 refactor(frontend): resolve linting errors, and EPUB reader lifecycle errors (#2127)
* refactor(types): improve type safety by replacing 'any' with specific types in various components

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* fix(filters): handle undefined values in filter streams and update type for selected filters

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(epub-reader): improve rendition cleanup and enhance debug logging in helper functions

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* fix(epub-reader): handle errors during rendition and book destruction in ngOnDestroy

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-08 15:21:23 -07:00
ACX
15de049f3d Support individual “write to file” settings per book type, with configurable file size limits (#2206)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-08 15:18:20 -07:00
ACX
c17fe58f4c Show a persistent loader while a large library is being created (#2200)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-07 18:10:53 -07:00
Balázs Szücs
13a617a9e9 feat(magic-shelf): add ISBN-10 and ISBN-13 metadata fields to book rules (#2196)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-07 14:16:12 -07:00
ACX
c7afe6ec13 Implement memoization in the book card to reduce CPU usage during scrolling (#2198)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-07 14:13:42 -07:00
Balázs Szücs
bd3df812b7 fix(lubimyczytac): Fix Lubimyczytac metadata lock persistence (#2194)
* feat(metadata): add support for Lubimyczytac ID and rating fields

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(metadata): add Lubimyczytac ID and rating fields to metadata editor

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat(metadata): add Lubimyczytac ID and rating fields to MetadataRefreshOptions

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-07 11:27:12 -07:00
ACX
fa3005369f Revamp metadata search UI to display live results (#2195)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-07 11:26:41 -07:00
acx10
f63a8641d8 Add frontend unit tests (Part 2) 2026-01-06 15:16:26 -07:00
Balázs Szücs
6a7b75d042 feat(series-page): implement multi-select functionality for book selection and add footer actions (#2167)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-06 10:11:02 -07:00
acx10
34851ef35c Add frontend unit tests (Part 1) 2026-01-05 17:10:40 -07:00
dependabot[bot]
e283b61e2e chore(deps): bump qs and body-parser in /booklore-ui (#2088)
Bumps [qs](https://github.com/ljharb/qs) and [body-parser](https://github.com/expressjs/body-parser). These dependencies needed to be updated together.

Updates `qs` from 6.14.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.0...v6.14.1)

Updates `body-parser` from 1.20.3 to 1.20.4
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.3...1.20.4)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: body-parser
  dependency-version: 1.20.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-05 15:28:54 -07:00
ACX
24862ed62b Move custom fonts management to Reader tab (#2161)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-05 15:25:48 -07:00
Darkraise
926b87872e feat: Add custom font support for EPUB reader (#2120)
* feat: Add custom font support for EPUB reader

This commit introduces the ability to manage and use custom fonts in the EPUB reader. Key changes include:

**Backend:**
- Added `CustomFontService` for handling custom font operations.
- Introduced `CustomFontController` for API endpoints.
- Created `CustomFontEntity` and `CustomFontRepository` for database interactions.
- Added `CustomFontMapper` and `CustomFontDto` for data transformation.
- Updated `SecurityConfig` to include JWT filter for custom fonts.
- Enhanced `GlobalExceptionHandler` to handle custom font-related exceptions.
- Added database migrations:
  - `V83__Create_Custom_Font_Table.sql` for creating the custom font table.
  - `V84__Add_Custom_Font_To_Epub_Preferences.sql` for integrating custom fonts with EPUB preferences.

**Frontend:**
- Added `CustomFontsComponent` and `FontUploadDialogComponent` for managing custom fonts in the settings UI.
- Updated `EpubReaderPreferencesComponent` to include custom font options.
- Introduced `CustomFontService` and `CustomFontModel` for frontend logic and data handling.
- Enhanced `SettingsComponent` to integrate custom font management.

**Other Changes:**
- Updated `EpubViewerPreferences` and `EpubViewerPreferencesEntity` to support custom fonts.
- Modified existing components and services to accommodate the new feature.

This feature enhances the user experience by allowing personalized font choices for EPUB reading.

* fix: custom font does not apply after page layout changed

* fix: duplicate API call when change EPUB global settings

* fix: some code review items, extract shared filter logic and improve UX

- Extract AbstractQueryParameterJwtFilter base class to reduce code duplication
  between CoverJwtFilter and CustomFontJwtFilter
- Remove cssIdentifier and fontUrl fields from CustomFont model (no longer needed)
- Add font name sanitization to prevent XSS and ensure data integrity
- Improve error handling in CustomFontService with proper APIException usage
- Replace RuntimeException handler with specific IllegalStateException and
  UnsupportedOperationException handlers in GlobalExceptionHandler
- Add skeleton loading states for font previews and font dropdowns
- Improve font loading state management in epub-reader component
- Create shared custom-font.util.ts for dropdown population logic
- Use reactive font$ subscription for real-time font updates in preferences
- Make DB migrations idempotent with IF NOT EXISTS clauses
- Optimize font file validation to read only header bytes instead of entire file

* chore: re-version migration scripts

* Fix: Kobo sync missing book covers (v1.16.4) (#2147)

Co-authored-by: acx10 <acx10@users.noreply.github.com>

* Fix: correctly update book cover hash on metadata refresh (#2149)

Co-authored-by: acx10 <acx10@users.noreply.github.com>

* Introduce Vitest as the frontend Angular testing framework for Booklore (#2150)

Co-authored-by: acx10 <acx10@users.noreply.github.com>

* Add Vitest frontend tests to CI with JUnit reporting and coverage (#2151)

Co-authored-by: acx10 <acx10@users.noreply.github.com>

* Update PR template to capture frontend test details

* Add instructions for running Angular frontend tests

---------

Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-05 14:45:29 -07:00
Balázs Szücs
9861e23333 feat(magic-shelf): add genre filter support and improve category labeling in rule fields (#2075)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-05 14:28:24 -07:00
ACX
cee7e96c63 Add Vitest frontend tests to CI with JUnit reporting and coverage (#2151)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-04 22:55:13 -07:00