* 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>
* docs: update license information from MIT to GPL-3.0 in CONTRIBUTING.md
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* docs: correct formatting of GPL-3.0 license statement in CONTRIBUTING.md
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>
* fix(bookdrop): gate library re-registration during single-file moves
- query MonitoringService to see if the library is actively watched before
unregistering/re-registering it
- lower log noise for these operations and monitoring registration
- expose MonitoringService#isLibraryMonitored via MonitoringRegistrationService
- add FileMoveServiceTest covering monitored vs unmonitored scenarios
This fixes issues when importing multiple files via bookdrop.
Refs: #1608
* fix(bookdrop): avoid unnecessary stacktrace
* Use `deleteIfExists` to avoid trying to delete a missing file
This happens regularly as the file has already been removed by other methods