840 Commits

Author SHA1 Message Date
acx10
23559d8b0a Remove all traces of telemetry (#3366)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-04-14 08:24:35 -06:00
James Ward
cc3d79407c fix(cron): proper return type for isTelemetryEnabled() (#3315) 2026-03-13 19:11:18 -06:00
James Ward
cac557b74e fix(cron): prevent telemetry ping when telemetry is disabled (#3313)
this updates the cron to avoid running the telemetry ping when
telemetry is disabled so that personally identifiable information
is not sent off to other parties (an IP address, an installation ID)
2026-03-12 20:43:28 -06:00
ACX
9e1ff527e8 Fix NPE when deleting authors by removing from book metadata first (#3296) (#3312) 2026-03-12 20:12:20 -06:00
Max
5fa511a26c WIP: replacement content for existing PR (#3011) 2026-03-12 19:13:30 -06:00
acx10
aeeba4169b Fix audiobook progress percentage calculation 2026-03-11 23:25:02 -06:00
ACX
210eed7ae0 Allow logout+jwt token type in OIDC backchannel logout (#3270) (#3291) 2026-03-11 17:26:45 -06:00
acx10
185422810d feat: mobile/app API enhancements 2026-03-10 21:41:29 -06:00
ACX
96b62fe902 Make OIDC scopes configurable to fix Entra ID login (#3261) (#3265) 2026-03-09 20:22:43 -06:00
ACX
bf1957847c Scanner organization modes (#3203)
* Add BOOK_PER_FILE and BOOK_PER_FOLDER organization modes for library scanning

* Filter temp/partial files, support .ignore directories, and skip zero-byte files during scanning

* Replace event-based monitoring with WatchService, add pending deletion pool and move detection

* Fix folder-based audiobook grouping, improve series detection, and add tests

* Add unit tests for BookFileTransactionalHandler, BookFilePersistenceService, and LibraryFileEventProcessor
2026-03-09 14:42:44 -06:00
ACX
1a8513dae4 Fix cover download failing when CDN redirects to raw IP (#3247) 2026-03-08 13:34:24 -06:00
ACX
92b395e0d2 Force UTC session timezone on JDBC connections to prevent DST gap rejections (#3245) 2026-03-08 10:26:09 -06:00
ACX
95fb920472 Add bulk ISBN import from file (#3239) (#3244) 2026-03-08 10:25:05 -06:00
ACX
c3ecf49984 Allow physical and digital book states to coexist (#3238) 2026-03-07 17:59:24 -07:00
acx10
36c7185636 Gate all file write operations for network storage users (#3231) 2026-03-07 16:17:00 -07:00
ACX
dcf54d6cad Add ASIN lookup to author search (#3162) (#3228) 2026-03-07 14:51:28 -07:00
ACX
bdb838d2e4 Add option to regenerate only missing covers (#3181) (#3227) 2026-03-07 14:42:46 -07:00
Benjamin Erb
4aadbefe4f fix: sort libraries by name in OPDS feed (#3220) 2026-03-07 13:22:03 -07:00
ACX
4031bba8cb Fall back to folder cover images when embedded cover extraction fails (#3212) 2026-03-06 19:56:21 -07:00
ACX
82b8e6c906 Increase minimum password length from 6 to 8 characters (#3207) 2026-03-06 16:56:56 -07:00
acx10
de796556b5 Renormalize gradlew.bat line endings to CRLF 2026-03-06 10:43:44 -07:00
dependabot[bot]
26fecf7f40 chore(deps): bump the gradle-dependencies group (#3188)
Bumps the gradle-dependencies group in /booklore-api with 5 updates:

| Package | From | To |
| --- | --- | --- |
| org.flywaydb:flyway-mysql | `12.0.2` | `12.0.3` |
| [org.springdoc:springdoc-openapi-starter-webmvc-ui](https://github.com/springdoc/springdoc-openapi) | `3.0.1` | `3.0.2` |
| [org.tukaani:xz](https://github.com/tukaani-project/xz-java) | `1.11` | `1.12` |
| org.hibernate.orm | `7.2.5.Final` | `7.2.6.Final` |
| gradle-wrapper | `9.3.1` | `9.4.0` |


Updates `org.flywaydb:flyway-mysql` from 12.0.2 to 12.0.3

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

Updates `org.tukaani:xz` from 1.11 to 1.12
- [Release notes](https://github.com/tukaani-project/xz-java/releases)
- [Changelog](https://github.com/tukaani-project/xz-java/blob/master/NEWS.md)
- [Commits](https://github.com/tukaani-project/xz-java/compare/v1.11...v1.12)

Updates `org.hibernate.orm` from 7.2.5.Final to 7.2.6.Final

Updates `gradle-wrapper` from 9.3.1 to 9.4.0

---
updated-dependencies:
- dependency-name: org.flywaydb:flyway-mysql
  dependency-version: 12.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.springdoc:springdoc-openapi-starter-webmvc-ui
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.tukaani:xz
  dependency-version: '1.12'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: org.hibernate.orm
  dependency-version: 7.2.6.Final
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: gradle-wrapper
  dependency-version: 9.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  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-03-06 10:28:34 -07:00
ACX
1ad1aa6a73 Fix Kobo sync failure caused by null root in magic shelf rule evaluation (#3074) (#3178) 2026-03-04 23:28:49 -07:00
ACX
9c249fff1d Replace arrow-based author reordering with CDK drag chips and persist author sort order (#3167) (#3175) 2026-03-04 18:29:53 -07:00
ACX
3ff8f0f69f Fix Kobo sync timeout with large magic shelves (#3172) (#3173)
* overhaul OIDC: backend token exchange, security hardening, group mapping, session management

* add unit tests for OIDC overhaul (166 tests across 12 classes)

* rewrite unit tests for metadata and extractor packages (~450 tests)

* fix Kobo sync timeout with large magic shelves (#3172)
2026-03-04 15:11:20 -07:00
Pedro Nave
f8375f03f3 feat(hardcover): get Hardcover metadata from a specific edition when ISBN is provided (#2678)
* fix: clean ISBN should allow ISBNs to have an X at the end

* hardcover mood filter overload for just list of tags

* When ISBN is given, fetch the book directly by the edition with that ISBN, and provide metadata from that edition

* chore: improved formatting

* PR improvements

* replaced CachedTag with GraphQL specific class

* moved hardcover cached tag to shared model
2026-03-04 14:48:22 -07:00
arjunsrinivasan1997
be04df6a11 fix(api):Remove unused TaskType file (#2789) 2026-03-04 14:46:38 -07:00
Ilya Shaplyko
463ff3eae5 fix(metadata): ensure EPUB version-aware metadata writing (#2998)
* fix(metadata): ensure EPUB version-aware metadata writing

EpubMetadataWriter unconditionally wrote EPUB3-only constructs into
all EPUB files regardless of version, producing invalid OPF documents
for EPUB3 files (e.g. opf:file-as/opf:role attributes on dc:creator)
and writing EPUB3-only elements into EPUB2 files.

Changes:
- createCreatorElement: EPUB3 uses <meta refines="#id"> for file-as/role;
  EPUB2 uses opf: attributes on dc:creator
- addFolderContentsToZip: mimetype is now STORED (uncompressed) and
  written as the first ZIP entry per EPUB spec
- replaceBelongsToCollection: EPUB3 uses belongs-to-collection with
  refines; EPUB2 uses calibre:series/calibre:series_index convention
- addSubtitleToTitle: EPUB3 uses separate dc:title with title-type
  refinement; EPUB2 stores subtitle via booklore:subtitle metadata only
- addBookloreMetadata/createBookloreMetaElement: EPUB3 uses property
  attribute with prefix; EPUB2 uses name/content attribute form
- removeAllBookloreMetadata: now handles both EPUB3 property and EPUB2
  name attributes
- cleanupCalibreArtifacts: preserves calibre:series and
  calibre:series_index metas used for EPUB2 series
- organizeMetadataElements: correctly categorizes EPUB2-style series
  and booklore metas into their respective buckets
- addBookloreMetadata: writes booklore:subtitle for round-trip fidelity
- Added isEpub3() helper method

Closes #2997

* fix(metadata): address review feedback for EPUB version-aware writing

- Only preserve calibre:series/calibre:series_index for EPUB2 in
  cleanupCalibreArtifacts; EPUB3 files now properly remove stale entries
- Use isEpub3() helper in createCreatorElement instead of inline detection
- Add trim() to isEpub3() to handle whitespace in version attribute
- Log warning when mimetype file is missing from extracted EPUB
2026-03-04 14:37:58 -07:00
ACX
52e312f67e fix flaky thisPeriod month test on 1st of month (#3130) 2026-02-28 22:14:54 -07:00
ACX
4956e8ae40 turn off auto book search by default, only trigger on search tab (#3127) 2026-02-28 21:56:41 -07:00
acx10
a1666932cb feat(mobile): add author and series endpoints 2026-02-28 18:39:52 -07:00
Jadehawk
e26ac45ae9 fix(epub): restore Calibre extraction, add age/content rating, fix BookDrop metadata loss (#3114)
Restores and extends the EPUB metadata extraction work from PR #1879
with additional fixes for field mapping gaps found in the processor,
BookDrop finalization, and JSON sidecar.

EPUB Metadata Extractor (EpubMetadataExtractor.java)
- Restore Calibre user_metadata iteration that was regressed: now
  iterates <calibre:user_metadata> elements and maps custom columns
  via CALIBRE_FIELD_MAPPINGS
- Add #age_rating and #content_rating to CALIBRE_FIELD_MAPPINGS
  so Calibre-managed rating/rating string fields are imported
- Add CALIBRE_IDENTIFIER_PREFIXES map for calibre: identifier
  fallback (hardcover_book, lubimyczytac, ranobedb, etc.)
- Support both read paths: booklore: namespace (round-trip) and
  Calibre user_metadata (first import from Calibre library)
- Validate age_rating values against VALID_AGE_RATINGS whitelist

EPUB Metadata Writer (EpubMetadataWriter.java)
- Write booklore:age_rating and booklore:content_rating to the
  OPF so values survive a round-trip rescan

Metadata Change Detector (MetadataChangeDetector.java)
- Mark ageRating and contentRating as includedInFileWrite=true so
  saving either field triggers a write-back to the EPUB file

EPUB Processor (EpubProcessor.java)
- Map extracted ageRating and contentRating from BookMetadata DTO
  into BookMetadataEntity in setBookMetadata(); these two lines were
  the silent reason values never reached the DB on library scan

BookDrop Service (BookDropService.java)
- Change processMovedFile() from REPLACE_ALL to REPLACE_WHEN_PROVIDED
  when applying bookdrop review metadata after file extraction.
  REPLACE_ALL unconditionally calls the setter even with null, wiping
  ageRating/contentRating that EpubProcessor just extracted from the
  file. REPLACE_WHEN_PROVIDED skips null fields and preserves the
  file-extracted values when the bookdrop review form does not submit
  those fields.

JSON Sidecar (SidecarIdentifiers.java, SidecarMetadataMapper.java)
- Add missing hardcoverBookId field to SidecarIdentifiers DTO
- Write hardcoverBookId in buildIdentifiers() (toSidecarMetadata path)
- Read hardcoverBookId in toBookMetadata() (sidecar import path)
  All other identifiers were already present; hardcoverBookId was the
  only one absent from all three locations simultaneously.

Tests (EpubMetadataExtractorTest.java)
- Add comprehensive test coverage for both extraction paths:
  booklore: namespace (round-trip) and Calibre user_metadata/
  identifier extraction including age_rating and content_rating
2026-02-28 16:15:55 -07:00
blitzar3k
a3a973024c fix: Populate ASIN field from Audible metadata search results (#2974) (#2985)
Co-authored-by: blitzar3k <263961889+blitzar3k@users.noreply.github.com>
2026-02-28 15:17:39 -07:00
ACX
0c5c22ab0c fix thumbnail missing-file test to assert ClassPathResource (#3121) 2026-02-28 14:56:11 -07:00
acx10
7decb9947b Merge branch 'develop' into mobile-library-allowed-formats-and-thumbnail-fix
* develop:
  Translations update from Hosted Weblate (#3113)
2026-02-28 14:36:38 -07:00
ACX
baed4002c7 Translations update from Hosted Weblate (#3113)
* fix: add DISTINCT to magic shelf specification to prevent duplicate rows

JOINs on multi-valued associations (authors, tags, shelves) produced
duplicate BookEntity rows, causing paginated results to contain fewer
unique books than the requested page size.

* Translated using Weblate (Indonesian)

Currently translated at 50.0% (3 of 6 strings)

Translation: BookLore/App
Translate-URL: https://hosted.weblate.org/projects/booklore/app/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.2% (1 of 80 strings)

Translation: BookLore/Settings Naming
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-naming/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.8% (3 of 166 strings)

Translation: BookLore/Reader Ebook
Translate-URL: https://hosted.weblate.org/projects/booklore/reader-ebook/id/

* Translated using Weblate (Indonesian)

Currently translated at 15.7% (3 of 19 strings)

Translation: BookLore/Series Browser
Translate-URL: https://hosted.weblate.org/projects/booklore/series-browser/id/

* Translated using Weblate (Indonesian)

Currently translated at 24.0% (39 of 162 strings)

Translation: BookLore/Settings Reader
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-reader/id/

* Translated using Weblate (Indonesian)

Currently translated at 0.1% (1 of 690 strings)

Translation: BookLore/Book
Translate-URL: https://hosted.weblate.org/projects/booklore/book/id/

* Translated using Weblate (Indonesian)

Currently translated at 10.7% (3 of 28 strings)

Translation: BookLore/Settings Profile
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-profile/id/

* Translated using Weblate (Indonesian)

Currently translated at 6.6% (1 of 15 strings)

Translation: BookLore/Settings Audit Logs
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-audit-logs/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.7% (1 of 57 strings)

Translation: BookLore/Settings Auth
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-auth/id/

* Translated using Weblate (Indonesian)

Currently translated at 7.3% (32 of 438 strings)

Translation: BookLore/Stats User
Translate-URL: https://hosted.weblate.org/projects/booklore/stats-user/id/

* Translated using Weblate (Ukrainian)

Currently translated at 49.3% (80 of 162 strings)

Translation: BookLore/Settings Reader
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-reader/uk/

* Translated using Weblate (Indonesian)

Currently translated at 95.8% (23 of 24 strings)

Translation: BookLore/Common
Translate-URL: https://hosted.weblate.org/projects/booklore/common/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.4% (2 of 140 strings)

Translation: BookLore/Settings Users
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-users/id/

* Translated using Weblate (Indonesian)

Currently translated at 18.2% (23 of 126 strings)

Translation: BookLore/Shared
Translate-URL: https://hosted.weblate.org/projects/booklore/shared/id/

* Translated using Weblate (Indonesian)

Currently translated at 3.8% (2 of 52 strings)

Translation: BookLore/Library Creator
Translate-URL: https://hosted.weblate.org/projects/booklore/library-creator/id/

* Translated using Weblate (Indonesian)

Currently translated at 84.6% (11 of 13 strings)

Translation: BookLore/Settings
Translate-URL: https://hosted.weblate.org/projects/booklore/settings/id/

* Translated using Weblate (Indonesian)

Currently translated at 4.6% (2 of 43 strings)

Translation: BookLore/Layout
Translate-URL: https://hosted.weblate.org/projects/booklore/layout/id/

* Translated using Weblate (Indonesian)

Currently translated at 3.8% (2 of 52 strings)

Translation: BookLore/Dashboard
Translate-URL: https://hosted.weblate.org/projects/booklore/dashboard/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.5% (3 of 188 strings)

Translation: BookLore/Stats Library
Translate-URL: https://hosted.weblate.org/projects/booklore/stats-library/id/

* Translated using Weblate (Indonesian)

Currently translated at 5.2% (2 of 38 strings)

Translation: BookLore/Settings Application
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-application/id/

* Translated using Weblate (Indonesian)

Currently translated at 0.5% (3 of 535 strings)

Translation: BookLore/Metadata
Translate-URL: https://hosted.weblate.org/projects/booklore/metadata/id/

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (38 of 38 strings)

Translation: BookLore/Settings Application
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-application/sl/

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (24 of 24 strings)

Translation: BookLore/Common
Translate-URL: https://hosted.weblate.org/projects/booklore/common/sl/

* Translated using Weblate (Indonesian)

Currently translated at 3.5% (1 of 28 strings)

Translation: BookLore/Settings Library Metadata
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-library-metadata/id/

* Translated using Weblate (Indonesian)

Currently translated at 6.8% (3 of 44 strings)

Translation: BookLore/Reader Audiobook
Translate-URL: https://hosted.weblate.org/projects/booklore/reader-audiobook/id/

* Translated using Weblate (Indonesian)

Currently translated at 20.3% (23 of 113 strings)

Translation: BookLore/Settings View
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-view/id/

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (535 of 535 strings)

Translation: BookLore/Metadata
Translate-URL: https://hosted.weblate.org/projects/booklore/metadata/sl/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (3 of 3 strings)

Translation: BookLore/Nav
Translate-URL: https://hosted.weblate.org/projects/booklore/nav/id/

* Translated using Weblate (Indonesian)

Currently translated at 2.5% (3 of 118 strings)

Translation: BookLore/Settings Device
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-device/id/

* Translated using Weblate (Indonesian)

Currently translated at 4.5% (1 of 22 strings)

Translation: BookLore/Notebook
Translate-URL: https://hosted.weblate.org/projects/booklore/notebook/id/

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (690 of 690 strings)

Translation: BookLore/Book
Translate-URL: https://hosted.weblate.org/projects/booklore/book/sl/

* Translated using Weblate (Indonesian)

Currently translated at 8.6% (2 of 23 strings)

Translation: BookLore/Auth
Translate-URL: https://hosted.weblate.org/projects/booklore/auth/id/

* Translated using Weblate (Indonesian)

Currently translated at 2.5% (3 of 117 strings)

Translation: BookLore/Settings Email
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-email/id/

* Translated using Weblate (Indonesian)

Currently translated at 75.0% (3 of 4 strings)

Translation: BookLore/Reader Pdf
Translate-URL: https://hosted.weblate.org/projects/booklore/reader-pdf/id/

* Translated using Weblate (Ukrainian)

Currently translated at 79.1% (19 of 24 strings)

Translation: BookLore/Common
Translate-URL: https://hosted.weblate.org/projects/booklore/common/uk/

* Translated using Weblate (Indonesian)

Currently translated at 4.4% (3 of 68 strings)

Translation: BookLore/Settings Opds
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-opds/id/

* Translated using Weblate (Indonesian)

Currently translated at 2.7% (3 of 111 strings)

Translation: BookLore/Reader Cbx
Translate-URL: https://hosted.weblate.org/projects/booklore/reader-cbx/id/

* Translated using Weblate (Indonesian)

Currently translated at 1.2% (1 of 80 strings)

Translation: BookLore/Settings Metadata
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-metadata/id/

* Translated using Weblate (Slovenian)

Currently translated at 100.0% (234 of 234 strings)

Translation: BookLore/Magic Shelf
Translate-URL: https://hosted.weblate.org/projects/booklore/magic-shelf/sl/

* Translated using Weblate (Ukrainian)

Currently translated at 95.6% (22 of 23 strings)

Translation: BookLore/Auth
Translate-URL: https://hosted.weblate.org/projects/booklore/auth/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (3 of 3 strings)

Translation: BookLore/Nav
Translate-URL: https://hosted.weblate.org/projects/booklore/nav/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (6 of 6 strings)

Translation: BookLore/App
Translate-URL: https://hosted.weblate.org/projects/booklore/app/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (13 of 13 strings)

Translation: BookLore/Settings
Translate-URL: https://hosted.weblate.org/projects/booklore/settings/uk/

* Translated using Weblate (Dutch)

Currently translated at 0.7% (5 of 690 strings)

Translation: BookLore/Book
Translate-URL: https://hosted.weblate.org/projects/booklore/book/nl/

* Translated using Weblate (Dutch)

Currently translated at 0.7% (5 of 690 strings)

Translation: BookLore/Book
Translate-URL: https://hosted.weblate.org/projects/booklore/book/nl/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (162 of 162 strings)

Translation: BookLore/Settings Reader
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-reader/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 0.8% (1 of 113 strings)

Translation: BookLore/Settings View
Translate-URL: https://hosted.weblate.org/projects/booklore/settings-view/uk/

* Translated using Weblate (Dutch)

Currently translated at 3.3% (23 of 690 strings)

Translation: BookLore/Book
Translate-URL: https://hosted.weblate.org/projects/booklore/book/nl/

---------

Co-authored-by: acx10 <acx10@users.noreply.github.com>
Co-authored-by: Danni <danninov@users.noreply.github.com>
Co-authored-by: vkhvostov <viktor.khvostov@gmail.com>
Co-authored-by: thehijacker <thehijacker@gmail.com>
Co-authored-by: JVT038 <jvt038@pm.me>
Co-authored-by: hiddit <ht13@live.nl>
2026-02-28 14:23:04 -07:00
acx10
485a8b2230 refactor(mobile): use coverUpdatedOn timestamps instead of cover hashes
Expose coverUpdatedOn/audiobookCoverUpdatedOn from metadata for
cache busting, matching the webapp's approach. Replaces coverHash
fields which didn't change when thumbnails were regenerated.
2026-02-28 13:57:57 -07:00
acx10
c472e07990 Merge branch 'develop' into mobile-library-allowed-formats-and-thumbnail-fix
* develop:
  simplify image download SSRF protection, remove broken IP-rewriting approach (#3118)
  Translations update from Hosted Weblate (#3103)
  add ukrainian and indonesian language support (#678) (#3102)
2026-02-28 13:51:09 -07:00
ACX
26497ca790 simplify image download SSRF protection, remove broken IP-rewriting approach (#3118) 2026-02-28 13:50:44 -07:00
acx10
d6084e81c4 refactor(mobile): expose cover hashes instead of booleans for cache busting
Replace hasCover/hasAudiobookCover booleans with the actual
coverHash/audiobookCoverHash strings. The client uses these as
URL query params so cover updates bust the CachedNetworkImage cache.
2026-02-28 13:39:03 -07:00
acx10
a6647a6cbf feat(mobile): add hasCover and hasAudiobookCover flags to book DTOs
Expose cover existence via bookCoverHash/audiobookCoverHash so the
mobile client can show generated placeholders instead of loading the
server's generic missing-cover image.
2026-02-28 13:32:46 -07:00
acx10
d19fe22d50 add allowedFormats to mobile library endpoint and fix thumbnail classpath fallback 2026-02-28 12:59:20 -07:00
ACX
11dea38267 fix metadata search save clearing age rating and content rating (#3069) (#3098) 2026-02-27 18:28:30 -07:00
ACX
251c2c60a8 fix author endpoints leaking authors across library boundaries (#3077) (#3096) 2026-02-27 18:14:37 -07:00
Karl Hesselgren
a37cc1d8a3 Add non-lowercased auth header to include list (#3078) 2026-02-27 09:19:04 -07:00
ACX
4d2eace655 fix comic book deletion failing with transient entity error (#3000) (#3067) 2026-02-27 01:49:10 -07:00
ACX
f9132fea12 add library health indicator in sidebar (#3005) (#3066) 2026-02-27 01:32:27 -07:00
ACX
c67291cc7f add codec, chapter count, and bitrate magic shelf filters (#3065) 2026-02-27 00:50:43 -07:00
ACX
6a610c0bb1 fix magic shelf audiobook duration filter and add missing audio file types (#3059) (#3064) 2026-02-27 00:41:38 -07:00
Balázs Szücs
88d7192d87 fix(goodreads): handle null and blank timestamps in date conversion (#3034) 2026-02-26 23:45:18 -07:00