* 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.