618 Commits

Author SHA1 Message Date
9761c0e9b6 feat(OpdsFeedService): detect ZIP mime type for FB2 files when zipped (#2242)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-12 17:01:22 -07:00
64f036fb71 fix(epub): strip formatting from ISBN values to ensure correct extraction (#2248)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-12 17:00:52 -07:00
8dd9b28552 feat(deps): add JPEG2000 support in PDFBox with Jai ImageIO dependencies (#2250)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-12 16:59:56 -07:00
06a75c42c8 fix(metadata): missing lubimyczytac fields and fetch retry (#2179)
* fix(metadata): fix LubimyczytacId and LubimyczytacRating not appearing with metadata refresh

* fix(metadata): remove searching by ISBN on lubimyczytac.pl (not supported)

* fix(metadata): add retries for lubimyczytac.pl

---------

Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-12 16:59:28 -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
af07110f4c Correct Flyway migration file version 2026-01-10 10:24:18 -07:00
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
105f477c79 feat(archive): add ArchiveType via Magic Numbers detection and integrate into book processing (#2220)
* feat(archive): add ArchiveType detection and integrate into book processing

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

* feat(cbx): enhance archive type detection for CBX files

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

* refactor(tests): rename method for clarity in CbxMetadataWriterTest

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-10 10:04:50 -07:00
24fabc97de fix(epub): normalize text nodes in EPUB metadata content.opf (#2222)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-10 10:02:06 -07:00
9f019f0636 fix: Ignore access denied when doing library scan instead of failing (fixes #1342, #2122) (#2132) 2026-01-09 14:03:23 -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
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
6cf7848f44 Fix Kobo series handling for empty names and series number formatting (#2185) 2026-01-08 15:26:43 -07:00
14dcf552bd fix(cbx): "Archive too large" error for invalid/corrupt CBX files (#2205)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-08 15:18:40 -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
b43e9ba08c feat(ComicVine): use structured search for ComicVine metadata fetching instead of generic /search (#2193)
* feat(comicvine): improve comic metadata handling with additional fields and improved search logic

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

* feat(comicvine): enhance series and issue extraction with improved regex patterns and caching mechanism

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

* feat(comicvine): enhance ComicvineBookParser with improved metadata extraction and logging

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

* feat(comicvine): improve title formatting and author extraction in ComicvineBookParser

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-07 18:12:55 -07:00
f0444df6ee refactor(images): migrate to TwelveMonkeys ImageIO with graceful unsupported format handling (#2188)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
2026-01-07 18:12:12 -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
251fe65ec0 fix(parser): handle missing results table in GoodReads search and log a warning (#2187)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-07 14:16:57 -07:00
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
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
81442a1e5c feat(metadata): enhance XML parsing with secure processing and improved error handling (#2163)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-06 10:12:29 -07:00
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
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
9a498da2ba feat(cover-generator): enhance cover resolution and redesign layout for improved aesthetics (#2125)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-05 14:27:26 -07:00
34bbe8a14e fix(api): kobo proxy server unit tests (#2136)
* fix: resolve issue with kobo proxy failing to reencode encoded query params

* fix: add additional tests for kobo server proxy
2026-01-05 14:26:41 -07:00
ACX
e8de8adf6f Introduce Vitest as the frontend Angular testing framework for Booklore (#2150)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-04 21:56:20 -07:00
ACX
92dc156459 Fix: correctly update book cover hash on metadata refresh (#2149)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-04 20:52:05 -07:00
ACX
c3af19a804 Fix: Kobo sync missing book covers (v1.16.4) (#2147)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-04 19:01:54 -07:00
d169a26eb3 fix(recommendations): improve error handling for JSON conversion and return empty set on failure (#2137)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-04 10:57:47 -07:00
ACX
1ea9cbde3e Ensure Booklore metadata changes are reflected on Kobo books (#2140)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-04 10:55:44 -07:00
ACX
3b3656c29b Improve robustness of book uploader error handling (#2130)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-03 16:47:59 -07:00
d3a0e9ddc9 Fix: Ignore access denied when doing library scan instead of failing (fixes #1342) (#2122) 2026-01-03 14:06:53 -07:00
e0b324689e fix(metadata): add unit tests for task execution layer + fix permission validation logic (#2123)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-03 14:06:24 -07:00
ae30b3434e Fix kobo auto add on bookdrop. (#2116) 2026-01-03 14:02:41 -07:00
998b07d243 fix(filemove): improve handling of library monitoring during file moves and add tests for operation order (#2104)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-02 10:49:34 -07:00
486781b9cd feat(metadata): add endpoint and service for generating custom book covers for PDFs and CBX (#2108)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-02 10:47:26 -07:00
ACX
5d7c67cb5f Assign newly created library to the creating user (#2110)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-02 10:42:58 -07:00
b3ac58207a refactor(api): modernize codebase with Java 21 idioms and improve null safety (#2106)
* fix(controller): handle null filename in getBackgroundImage method

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

* refactor(tests): replace hardcoded replace mode with variable in BookMetadataUpdaterCategoryTest

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-02 10:16:01 -07:00
c8e10b5499 feat: Append volume to comic series when extracting cbx metadata (#2072)
* Append volume to comic series when extracting cbx metadata

* Add testing for extracting metadata with and without the volume tag
2026-01-01 17:36:05 -07:00
ACX
6394d1ef04 Fix date inconsistencies in Favorite Days and Reading Session Timeline charts (#2096)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-01 17:34:33 -07:00
ACX
e0dec6f2f6 Add extended permissions for bulk metadata, reading progress, and read status actions (#2091)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-01-01 11:41:22 -07:00
60524ee8a6 Fix/kobo library snapshot (#2051)
* Fix Kobo snapshot ownership and clean existing rows

* Add Kobo snapshot ownership and clean existing rows test.
2026-01-01 01:00:29 -07:00
52329e659c fix(metadata): improve ComicInfo.xml detection and normalize fallback titles (#2080)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:51:39 -07:00
f3299915f5 refactor(pdf): update PDFBox usage for improved 3.x compatibility (#2079)
* refactor(pdf): update PDFBox usage for 3.x compatibility and improve file handling

- Use RandomAccessReadBufferedFile and RandomAccessStreamCache for loading PDFs
- Update methods to use new PDFBox 3.x APIs for reading and writing
- Add pdfbox-io dependency to build.gradle
- Add comments regarding compressed mode in PDFBox 3.x

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

* test(pdf): remove outdated comments about PDFBox 3.x default compression in save operations

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

* test(pdf): remove outdated comments about PDFBox 3.x default compression in save operations

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:50:46 -07:00
03311b76ee feat(library): improve detection of new files by using unique key and add tests for subpath handling (#2078)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:49:31 -07:00
b31012c986 fix(opds): update mime type support for FB2 and CBX formats based on file extension (#2077)
* fix(opds): add mime type support for FB2 and CBX formats based on file extension

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

* fix(opds): return correct MIME types for all supported book formats in feed links

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

* fix(opds): remove incorrect MIME type mapping for DJVU and default fallback

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

* test(opds): add unit tests for correct MIME type mapping in catalog feed generation

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:48:38 -07:00
200212799c fix(comicvine): handle API rate limiting by skipping requests and logging warning when limit is reached (#2076)
* fix(comicvine): handle API rate limiting by skipping requests and logging warning when limit is reached

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

* fix(comicvine): improve rate limit handling by supporting Retry-After header and 429 status code

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:48:11 -07:00
a72f6e285c feat(viewer): add context-aware series collapse functionality (#2073)
- Introduced support for context-specific series collapse preferences for libraries, shelves, and magic shelves.
- Improved backward compatibility with legacy preference structures.
- Added JSON aliasing for `seriesCollapse` to maintain API compatibility.
- Extended entity selection in view preferences to include magic shelves.
- Enhanced error handling in app settings service to filter null values.
- Optimized series collapse preference management, ensuring local and global overrides persist accurately.

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:38:46 -07:00