* 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>
* feat(bookmark): add bookmark editing, priority, color, notes, and improved sorting
- Add UpdateBookMarkRequest DTO and bookmark editing dialog/component in frontend
- Extend BookMark model/entity with color, notes, priority, updatedAt fields
- Implement bookmark update API and service logic with validation
- Sort bookmarks by priority and creation date
- Add Flyway migrations for new columns and index
- Update tests for new bookmark features
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(bookmark): prevent notes length display error in edit dialog
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(bookmark): reset editing state and improve dialog cancel handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(bookmark): improve edit dialog template with Angular @if and conditional error display
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): add view dialog, search, and improved display for bookmarks in reader
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): redesign bookmarks section UI with improved layout, styling, and interactions
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): enhance view dialog UI with improved layout, styling, and priority display
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* chore(migration): rename migration files to maintain sequential versioning
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): add view and edit actions to bookmark list with improved UI and tooltips
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): add search and filter functionality to bookmark list in EPUB reader
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): update search input to use PrimeNG IconField and InputIcon components
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix: ensure book metadata is eagerly loaded for updates and rescans
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* Fix failing tests in LibraryRescanHelperTest and MetadataControllerTest
- Update LibraryRescanHelper to handle null and deleted books gracefully during rescan.
- Update LibraryRescanHelperTest to mock BookRepository correctly.
- Update MetadataControllerTest to mock findAllWithMetadataByIds.
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add hardcover API key and sync settings to KoboSync and KoboUserSettings entities
* feat(hardcover): enhance sync functionality to use per-user API keys
- Updated HardcoverSyncService to utilize user-specific Hardcover API keys for syncing reading progress.
- Modified syncProgressToHardcover method to accept userId, allowing for personalized sync settings.
- Improved logging to include userId in sync operations for better traceability.
- Adjusted KoboReadingStateService to pass userId when triggering sync to Hardcover.
* feat(database): update kobo_location_source column size and add hardcover settings
- Increased the size of the kobo_location_source column to accommodate longer location strings from Kobo devices.
- Added new columns for hardcover API key and sync settings in the kobo_user_settings table to enhance user customization.
* refactor(hardcover): update tests to use user-specific Kobo settings
- Replaced AppSettingService with KoboSettingsService in HardcoverSyncServiceTest to utilize user-specific settings.
- Modified syncProgressToHardcover method calls to include userId for personalized sync operations.
- Added a new test case to handle scenarios where user settings are not found, ensuring robust error handling.
---------
Co-authored-by: akiraslingshot <akiraslingshot@gmail.com>
* feat: add cover image auto cropping when oversized
* feat: add smart cropping to ignore sections of constant colours in cover images
* fix: description implied cbx files would be excluded from cover regeneration when they are not
* feat: add options to bulk edit cover images in the library view
* fix: resolve issues with batching requests and data validation for cover images
* fix(FilenamePatternExtractor): correct date format regex logic and add comprehensive tests
- Fix bug in buildRegexForDateFormat to handle single 'M' and 'd' at any position
- Add FilenamePatternExtractorDateFormatTest and FilenamePatternExtractorIntegrationTest for date extraction scenarios
- Improve StringBuilder initialization for performance in multiple classes
- Precompile regex patterns in Fb2MetadataExtractor for efficiency
- Add Fb2MetadataExtractorOptimizationTest for pattern and StringBuilder usage
- Add null check in BookFilePersistenceService.markAllBooksUnderPathAsDeleted
- Improve path validation logic in PathPatternResolver
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test: remove unnecesary tests
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>