* 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>
* 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>
* fix(metadata-viewer): show only allowed other actions and localize amazon link
* fix(metadata-viewer): simplify permission checks for displaying other actions
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.
* 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
* 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.
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.
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.
* 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>
- 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>