Amazon, Audible, and GoodReads parsers now fetch full detailed metadata
(4 results each) instead of returning lightweight previews. Adds randomized
500-1500ms delays between requests. GoodReads retries with title-only search
(2 results) when title+author yields no matches.
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* fix(sidebar): replace routerLinkActive with getter-based route matching to prevent stale highlights
* feat(sort): replace compound sort options with atomic fields and add 6 new sort criteria
* feat(metadata): add BookLore custom metadata support for moods, tags, ratings, and external IDs in EPUB, PDF, and CBZ
- Introduce BookLoreSchema for XMP custom fields and BookLoreMetadata for namespace constants
- Write and extract moods, tags, ratings, and external IDs (Goodreads, Amazon, Hardcover, Lubimyczytac, RanobeDB, Google) in EPUB, PDF, and CBZ metadata
- Store BookLore custom fields in ComicInfo.xml notes and Web fields for CBZ
- Add BookLore fields to XMP metadata in PDF, including moods and tags as separate fields
- Update extractors and writers to handle BookLore fields and ensure separation of categories, moods, and tags
- Add comprehensive tests for BookLore metadata extraction and writing
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(metadata): standardize hardcoverBookId as String and improve identifier handling
- Change hardcoverBookId field and related methods to use String instead of Integer for consistency across extractors and writers
- Update metadata copy helpers and tests to reflect new hardcoverBookId type
- Improve identifier prefix handling in EPUB and PDF extractors to be case-insensitive and trim whitespace
- Allow PDF keywords to be split by comma or semicolon
- Rename TaskCreateRequest#getOptions to getOptionsAs for clarity and update usages
- Adjust series number writing in EPUB metadata to preserve decimals when needed
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(metadata): standardize usage of tags over categories and improve BookLore field extraction
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): add rating and ratingLocked fields to BookMetadata and improve PDF metadata extraction
- Add rating and ratingLocked fields to BookMetadata for enhanced rating support
- Refine PDF keyword extraction to handle both comma and semicolon delimiters
- Ensure ISBN fields are only set if cleaned values are non-blank
- Use temp file only stream cache when loading PDFs for metadata writing
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): implement ComicInfo.xml writing via JAXB, ensure XSD compliance and add tests for CBX metadata persistence
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): enhance metadata extraction with additional identifiers and improve parsing logic
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): improve metadata handling by ensuring descriptions are prioritized and enhancing keyword management for PDF compatibility
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(metadata): simplify Pages class structure in ComicInfo.java
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): refine PDF metadata writing by isolating categories for legacy compatibility and removing moods and tags from keywords
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): enhance PDF metadata extraction and writing with support for additional fields and improved handling of series information
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): enhance PDF metadata extraction and writing with support for additional fields and improved handling of series information
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): implement secure XML parsing utility and enhance metadata extraction with improved GTIN validation and debug logging
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(metadata): update package structure to align with new organization naming conventions
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(epub-metadata): streamline cover image extraction logic and improve error handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): enhance PDF and comic metadata extraction with additional fields
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat(metadata): migrate to tools.jackson for JSON processing in sidecar metadata handling
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(epub-metadata): streamline cover image extraction and enhance XML parsing security
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* fix(i18n): make sidebar menu labels translate dynamically on language change
* fix: sync package-lock.json with missing hono dependency
* style: normalize small font sizes to 0.875rem across UI components
* feat(i18n): add Transloco translation framework and translate all settings tabs (EN/ES)
* feat(i18n): translate shared, layout, dashboard, library-creator, and app-root components (EN/ES) and scaffold 7 new languages
* feat(i18n): translate bookdrop and metadata components (EN/ES), remove i18n-audit from tracking
* fix(i18n): deep-merge English as fallback base for incomplete language translations
* fix(epub-metadata): enhance cover extraction with heuristic fallbacks for manifest and ZIP entries
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test(epub-metadata-extractor): add heuristic cover creation methods for EPUB files
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add comic metadata support to metadata picker and fix Comicvine parser
* feat: lazy-load Comicvine issue details on selection
* feat: lazy-load detail metadata for Amazon, GoodReads, and Audible parsers
* fix: prevent spurious comic_metadata row creation for non-comic books
* fix: extract rich previews from Audible search and reorder picker sections
* feat: redesign metadata editor layout with collapsible sections and boolean selects
* fix: implement per-field comic metadata locks replacing grouped locks
* feat: add comic metadata filters and fix visibleFilters backend support
* fix: use human-readable role labels in comic creator filter
* fix: auto-populate comic metadata from ComicVine during metadata fetch
* refactor: clean up ComicvineBookParser remove duplication and comments
* fix: use ComicMetadata webLink for ComicVine favicon URL
* fix: cache library options to prevent Set All dropdowns from resetting
* fix: stream book content from disk instead of loading entire file into memory
* fix: increase max visible filters from 15 to 20
* feat: replace filter multiselect with drag-and-drop reorderable list
* fix: use audiobook-specific cover paths and cache busting for audiobook thumbnail updates
* chore: enforce mandatory screenshots and stricter testing requirements in PR template
* fix: update BookServiceTest to match Resource return type after streaming change
---------
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* feat: remove nginx and serve Angular directly from Spring Boot
* fix: handle null values in EnabledFields deserialization from persisted JSON
* fix(migration): auto-repair failed Flyway migrations on startup
* fix(migration): replace DB triggers with app-level orphan cleanup
* fix: restore default port to 6060 for backwards compatibility
* fix: align all port references to 6060 and add OPDS compression MIME types
* fix: resolve NG0101 recursive tick error in book browser selection
---------
Co-authored-by: acx10 <acx10@users.noreply.github.com>
Add IF NOT EXISTS / IF EXISTS / DROP IF EXISTS guards to prevent
failures when migrations are re-run after partial application on
MariaDB which lacks transactional DDL support.
Reverts V114 to its original content to preserve Flyway checksum
for existing installations. Moves orphan-cleanup triggers to new
V117 migration to avoid checksum mismatch failures on MariaDB.
* refactor: simplify RestTemplate and ObjectMapper configurations, add no-args constructors to progress classes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* chore: update Gradle and Java versions in Docker configuration and build files
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test: enhance header assertions in tests and add spring-boot-test-autoconfigure dependency
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(tests): migrate to SpringBootTest and update entity management in test cases
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test: update test property configurations for H2 database in Healthcheck and BookOpds repository tests
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test: clean up HealthcheckControllerTest by removing unnecessary whitespace and comments
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* test: remove unnecessary whitespace in HealthcheckControllerTest
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* chore: downgrade Flyway version from 12.0.0 to 11.14.1 in build.gradle
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* chore: downgrade Flyway version from 12.0.0 to 11.14.1 in build.gradle
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add @DependsOn annotation for Flyway in MultipartConfig
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add @DependsOn annotation for Flyway in LibraryService
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add test configuration for Flyway in HealthcheckControllerTest
chore: remove unused path variable in deleteLibrary method of LibraryService
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: configure Flyway migration and update test configuration
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: enable remote debugging in bootRun configuration
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: update Flyway version and enhance ObjectMapper configuration
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: remove @DependsOn annotation for Flyway in MultipartConfig and LibraryService
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add NoArgsConstructor and AllArgsConstructor annotations to DTO classes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add NoArgsConstructor and AllArgsConstructor annotations to FileProcessResult, MetadataUpdateContext, and MetadataUpdateWrapper classes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add DependsOnDatabaseInitialization annotation to MultipartConfig, AppSettingService, LibraryService, and JwtSecretService classes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add DependsOnDatabaseInitialization annotation to MultipartConfig and CronService classes
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: implement lazy initialization and thread safety for JWT secret retrieval
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add Flyway dependency and update LibraryService initialization to use ApplicationReadyEvent
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor: remove outdated comments from JwtSecretService class
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor: migrate from com.fasterxml.jackson to tools.jackson for JSON processing
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor: remove unused ObjectMapper bean and related imports from JacksonConfig
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: configure async support with VirtualThreadTaskExecutor in WebMvcConfig
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: enhance application performance with virtual threads and HTTP/2 support
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add JsonSetter annotation to skip null values for triggeredByCron field
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: add triggeredByCron field to TaskCreateRequest and initialize in task management
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* feat: enable Spring Data web support with DTO serialization in WebMvcConfig
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(UserDefaultsService): simplify class structure and remove unused methods
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(BookOpdsRepositoryDataJpaTest): simplify test setup and use TestEntityManager
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(BookOpdsRepositoryDataJpaTest): update test configuration and simplify entity persistence
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor: update Jackson dependencies and migrate to Jackson 3
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(build.gradle): update jackson-annotations dependency to use Jackson 3 BOM
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(BookOpdsRepositoryDataJpaTest): remove unused ObjectMapper bean definition
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
* refactor(LibraryService): simplify library deletion logic
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
---------
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
Allow users to choose which file format to send when emailing a book.
Includes file size display and large file warnings for files >25MB.
Backend:
- Add optional bookFileId to SendBookByEmailRequest
- Add resolveBookFile() to resolve specific file or fallback to primary
- Update SendEmailV2Service to use specified file path
Frontend:
- Change openCustomSendDialog to accept Book object
- Add format selection with radio buttons showing type/size
- Add "Primary" badge and large file warning banner
- Update book-card and metadata-viewer callers
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* feat(icons): Made icons for libraries and shelves optional with no default icon displayed.
* Added tests for making sure the API handles nullable icons for Shelves and Libraries.
* Fixed some issues identified during PR review.
* Rebased on develop.
I tested this on my end and it prevents the auto-zooming, but does not prevent manual user scrolling, essentially a perfect solution to a UI issue on iOS
* fix(hardcover-sync): Don't send repeated read status to Hardcover.app
* fix(hardcover-sync): Use progress percentage instead of read status
* fix(hardcover-sync): Add test cases
* fix(hardcover-sync): Also check read status for changes
* feat(kobo-sync): sync shelves and magic shelves to kobo tags
* refactor(kobo-sync): replace `EntityNotFoundException` with `NoSuchElementException`, update timestamps handling, and add unit tests for `generateTags`
---------
Co-authored-by: ACX <8075870+acx10@users.noreply.github.com>
* Audiobook enhancement
* Fix choppy virtual scroller with mixed audiobook/ebook cards by using uniform heights
* Fix audiobook cover regeneration for combined books and improve error messages
* Fix cover extraction when attaching audiobook files during rescan
* Set audiobookCoverUpdatedOn for cache busting when generating cover
* Add support for regenerating covers from specific book files
* Fix Continue Reading/Listening scrollers to filter by actual progress instead of primary file type
* Show ebook cover and open ebook reader in Continue Reading scroller for combined books
* Prevent read status from being downgraded when saving audiobook progress
* Fix BookCoverServiceTest to match updated regenerateCover method signature
---------
Co-authored-by: acx10 <acx10@users.noreply.github.com>
* fix(kobo-sync): Kobo reading state sync by returning the device expected shape and improve management with new DTOs and timestamp normalization
- Introduced `KoboReadingStateList` and `KoboReadingStateRequest` DTOs for improved handling of reading states.
- Updated `KoboController` to utilize the new DTOs and log request bodies.
- Enhanced `KoboReadingStateService` to normalize timestamps during reading state updates and merges.
- Adjusted repository queries to include user ID for better data integrity.
- Updated tests to reflect changes in DTOs and repository interactions.
* feat(kobo-sync): Enhance Kobo reading state management with user ID integration
* feat(kobo-sync): Add JSON annotations to KoboReadingStateList for improved serialization
* refactor(kobo-sync): Update repository and service methods to enhance reading state retrieval logic
- Replaced the existing method for fetching reading states with a new query that orders results by priority and timestamps.
- Updated service classes to utilize the new repository method for improved data handling.
- Adjusted unit tests to reflect changes in repository interactions.
* Enhance KoboReadingStateService and add database migration for user_id
- Added a new column `user_id` to the `kobo_reading_state` table with a foreign key constraint referencing the `users` table.
- Updated the `KoboReadingStateService` class by adding a new method to check for blank values, improving code readability and maintainability.