742 Commits

Author SHA1 Message Date
ACX
2c391cb1f4 chore: fix memory leaks, add aria-labels, improve type safety and logging (#2764) 2026-02-15 09:42:43 -07:00
ACX
0358667323 fix: use audiobook thumbnail URL for audiobook entries in notebook (#2763) 2026-02-15 09:16:11 -07:00
ACX
03272f7c35 chore: add caching, validation, lazy routes, refresh rate limiting, JaCoCo, and cleanup (#2762)
* feat: add login rate limiting to prevent brute-force attacks

* chore: add caching, validation, lazy routes, refresh rate limiting, JaCoCo, and remove dead code
2026-02-15 08:51:25 -07:00
ACX
f7650d9fd6 feat: add login rate limiting to prevent brute-force attacks (#2761) 2026-02-15 08:25:12 -07:00
ACX
0318d1b3bb feat: enhance audit logs with geo flags, relative time, and UX improvements (#2760) 2026-02-15 08:11:39 -07:00
ACX
c9551ef4ab feat: add audit log system for tracking admin-significant actions (#2759) 2026-02-15 00:24:25 -07:00
ACX
0899b99188 feat: add metadata presence filter to magic shelf (#2757) 2026-02-14 21:41:03 -07:00
ACX
6f77223686 perf: optimize book list API with ETag, delta sync, and IndexedDB caching (#2753) 2026-02-14 17:47:08 -07:00
ACX
218befb3b5 feat: add grouped field dropdown and composite fields to magic shelf (#2750) 2026-02-14 15:47:34 -07:00
ACX
ffd2adb032 perf: strip unused fields from book list API response (#2741)
* perf: strip unused fields from book list API response

* fix: regenerate package-lock.json to sync with package.json
2026-02-13 22:09:01 -07:00
ACX
77b4deb942 feat: add button to fetch metadata from book file in metadata editor (#2739) 2026-02-13 21:04:00 -07:00
ACX
54f633faad feat: add annotation notebook with server-side pagination (#2736)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-02-13 14:43:31 -07:00
ACX
6b0cc27d1b feat: add else clause and value modifiers to file naming patterns (#2724) 2026-02-12 22:17:55 -07:00
dependabot[bot]
9d3be9ec92 chore(deps): bump the gradle-dependencies group (#2720)
Bumps the gradle-dependencies group in /booklore-api with 2 updates: org.flywaydb:flyway-mysql and [jakarta.xml.bind:jakarta.xml.bind-api](https://github.com/jakartaee/jaxb-api).


Updates `org.flywaydb:flyway-mysql` from 12.0.0 to 12.0.1

Updates `jakarta.xml.bind:jakarta.xml.bind-api` from 4.0.4 to 4.0.5
- [Release notes](https://github.com/jakartaee/jaxb-api/releases)
- [Commits](https://github.com/jakartaee/jaxb-api/compare/4.0.4...4.0.5)

---
updated-dependencies:
- dependency-name: org.flywaydb:flyway-mysql
  dependency-version: 12.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: jakarta.xml.bind:jakarta.xml.bind-api
  dependency-version: 4.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 20:48:48 -07:00
acx10
5e0de4d3eb fix(epub): suppress FileNotFoundException for optional EPUB files 2026-02-12 16:40:34 -07:00
ACX
414b6d8d9e fix(ui): encode filter values in query params to handle commas in names (#2117) (#2717) 2026-02-12 09:21:23 -07:00
Balázs Szücs
ae041f900f feat(epub): enhance EPUB processing with optimized path validation and content type mapping (#2598)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-12 09:13:01 -07:00
ACX
f8f448a19b fix: reset audiobook progress and clear cached progress in UI (#2641) (#2711) 2026-02-12 08:21:05 -07:00
ACX
8128269310 feat(stats): add 5 new user statistics charts (#2703)
* feat(stats): add 5 new user statistics charts

* fix(stats): use COALESCE for dateFinished in heartbeat and page turner queries

* refactor(stats): remove heartbeat, genre flow, reading seasons, and abandonment autopsy charts

* feat(stats): add 5 new user statistics charts

* feat(stats): add info tooltips to all 5 new charts

* perf(stats): limit completion race chart to 15 most recent books server-side

* fix(stats): limit completion race to 10 books and cap progress at 100%

* refactor(stats): replace streak bars with GitHub-style activity heatmap calendar

* fix(stats): widen chart info tooltips to prevent tall narrow box

* feat(stats): add info tooltip to Page Turner Score chart

* feat(stats): add info tooltips to 7 existing charts

* refactor(stats): deduplicate chart-info-icon style into global styles.scss

* refactor(stats): fix scoring bugs and improve Reading DNA and Reading Habits charts

* refactor(stats): rebalance Series Progress Tracker layout and unify heatmap footer pills

* feat(stats): add info tooltips to 4 remaining charts

* fix(stats): fix session duration and overlap bugs in Reading Session Timeline
2026-02-12 00:11:49 -07:00
ACX
9ed6a3fe72 feat(reader): add PDF annotations, Range streaming, and optimized chunk loading (#2701) 2026-02-11 16:51:59 -07:00
Balázs Szücs
e8530fa0b7 fix(comicvine): add fallback to issue detail endpoint for missing creator credits (#2694)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-11 10:22:49 -07:00
WorldTeacher
7e6ad212b0 show session numbers in book (#2696) 2026-02-11 10:22:01 -07:00
ACX
6da6e8e373 fix(metadata): improve cover errors, reduce metadata fetch count, and hide attach option (#2690)
* fix(metadata): improve cover regen errors and reduce detailed metadata fetch count

* fix(metadata): hide attach-to-book option in single-format libraries

---------

Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-02-10 21:14:46 -07:00
ACX
ff11ec57b8 feat(metadata): return full metadata from fetchMetadata instead of previews (#2689)
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>
2026-02-10 15:49:11 -07:00
ACX
0fa84e3424 feat(sort): replace compound sort options with atomic fields and multi-sort support (#2686)
* 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
2026-02-10 14:27:07 -07:00
ACX
78a8bb4fea fix(settings): use boxed Integer for ScrollerConfig.maxItems to allow null (#2684)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-02-10 10:40:07 -07:00
Balázs Szücs
9444a544f9 feat(cbx-reader): enhance ZIP archive handling with Unicode support and fallback mechanisms (#2593)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-10 09:30:31 -07:00
Balázs Szücs
697de9052f feat(metadata): add custom metadata write to file support for moods, tags, ratings, and external IDs in PDF, and CBZ (#2552)
* 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>
2026-02-10 09:29:25 -07:00
Balázs Szücs
45dba44833 fix(epub-metadata): enhance cover extraction with heuristic fallbacks for manifest and ZIP entries (#2636)
* 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>
2026-02-09 16:46:50 -07:00
ACX
ffd4615b87 feat: comic metadata picker, lazy-load providers, and UI improvements (#2679)
* 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>
2026-02-09 16:43:53 -07:00
ACX
bc7ba8b933 Remove nginx and serve Angular directly from Spring Boot (#2662)
* 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>
2026-02-08 15:02:25 -07:00
dependabot[bot]
843b64969c chore(deps): bump the gradle-dependencies group across 1 directory with 7 updates (#2659)
Bumps the gradle-dependencies group with 7 updates in the /booklore-api directory:

| Package | From | To |
| --- | --- | --- |
| org.flywaydb:flyway-mysql | `11.19.0` | `12.0.0` |
| [io.documentnode:epub4j-core](https://github.com/documentnode/epub4j) | `4.2.2` | `4.2.3` |
| [org.jsoup:jsoup](https://github.com/jhy/jsoup) | `1.21.2` | `1.22.1` |
| [org.springdoc:springdoc-openapi-starter-webmvc-ui](https://github.com/springdoc/springdoc-openapi) | `2.8.14` | `3.0.1` |
| [com.github.ben-manes.caffeine:caffeine](https://github.com/ben-manes/caffeine) | `3.2.0` | `3.2.3` |
| [org.assertj:assertj-core](https://github.com/assertj/assertj) | `3.27.6` | `3.27.7` |
| org.hibernate.orm | `7.2.0.Final` | `7.2.4.Final` |



Updates `org.flywaydb:flyway-mysql` from 11.19.0 to 12.0.0

Updates `io.documentnode:epub4j-core` from 4.2.2 to 4.2.3
- [Commits](https://github.com/documentnode/epub4j/compare/v4.2.2...v4.2.3)

Updates `org.jsoup:jsoup` from 1.21.2 to 1.22.1
- [Release notes](https://github.com/jhy/jsoup/releases)
- [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES.md)
- [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.21.2...jsoup-1.22.1)

Updates `org.springdoc:springdoc-openapi-starter-webmvc-ui` from 2.8.14 to 3.0.1
- [Release notes](https://github.com/springdoc/springdoc-openapi/releases)
- [Changelog](https://github.com/springdoc/springdoc-openapi/blob/v3.0.1/CHANGELOG.md)
- [Commits](https://github.com/springdoc/springdoc-openapi/compare/v2.8.14...v3.0.1)

Updates `com.github.ben-manes.caffeine:caffeine` from 3.2.0 to 3.2.3
- [Release notes](https://github.com/ben-manes/caffeine/releases)
- [Commits](https://github.com/ben-manes/caffeine/compare/v3.2.0...v3.2.3)

Updates `org.assertj:assertj-core` from 3.27.6 to 3.27.7
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.6...assertj-build-3.27.7)

Updates `org.hibernate.orm` from 7.2.0.Final to 7.2.4.Final

---
updated-dependencies:
- dependency-name: org.flywaydb:flyway-mysql
  dependency-version: 12.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gradle-dependencies
- dependency-name: io.documentnode:epub4j-core
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.jsoup:jsoup
  dependency-version: 1.22.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: org.springdoc:springdoc-openapi-starter-webmvc-ui
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gradle-dependencies
- dependency-name: com.github.ben-manes.caffeine:caffeine
  dependency-version: 3.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.assertj:assertj-core
  dependency-version: 3.27.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.hibernate.orm
  dependency-version: 7.2.4.Final
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-08 13:20:58 -07:00
acx10
855b215ee5 fix(migration): add idempotent guards to V114-V117 migrations
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.
2026-02-08 13:08:08 -07:00
acx10
7f3680dd21 fix(migration): move comic metadata triggers to separate migration
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.
2026-02-08 12:46:25 -07:00
Balázs Szücs
108d94c0f7 feat(api, build): Upgrade to Java 25, Gradle 9, and Spring Boot 4, Jackson 3 (#2597)
* 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>
2026-02-08 10:15:16 -07:00
ACX
e462b6c197 feat(sidecar): add sidecar JSON metadata file support (#2657)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-02-08 09:31:18 -07:00
ACX
c1c72ea7ba feat(comic-metadata): add extended comic metadata support (#2654)
* feat(metadata): add comic metadata support

* Fix metadata saving

* feat(comic-metadata): normalize comic metadata with relational tables

* feat(comic-metadata): add comic metadata UI components and model

---------

Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-02-07 21:15:59 -07:00
ACX
b2a4aa7960 feat(email): add format selection to email book dialog (#2650)
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>
2026-02-07 12:28:21 -07:00
WorldTeacher
d93f1b8dfb fix(file naming): follow documentation... (#2642)
... and add a leading zero to seriesIndex
2026-02-07 08:36:17 -07:00
Giroux Arthur
14236299f2 feat(icons): Made icons for libraries and shelves optional with no default icons. (#2599)
* 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.
2026-02-07 08:25:34 -07:00
PhasecoreX
a941ef51b5 fix(hardcover-sync): Don't send repeated read status to Hardcover.app (#2609)
* 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
2026-02-07 08:22:28 -07:00
acx10
11007325b3 Audiobook fixes 2026-02-06 17:47:22 -07:00
Balázs Szücs
f5326ce435 fix(file-move): update empty directory cleanup to handle multiple library paths (#2634)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-06 13:12:38 -07:00
Balázs Szücs
cd428c6fe3 fix(file-move): implement transaction management for file moves and rollback on failure (#2592)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-06 13:11:10 -07:00
Balázs Szücs
37f6417e3d fix(library-service): prevent concurrent library scans with a tracking set (#2637)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-06 13:06:41 -07:00
ACX
37ea0b156f feat(google-books): add optional API key configuration (#2629) 2026-02-05 22:37:12 -07:00
ACX
555cd13f8a fix(auth): resolve DST-related login failure for refresh tokens (#2624) 2026-02-05 20:16:27 -07:00
ACX
9f9c762180 feat(content-restrictions): add age rating and content rating support (#2619) 2026-02-05 17:10:44 -07:00
Balázs Szücs
c7dd23ed85 fix(file-move): implement transaction management for file moves and rollback on failure (#2588)
Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2026-02-05 14:01:34 -07:00
xcashy
539734a3cf feat(kobo-sync): Sync Shelves and Magic Shelves to Kobo Tags (#2236)
* 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>
2026-02-05 13:59:08 -07:00