* feat(hardcover): sync Kobo reading progress to Hardcover
- Add HardcoverSyncService to sync reading progress asynchronously
- Store hardcover_book_id in book_metadata for faster lookups
- Integrate with KoboReadingStateService to trigger sync on progress updates
- Add database migration for hardcover_book_id column
* test(hardcover): add unit tests for HardcoverSyncService
* test(hardcover): add HardcoverSyncService mock to unit tests for improved coverage
* refactor(hardcover): update syncProgressToHardcover method to use book ID
- Changed syncProgressToHardcover to accept book ID instead of BookEntity.
- Integrated BookRepository to fetch BookEntity within the method.
- Updated related unit tests to reflect the new method signature and ensure proper functionality.
* feat(hardcover): enhance HardcoverSyncService with edition lookup and logging
- Added a method to find an edition by ISBN, improving the accuracy of edition information.
- Enhanced logging for progress calculations, search responses, and reading progress updates for better traceability.
- Updated the handling of default edition IDs to ensure correct page counts are used when available.
* feat(metadata): add hardcoverBookId and its locking mechanism
- Introduced hardcoverBookId and hardcoverBookIdLocked fields to MetadataClearFlags, BookMetadata, and BookMetadataEntity.
- Updated BookMetadataUpdater to handle locking for hardcoverBookId.
- Enhanced MetadataChangeDetector to compare changes for hardcoverBookId, ensuring proper metadata management.
* feat(metadata): add hardcoverBookId input and display in metadata dialogs
- Introduced hardcoverBookId input field in the metadata editor with locking mechanism.
- Updated metadata restore dialog to display hardcoverBookId when available.
- Enhanced user interface for better metadata management and visibility.
* feat(metadata): integrate hardcoverBookId across components and forms
- Added hardcoverBookId and hardcoverBookIdLocked fields to relevant models and interfaces.
- Updated metadata editor, picker, and review components to include hardcoverBookId input and locking functionality.
- Enhanced form controls and metadata handling to support the new hardcoverBookId feature for improved user experience.
* feat(migration): add hardcover_book_id_locked column to book_metadata table
- Introduced a new column hardcover_book_id_locked with a default value of FALSE to the book_metadata table for enhanced metadata management.
* fix(metadata): realign html with develop
---------
Co-authored-by: akiraslingshot <akiraslingshot@gmail.com>
* fix: update path pattern resolver to better handle file extensions
* chore: add unit tests to cover the newly found edge cases
* fix: resolve issue with file extension duplication when using fallback filename
* feat: add bulk editors for bookdrop
* fix: update pattern behaviour and remove redundant frontend logic
* fix: clean up pattern extractor
* fix: create shared logic to align bulk edit and pattern extract and resolve some minor behaviour issues
* fix: date matching pattern and resolve issues with pattern matching to ignore extra trailing data
* chore: cleanup tests and code to be cleaner
* chore: cleanup autogenerated testing rules
* fix: update to use the new dialog launcher service
* fix: add boolean null check and data validation on pattern extract api
* feat: add bulk edit batching to avoid issues with extremely large import counts
* fix: adding timeout to avoid potential redos issue
* fix: add try blocks for issues with potential NumberFormatException
* fix: update isbn and asin regex to better match spec
* fix: improve error handling and logging
* fix: make component names consistent with the project
* fix: mising import for pattern syntax exception
* chore: add additional tests for the bulk edit service
* fix: improve accessibility to new ui elements
* fix: further improvements to the pattern extractor timeout
* fix: improve frontend placeholder validation
* fix: add back changes accidently removed by merge
* feat(opds): allow user to set sorting for opds feed in settings
* patch(opds): re-add search normalization
* patch(opds): add series to feedid determination
---------
Co-authored-by: WorldTeacher <admin@theprivateserver.de>
* fix(bookdrop): fix 'Select All' query logic and improve filename fallback for missing metadata
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(tests): update BookDropServiceTest and PathPatternResolverTest to use findAllIds method
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix: add retry and retry delays to handle smb lag
* fix: issue with importing cb7 files. missing required dependency. Scan would fail prematurely if a cb7 file was present
* fix: cleanup empty subdirectories when cleaning up parent folders
* fix: update folder cleanup to account for SMB delays
* chore: cleanup redundant and weak tests from auto-generated unit tests
* fix: make sleep function name more descriptive
* fix: minor optimisation around path matching
* fix: update xz package to latest version
* feat(bookmark): implement bookmark management with CRUD operations and UI integration
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(bookmark): add uniqueness constraint for bookmarks and check for existing bookmarks before creation
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(search): Optimize book search with denormalized search_text column
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(search): Enhance search text normalization for diacritics in author names
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(migration): Implement batch processing for populating search text and enhance error handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(search): Manually trigger search text update after author modifications and enhance special character handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(search): Update special character handling to be more permissive in search text normalization
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(AppMigrationService): add FileService dependency for enhanced file handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(database): add search_text column to book_metadata for improved search functionality
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(database): add search_text column to book_metadata for improved search functionality
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(database): correct join condition and ordering in findBooksForMigrationBatch query
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(api): minor QOL updates, code modernization
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(oidc): replace regex literals with compiled patterns for improved performance
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(shelf): remove redundant icon type initialization method
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
This commit enhances the OPDS server with two major features:
1. Series Metadata in OPDS Feed:
- Add series name and book number to OPDS book entries
- Uses standard OPDS/EPUB 3 metadata format with <meta> tags
- Includes belongs-to-collection and group-position properties
2. Authors Navigation Hierarchy:
- Add new /authors endpoint for browsing books by author
- Implement authors list navigation feed with alphabetical sorting
- Add author filtering to catalog feed via ?author parameter
- Support library-based access control for author lists
- Add authors link to root OPDS navigation
Changes:
- OpdsFeedService: Add series metadata to appendMetadata(), add generateAuthorsNavigation()
- OpdsController: Add getAuthorsNavigation() endpoint
- OpdsBookService: Add getDistinctAuthors() and getBooksByAuthorName() methods
- BookOpdsRepository: Add queries for distinct authors and books by author name
- Updated generateCatalogFeed() to support author parameter
- Updated determineFeedTitle() and determineFeedId() to handle author context
Co-authored-by: Claude <noreply@anthropic.com>
* Add mobile OIDC authentication endpoint
This adds a new REST endpoint for mobile applications to complete OIDC
authentication. Mobile apps cannot use the web-based OIDC callback because
they need to receive tokens via a custom URL scheme.
New endpoints:
- POST /api/v1/auth/mobile/oidc/callback
Accepts authorization code, PKCE verifier, and redirect URI.
Returns Booklore JWT tokens (accessToken, refreshToken).
- GET /api/v1/auth/mobile/oidc/redirect
Alternative endpoint that redirects to the mobile app's URL scheme
with tokens as query parameters.
The flow works as follows:
1. Mobile app initiates OIDC auth with PKCE, using its own redirect URI
2. User authenticates with the OIDC provider
3. OIDC provider redirects to Booklore server's oauth2-callback
4. Mobile app calls this new endpoint with the authorization code
5. Booklore exchanges the code for OIDC tokens
6. Booklore validates the tokens and provisions/finds the user
7. Booklore issues its own JWT tokens to the mobile app
This enables iOS/Android apps to use OIDC authentication with Booklore.
* Fix compilation issues in MobileOidcController.java
* fix(amazon): review date parsing to support Japanese formats
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor: enhance Amazon metadata parser robustness and domain support
- Add missing Amazon domains (AE, SA, CN, SG, TR, EG, BE) to DOMAIN_LOCALE_MAP.
- Implement fallback selectors for Title, Authors, Description, Publisher, Publication Date, and ISBNs to support legacy and variant page layouts.
- Support localized 'Publisher' labels (e.g., Herausgeber, Éditeur, Uitgever) in detail bullets.
- Fix brittle date parsing by searching for dates in detail bullets when RPI attributes are missing.
- Improve author extraction with multiple fallback strategies.
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>