742 Commits

Author SHA1 Message Date
CounterClops
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
Balázs Szücs
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
Gavin Mogan
d3a0e9ddc9 Fix: Ignore access denied when doing library scan instead of failing (fixes #1342) (#2122) 2026-01-03 14:06:53 -07:00
Balázs Szücs
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
Doug Coffin
ae30b3434e Fix kobo auto add on bookdrop. (#2116) 2026-01-03 14:02:41 -07:00
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
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
Charlie Le
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
Doug Coffin
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
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
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
Balázs Szücs
ded5da9ef2 fix(file-move): ensure library monitoring is restored after file move and update tests (#2057)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-01-01 00:26:47 -07:00
Balázs Szücs
47efb6593d fix(upload): truncate long filenames to safe length while preserving extension for bookdrop and additional files (#2059)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-30 16:56:05 -07:00
Balázs Szücs
4f372615cf fix(cbz): exclude macOS metadata and hidden files from image extraction (#2056)
* fix(cbz): exclude macOS metadata and hidden files from image extraction

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

* refactor(cbz): restrict isContentEntry method visibility to private in CbxReaderService

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

* test(cbz): add unit tests for macOS metadata file exclusion in CbxReaderService

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-30 14:51:44 -07:00
Balázs Szücs
939299f93c fix(upload): preserve original filename as title when metadata extraction returns temp file name (#2053)
* fix(upload): preserve original filename as title when metadata extraction returns temp file name

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

* fix(upload): set original filename as title directly when extracted title is temp name

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

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-30 12:12:42 -07:00
CounterClops
161eb05965 fix(ui): update tasks last run time to include timezone information (#2047)
* fix: update tasks last run time to include timezone information

* fix: use system default timezone instead of assuming UTC
2025-12-30 11:55:27 -07:00
David Long
8580670b6e feat(api): add healthcheck endpoint for monitoring health from Docker/Podman (#2024) 2025-12-30 11:54:30 -07:00
Balázs Szücs
27b366aa3a fix(metadata): add null handling for MetadataRefreshService and improve default initialization in MetadataRefreshOptions (#2034)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-30 11:50:37 -07:00
MightyHalfGinger
bfb77ecee0 fix(metadata): cover no longer fails to extract with invalid zip files (#2012)
Previously if any file in the epub was invalid-ly packed into the zip
container, the covers will fail to fetch due to the EpubReader trying to
load everything in the file into memory.

This patch fixes this by making the EpubReader lazy-load all of the
files in the epub so we only actually try to read the strictly-necesasry
files to find the cover. This should also improve loading times ever so
slightly by not needing to read everything in for no reason.
2025-12-30 11:49:50 -07:00
ACX
11e64904a5 - Remove library name from payload (#2054)
- Add basic installation ping to track number of active instances

Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-30 11:49:28 -07:00
ACX
5bd26b9aa7 Change the official domain from booklore.dev to booklore.org (#2046)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-29 19:42:10 -07:00
CounterClops
91f0e86b00 fix(bookdrop): improve pattern extractor date extraction (#2032)
* fix: add support for yyyy-MM formats and add tests for new edge case

* fix: add support for MM-yyyy formats
2025-12-29 05:29:55 -07:00
Balázs Szücs
76b2979f37 chore: remove unused imports and minor code cleanup across services, controllers, and tests (#2036)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-29 05:28:07 -07:00
Marcin Gajewski
dfcd9db368 Feat/lubimyczytac metadata provider (#2019)
* feat: add LubimyCzytac metadata provider

- Add LubimyCzytac parser with web scraping for lubimyczytac.pl
- Extract book metadata including title, authors, description, ratings
- Parse JSON-LD structured data for reliable metadata extraction
- Add database migration with columns and JSON property name updates
- Add comprehensive test coverage for parser

* feat: add LubimyCzytac UI integration

- Add LC ID and LC Rating fields to metadata picker
- Update settings page with Lubimyczytac provider toggle
- Add LubimyCzytac to metadata searcher provider list
- Display Lubimyczytac in all metadata viewer sections
- Add Lubimyczytac to advanced fetch options
- Update TypeScript models to match backend serialization
2025-12-28 19:50:53 -07:00
Balázs Szücs
e65aa47552 refactor(api): improve file resource handling in book download and FB2 metadata extraction (#2018)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-28 19:40:12 -07:00
ACX
01446c2537 Refactor book service in BE and FE (#2013)
* Refactor book service in BE and FE

* Add missing method

---------

Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-28 19:37:35 -07:00
ACX
60095c2173 Tele BE (#2026)
* WIP

* Tel BE

---------

Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-28 18:49:43 -07:00
ACX
9e151010e7 Improve the SVG fetching and caching logic (#2011)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-27 15:26:11 -07:00
MightyHalfGinger
4d8092e5bc Fix(metadata): Improve handling of non-author creator roles (#1987)
* Fix(metadata): Don't import creators with a non-author role as author

Looks at either the meta tag for the creators or the opf role attribute
to determine the role of a creator. If no role is specified its assumed
to be an author.

Also only prunes handled created roles when writing the epub data back
out to prevent clobbering any extra data that might be present in the
epub already.

* Fix(metadata): Add testcases for non-author creator handling

Just adds testcases for the previous changes to the extraction and
writer logic.
2025-12-26 16:47:24 -07:00
Balázs Szücs
87fe405455 test(util): expand and improve utility test coverage for BookUtils, FileUtils, PathPatternResolver, MetadataChangeDetector, and UserPermissionUtils (#1985)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-26 16:45:55 -07:00
ACX
4712f53b8e Display paginated reading sessions in the book metadata view (#2003)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-26 16:44:44 -07:00
ACX
2c1e8a99e3 Add more user-specific charts (#1991)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2025-12-26 12:08:27 -07:00
cwar
811a7e0906 fix(metadata): Use existing Goodreads ID for batch refresh instead of searching (#1973)
When refreshing metadata for books that already have a goodreadsId stored,
the GoodReadsParser now fetches directly from the book page instead of
performing a title search first.

Problem:
- Books with goodreadsId populated but missing goodreadsRating
- Batch refresh would search by title, ignoring the stored ID
- If search failed (rate limits, transient errors), ratings never populated

Solution:
- Check for existing goodreadsId before searching
- If valid ID exists, fetch directly from /book/show/{id}
- Fall back to search only if no ID or direct fetch fails

This ensures previously matched books get their ratings updated reliably.
2025-12-25 11:35:53 -07:00
cwar
cb91a4ae6e fix: Prevent transaction rollback when cover download fails (#1971)
Cover download failures in updateThumbnailIfNeeded() were propagating
exceptions that poisoned the @Transactional method, causing the entire
book's metadata update to roll back - even though the metadata itself
was fetched successfully.

This commonly occurs when CDNs serve WebP images with JPEG extensions/
headers (e.g., Amazon CDN), causing ImageIO to fail validation.

The fix wraps the thumbnail download in a try-catch and logs a warning
instead of propagating the exception. Cover failures are non-critical
and shouldn't prevent metadata updates from persisting.
2025-12-25 11:17:28 -07:00
Balázs Szücs
21bcc7d382 perf(cbz): optimize CBZ reading (#1980)
* perf(cbz): improve zip file compatibility by enabling Unicode extra fields and ignoring local file headers

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

* feat(perf): Implement robust ZipFile optimization with fallback

Updated ZipFile reading logic in CbxReaderService, CbxProcessor, and CbxConversionService. Implemented a 'Fast Path' (Central Directory only) for speed (20x faster on large archives). Implemented a 'Slow Path' (Local Header scanning) fallback if the fast path fails or finds no images. Ensures compatibility with older or malformed archives where Unicode names are only present in local headers. Refactored extraction logic to helper methods where appropriate to support retry mechanism.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-25 10:10:14 -07:00
farfromrefuge
f5e99d52c1 Fix: regenerate improvements (#1981)
* chore: report error on cover regeneration fail

* refactor: use RxJS forkJoin instead of Promise.all

- Replace Promise-based approach with RxJS forkJoin for better consistency
- Remove console.log debug statement
- Improve error handling with proper RxJS operators

Co-authored-by: farfromrefug <655344+farfromrefug@users.noreply.github.com>

* chore: cleanup

* chore: rework per development upstream

* chore: updating books on bulk cover regenerate

* chore: working

* chore: metadata regenerateCover pdate UI

* chore: review per comments

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2025-12-25 10:09:33 -07:00
Balázs Szücs
77e06b868e fix(epub-metadata): properly decode URL-encoded cover image hrefs in EPUB files (#1983)
- Ensure cover image paths in EPUB manifest are URL-decoded before file access
- Update EpubMetadataExtractor and EpubMetadataWriter to handle encoded hrefs
- Add comprehensive tests for unicode and URL-encoded cover image filenames

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-12-25 10:05:24 -07:00