845 Commits

Author SHA1 Message Date
dependabot[bot] a8f0353035 chore(deps): bump the gradle-dependencies group across 1 directory with 15 updates (#3377)
Bumps the gradle-dependencies group with 13 updates in the /booklore-api directory:

| Package | From | To |
| --- | --- | --- |
| [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) | `3.5.7` | `3.5.8` |
| org.flywaydb:flyway-mysql | `12.0.3` | `12.5.0` |
| [org.projectlombok:lombok](https://github.com/projectlombok/lombok) | `1.18.42` | `1.18.46` |
| org.apache.pdfbox:pdfbox | `3.0.6` | `3.0.7` |
| [com.github.junrar:junrar](https://github.com/junrar/junrar) | `7.5.8` | `7.5.10` |
| [org.jsoup:jsoup](https://github.com/jhy/jsoup) | `1.22.1` | `1.22.2` |
| [org.springdoc:springdoc-openapi-starter-webmvc-ui](https://github.com/springdoc/springdoc-openapi) | `3.0.2` | `3.0.3` |
| org.glassfish.jaxb:jaxb-runtime | `4.0.6` | `4.0.7` |
| [tools.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) | `3.1.0` | `3.1.2` |
| [org.springframework.boot](https://github.com/spring-projects/spring-boot) | `4.0.3` | `4.0.6` |
| org.hibernate.orm | `7.2.6.Final` | `7.3.2.Final` |
| com.github.ben-manes.versions | `0.53.0` | `0.54.0` |
| [gradle-wrapper](https://github.com/gradle/gradle) | `9.4.0` | `9.5.0` |



Updates `org.mariadb.jdbc:mariadb-java-client` from 3.5.7 to 3.5.8
- [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases)
- [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.7...3.5.8)

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

Updates `org.projectlombok:lombok` from 1.18.42 to 1.18.46
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.42...v1.18.46)

Updates `org.apache.pdfbox:pdfbox` from 3.0.6 to 3.0.7

Updates `org.apache.pdfbox:pdfbox-io` from 3.0.6 to 3.0.7

Updates `org.apache.pdfbox:xmpbox` from 3.0.6 to 3.0.7

Updates `com.github.junrar:junrar` from 7.5.8 to 7.5.10
- [Release notes](https://github.com/junrar/junrar/releases)
- [Changelog](https://github.com/junrar/junrar/blob/master/CHANGELOG.md)
- [Commits](https://github.com/junrar/junrar/compare/v7.5.8...v7.5.10)

Updates `org.jsoup:jsoup` from 1.22.1 to 1.22.2
- [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.22.1...jsoup-1.22.2)

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

Updates `org.glassfish.jaxb:jaxb-runtime` from 4.0.6 to 4.0.7

Updates `tools.jackson:jackson-bom` from 3.1.0 to 3.1.2
- [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-3.1.0...jackson-bom-3.1.2)

Updates `org.springframework.boot` from 4.0.3 to 4.0.6
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v4.0.3...v4.0.6)

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

Updates `com.github.ben-manes.versions` from 0.53.0 to 0.54.0

Updates `gradle-wrapper` from 9.4.0 to 9.5.0
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.4.0...v9.5.0)

---
updated-dependencies:
- dependency-name: org.mariadb.jdbc:mariadb-java-client
  dependency-version: 3.5.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.flywaydb:flyway-mysql
  dependency-version: 12.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: org.projectlombok:lombok
  dependency-version: 1.18.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.apache.pdfbox:pdfbox
  dependency-version: 3.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.apache.pdfbox:pdfbox-io
  dependency-version: 3.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.apache.pdfbox:xmpbox
  dependency-version: 3.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: com.github.junrar:junrar
  dependency-version: 7.5.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.jsoup:jsoup
  dependency-version: 1.22.2
  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.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.glassfish.jaxb:jaxb-runtime
  dependency-version: 4.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: tools.jackson:jackson-bom
  dependency-version: 3.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.springframework.boot
  dependency-version: 4.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.hibernate.orm
  dependency-version: 7.3.2.Final
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: com.github.ben-manes.versions
  dependency-version: 0.54.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: gradle-wrapper
  dependency-version: 9.5.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-04-29 10:39:19 -06:00
acx10 c5f8539d9b Sanitize scripts and dangerous content in EPUB/MOBI reader (#2938) 2026-04-29 10:37:07 -06:00
acx10 223e548c65 chore: update GHCR/org references and stabilize CI workflow deps 2026-04-29 10:31:23 -06:00
Aku 2b1af054f6 fix: use correct reader service based on book type (PDF vs CBX) (#3374) 2026-04-29 09:21:23 -06:00
acx10 385583d5d5 Remove unused app endpoints (#3378)
Co-authored-by: acx10 <acx10@users.noreply.github.com>
2026-04-29 09:20:05 -06:00
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