Compare commits

...

650 commits

Author SHA1 Message Date
github-actions[bot]
ba6cb76b71 build(webui): update Browserslist db 2026-05-04 10:04:00 +08:00
Gauthier Roebroeck
3d7615e7b4 deps: upgrade Spring Boot to 3.5.14 2026-04-27 17:16:34 +08:00
github-actions
9c84690a07 chore(release): 1.24.4 [skip ci] 2026-04-24 01:52:15 +00:00
Óliver García Albertos
5d14057736
build(docker): update base image to Ubuntu 26.04 for amd64 and arm64 2026-04-24 09:14:45 +08:00
James Ward
e3a8cc6b01
fix(api): omit UserDto.ageRestriction instead of returning null
Closes: 2296
2026-04-23 14:34:05 +08:00
dependabot[bot]
bb60a797e8 deps(webui): bump @xmldom/xmldom from 0.8.12 to 0.8.13 in /komga-webui
Bumps [@xmldom/xmldom](https://github.com/xmldom/xmldom) from 0.8.12 to 0.8.13.
- [Release notes](https://github.com/xmldom/xmldom/releases)
- [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xmldom/xmldom/compare/0.8.12...0.8.13)

---
updated-dependencies:
- dependency-name: "@xmldom/xmldom"
  dependency-version: 0.8.13
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 14:22:19 +08:00
Gauthier Roebroeck
ddfe65dde1 fix(koreader): also accept application/json on Accept header 2026-04-21 16:33:45 +08:00
Gauthier Roebroeck
4a7d9a6510 fix(kobo): proxy raw request body to kobo store
Closes: #2289
2026-04-17 16:45:52 +08:00
dependabot[bot]
85edd8b63f deps(webui): bump axios from 1.13.5 to 1.15.0 in /komga-webui
Bumps [axios](https://github.com/axios/axios) from 1.13.5 to 1.15.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.5...v1.15.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.15.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-14 14:37:46 +08:00
dependabot[bot]
63de6aa9b1 deps(webui): bump follow-redirects in /komga-webui
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.11 to 1.16.0.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.11...v1.16.0)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-version: 1.16.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-14 14:37:26 +08:00
Gauthier Roebroeck
717ef82a3d fix(opds2): incorrect latest series navigation links
Closes: #2285
2026-04-14 14:28:54 +08:00
Gauthier Roebroeck
7c00661365 fix(opds2): auth logo issue when using base url
Closes: #2285
2026-04-14 14:28:38 +08:00
Gauthier Roebroeck
6c2621b538 ci: update homebrew action 2026-04-13 13:22:48 +08:00
Gauthier Roebroeck
5fc0b7ef30 fix(epub): some TOC may not be parsed correctly 2026-04-13 10:13:35 +08:00
Gauthier Roebroeck
dd9c3facd7 deps: bump gradle-git-properties plugin from 2.5.2 to 2.5.7 2026-04-13 10:13:35 +08:00
dependabot[bot]
b77554fa17 deps(webui): bump lodash from 4.17.23 to 4.18.1 in /komga-webui
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-10 11:44:23 +08:00
github-actions[bot]
7e0d680bdf build(webui): update Browserslist db 2026-04-01 13:57:47 +08:00
dependabot[bot]
5620e3fd67 deps(webui): bump @xmldom/xmldom from 0.8.10 to 0.8.12 in /komga-webui
Bumps [@xmldom/xmldom](https://github.com/xmldom/xmldom) from 0.8.10 to 0.8.12.
- [Release notes](https://github.com/xmldom/xmldom/releases)
- [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xmldom/xmldom/compare/0.8.10...0.8.12)

---
updated-dependencies:
- dependency-name: "@xmldom/xmldom"
  dependency-version: 0.8.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-01 09:21:46 +08:00
dependabot[bot]
3ca9806e86 deps(ci): bump gradle/actions from 5 to 6
Bumps [gradle/actions](https://github.com/gradle/actions) from 5 to 6.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v5...v6)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 15:51:54 +08:00
dependabot[bot]
263d3dd893 deps(webui): bump brace-expansion from 1.1.12 to 1.1.13 in /komga-webui
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.12 to 1.1.13.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.12...v1.1.13)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.13
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 10:50:15 +08:00
github-actions
328a22064d chore(release): 1.24.3 [skip ci] 2026-03-27 08:39:06 +00:00
dependabot[bot]
40dadcb8ca deps(webui): bump node-forge from 1.3.2 to 1.4.0 in /komga-webui
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.2 to 1.4.0.
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.2...v1.4.0)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.4.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-27 16:25:37 +08:00
Gauthier Roebroeck
b8ea79eaf8 fix(webui): epub reader would not load 2026-03-27 16:17:14 +08:00
github-actions
9033dc73ba chore(release): 1.24.2 [skip ci] 2026-03-26 09:43:51 +00:00
Hosted Weblate
da981bed0f i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
92a61debea i18n(webui): translated using Weblate (Korean)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 안세훈 <on9686@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
c00aaebef1 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
0013a65306 i18n(webui): translated using Weblate (Bulgarian)
Currently translated at 98.6% (829 of 840 strings)

Co-authored-by: A L <lembata1@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/bg/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
df5e90e6e3 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Wolfram <kanedat@web.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
c79008d167 i18n(webui): translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Portuguese (Brazil))

Currently translated at 82.1% (690 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Marcos Soares <soaresmarcosb@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Hosted Weblate
4fa9422a3d i18n(webui): translated using Weblate (Tamil)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ta/
Translation: komga/webui
2026-03-26 17:28:16 +08:00
Gauthier Roebroeck
90d3a1dbc3 fix: epub extension could get lost during book restoration 2026-03-26 17:27:28 +08:00
dependabot[bot]
457a7247d5 deps(webui): bump picomatch from 2.3.1 to 2.3.2 in /komga-webui
Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 09:57:45 +08:00
dependabot[bot]
de25e4903c deps(ci): bump hydraulic-software/conveyor from 21.1 to 22.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 21.1 to 22.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v21.1...v22.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '22.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 16:15:50 +08:00
dependabot[bot]
b91919a1f5 deps(ci): bump EndBug/add-and-commit from 9 to 10
Bumps [EndBug/add-and-commit](https://github.com/endbug/add-and-commit) from 9 to 10.
- [Release notes](https://github.com/endbug/add-and-commit/releases)
- [Commits](https://github.com/endbug/add-and-commit/compare/v9...v10)

---
updated-dependencies:
- dependency-name: EndBug/add-and-commit
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 16:13:49 +08:00
dependabot[bot]
7ad2bd5c65 deps(webui): bump flatted from 3.2.7 to 3.4.2 in /komga-webui
Bumps [flatted](https://github.com/WebReflection/flatted) from 3.2.7 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.2.7...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 09:12:52 +08:00
dependabot[bot]
322cf23ad9 deps(webui): bump yauzl and r2-utils-js in /komga-webui
Bumps [yauzl](https://github.com/thejoshwolfe/yauzl) and [r2-utils-js](https://github.com/readium/r2-utils-js). These dependencies needed to be updated together.

Updates `yauzl` from 2.10.0 to 3.2.1
- [Commits](https://github.com/thejoshwolfe/yauzl/compare/2.10.0...3.2.1)

Updates `r2-utils-js` from 1.0.35 to 1.0.43
- [Changelog](https://github.com/edrlab/r2-utils-js/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/readium/r2-utils-js/compare/v1.0.35...v1.0.43)

---
updated-dependencies:
- dependency-name: yauzl
  dependency-version: 3.2.1
  dependency-type: indirect
- dependency-name: r2-utils-js
  dependency-version: 1.0.43
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-16 12:00:10 +08:00
dependabot[bot]
a584f4cf12 deps(ci): bump docker/setup-buildx-action from 3 to 4
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 16:54:01 +08:00
dependabot[bot]
25ccf5a25f deps(ci): bump docker/login-action from 3 to 4
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 16:53:48 +08:00
dependabot[bot]
30ed01505a deps(ci): bump docker/setup-qemu-action from 3 to 4
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 16:53:33 +08:00
dependabot[bot]
fd841253dc deps(webui): bump svgo from 2.8.0 to 2.8.2 in /komga-webui
Bumps [svgo](https://github.com/svg/svgo) from 2.8.0 to 2.8.2.
- [Release notes](https://github.com/svg/svgo/releases)
- [Commits](https://github.com/svg/svgo/compare/v2.8.0...v2.8.2)

---
updated-dependencies:
- dependency-name: svgo
  dependency-version: 2.8.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 10:58:59 +08:00
dependabot[bot]
112c442af6 deps(webui): bump immutable from 4.3.4 to 4.3.8 in /komga-webui
Bumps [immutable](https://github.com/immutable-js/immutable-js) from 4.3.4 to 4.3.8.
- [Release notes](https://github.com/immutable-js/immutable-js/releases)
- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/immutable-js/immutable-js/compare/v4.3.4...v4.3.8)

---
updated-dependencies:
- dependency-name: immutable
  dependency-version: 4.3.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 08:59:35 +08:00
dependabot[bot]
dfdcd08a3c deps(ci): bump actions/upload-artifact from 6 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 15:38:01 +08:00
github-actions[bot]
de849a5afd build(webui): update Browserslist db 2026-03-02 13:39:18 +08:00
dependabot[bot]
8b542b86e3 deps(webui): bump minimatch in /komga-webui
Bumps  and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together.

Updates `minimatch` from 3.1.2 to 3.1.4
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.4)

Updates `minimatch` from 5.1.6 to 5.1.8
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.4)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.4
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 5.1.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-25 12:05:28 +08:00
Gauthier
034ab23b02
docs: rename sponsors 2026-02-25 09:44:25 +08:00
dependabot[bot]
7e83afde10 deps(webui): bump ajv from 6.12.6 to 6.14.0 in /komga-webui
Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.6 to 6.14.0.
- [Release notes](https://github.com/ajv-validator/ajv/releases)
- [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.6...v6.14.0)

---
updated-dependencies:
- dependency-name: ajv
  dependency-version: 6.14.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 12:12:33 +08:00
dependabot[bot]
3d52eab1bf deps(webui): bump qs from 6.14.1 to 6.14.2 in /komga-webui
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-23 11:34:09 +08:00
dependabot[bot]
22fdc2ed0c deps(webui): bump axios from 1.12.0 to 1.13.5 in /komga-webui
Bumps [axios](https://github.com/axios/axios) from 1.12.0 to 1.13.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.12.0...v1.13.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 09:59:35 +08:00
dependabot[bot]
0400b8f265 deps(webui): bump webpack from 5.94.0 to 5.105.0 in /komga-webui
Bumps [webpack](https://github.com/webpack/webpack) from 5.94.0 to 5.105.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.94.0...v5.105.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.105.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-06 09:05:22 +08:00
Gauthier Roebroeck
bcc443806a refactor(docker): fix small warnings when builing 2026-02-03 11:14:01 +08:00
Gauthier Roebroeck
45f39b04af fix(docker): remove anonymous /tmp volume
Closes: #2191
2026-02-03 11:12:49 +08:00
github-actions[bot]
6305cae0b5 build(webui): update Browserslist db 2026-02-02 09:36:18 +08:00
Gauthier Roebroeck
4ce8f27707 fix(epub): fallback on epub2 toc if epub3 is present but invalid 2026-01-30 12:26:25 +08:00
github-actions
966dceb10f chore(release): 1.24.1 [skip ci] 2026-01-29 05:05:35 +00:00
Hosted Weblate
80e5432bee i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2026-01-29 12:55:41 +08:00
Hosted Weblate
7e2798b2b4 i18n(webui): translated using Weblate (Swedish)
Currently translated at 89.5% (752 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kon K Dong <konkeydong@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/sv/
Translation: komga/webui
2026-01-29 12:55:41 +08:00
Hosted Weblate
deece74f53 i18n(webui): translated using Weblate (Russian)
Currently translated at 55.4% (466 of 840 strings)

i18n(webui): translated using Weblate (Russian)

Currently translated at 64.7% (544 of 840 strings)

Co-authored-by: Aleksey <mitin_aleksey@mail.ru>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ru/
Translation: komga/webui
2026-01-29 12:55:41 +08:00
Hosted Weblate
f990b9a331 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Wolfram <kanedat@web.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2026-01-29 12:55:41 +08:00
Hosted Weblate
ecf6708e74 i18n(webui): translated using Weblate (Galician)
Currently translated at 24.5% (206 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Johkum <jacobomur@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/gl/
Translation: komga/webui
2026-01-29 12:55:41 +08:00
Gauthier Roebroeck
4f94365735 fix(epub): more lenient fixed-layout detection 2026-01-29 10:36:28 +08:00
github-actions
58cb44583e chore(release): 1.24.0 [skip ci] 2026-01-28 04:06:17 +00:00
Gauthier Roebroeck
512492b72e feat(api): add heartbeat event to SSE connections
Closes: #2205
2026-01-28 11:49:29 +08:00
Gauthier Roebroeck
525b37fce7 feat: support epub with images in spine 2026-01-28 11:32:04 +08:00
dependabot[bot]
a4958b001f deps(webui): bump lodash from 4.17.21 to 4.17.23 in /komga-webui
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.17.23
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-22 10:04:52 +08:00
dependabot[bot]
2ff8ea15b0 deps(ci): bump hydraulic-software/conveyor from 21.0 to 21.1
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 21.0 to 21.1.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v21.0...v21.1)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '21.1'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-20 09:59:03 +08:00
github-actions[bot]
e6560e0c81 build(webui): update Browserslist db 2026-01-02 10:29:42 +08:00
dependabot[bot]
13761f67ef deps(webui): bump qs from 6.13.0 to 6.14.1 in /komga-webui
Bumps [qs](https://github.com/ljharb/qs) from 6.13.0 to 6.14.1.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.14.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-02 10:29:30 +08:00
dependabot[bot]
4911cc8c92 deps(ci): bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 15:06:24 +08:00
dependabot[bot]
2e268b4032 deps(ci): bump dessant/lock-threads from 5 to 6
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/v5...v6)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 15:06:13 +08:00
Gauthier Roebroeck
62b4154156 deps(webui): update package name for isbn-verify 2025-12-11 13:23:43 +08:00
dependabot[bot]
7d1c9b8cab deps(ci): bump hydraulic-software/conveyor from 20.0 to 21.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 20.0 to 21.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v20.0...v21.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '21.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-08 15:42:28 +08:00
github-actions[bot]
361d20df2c build(webui): update Browserslist db 2025-12-01 11:23:06 +08:00
github-actions
ced89c5c54 chore(release): 1.23.6 [skip ci] 2025-11-28 03:43:03 +00:00
Hosted Weblate
a5548a5429 i18n(komga-tray): translated using Weblate (Arabic)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): translated using Weblate (Arabic)

Currently translated at 33.3% (3 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: redaloe <farahks@proton.me>
Co-authored-by: redaloe <redaloe@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ar/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
8f8d20a324 i18n(komga-tray): translated using Weblate (Russian)
Currently translated at 77.7% (7 of 9 strings)

Co-authored-by: Aleksey <mitin_aleksey@mail.ru>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ru/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
0f69a3a4cb i18n(komga-tray): translated using Weblate (Galician)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Francisco José Aquino García <fj.aquino@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/gl/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
9d10ed31a7 chore: update translation files
Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

i18n(webui): translated using Weblate (Arabic)

Currently translated at 91.6% (770 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: redaloe <redaloe@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ar/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
dde0169f2a i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
a2ed7d319d i18n(webui): translated using Weblate (Russian)
Currently translated at 64.6% (543 of 840 strings)

i18n(webui): translated using Weblate (Russian)

Currently translated at 67.0% (563 of 840 strings)

Co-authored-by: Aleksey <mitin_aleksey@mail.ru>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ru/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
475f026749 i18n(webui): translated using Weblate (Portuguese (Brazil))
Currently translated at 79.5% (668 of 840 strings)

i18n(webui): translated using Weblate (Portuguese (Brazil))

Currently translated at 79.5% (668 of 840 strings)

i18n(webui): translated using Weblate (Portuguese (Brazil))

Currently translated at 79.5% (668 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Luiz Henrique Moreira de Souza <cloud.5623tumacacori@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
a03f1bdf7b i18n(webui): translated using Weblate (Thai)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: altinat <al@altqx.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/th/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
b43046fbeb chore: update translation files
Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Galician)

Currently translated at 20.1% (169 of 840 strings)

Co-authored-by: Francisco José Aquino García <fj.aquino@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/gl/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Jason
3739951b36
fix(kobo): proxy 401 errors on initialization
Co-authored-by: Gauthier Roebroeck <gauthier.roebroeck@gmail.com>
2025-11-28 11:10:01 +08:00
dependabot[bot]
0f25453949 deps(webui): bump node-forge from 1.3.1 to 1.3.2 in /komga-webui
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2.
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-27 11:02:30 +08:00
dependabot[bot]
cd47fc777a deps(webui): bump js-yaml from 3.14.1 to 3.14.2 in /komga-webui
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 3.14.2.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 16:07:21 +08:00
dependabot[bot]
f138fe31e7 deps(ci): bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 15:39:11 +08:00
Jason
454c6c7202
refactor(kobo): log error responses 2025-11-13 13:32:16 +08:00
Jason
ce3ad4c1c7
fix(kobo): prevent double URL encoding when proxying
Closes: #2130
2025-11-11 15:52:32 +08:00
Jason
b925f3e19d
fix(kobo): proxy Content-Type headers for kobo
Closes: #2074
2025-11-10 15:26:07 +08:00
Gauthier Roebroeck
9a56b30b6c ci: fix svu install 2025-11-03 16:00:14 +08:00
dependabot[bot]
6b07fda273 deps(ci): bump mikepenz/action-junit-report from 5 to 6
Bumps [mikepenz/action-junit-report](https://github.com/mikepenz/action-junit-report) from 5 to 6.
- [Release notes](https://github.com/mikepenz/action-junit-report/releases)
- [Commits](https://github.com/mikepenz/action-junit-report/compare/v5...v6)

---
updated-dependencies:
- dependency-name: mikepenz/action-junit-report
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 15:12:21 +08:00
github-actions[bot]
727fe39e6d build(webui): update Browserslist db 2025-11-03 10:39:12 +08:00
Gauthier Roebroeck
f8ca936ee7 fix: properly decode cover href when generating epub cover
Closes: #2118
2025-11-03 10:38:43 +08:00
dependabot[bot]
fe40ede34a deps(ci): bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-28 10:46:45 +08:00
dependabot[bot]
c23f2d3810 deps(ci): bump actions/setup-node from 5 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-20 15:51:56 +08:00
Gauthier Roebroeck
af66144060 docs(api): fix mediatype 2025-10-14 14:00:34 +08:00
Gauthier Roebroeck
ba7b82631f build(docker): use old-releases apt repo 2025-10-08 16:42:12 +08:00
github-actions
a166f96bdf chore(release): 1.23.5 [skip ci] 2025-10-08 07:21:06 +00:00
Hosted Weblate
2259e4bf1c i18n(komga-tray): translated using Weblate (Portuguese (Brazil))
Currently translated at 55.5% (5 of 9 strings)

Co-authored-by: lucas philippe <lucas.philippe.nunes@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/pt_BR/
Translation: komga/desktop
2025-10-08 15:09:32 +08:00
Hosted Weblate
f75ad77e85 i18n(webui): translated using Weblate (Slovak)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: fantastron27 <fantastron27@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/sk/
Translation: komga/webui
2025-10-08 15:08:24 +08:00
Hosted Weblate
f2913d1e83 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-10-08 15:08:24 +08:00
Hosted Weblate
0b3307cd70 i18n(webui): translated using Weblate (Czech)
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 99.8% (839 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2025-10-08 15:08:24 +08:00
Hosted Weblate
1213309f35 i18n(webui): translated using Weblate (Portuguese (Brazil))
Currently translated at 77.1% (648 of 840 strings)

i18n(webui): translated using Weblate (Portuguese (Brazil))

Currently translated at 77.1% (648 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: lucas philippe <lucas.philippe.nunes@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/
Translation: komga/webui
2025-10-08 15:08:24 +08:00
Gauthier Roebroeck
5a5f8d701e fix(api): empty content when x-api-key is sent alongside session
Closes: #2099
2025-10-08 14:47:10 +08:00
dependabot[bot]
bdca990e82 deps(ci): bump peter-evans/dockerhub-description from 4.0.2 to 5.0.0
Bumps [peter-evans/dockerhub-description](https://github.com/peter-evans/dockerhub-description) from 4.0.2 to 5.0.0.
- [Release notes](https://github.com/peter-evans/dockerhub-description/releases)
- [Commits](https://github.com/peter-evans/dockerhub-description/compare/v4.0.2...v5.0.0)

---
updated-dependencies:
- dependency-name: peter-evans/dockerhub-description
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 15:45:50 +08:00
dependabot[bot]
8081439009 deps(ci): bump gradle/actions from 4 to 5
Bumps [gradle/actions](https://github.com/gradle/actions) from 4 to 5.
- [Release notes](https://github.com/gradle/actions/releases)
- [Commits](https://github.com/gradle/actions/compare/v4...v5)

---
updated-dependencies:
- dependency-name: gradle/actions
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 15:44:31 +08:00
dependabot[bot]
80c604e089 deps(ci): bump peter-evans/repository-dispatch from 3 to 4
Bumps [peter-evans/repository-dispatch](https://github.com/peter-evans/repository-dispatch) from 3 to 4.
- [Release notes](https://github.com/peter-evans/repository-dispatch/releases)
- [Commits](https://github.com/peter-evans/repository-dispatch/compare/v3...v4)

---
updated-dependencies:
- dependency-name: peter-evans/repository-dispatch
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 15:44:07 +08:00
Gauthier Roebroeck
f19d7aac1e feat: support local artwork in gif format
Closes: #1853
2025-10-03 15:07:59 +08:00
Gauthier Roebroeck
43c1018e3e perf(api): remove no-transform cache-control from response header
Closes: #2091
2025-10-03 12:00:48 +08:00
Gauthier Roebroeck
eb8bdfc94c fix(api): relax JSON deserializer 2025-10-03 11:51:50 +08:00
github-actions[bot]
e842a5287f build(webui): update Browserslist db 2025-10-02 10:22:35 +08:00
dependabot[bot]
e0b583ff1d deps(ci): bump hydraulic-software/conveyor from 19.0 to 20.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 19.0 to 20.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v19.0...v20.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '20.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-23 08:59:10 +08:00
Gauthier Roebroeck
5e3ca4d571 fix(api): add id field in HistoricalEventDto 2025-09-16 14:23:16 +08:00
Gauthier Roebroeck
730b093a5f refactor: add more logs when epub extension is missing 2025-09-16 11:38:14 +08:00
Gauthier Roebroeck
2f9b4e75d2 refactor: add more logs to koreader sync controller 2025-09-16 11:38:00 +08:00
dependabot[bot]
d9657587c4 deps(webui): bump axios from 1.8.2 to 1.12.0 in /komga-webui
Bumps [axios](https://github.com/axios/axios) from 1.8.2 to 1.12.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.8.2...v1.12.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 09:17:13 +08:00
Gauthier Roebroeck
69ba569b04 refactor: make dslRO transaction aware 2025-09-09 12:32:17 +08:00
github-actions
e850cdcd2f chore(release): 1.23.4 [skip ci] 2025-09-09 02:33:13 +00:00
Gauthier Roebroeck
51bfb353e7 perf: send events outside of db transaction 2025-09-09 10:21:52 +08:00
dependabot[bot]
3f64435afa deps(ci): bump actions/setup-node from 4 to 5
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 15:15:28 +08:00
Gauthier Roebroeck
166b1ee371 fix(kobo): update default kobo resources
Closes: #2066
2025-09-03 10:32:24 +08:00
github-actions[bot]
0e63e7454b build(webui): update Browserslist db 2025-09-01 11:32:44 +08:00
Gauthier Roebroeck
058af49807 fix(kobo): fail to create proxy url
Closes: #2063
2025-08-28 17:41:44 +08:00
Gauthier Roebroeck
7888a53dbf test: run tests with a WAL database instead of memorydb 2025-08-28 16:49:27 +08:00
github-actions
2ec0e295fa chore(release): 1.23.3 [skip ci] 2025-08-28 02:37:07 +00:00
Gauthier Roebroeck
1776174d3f fix(api): cannot create readlist or collection with database in WAL mode 2025-08-28 09:43:15 +08:00
dependabot[bot]
b837963f0e deps(ci): bump actions/setup-java from 4 to 5
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4 to 5.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-26 10:00:06 +08:00
Gauthier Roebroeck
6b4d81e0ba build(release): fail jreleaser on publish errors 2025-08-26 09:59:37 +08:00
github-actions
caf658a7bf chore(release): 1.23.2 [skip ci] 2025-08-25 09:24:08 +00:00
Hosted Weblate
4a598e3908 i18n(komga-tray): translated using Weblate (Slovak)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: fantastron27 <fantastron27@gmail.com>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/sk/
Translation: komga/desktop
2025-08-25 17:13:04 +08:00
Hosted Weblate
9a6f66444d i18n(webui): translated using Weblate (Slovak)
Currently translated at 40.3% (339 of 840 strings)

i18n(webui): translated using Weblate (Slovak)

Currently translated at 28.5% (240 of 840 strings)

i18n(webui): added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: fantastron27 <fantastron27@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/sk/
Translation: komga/webui
2025-08-25 17:12:25 +08:00
Hosted Weblate
ed271fc485 i18n(webui): translated using Weblate (Ukrainian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/uk/
Translation: komga/webui
2025-08-25 17:12:25 +08:00
Hosted Weblate
9ce6258914 i18n(komga-tray): translated using Weblate (Assamese)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/as/
Translation: komga/desktop
2025-08-25 17:10:13 +08:00
Hosted Weblate
c6a424ee92 i18n(komga-tray): added translation using Weblate (Slovak)
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
2025-08-25 17:10:13 +08:00
Hosted Weblate
45a105a26f i18n(komga-tray): translated using Weblate (Ukrainian)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/uk/
Translation: komga/desktop
2025-08-25 17:10:13 +08:00
Gauthier Roebroeck
0bcf1e4743 docs: update sponsors 2025-08-25 09:34:10 +08:00
Gauthier Roebroeck
e7b56b2bee perf: enable SQLite WAL mode by default 2025-08-22 13:21:56 +08:00
Gauthier Roebroeck
138c0ed464 fix(kobo): NullPointer exception
Closes: #2045
2025-08-22 11:27:21 +08:00
dependabot[bot]
777acbbd68 deps(webui): bump brace-expansion from 1.1.11 to 1.1.12 in /komga-webui
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-20 14:31:09 +08:00
Gauthier Roebroeck
3ab21ff6aa fix: ignore xml namespace in EPUB opf file
Closes: #2043
2025-08-20 14:30:41 +08:00
Gauthier Roebroeck
4e7c49d5d8 refactor: use Jsoup XmlParser instead of HTML parser where needed 2025-08-20 14:30:41 +08:00
Gauthier Roebroeck
8b629888ff deps: bump jsoup to 1.21.1 2025-08-20 14:30:41 +08:00
dependabot[bot]
30f6d3a862 deps(webui): bump ws in /komga-webui
Bumps  and [ws](https://github.com/websockets/ws). These dependencies needed to be updated together.

Updates `ws` from 7.5.9 to 7.5.10
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

Updates `ws` from 8.14.1 to 8.18.3
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

---
updated-dependencies:
- dependency-name: ws
  dependency-version: 7.5.10
  dependency-type: indirect
- dependency-name: ws
  dependency-version: 8.18.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-20 13:41:57 +08:00
dependabot[bot]
ea5a4701f2 deps(ci): bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-20 10:41:19 +08:00
Gauthier Roebroeck
85a33d4661 fix(webui): ignore content negotiation when downloading page
Closes: #2042
2025-08-11 12:51:24 +08:00
Gauthier Roebroeck
d1475864af refactor(api): mark kepubifyPath as deprecated 2025-08-05 15:00:53 +08:00
Gauthier Roebroeck
eb8a2df3ea deps: bump nightcompress from 1.1.0 to 1.1.1 2025-08-05 10:21:34 +08:00
dependabot[bot]
a333b75724 deps(ci): bump hydraulic-software/conveyor from 18.1 to 19.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 18.1 to 19.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v18.1...v19.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '19.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-05 09:38:03 +08:00
Gauthier Roebroeck
54c818e857 deps: bump ktlint from 1.6.0 to 1.7.1 2025-08-04 10:55:16 +08:00
Gauthier Roebroeck
18ec31f28b build(deps): move redundant versions to gradle version catalog 2025-08-04 10:52:25 +08:00
github-actions
37ef23d17f chore(release): 1.23.1 [skip ci] 2025-08-01 04:14:18 +00:00
dependabot[bot]
cd98fed8b9 deps(webui): bump on-headers and compression in /komga-webui
Bumps [on-headers](https://github.com/jshttp/on-headers) and [compression](https://github.com/expressjs/compression). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: indirect
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 11:56:51 +08:00
Gauthier Roebroeck
ffd2d0c107 build(docker): downgrade base image from ubuntu:25.04 to ubuntu:24.10 for arm64/arm64
ubuntu 25.04 has libarchive 3.7.7 which crashes for rar5 files with recovery records

Closes: #2021
2025-08-01 11:50:04 +08:00
github-actions[bot]
8c4fb26eb3 build(webui): update Browserslist db 2025-08-01 10:55:16 +08:00
Gauthier Roebroeck
d8d2029cec deps(komga): bump spring boot to 3.5.4 2025-08-01 10:52:20 +08:00
Gauthier Roebroeck
5af98a5fa4 deps(komga): bump bestbefore-processor-kotlin to 0.2.0 2025-08-01 10:52:06 +08:00
Gauthier Roebroeck
0a0bd960fb deps(komga): bump spring-session-caffeine to 2.1.0 2025-08-01 10:51:49 +08:00
Gauthier Roebroeck
9986f9d7f1 style: ktlint format 2025-07-31 15:10:42 +08:00
Gauthier Roebroeck
0e52bde2d0 test: use synchronous lucene committer for tests
removes the need for Thread.sleep, which should help with flaky tests
2025-07-31 15:02:23 +08:00
Gauthier Roebroeck
243355f2c9 refactor: move lucene commit to separate class 2025-07-31 15:01:24 +08:00
Gauthier Roebroeck
a80eb59b1b test: use synchronous events for tests 2025-07-31 15:00:28 +08:00
Gauthier Roebroeck
e019f5d505 fix(api): reduce cache for announcements and releases to 1h 2025-07-31 12:15:33 +08:00
Gauthier Roebroeck
f9d9139bb2 perf: separate database reads from writes
this is only used when the database is in WAL mode
2025-07-31 11:48:31 +08:00
Gauthier Roebroeck
7464e64687 perf: use sqlite temporary tables for long parameter list
Instead of a single table reused everytime. Reduces the need for some transactions, and will reduce contention with multiple readers in WAL mode.
2025-07-30 17:40:14 +08:00
Gauthier Roebroeck
33f205234f chore: add .kotlin to gitignore 2025-07-30 15:44:35 +08:00
Gauthier Roebroeck
cfa399560a refactor: replace deprecated property 2025-07-30 15:36:31 +08:00
Gauthier Roebroeck
9046a61fc6 refactor(benchmark): replace deprecated methods 2025-07-29 12:04:07 +08:00
github-actions
8a07a7224c chore(release): 1.23.0 [skip ci] 2025-07-28 08:30:43 +00:00
Gauthier Roebroeck
ba8345296c ci: add os name to junit test report 2025-07-28 16:15:05 +08:00
Gauthier Roebroeck
8952b83423 ci: publish junit test report 2025-07-28 16:06:54 +08:00
Hosted Weblate
dc1248e9ad i18n(webui): translated using Weblate (Turkish)
Currently translated at 94.5% (794 of 840 strings)

Co-authored-by: Serhat Gülaştı <serhatgulasti@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2025-07-28 15:53:29 +08:00
Gauthier Roebroeck
93b21307d1 feat: check if database files are on local filesystem on startup 2025-07-28 15:33:24 +08:00
Gauthier Roebroeck
eb1e602b18 fix: ensure tasksDB parent directory is created 2025-07-28 12:19:32 +08:00
Gauthier Roebroeck
756d9f91f8 style: ktlint format 2025-07-16 11:33:18 +08:00
Gauthier Roebroeck
83a995fc0b refactor: use guard condition in when 2025-07-16 11:27:36 +08:00
Gauthier Roebroeck
d82af1b5b3 refactor: remove redundant qualifier 2025-07-16 11:25:05 +08:00
Gauthier Roebroeck
5ba13d0bb8 refactor: rename unused exceptions 2025-07-16 11:24:45 +08:00
Gauthier Roebroeck
b84a958732 refactor: simplify condition 2025-07-16 11:24:28 +08:00
Gauthier Roebroeck
c955f2da0f refactor: simplify regex string 2025-07-16 11:24:18 +08:00
Gauthier Roebroeck
65c8575c0e refactor: remove explicit type 2025-07-16 11:24:09 +08:00
Gauthier Roebroeck
03993acc71 refactor: replace enum.values() with enum.entries 2025-07-16 11:23:41 +08:00
Gauthier Roebroeck
b7d1824ac8 refactor: remove unused code 2025-07-16 11:22:56 +08:00
Gauthier Roebroeck
209792f458 refactor: fix warning on startup 2025-07-15 15:45:42 +08:00
github-actions
b2ef2e9dcd chore(release): 1.22.1 [skip ci] 2025-07-15 06:30:39 +00:00
Hosted Weblate
239be6076f i18n(webui): translated using Weblate (Dutch)
Currently translated at 96.1% (808 of 840 strings)

i18n(webui): translated using Weblate (Dutch)

Currently translated at 96.1% (808 of 840 strings)

i18n(webui): translated using Weblate (Dutch)

Currently translated at 96.1% (808 of 840 strings)

i18n(webui): translated using Weblate (Dutch)

Currently translated at 95.2% (800 of 840 strings)

Co-authored-by: Ben <ben-nl@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/nl/
Translation: komga/webui
2025-07-15 14:10:04 +08:00
Hosted Weblate
787367111c i18n(webui): translated using Weblate (Ukrainian)
Currently translated at 15.8% (133 of 840 strings)

i18n(webui): translated using Weblate (Ukrainian)

Currently translated at 15.8% (133 of 840 strings)

i18n(webui): translated using Weblate (Ukrainian)

Currently translated at 15.8% (133 of 840 strings)

i18n(webui): translated using Weblate (Ukrainian)

Currently translated at 15.8% (133 of 840 strings)

i18n(webui): translated using Weblate (Ukrainian)

Currently translated at 15.8% (133 of 840 strings)

i18n(webui): added translation using Weblate (Ukrainian)

Co-authored-by: Anatolii <acepesh@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/uk/
Translation: komga/webui
2025-07-15 14:10:04 +08:00
Hosted Weblate
da2bf7df56 i18n(webui): translated using Weblate (Tamil)
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Tamil)

Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ta/
Translation: komga/webui
2025-07-15 14:10:04 +08:00
Hosted Weblate
c960e45e7d i18n(komga-tray): translated using Weblate (Ukrainian)
Currently translated at 88.8% (8 of 9 strings)

i18n(komga-tray): added translation using Weblate (Ukrainian)

Co-authored-by: Anatolii <acepesh@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/uk/
Translation: komga/desktop
2025-07-15 14:09:37 +08:00
Gauthier Roebroeck
1de36b7550 refactor: use interpolation prefix 2025-07-15 13:36:26 +08:00
Gauthier Roebroeck
1975ff2107 refactor: add param target for some annotations to fix archunit tests 2025-07-15 13:34:57 +08:00
Gauthier Roebroeck
5f00bd5e71 build(komga): align jooq version for jooq plugin 2025-07-15 13:34:06 +08:00
Gauthier Roebroeck
9567df1cae refactor(komga): remove artemis cleanup 2025-07-15 13:24:14 +08:00
Gauthier Roebroeck
48207cb712 deps(komga): bump deps 2025-07-15 13:12:38 +08:00
Gauthier Roebroeck
cd99019ac4 deps: bump ben-manes version plugin to 0.52.0 2025-07-15 13:06:32 +08:00
Gauthier Roebroeck
9bc37944d8 deps: bump ktlint to 1.6.0 2025-07-15 13:05:52 +08:00
Gauthier Roebroeck
eacf305ba8 build: update ktlint gradle plugin configuration 2025-07-15 13:05:30 +08:00
Gauthier Roebroeck
ce7816b0af build(komga): add kotlin compiler parameter to remove warnings 2025-07-15 12:46:44 +08:00
Gauthier Roebroeck
4b9a14640c deps(komga): bump ksp plugin 2025-07-15 12:27:38 +08:00
Gauthier Roebroeck
d56c3e3c8f refactor(komga-tray): remove deprecated methods 2025-07-15 12:27:08 +08:00
Gauthier Roebroeck
0f74e6ec41 deps(komga-tray): bump Gradle plugins 2025-07-15 12:26:23 +08:00
Gauthier Roebroeck
f2841eaec7 build: update build.gradle for newer Kotlin 2025-07-15 12:25:30 +08:00
Gauthier Roebroeck
34c7d8b39b refactor: fix types for new Kotlin compiler 2025-07-15 12:22:45 +08:00
Gauthier Roebroeck
aa80ef83a7 deps: bump Kotlin to 2.2.0 2025-07-15 12:22:12 +08:00
Gauthier Roebroeck
388349df58 docs: minimum Java version is 21 2025-07-15 12:21:49 +08:00
Gauthier Roebroeck
71e8e9a014 ci: use Java 21 2025-07-15 12:21:34 +08:00
Gauthier Roebroeck
c8989060bf deps(komga): bump deps 2025-07-15 11:37:09 +08:00
Gauthier Roebroeck
e7a0a522fc deps(komga): bump Gradle plugins 2025-07-15 11:35:37 +08:00
Gauthier Roebroeck
f674d65692 refactor: replace deprecated AntPathRequestMatcher with PathPatternRequestMatcher 2025-07-15 11:35:05 +08:00
Gauthier Roebroeck
d4de08a105 refactor: remove unused params 2025-07-15 11:34:28 +08:00
Gauthier Roebroeck
1235220eb8 deps: bump ktlint plugin to 13.0.0 2025-07-15 11:32:41 +08:00
Gauthier Roebroeck
9ac225bf4f deps(komga): bump Spring Boot to 3.5.3 2025-07-15 10:55:49 +08:00
Gauthier Roebroeck
267292d73e deps(build): update Gradle to 8.14.3 2025-07-15 10:27:31 +08:00
Gauthier Roebroeck
6f951bde98 build(docker): bump base image from ubuntu:24.10 to ubuntu:25.04 for amr64/arm64 2025-07-03 10:46:32 +08:00
Gauthier Roebroeck
d112e695b9 refactor: use new syntax for gradle task registation 2025-07-02 17:39:25 +08:00
Gauthier Roebroeck
39bc3b2dfc deps(komga): bump icu4j from 76.1 to 77.1 2025-07-02 17:38:44 +08:00
Gauthier Roebroeck
4189833336 deps(build): bump JReleaser from 1.10.0 to 1.19.0 2025-07-02 17:38:16 +08:00
Gauthier Roebroeck
a98000958d deps(build): bump Gradle from 8.11.1 to 8.14.2 2025-07-02 17:37:51 +08:00
github-actions[bot]
ddc5f7274e build(webui): update Browserslist db 2025-07-02 11:10:36 +08:00
Gauthier Roebroeck
c2c697fba7 fix: don't strip accents on input data and sort series title with unicode collation 2025-06-30 10:13:42 +08:00
Gauthier Roebroeck
860274079d build: add enable native access attribute to jar manifest 2025-06-25 10:46:28 +08:00
Gauthier Roebroeck
5f9cc449b7 fix: epub divina heuristic
Closes: #1997
2025-06-23 11:37:56 +08:00
github-actions
76feaa13c8 chore(release): 1.22.0 [skip ci] 2025-06-23 03:02:42 +00:00
Hosted Weblate
aad3e4a11d i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
b228f0e1f4 i18n(webui): translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Chinese (Traditional Han script))

Currently translated at 99.5% (836 of 840 strings)

i18n(webui): translated using Weblate (Chinese (Traditional Han script))

Currently translated at 99.2% (834 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: devchung <chungchung.dev@gmail.com>
Co-authored-by: dwong33 <dwong@posteo.ch>
Co-authored-by: plum7x <plumgift@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hant/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
324262f022 i18n(webui): translated using Weblate (Korean)
Currently translated at 99.7% (838 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: YongJin Yoon <menkinds@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
0423f82661 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
d77d9cbaad i18n(webui): translated using Weblate (French)
Currently translated at 99.8% (839 of 840 strings)

i18n(webui): translated using Weblate (French)

Currently translated at 99.5% (836 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rafael M <rafael.mathieu@live.com>
Co-authored-by: Smayzy <smayzy@smayzy.ovh>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
80e7cfbbd8 i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
b762fe0c1d i18n(webui): translated using Weblate (Dutch)
Currently translated at 93.9% (789 of 840 strings)

i18n(webui): translated using Weblate (Dutch)

Currently translated at 89.8% (755 of 840 strings)

Co-authored-by: Ben <bzweekhorst@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/nl/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
f00ec95d88 i18n(webui): translated using Weblate (Indonesian)
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Indonesian)

Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Arief Hidayat <kekesed97@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/id/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
d8a374a06a i18n(webui): translated using Weblate (Italian)
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Gino Cicatiello <ginocic@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/it/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
299ef6ca0c i18n(webui): translated using Weblate (Hungarian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Dániel Vadon <vadondani10@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hu/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
009bc6e0ef i18n(webui): translated using Weblate (Portuguese)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
1197ecfc88 i18n(webui): translated using Weblate (Japanese)
Currently translated at 100.0% (840 of 840 strings)

i18n(webui): translated using Weblate (Japanese)

Currently translated at 97.6% (820 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: nazo6 <git@nazo6.dev>
Co-authored-by: なお <harumura0415@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ja/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
6629741484 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: M <mhannig@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
b57016925d i18n(webui): translated using Weblate (Turkish)
Currently translated at 92.9% (781 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Serhat <serhat@10lineweb.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2025-06-23 10:51:14 +08:00
Hosted Weblate
56e7cffa87 i18n(komga-tray): translated using Weblate (Assamese)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): added translation using Weblate (Assamese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/as/
Translation: komga/desktop
2025-06-23 10:50:46 +08:00
Hosted Weblate
4082451fee i18n(komga-tray): translated using Weblate (Indonesian)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): translated using Weblate (Indonesian)

Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Arief Hidayat <kekesed97@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/id/
Translation: komga/desktop
2025-06-23 10:50:46 +08:00
Hosted Weblate
fb7f14480e i18n(komga-tray): translated using Weblate (Bulgarian)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ivan <thl1ghtbringer@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/bg/
Translation: komga/desktop
2025-06-23 10:50:46 +08:00
Gauthier Roebroeck
25de5973a6 fix(api): add CSP response header for untrusted epub resources
(cherry picked from commit cd257dbbe859ad42007371ae44094855fbea01f0)
2025-06-23 10:49:02 +08:00
github-actions[bot]
bc8a5df1a7 build(webui): update Browserslist db 2025-06-02 09:42:28 +08:00
Gauthier Roebroeck
a17ff434d5 docs(openapi): rename Claim Server tag to avoid conflict with operation name 2025-05-29 13:36:37 +08:00
Gauthier Roebroeck
1f0817bbe7 feat(api): user creation supports restrictions 2025-05-27 15:16:44 +08:00
dependabot[bot]
e2a0b9450e deps(ci): bump hydraulic-software/conveyor from 18.0 to 18.1
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 18.0 to 18.1.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v18.0...v18.1)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '18.1'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-26 15:39:43 +08:00
Gauthier Roebroeck
8cf2403147 fix(api): marking already read announcement as read would return error 500 2025-05-20 15:18:43 +08:00
Gauthier Roebroeck
1ab46a7fc6 docs(api): add /actuator/info in OpenAPI specification 2025-05-19 12:39:13 +08:00
Gauthier Roebroeck
cc78cd3133 docs(api): document remember-me parameter on Retrieve Current User API 2025-05-19 12:38:46 +08:00
Gauthier Roebroeck
291134811e ci(release): remove unused announce step 2025-05-19 12:35:31 +08:00
github-actions
45363fce35 chore(release): 1.21.3 [skip ci] 2025-05-16 03:26:50 +00:00
Tatsuhiko Kono
0a2c3ace28
fix(webui): add missing characters for Japanese series grouping
Closes: #1959
2025-05-08 09:53:54 +08:00
Gauthier Roebroeck
a568a7d5d8 refactor: remove startup task to fix missing thumbnail metadata 2025-05-06 14:26:40 +08:00
Gauthier Roebroeck
2120edbcb6 build(conveyor): update conveyor compatibility to 18 2025-05-06 11:51:50 +08:00
dependabot[bot]
ec7d4e32d6 deps(ci): bump hydraulic-software/conveyor from 17.0 to 18.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 17.0 to 18.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v17.0...v18.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-version: '18.0'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 11:51:19 +08:00
Gauthier Roebroeck
80fa75aa1b fix(webui): webtoon page margin is not restored
Closes: #1944
2025-05-02 17:28:21 +08:00
Gauthier Roebroeck
f03ba84cca docs(api): better operationId 2025-05-02 17:28:21 +08:00
Gauthier Roebroeck
95afb4b560 refactor: rename REST controller operations for better clarity in generated openapi spec 2025-05-02 17:28:21 +08:00
github-actions[bot]
e0a8edfdd5 build(webui): update Browserslist db 2025-05-02 10:44:45 +08:00
dependabot[bot]
6c486c0439 deps(webui): bump http-proxy-middleware in /komga-webui
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-17 09:26:31 +08:00
dependabot[bot]
08941f0650 deps(ci): bump peter-evans/dockerhub-description from 4.0.0 to 4.0.2
Bumps [peter-evans/dockerhub-description](https://github.com/peter-evans/dockerhub-description) from 4.0.0 to 4.0.2.
- [Release notes](https://github.com/peter-evans/dockerhub-description/releases)
- [Commits](https://github.com/peter-evans/dockerhub-description/compare/v4.0.0...v4.0.2)

---
updated-dependencies:
- dependency-name: peter-evans/dockerhub-description
  dependency-version: 4.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-07 16:47:19 +08:00
dependabot[bot]
c6180479d2 deps(webui): bump @babel/helpers from 7.22.15 to 7.27.0 in /komga-webui
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.22.15 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 13:15:07 +08:00
dependabot[bot]
77c8aa5dee deps(webui): bump @babel/runtime from 7.22.15 to 7.27.0 in /komga-webui
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.22.15 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 13:14:57 +08:00
github-actions[bot]
9ae39c0f39
build(webui): update Browserslist db (#1926)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-01 11:26:03 +08:00
Gauthier Roebroeck
343add1047 fix: epubs would have a "null" comment in the Media 2025-03-12 13:48:39 +08:00
github-actions
3638bb3122 chore(release): 1.21.2 [skip ci] 2025-03-12 03:56:56 +00:00
Gauthier Roebroeck
9be980dd35 fix(opds): keep reading paging would spill over to on-deck 2025-03-12 11:40:38 +08:00
dependabot[bot]
945455239e
deps(webui): bump axios from 1.7.4 to 1.8.2 in /komga-webui (#1910)
Bumps [axios](https://github.com/axios/axios) from 1.7.4 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.4...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-11 15:48:18 +08:00
Gauthier Roebroeck
6553437e4a fix: replace UriUtils.decode with URLDecode.decode
Closes: #1909
2025-03-11 15:31:06 +08:00
Gauthier Roebroeck
cd6b83d14d fix: better handling of epub path with anchor on windows
Closes: #1909
2025-03-11 15:30:54 +08:00
Gauthier Roebroeck
48e6eaf41d fix: more robust process handling for kepubify 2025-03-11 13:29:11 +08:00
Gauthier Roebroeck
62d193db38 test: fix parameterized test 2025-03-11 13:24:34 +08:00
Gauthier Roebroeck
01ef2b056f test: add corner cases for epub nav 2025-03-11 13:15:02 +08:00
Gauthier Roebroeck
d29902012d ci: also run tests on windows and macos 2025-03-11 13:11:54 +08:00
Gauthier Roebroeck
465467c50c fix: don't fail epub analysis when optional features are missing
Refs: #1909
2025-03-11 12:39:46 +08:00
Gauthier Roebroeck
1250a97d99 refactor(conveyor): remove key added by mistake 2025-03-10 10:54:25 +08:00
Gauthier Roebroeck
0d144a6ab0 fix(conveyor): disable Linux builds for desktop app 2025-03-07 10:08:14 +08:00
Gauthier Roebroeck
b7069c23f6 fix(webui): import book details does not show format 2025-03-06 16:12:07 +08:00
github-actions
11c2c38e7e chore(release): 1.21.1 [skip ci] 2025-03-06 07:01:30 +00:00
Gauthier Roebroeck
10e0bded9d fix(api): book import would return incorrect matched series 2025-03-06 09:51:03 +08:00
github-actions
4a0e4047a8 chore(release): 1.21.0 [skip ci] 2025-03-05 06:38:34 +00:00
Hosted Weblate
fafbe6c05c i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 98.6% (824 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
c43f0a3161 i18n(webui): translated using Weblate (Korean)
Currently translated at 99.7% (833 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Noa Himesaka <himesaka@noa.codes>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
b87f78ac8c i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
ab65970840 i18n(webui): translated using Weblate (French)
Currently translated at 99.8% (834 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthieu Sontag <matthieu.sontag@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
7e436edbbb i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.2% (829 of 835 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.2% (829 of 835 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
1a5c395d10 i18n(webui): translated using Weblate (Italian)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Gino Cicatiello <ginocic@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/it/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
5977218df1 i18n(webui): translated using Weblate (Hungarian)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Dániel Vadon <vadondani10@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hu/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
c1963fedaf i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
4b2826c611 i18n(webui): translated using Weblate (Portuguese)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
e235ed7d09 i18n(webui): translated using Weblate (Czech)
Currently translated at 100.0% (835 of 835 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 100.0% (835 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Hosted Weblate
e5b8254072 i18n(webui): translated using Weblate (Japanese)
Currently translated at 95.3% (796 of 835 strings)

i18n(webui): translated using Weblate (Japanese)

Currently translated at 95.3% (796 of 835 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: minahoku <minahoku@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ja/
Translation: komga/webui
2025-03-05 14:15:40 +08:00
Gauthier Roebroeck
278ae7a2b3 fix(webui): remove pin/unpin from library action menu
Closes: #1887
2025-03-05 14:14:55 +08:00
github-actions[bot]
23fa56e522 build(webui): update Browserslist db 2025-03-03 09:52:43 +08:00
Gauthier Roebroeck
8b6d23e930 fix(api): better matching of series name when importing books with metadata 2025-02-25 11:44:30 +08:00
Gauthier Roebroeck
ca93ed823e build(komga-tray): bump jdk to 23 2025-02-25 11:05:02 +08:00
Gauthier Roebroeck
7f93aae88d build(komga-tray): update conveyor compatibility to 17 2025-02-25 10:52:13 +08:00
dependabot[bot]
40b2508ff8 deps(ci): bump hydraulic-software/conveyor from 16.0 to 17.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 16.0 to 17.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v16.0...v17.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-25 10:51:26 +08:00
Gauthier Roebroeck
fd8b05fbe7 docs(api): update cookie names 2025-02-24 12:28:17 +08:00
Gauthier Roebroeck
e7335faee9 feat(api): use unique cookie names
Closes: #1889
2025-02-24 11:34:37 +08:00
Gauthier Roebroeck
66c711e846 docs(api): only include servers when generating the openapi reference
Closes: #1890
2025-02-24 10:43:04 +08:00
Gauthier Roebroeck
42223b7521 build: use .svu.yml configuration file 2025-02-21 11:05:46 +08:00
Gauthier Roebroeck
9563310c71 feat(webui): add media status condition in books view filters 2025-02-20 18:04:35 +08:00
Gauthier Roebroeck
1b8fa45ef2 feat(webui): add unavailable condition in series and books filters
Closes: #1580
2025-02-20 17:50:10 +08:00
Gauthier Roebroeck
87d73cc207 feat(webui): add any/none filtering on more criteria
Closes: #1884
2025-02-20 17:11:23 +08:00
Gauthier Roebroeck
400135cf6c fix(webui): better handling of dates missing leading zero series filters 2025-02-20 17:09:51 +08:00
Gauthier Roebroeck
a3bf04af54 fix(webui): better handling of dates missing leading zero in book edit dialogs 2025-02-20 17:09:07 +08:00
Gauthier Roebroeck
171cf8c023 feat(api): allow isNull / isNotNull on some search criteria
added for tag, sharingLabel, genre
2025-02-20 17:07:45 +08:00
Gauthier Roebroeck
d2aaf4009a fix(webui): better display of edit recommended dialog on mobile 2025-02-20 13:51:48 +08:00
Gauthier Roebroeck
4d3e6e450d fix(webui): better placement of edit dashboard button on mobile 2025-02-20 13:05:25 +08:00
Gauthier Roebroeck
bf3a978f21 style: ktlint 2025-02-20 12:40:32 +08:00
Gauthier Roebroeck
fb9459bc83 ci: dispatch events when openapi.json changes 2025-02-20 12:12:11 +08:00
Gauthier Roebroeck
f2280b8d13 docs(api): add required roles in operation descriptions 2025-02-20 12:03:38 +08:00
Gauthier Roebroeck
1fe7a001e5 fix(api): missing admin permission on global settings endpoint 2025-02-20 12:03:08 +08:00
Gauthier Roebroeck
6b27836437 refactor: rename swagger package to openapi 2025-02-20 10:44:23 +08:00
Gauthier Roebroeck
1638d2b873 refactor: remove openapi annotations from OPDS controllers 2025-02-20 10:44:07 +08:00
Gauthier Roebroeck
51c4617cc4 docs(api): add missing global security requirements 2025-02-20 10:38:40 +08:00
Gauthier Roebroeck
7f9dc5c97c chore(api): allow CORS from localhost:3000 for local development 2025-02-20 10:37:54 +08:00
Gauthier Roebroeck
707f9a00d2 docs(api): add missing default port value for localhost server 2025-02-20 09:51:03 +08:00
Gauthier Roebroeck
e528c7e3d9 fix(webui): libraries ordering does not work on Chrome 2025-02-20 09:41:28 +08:00
Gauthier Roebroeck
174c6fdf38 chore(api): allow CORS from komga.org for local development 2025-02-20 09:41:07 +08:00
Gauthier Roebroeck
d475a333af docs(api): fix broken link 2025-02-19 18:02:17 +08:00
Gauthier Roebroeck
d6b5bca3a9 docs: typo in openApi spec 2025-02-19 18:01:44 +08:00
github-actions
82b53823eb chore(release): 1.20.0 [skip ci] 2025-02-19 08:23:58 +00:00
Gauthier Roebroeck
6875e6ecaf ci: adjust svu options for v3 2025-02-19 16:13:20 +08:00
Hosted Weblate
b4d97d474e i18n(komga-tray): translated using Weblate (Hungarian)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Dániel Vadon <vadondani10@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/hu/
Translation: komga/desktop
2025-02-19 16:02:50 +08:00
Hosted Weblate
a88d8a0db4 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.1% (816 of 823 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
0c7baf9ec7 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (822 of 822 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
c1dcb789f5 i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (822 of 822 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.8% (814 of 815 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
b82fb17759 i18n(webui): translated using Weblate (Italian)
Currently translated at 100.0% (831 of 831 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 99.5% (827 of 831 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 99.8% (822 of 823 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 99.1% (816 of 823 strings)

i18n(webui): translated using Weblate (Italian)

Currently translated at 95.0% (770 of 810 strings)

Co-authored-by: Gino Cicatiello <ginocic@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/it/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
85fa17f3e0 i18n(webui): translated using Weblate (Hungarian)
Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 92.7% (763 of 823 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 92.7% (763 of 823 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 92.4% (761 of 823 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 92.4% (761 of 823 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 92.4% (761 of 823 strings)

Co-authored-by: Dániel Vadon <vadondani10@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hu/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
e9a51209d7 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (823 of 823 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 100.0% (823 of 823 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
cf3fcab834 i18n(webui): translated using Weblate (Portuguese)
Currently translated at 100.0% (831 of 831 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 100.0% (822 of 822 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 100.0% (810 of 810 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 100.0% (810 of 810 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
8d9840c047 i18n(webui): translated using Weblate (Czech)
Currently translated at 100.0% (823 of 823 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
8a2bce26ef i18n(webui): translated using Weblate (Japanese)
Currently translated at 96.4% (794 of 823 strings)

i18n(webui): translated using Weblate (Japanese)

Currently translated at 96.4% (794 of 823 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: minahoku <minahoku@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ja/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Hosted Weblate
17be53da60 i18n(webui): translated using Weblate (German)
Currently translated at 96.7% (804 of 831 strings)

i18n(webui): translated using Weblate (German)

Currently translated at 97.2% (788 of 810 strings)

Co-authored-by: Deleted User <noreply+104597@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: M <mhannig@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2025-02-19 16:02:35 +08:00
Gauthier Roebroeck
406ae4be1c feat(webui): new view to browse all books
Closes: #1153
2025-02-19 15:50:54 +08:00
Gauthier Roebroeck
e1acc58495 refactor(webui): dashboard edit button hides the bottom bar on mobile 2025-02-19 15:49:40 +08:00
Gauthier Roebroeck
1f852dbce9 feat(webui): sort books within a series by last modified date or read date 2025-02-19 15:49:10 +08:00
Gauthier Roebroeck
ef01550367 feat(webui): only shows filter values for pinned libraries 2025-02-19 15:48:23 +08:00
Gauthier Roebroeck
9bab9f620f feat(api): books can be sorted by series title 2025-02-19 15:46:33 +08:00
Gauthier Roebroeck
4de763a7bf feat(api): referential APIs accept multiple library_id for filtering 2025-02-19 15:46:12 +08:00
Gauthier Roebroeck
8b66308a5f docs(api): move deprecated endpoints to the top 2025-02-18 11:55:38 +08:00
Gauthier Roebroeck
9dcdb1df03 docs(api): update openapi description 2025-02-18 11:55:38 +08:00
dependabot[bot]
4d72ec0598 deps(webui): bump serialize-javascript in /komga-webui
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.1...v6.0.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-18 11:32:21 +08:00
Gauthier Roebroeck
0546deb424 fix(api): embedded fonts would not load on windows
Closes: #1877
2025-02-18 11:08:45 +08:00
Gauthier Roebroeck
25dc282fc6 refactor(webui): remove unused component references 2025-02-17 17:55:49 +08:00
Gauthier Roebroeck
3273048f68 docs(api): add servers and logout endpoint 2025-02-17 14:59:34 +08:00
Gauthier Roebroeck
ad8ee86a17 docs: cleanup openApi documentation 2025-02-17 13:06:48 +08:00
Gauthier Roebroeck
d4d3f641a2 fix(api): add missing permissions for history api 2025-02-14 10:14:44 +08:00
Gauthier Roebroeck
b5928ebf26 fix(webui): add missing admin guard for history view 2025-02-14 10:14:18 +08:00
Gauthier Roebroeck
77c1069200 build: cleanup openapi reference generation 2025-02-12 11:43:44 +08:00
Gauthier Roebroeck
c1fb307f9a fix(api): oauth2 providers endpoint should only expose get 2025-02-12 11:42:57 +08:00
Gauthier Roebroeck
a70a3b24bb ci: enable repository dispatch on release 2025-02-12 10:34:11 +08:00
Gauthier Roebroeck
e980e3316e feat(webui): add ability to configure recommended view per library
Closes: #1539
2025-02-10 18:03:30 +08:00
Gauthier Roebroeck
6c71e07a27 feat(webui): add UI setting to group series using japanese characters
Closes: #1715
2025-02-10 17:58:08 +08:00
Gauthier Roebroeck
7f55fe152b refactor(api): rework client-settings API validation 2025-02-10 17:58:08 +08:00
Gauthier Roebroeck
f90b415ab8 refactor(webui): remove 3-dots menu for all libraries in main view 2025-02-10 10:00:34 +08:00
Gauthier Roebroeck
9511c112bc style: ktlint format 2025-02-10 09:44:20 +08:00
Gauthier Roebroeck
7fbf9c711f docs(api): add Open API documentation for Client Settings API 2025-02-07 17:22:38 +08:00
Gauthier Roebroeck
fab59bced9 docs(api): add replacement for deprecated APIs 2025-02-07 17:22:14 +08:00
Gauthier Roebroeck
c423d7cd8e refactor(api): add validation on client-settings api 2025-02-07 16:34:30 +08:00
Gauthier Roebroeck
a2a689f7d5 feat(webui): add ability to reorder libraries 2025-02-07 11:36:23 +08:00
Gauthier Roebroeck
8c64639884 refactor(webui): remove unused imports 2025-02-06 16:02:13 +08:00
Gauthier Roebroeck
c8e4a462a2 feat(webui): add ability to pin/unpin libraries
Closes: #1560
2025-02-06 15:38:31 +08:00
Gauthier Roebroeck
4892945ddf feat(webui): add user setting to blur unread posters
Closes: #1549
2025-02-06 11:39:01 +08:00
Gauthier Roebroeck
05f73f0d1f refactor(webui): use reworked client-settings API 2025-02-06 10:50:50 +08:00
Gauthier Roebroeck
0b37257be7 refactor(api): rework client-settings API 2025-02-06 10:13:58 +08:00
Gauthier Roebroeck
c82c8b0c73 feat(webui): add UI setting to stretch poster to fit card
Closes: #1825
2025-02-05 17:59:20 +08:00
Gauthier Roebroeck
961832e1a1 feat(webui): add UI settings section with OAuth2 options 2025-02-05 17:40:48 +08:00
Gauthier Roebroeck
3b1504c329 feat(api): add client settings API 2025-02-05 17:38:05 +08:00
Gauthier Roebroeck
64b192cee2 feat(api): add support for API keys in REST API via X-API-Key header 2025-02-05 14:05:33 +08:00
Gauthier Roebroeck
6fa976fffa fix(api): use proper media type for fonts
Refs: #1849
2025-02-03 14:51:38 +08:00
Gauthier Roebroeck
0f05a065ac fix(api): incorrect format keyword in generated fonts css
Refs: #1849
2025-02-03 14:51:38 +08:00
github-actions
f46e0406f9 chore(release): 1.19.1 [skip ci] 2025-02-03 04:04:07 +00:00
Hosted Weblate
ab5e50686d i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (810 of 810 strings)

chore: update translation files

Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.7% (808 of 810 strings)

chore: update translation files

Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.7% (808 of 810 strings)

chore: update translation files

Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (809 of 809 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-02-03 11:54:31 +08:00
Hosted Weblate
aec75d9af6 chore: update translation files
Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.7% (808 of 810 strings)

chore: update translation files

Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.7% (808 of 810 strings)

chore: update translation files

Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (809 of 809 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
cac687e785 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (810 of 810 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (810 of 810 strings)

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
d1b5fea2b6 i18n(webui): translated using Weblate (French)
Currently translated at 96.7% (784 of 810 strings)

Co-authored-by: JP Brunache <kosmik01@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
df7b87994c i18n(webui): translated using Weblate (Spanish)
Currently translated at 99.8% (809 of 810 strings)

chore: update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
a5cbfb171e chore: update translation files
Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Italian)

Currently translated at 94.9% (769 of 810 strings)

chore: update translation files

Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Italian)

Currently translated at 94.9% (769 of 810 strings)

chore: update translation files

Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Italian)

Currently translated at 95.1% (770 of 809 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Gino Cicatiello <ginocic@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/it/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
1c37f25efd i18n(webui): translated using Weblate (Hungarian)
Currently translated at 75.9% (615 of 810 strings)

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 75.9% (615 of 810 strings)

Co-authored-by: Piyoka Smith <piyoka5697@ahaks.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hu/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
9db92d9f44 chore: update translation files
Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Japanese)

Currently translated at 97.7% (792 of 810 strings)

chore: update translation files

Updated by "Remove blank strings" hook in Weblate.

i18n(webui): translated using Weblate (Japanese)

Currently translated at 97.7% (792 of 810 strings)

chore: update translation files

Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Japanese)

Currently translated at 98.0% (793 of 809 strings)

i18n(webui): translated using Weblate (Japanese)

Currently translated at 98.0% (793 of 809 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: minahoku <minahoku@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ja/
Translation: komga/webui
2025-02-03 11:52:06 +08:00
Hosted Weblate
0d711facbe i18n(komga-tray): translated using Weblate (Hungarian)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Piyoka Smith <piyoka5697@ahaks.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/hu/
Translation: komga/desktop
2025-02-03 11:51:48 +08:00
github-actions[bot]
09a45b8654 build(webui): update Browserslist db 2025-02-03 11:21:30 +08:00
Gauthier Roebroeck
e23e9d1d6a chore(webui): cleanup translation files 2025-01-28 16:21:49 +08:00
Gauthier Roebroeck
723d390784 fix(webui): flickering on duplicate pages views 2025-01-28 15:44:49 +08:00
Gauthier Roebroeck
523151ac7d fix(webui): filter panels would display invalid data 2025-01-28 15:01:27 +08:00
Gauthier Roebroeck
a44135d550 fix(webui): adjust navigation drawer for better readability 2025-01-28 12:02:59 +08:00
Gauthier Roebroeck
c4a4278682 fix(api): cannot delete library with huge number of series
Closes: #1848
2025-01-28 11:35:13 +08:00
Gauthier Roebroeck
e5e534a70a fix(docker): embedded fonts would not load properly 2025-01-27 14:09:40 +08:00
github-actions
4a17eabb23 chore(release): 1.19.0 [skip ci] 2025-01-27 04:34:20 +00:00
Hosted Weblate
80253f288c i18n(komga-tray): translated using Weblate (Polish)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: ŁK <klinn91+weblate@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/pl/
Translation: komga/desktop
2025-01-27 11:34:39 +08:00
Hosted Weblate
3ada19cdf9 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (807 of 807 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (796 of 796 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (790 of 790 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
beb7452174 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (790 of 790 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (790 of 790 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
13ecc44fa1 i18n(webui): translated using Weblate (French)
Currently translated at 98.6% (785 of 796 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Samyar Vahid <samyarvahid@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
9ad57a4a6b i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (807 of 807 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.6% (804 of 807 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.8% (795 of 796 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 99.8% (789 of 790 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
5421a96c96 i18n(webui): translated using Weblate (Polish)
Currently translated at 98.7% (799 of 809 strings)

i18n(webui): translated using Weblate (Polish)

Currently translated at 98.7% (799 of 809 strings)

i18n(webui): translated using Weblate (Polish)

Currently translated at 83.6% (677 of 809 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: ŁK <klinn91+weblate@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pl/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
9c6c16a008 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (809 of 809 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 97.8% (792 of 809 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 97.8% (792 of 809 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
92f06a1c77 i18n(webui): translated using Weblate (Portuguese)
Currently translated at 98.7% (786 of 796 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 99.8% (785 of 786 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Hosted Weblate
8affb7ac6f i18n(webui): translated using Weblate (Czech)
Currently translated at 100.0% (796 of 796 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 100.0% (796 of 796 strings)

Co-authored-by: Filip Jaruška <filip.jaruska@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2025-01-27 11:34:07 +08:00
Gauthier Roebroeck
79709e33fb docs: update JetBrains logo 2025-01-24 17:23:53 +08:00
Gauthier Roebroeck
201c066fc4 feat(webui): support additional fonts
added embedded font OpenDyslexic
additional fonts can be added in the configuration directory under ./fonts/{fontFamily}/
supported files are woff/woff2/ttf/otf

Closes: #1836
2025-01-24 17:20:52 +08:00
Gauthier Roebroeck
42047cdafb fix: better handling of broken epub
Closes: #1844
2025-01-23 11:37:28 +08:00
Gauthier Roebroeck
214f687c2e feat(webui): add page margin option in webtoon reader
Closes: #1512
2025-01-22 16:52:24 +08:00
Gauthier Roebroeck
9156ff7537 feat(webui): choose number of thumbnails to display in webreader
Closes: #1540
2025-01-22 16:25:37 +08:00
Gauthier Roebroeck
38fa3ccaa7 feat(webui): display book number in webreader tab title and toolbar
Closes: #1543
2025-01-22 16:12:13 +08:00
Gauthier Roebroeck
dd31f5b062 feat(webui): disable bounce in divina reader
Closes: #1600
2025-01-22 15:59:46 +08:00
Gauthier Roebroeck
fd3b1aa8b8 build(webui): fix hot reload 2025-01-22 15:37:13 +08:00
Gauthier Roebroeck
b83d7414bc fix(webui): better handling of the read-more expansion panel during page change 2025-01-22 14:09:52 +08:00
Gauthier Roebroeck
68e05b8e28 feat(webui): add filters to media analysis table
Closes: #1802
2025-01-22 13:42:26 +08:00
Gauthier Roebroeck
dbd225dcb4 feat(webui): add rel="noreferrer" for metadata links
Closes: #1615
2025-01-22 13:06:01 +08:00
Gauthier Roebroeck
d868ba4154 feat(webui): reorder reading lists and collection by index input
Refs: #1584
2025-01-22 11:57:29 +08:00
Gauthier Roebroeck
6d71f4b398 fix(webui): disable item card menu and fab when dragging/editing is active 2025-01-22 10:49:24 +08:00
Gauthier Roebroeck
a490449f74 feat(webui): add all books from series to read list from action menu
Refs: #1535
2025-01-22 10:17:02 +08:00
Gauthier Roebroeck
681337af63 feat: try to guess epub cover if not standard
Closes: #1835
2025-01-21 16:04:42 +08:00
Gauthier Roebroeck
7ef59b0cda feat(webui): show all libraries action menu next to All Libraries when browsing 2025-01-21 15:49:16 +08:00
Gauthier Roebroeck
8706048a71 feat(webui): move all libraries action to 3-dots menu in sidebar 2025-01-21 15:25:35 +08:00
Gauthier Roebroeck
169c47e701 feat(webui): split account settings into different views 2025-01-21 15:12:31 +08:00
Gauthier Roebroeck
c36e10d93d fix(webui): prevent flickering on unknown duplicate pages view load 2025-01-21 14:52:33 +08:00
Gauthier Roebroeck
84253cbac4 feat(webui): show empty state if no known duplicate pages are found 2025-01-21 14:52:03 +08:00
Gauthier Roebroeck
1e6ff7ac66 feat(webui): remove tab navigation and use sidebar instead 2025-01-21 14:51:37 +08:00
Gauthier Roebroeck
3582114efc feat(webui): add all books from series to read list from multi-select bar
Closes: #1535
2025-01-21 11:31:10 +08:00
Gauthier Roebroeck
da35e012d4 feat(webui): display creation and last modified date on book page
Closes: #1547
2025-01-21 10:45:34 +08:00
Gauthier Roebroeck
f5f36b3d2f refactor(webui): extract missing translation strings 2025-01-21 10:38:36 +08:00
Gauthier Roebroeck
8880642370 feat(webui): add context in document title
Closes: #1710
2025-01-21 10:34:15 +08:00
Gauthier Roebroeck
901ea3cbbb feat(webui): remove from collection/readlist directly from the book/series page
Closes: #1518
2025-01-20 17:42:39 +08:00
Gauthier Roebroeck
378f99b558 feat(webui): allow readlist import if duplicates are present
Closes: #1671
2025-01-20 15:41:11 +08:00
Gauthier Roebroeck
7ae4d7b8a0 feat(webui): add filters in Import read list view
Closes: #1702
2025-01-20 15:11:08 +08:00
Gauthier Roebroeck
7d092c2c6f feat(webui): add media management view for books with missing poster
Refs: #1829
2025-01-20 13:08:41 +08:00
Gauthier Roebroeck
70bcb8f417 feat(api): add new book search condition for posters
Refs: #1829
2025-01-20 13:07:54 +08:00
Gauthier Roebroeck
ffc397f119 feat(webui): filter series and books by any/none author role
Refs: #1829
2025-01-20 11:25:02 +08:00
Gauthier Roebroeck
d07eb39181 feat(webui): filter books by media profile
Refs: #1829
2025-01-17 17:59:22 +08:00
Gauthier Roebroeck
2d9a59af70 feat(webui): better filtering for Books
use the new conditions API to allow negative filters as well as any/all of filters
2025-01-17 17:59:22 +08:00
Gauthier Roebroeck
2ac296dd49 refactor(webui): use new book list API 2025-01-17 17:59:22 +08:00
Gauthier Roebroeck
1da0afe04a feat(api): add new book list API using search condition criteria DSL 2025-01-17 17:59:22 +08:00
Gauthier Roebroeck
7370b43005 refactor(webui): remove unused functions 2025-01-17 17:59:22 +08:00
github-actions
18b428cc5f chore(release): 1.18.0 [skip ci] 2025-01-15 07:22:54 +00:00
Hosted Weblate
9b0805e518 i18n(komga-tray): translated using Weblate (Tamil)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ta/
Translation: komga/desktop
2025-01-15 15:03:07 +08:00
Hosted Weblate
8653eaab73 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (786 of 786 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
6853e31363 i18n(webui): translated using Weblate (Korean)
Currently translated at 100.0% (786 of 786 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Noa Himesaka <himesaka@noa.codes>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
a14c08fe12 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (786 of 786 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
b0413eb9bd i18n(webui): translated using Weblate (French)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthieu Sontag <matthieu.sontag@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
46a7869574 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (786 of 786 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
d775ea48b1 i18n(webui): translated using Weblate (Portuguese)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
a53c9a6ddc i18n(webui): translated using Weblate (Danish)
Currently translated at 89.4% (701 of 784 strings)

Co-authored-by: Emil Schildknecht Nielsen <emil485h@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/da/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Hosted Weblate
f7a72ae86b i18n(webui): translated using Weblate (Tamil)
Currently translated at 99.7% (782 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ta/
Translation: komga/webui
2025-01-15 15:02:38 +08:00
Gauthier Roebroeck
79be279cda deps(komga): upgrade sqlite-jdbc to 3.48.0 2025-01-15 15:00:50 +08:00
Gauthier Roebroeck
072dc27bf4 perf: use materialized CTE
Refs: #1823
2025-01-15 14:07:23 +08:00
Gauthier Roebroeck
3089063c0b fix: only decompress rar5 with libarchive
Closes: #1826
2025-01-15 13:38:56 +08:00
Gauthier Roebroeck
bd68b146a3 deps(komga): bump nightcompress to 1.1.0 2025-01-15 13:38:25 +08:00
Gauthier Roebroeck
b0d9b88829 perf: downgrade sqlite-jdbc from 3.47.1.0 to 3.46.1.3
Closes: #1823
2025-01-14 14:21:29 +08:00
Gauthier Roebroeck
51416c537b feat: allow book import for one-shots 2025-01-14 10:00:01 +08:00
Gauthier Roebroeck
41cdf80554 fix(opds2): keep reading feed incorrectly showing all books 2025-01-13 10:12:08 +08:00
Gauthier Roebroeck
b7b1b51857 fix: updating library options should trigger corresponding tasks 2025-01-13 10:12:08 +08:00
Gauthier
7d7f302b83
docs: mention KOReader Sync in README 2025-01-09 17:40:57 +08:00
github-actions
80d1da5898 chore(release): 1.17.0 [skip ci] 2025-01-09 09:13:13 +00:00
Gauthier Roebroeck
6c3565caa8 fix(api): read progress modified time could be inaccurate in some cases 2025-01-09 15:41:06 +08:00
Gauthier Roebroeck
623b2e3687 feat: add support for KOReader Sync
Closes: #1760
2025-01-09 15:41:06 +08:00
Gauthier Roebroeck
cbb0d6151d refactor: move user roles to separate database table 2025-01-08 16:46:19 +08:00
Gauthier Roebroeck
6dcebb4e07 fix: better detection for KCC converted Epub
also added more logs during epub divina detection
2025-01-07 14:10:55 +08:00
github-actions
9e33e2e4fb chore(release): 1.16.0 [skip ci] 2025-01-02 07:15:25 +00:00
Hosted Weblate
bd0a4832a2 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (784 of 784 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (780 of 780 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
b50072cd83 i18n(webui): translated using Weblate (Korean)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Noa Himesaka <himesaka@noa.codes>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
bcdb7b2319 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
cb5748878b i18n(webui): translated using Weblate (French)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthieu Sontag <matthieu.sontag@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
48b472dc0d i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (780 of 780 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
4911fba54b i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
9081c33665 i18n(webui): translated using Weblate (Czech)
Currently translated at 99.6% (781 of 784 strings)

Co-authored-by: Filip Jaruška <filip.jaruska@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
e47b18c058 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: M <mhannig@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Hosted Weblate
263e64bb2f i18n(webui): translated using Weblate (Turkish)
Currently translated at 100.0% (784 of 784 strings)

Co-authored-by: Eren Eroğlu <ereneroglum@yahoo.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2025-01-02 14:59:59 +08:00
Gauthier Roebroeck
39a054b947 fi(api): collection series are not always sorted by number 2025-01-02 14:57:34 +08:00
Gauthier Roebroeck
274ac6aae1 refactor: remove duplicated code 2025-01-02 14:52:11 +08:00
Gauthier Roebroeck
0dd4b270ef feat(api): readlist books are not always sorted by number
Closes: #1803
2025-01-02 13:27:19 +08:00
github-actions[bot]
1552b9b0c4 build(webui): update Browserslist db 2025-01-02 10:32:39 +08:00
Gauthier Roebroeck
d50646f955 feat: sort series by random
Closes: #1558
2024-12-19 11:03:47 +08:00
Gauthier Roebroeck
09bc445605 feat: sort books by page count
Closes: #1570
2024-12-19 10:51:36 +08:00
Gauthier Roebroeck
0dc8e61930 feat: sort series by read date
Closes: #1700
2024-12-18 17:04:44 +08:00
Gauthier Roebroeck
eed4f09a06 feat(webui): download log file from server settings
Closes: #1599
2024-12-18 16:55:26 +08:00
Gauthier Roebroeck
85cffc73fd feat(webui): display updates with available indicator and changelog
Closes: #1598
2024-12-18 16:43:20 +08:00
Gauthier Roebroeck
fa98da3c83 feat(api): add new endpoint to retrieve Komga releases 2024-12-18 16:39:09 +08:00
Gauthier Roebroeck
9fde145860 refactor: use spring's webclient.builder 2024-12-18 16:38:28 +08:00
github-actions
feb807b0ec chore(release): 1.15.1 [skip ci] 2024-12-17 06:49:28 +00:00
Hosted Weblate
1470a02cf6 i18n(komga-tray): translated using Weblate (Portuguese)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): translated using Weblate (Portuguese)

Currently translated at 88.8% (8 of 9 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/pt/
Translation: komga/desktop
2024-12-17 13:47:44 +08:00
Hosted Weblate
d179eb2b1b i18n(komga-tray): translated using Weblate (Thai)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: altinat <al@altqx.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/th/
Translation: komga/desktop
2024-12-17 13:47:44 +08:00
Hosted Weblate
572440961a i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (777 of 777 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
83d06275ca i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (777 of 777 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
af7b1d65c9 i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (777 of 777 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
43f86ad0c2 i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (777 of 777 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
29826e166e i18n(webui): translated using Weblate (Portuguese)
Currently translated at 95.3% (739 of 775 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 88.5% (686 of 775 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
3871fcf955 i18n(webui): translated using Weblate (Japanese)
Currently translated at 99.8% (774 of 775 strings)

i18n(webui): translated using Weblate (Japanese)

Currently translated at 96.7% (750 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: minahoku <minahoku@gmail.com>
Co-authored-by: shimanchu <shimano@knd.biglobe.ne.jp>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ja/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
3cdb5f0555 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (German)

Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: M <mhannig@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
dd9482dccc i18n(webui): translated using Weblate (Portuguese (Brazil))
Currently translated at 79.7% (618 of 775 strings)

Co-authored-by: Horus68 <horus68@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
3cdec06213 i18n(webui): translated using Weblate (Thai)
Currently translated at 29.2% (227 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: altinat <al@altqx.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/th/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Hosted Weblate
d501d1a972 i18n(webui): translated using Weblate (Turkish)
Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Eren Eroğlu <ereneroglum@yahoo.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2024-12-17 13:47:20 +08:00
Gauthier Roebroeck
4ff38812ac refactor: fix path format 2024-12-17 13:46:23 +08:00
Gauthier Roebroeck
e45acdb921 chore: disable false positive warning log 2024-12-17 13:45:53 +08:00
Gauthier Roebroeck
f22d88082a fix: static web resources not available 2024-12-17 13:45:29 +08:00
Gauthier Roebroeck
3b4dca2589 build(conveyor): use JDK 22 to fix windows build issue 2024-12-16 13:15:19 +08:00
github-actions
ed3feb9ccf chore(release): 1.15.0 [skip ci] 2024-12-16 01:40:39 +00:00
Gauthier Roebroeck
fceda30170 deps: bump deps 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
d659446194 style: ktlint format 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
307c652a47 deps: bump ktlint to 1.5.0 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
143770e82e feat(docker): add curl and wget 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
858365f4c9 build(docker): use ubuntu 24.10 and JDK 23 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
b682e35713 feat(docker): add native jpeg-xl library for arm64 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
5a32f7b30f build(macos-app): minimum macos version is now 13 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
17925e5cb7 feat(windows-app): add native webp libraries 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
750710db02 deps(komga): bump nightcompress to 1.0.0 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
8ce7716ff8 deps(komga): bump nightmonkeys to 1.0.0 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
7984be2a72 refactor: remove deprecated configuration properties 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
051cfb7248 build: move JDK configuration for desktop app to Conveyor configuration 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
225f58f81c refactor: address deprecations 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
a7ae8c75b3 build(docker): use new spring boot jar tools to extract layers 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
c76d9bf36f deps(komga): bump spring boot to 3.4.0 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
2e5d5d81e9 build: bump gradle to 8.11.1 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
d839cd6208 test: refactor 2024-12-13 12:18:10 +08:00
Gauthier Roebroeck
ee4d0a54e4 deps: bump com.github.ben-manes.versions to 0.51.0 2024-12-13 12:18:10 +08:00
dependabot[bot]
570650a4fc deps(webui): bump nanoid from 3.3.6 to 3.3.8 in /komga-webui
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.6 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.6...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-13 09:17:02 +08:00
Gauthier Roebroeck
d64fe03065 style: ktlint format 2024-12-12 16:44:15 +08:00
Gauthier Roebroeck
d93bc3d996 feat(webui): better filtering for Series
use the new conditions API to allow negative filters as well as any/all of filters

Closes: #1169
Closes: #1523
Closes: #1552
2024-12-12 16:35:41 +08:00
Gauthier Roebroeck
3bfc7981e5 feat(api): add new series list API using search condition criteria DSL
add book search condition criteria DSL
2024-12-12 16:35:40 +08:00
dependabot[bot]
7fa42f5899 deps(ci): bump hydraulic-software/conveyor from 15.1 to 16.0
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 15.1 to 16.0.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v15.1...v16.0)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 15:22:38 +08:00
github-actions[bot]
4ce9c15731 build(webui): update Browserslist db 2024-12-02 09:20:18 +08:00
Gauthier Roebroeck
b7b74c8b50 fix: keep user uploaded thumbnail when importing a book with upgrade 2024-11-18 11:14:20 +08:00
Gauthier Roebroeck
812f82207a fix: restore user uploaded thumbnail when restoring deleted books and series 2024-11-18 11:13:40 +08:00
github-actions[bot]
25a1cfa866 build(webui): update Browserslist db 2024-11-01 10:57:01 +08:00
Mad Scientist
6cc14e30be
docs: fix FAQ link in CONTRIBUTING.md 2024-10-24 09:30:50 +08:00
dependabot[bot]
892340383e deps(ci): bump hydraulic-software/conveyor from 14.3 to 15.1
Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 14.3 to 15.1.
- [Commits](https://github.com/hydraulic-software/conveyor/compare/v14.3...v15.1)

---
updated-dependencies:
- dependency-name: hydraulic-software/conveyor
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 16:55:50 +08:00
github-actions
668c3624d8 chore(release): 1.14.1 [skip ci] 2024-10-15 01:15:41 +00:00
Hosted Weblate
a05ad4415c i18n(komga-tray): translated using Weblate (Czech)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/cs/
Translation: komga/desktop
2024-10-15 08:57:09 +08:00
Hosted Weblate
c18539563a i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2024-10-15 08:56:52 +08:00
Hosted Weblate
246c53920a i18n(webui): translated using Weblate (French)
Currently translated at 99.8% (774 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthieu Sontag <matthieu.sontag@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2024-10-15 08:56:52 +08:00
Hosted Weblate
a23d8939a9 i18n(webui): translated using Weblate (Czech)
Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 92.2% (715 of 775 strings)

i18n(webui): translated using Weblate (Czech)

Currently translated at 92.2% (715 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petr Šimek <petr.simek@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/cs/
Translation: komga/webui
2024-10-15 08:56:52 +08:00
Hosted Weblate
833f4b394f i18n(webui): translated using Weblate (Turkish)
Currently translated at 100.0% (775 of 775 strings)

i18n(webui): translated using Weblate (Turkish)

Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Eren Eroğlu <ereneroglum@yahoo.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2024-10-15 08:56:52 +08:00
Gauthier Roebroeck
f910ef4868 fix(webui): book import filename chooser dialog would not reopen in some scenarios 2024-10-15 08:55:25 +08:00
dependabot[bot]
64094ff191 deps(webui): bump cookie and express in /komga-webui
Bumps [cookie](https://github.com/jshttp/cookie) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `cookie` from 0.6.0 to 0.7.1
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.6.0...v0.7.1)

Updates `express` from 4.21.0 to 4.21.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.1)

---
updated-dependencies:
- dependency-name: cookie
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 09:59:47 +08:00
Gauthier Roebroeck
406274de86 fix(kobo): better display of fixed layout books
Closes: #1732
2024-10-09 10:24:30 +08:00
Gauthier Roebroeck
e1b92960d9 fix(webui): bulk edit metadata numberSort increment does not work as expected after editing
Closes: #1727
2024-10-07 09:36:42 +08:00
Gauthier Roebroeck
2b41fefef4 fix(komga-tray): load optional application configuration files inside config directory 2024-10-02 12:29:20 +08:00
Gauthier Roebroeck
e7ef2bc91d fix(webui): epub reader crash when reading one-shot from collection context
Closes: #1718
2024-10-02 10:06:18 +08:00
Gauthier Roebroeck
fa006c0428 fix(webui): file system browser parent button does not work
Closes: #1721
2024-10-02 09:56:17 +08:00
Gauthier Roebroeck
836cfa4b69 fix(api): file system listing does not respect showFiles=false
Closes: #1721
2024-10-02 09:56:17 +08:00
github-actions[bot]
b382cd6a2a build(webui): update Browserslist db 2024-10-02 09:33:16 +08:00
github-actions
d7ec1af53b chore(release): 1.14.0 [skip ci] 2024-09-27 08:29:48 +00:00
Hosted Weblate
a253bcee32 i18n(komga-tray): translated using Weblate (Danish)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Steffen <steffensunivers@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/da/
Translation: komga/desktop
2024-09-27 16:08:38 +08:00
Hosted Weblate
b549038995 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2024-09-27 16:08:24 +08:00
Hosted Weblate
f7d1fe49f7 i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (775 of 775 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2024-09-27 16:08:24 +08:00
Hosted Weblate
5c5aabbcdf i18n(webui): translated using Weblate (Danish)
Currently translated at 19.4% (151 of 775 strings)

i18n(webui): translated using Weblate (Danish)

Currently translated at 17.0% (132 of 775 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Steffen <steffensunivers@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/da/
Translation: komga/webui
2024-09-27 16:08:24 +08:00
Gauthier Roebroeck
b9cb0fe091 deps(komga): bump sqlite-jdbc from 3.45.0.0 to 3.46.1.3 2024-09-27 15:33:38 +08:00
Gauthier Roebroeck
870afffcf3 feat(kobo): update changed covers on Kobo 2024-09-25 18:38:14 +08:00
Hosted Weblate
51cd7e0ccd i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (774 of 774 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (774 of 774 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
cc55e2f7ef i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
14bbdc44e2 i18n(webui): translated using Weblate (French)
Currently translated at 98.9% (766 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthieu Sontag <matthieu.sontag@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
fdf0582e14 i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (774 of 774 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
9c49f6521f i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
7e29dc6eb1 i18n(webui): translated using Weblate (Portuguese)
Currently translated at 86.9% (673 of 774 strings)

i18n(webui): translated using Weblate (Portuguese)

Currently translated at 86.9% (673 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rodrigo Müller <contato@rodrigo.muller.nom.br>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
ebeea18779 i18n(webui): translated using Weblate (German)
Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: M <mhannig@gmx.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/de/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
e1c2395d5a i18n(webui): translated using Weblate (Turkish)
Currently translated at 100.0% (774 of 774 strings)

Co-authored-by: Eren Eroğlu <ereneroglum@yahoo.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2024-09-25 15:51:55 +08:00
Hosted Weblate
5494254ace i18n(komga-tray): translated using Weblate (Portuguese)
Currently translated at 44.4% (4 of 9 strings)

i18n(komga-tray): translated using Weblate (Portuguese)

Currently translated at 44.4% (4 of 9 strings)

Co-authored-by: Rodrigo Müller <contato@rodrigo.muller.nom.br>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/pt/
Translation: komga/desktop
2024-09-25 15:51:18 +08:00
Gauthier Roebroeck
df11920616 feat(kobo): handle read progression conversion between kepub and epub 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
1d1e3fdb66 feat(docker): bundle kepubify 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
489d4b112a feat(komga-tray): bundle kepubify for windows and macos apps 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
d838c85786 feat(webui): support kepubify path in Server Settings 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
ca57ab35fd docs(openapi): split OPDS v1 and v2 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
dd39f28466 feat(kobo): convert books to kepub on the fly using kepubify 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
9e8a525554 feat(kobo): provide KEPUB format download url if book is kepub 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
12e243683f feat(webui): display KEPUB as book format for kepub files 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
0fd783c9cd feat: detect if epub is a kepub 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
d0143bf979 refactor: simplify epub zip functions 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
734bf8fbe1 refactor: move TaskPoolSize event to infrastructure package 2024-09-25 15:49:18 +08:00
Gauthier Roebroeck
2b18dfa5c1 fix: don't crash if ForwardedHeaderFilter is not defined
it can happen if server.forward-headers-strategy is set to something other than 'native'
2024-09-25 15:48:56 +08:00
dependabot[bot]
b64c117029 deps(webui): bump serve-static and express in /komga-webui
Bumps [serve-static](https://github.com/expressjs/serve-static) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-19 11:41:04 +08:00
github-actions
76ec1189da chore(release): 1.13.0 [skip ci] 2024-09-11 04:15:54 +00:00
Hosted Weblate
bc913adc81 i18n(webui): translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (772 of 772 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (770 of 770 strings)

i18n(webui): translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (770 of 770 strings)

i18n(webui): translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (770 of 770 strings)

i18n(webui): translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (770 of 770 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hans/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
41c93fdd14 i18n(webui): translated using Weblate (Korean)
Currently translated at 97.0% (747 of 770 strings)

Co-authored-by: Assem Askarova <assask499@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ko/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
026c6966a9 i18n(webui): translated using Weblate (Finnish)
Currently translated at 100.0% (772 of 772 strings)

i18n(webui): translated using Weblate (Finnish)

Currently translated at 99.8% (769 of 770 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fi/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
c725d73c44 i18n(webui): translated using Weblate (French)
Currently translated at 98.1% (756 of 770 strings)

i18n(webui): translated using Weblate (French)

Currently translated at 98.1% (756 of 770 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Samyar Vahid <samyarvahid@users.noreply.hosted.weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/fr/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
ffc7bc3dff i18n(webui): translated using Weblate (Spanish)
Currently translated at 100.0% (772 of 772 strings)

i18n(webui): translated using Weblate (Spanish)

Currently translated at 100.0% (770 of 770 strings)

Co-authored-by: 1024mb <1024mb@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/es/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
15eb9a433e i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (770 of 770 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 96.4% (743 of 770 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 94.4% (727 of 770 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 94.4% (727 of 770 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 94.2% (726 of 770 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Hosted Weblate
8249e0fa41 i18n(webui): translated using Weblate (Russian)
Currently translated at 77.2% (595 of 770 strings)

Co-authored-by: Artem Ryabkov <rad964@pm.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ru/
Translation: komga/webui
2024-09-11 12:01:04 +08:00
Weblate (bot)
b8f2ceadf0
i18n(komga-tray): translated using Weblate (Croatian)
Currently translated at 100.0% (9 of 9 strings)

i18n(komga-tray): translated using Weblate (Croatian)

Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/hr/
Translation: komga/desktop
2024-09-11 11:59:14 +08:00
Gauthier Roebroeck
be4911d56b feat(webui): add sort criteria for known page hash
Closes: #1609
2024-09-11 11:54:59 +08:00
Gauthier Roebroeck
d12f3b3493 feat(metadata): support multiple values in Web field from ComicInfo.xml
Closes: #1639
2024-09-11 11:27:38 +08:00
Gauthier Roebroeck
f07be065d2 feat(kobo): sync On Deck as a Kobo collection 2024-09-11 11:27:38 +08:00
Gauthier Roebroeck
e72ff784e8 perf(api): make on deck much faster 2024-09-11 11:27:37 +08:00
Gauthier Roebroeck
0047a91a18 test(benchmark): mark some books as read for on deck 2024-09-06 16:16:21 +08:00
Gauthier Roebroeck
bf8bbdd764 fix: admin user created by claiming does not have kobo sync role
Closes: #1686
2024-09-05 09:28:13 +08:00
github-actions
ee9011d698 chore(release): 1.12.1 [skip ci] 2024-09-04 08:30:57 +00:00
Gauthier Roebroeck
4351086935 fix(webui): only show API key copy button if clipboard is available
Closes: #1675
2024-09-04 16:12:42 +08:00
Gauthier Roebroeck
4cd838abbd fix(kobo): better handling of missing port from Kobo Sync requests 2024-09-04 16:12:42 +08:00
Gauthier Roebroeck
be371277eb fix(kobo): use the total progression sent by Kobo 2024-09-02 16:55:11 +08:00
Gauthier Roebroeck
20e7c295ad fix(kobo): correctly propagate metadata update during kobo sync
Massive thanks to @tsheinen for this!
2024-09-02 16:39:56 +08:00
Gauthier Roebroeck
fcde9c9376 fix(kobo): properly store total progression on state update 2024-09-02 16:39:09 +08:00
Gauthier Roebroeck
c3fc37a5da fix(kobo): properly mark book as read when finished on Kobo 2024-09-02 15:49:21 +08:00
github-actions[bot]
63e1c0c932 build(webui): update Browserslist db 2024-09-02 10:15:30 +08:00
Gauthier
02e8d304df
docs: add kobo sync in readme 2024-08-30 16:23:55 +08:00
Gauthier Roebroeck
2c260b1878 refactor: adjust loglevel for LoginListener 2024-08-30 12:09:29 +08:00
github-actions
fe96fca5bf chore(release): 1.12.0 [skip ci] 2024-08-29 08:43:52 +00:00
Weblate (bot)
95df31533a
i18n(komga-tray): translated using Weblate (Hungarian)
Currently translated at 66.6% (6 of 9 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Simon Ádám <adamsimon2332@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/hu/
Translation: komga/desktop
2024-08-29 16:27:47 +08:00
Hosted Weblate
413376571c chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
7ba3c0cafc chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
296501f0b4 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (751 of 751 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lee Andy <crazyandy316945@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/zh_Hant/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
09fe1a9fe2 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
42f8dcd825 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
06d7764b2b chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
d0401c496e chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
6fa17df9da chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
27642ad360 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
b37780e5b1 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
3fe5122b87 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
6677d6720a chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
6c5652f49f chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
7e7e47fe91 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
ad90a72e9f chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Hungarian)

Currently translated at 69.3% (521 of 751 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Simon Ádám <adamsimon2332@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hu/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
e53a1a3698 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Croatian)

Currently translated at 96.9% (728 of 751 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 96.5% (725 of 751 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 96.4% (724 of 751 strings)

i18n(webui): translated using Weblate (Croatian)

Currently translated at 89.0% (669 of 751 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
f1cdb5f3a8 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
9559b84e33 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
a135bdece5 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
82947becdd chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
99fd69d429 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
5c3cd59f26 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
a5fa01f6e4 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
4eddce9ee2 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
04dbdf4eda chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
f5f2f35e1d chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Hosted Weblate
99f47c4342 chore: update translation files
Updated by "Cleanup translation files" hook in Weblate.

i18n(webui): translated using Weblate (Turkish)

Currently translated at 100.0% (751 of 751 strings)

Co-authored-by: Eren Eroğlu <ereneroglum@yahoo.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/tr/
Translation: komga/webui
2024-08-29 16:26:25 +08:00
Gauthier Roebroeck
32c0851c17 chore: update issue template 2024-08-29 16:15:50 +08:00
Gauthier Roebroeck
c1e1da6ffc feat(webui): api key support 2024-08-29 16:15:50 +08:00
Gauthier Roebroeck
210c7b1e50 feat(kobo): initial Kobo Sync support 2024-08-29 16:15:50 +08:00
Gauthier Roebroeck
a4747e81f4 feat(kobo): add API key support 2024-08-29 16:15:50 +08:00
dependabot[bot]
f3bce238c1 deps(webui): bump webpack from 5.88.2 to 5.94.0 in /komga-webui
Bumps [webpack](https://github.com/webpack/webpack) from 5.88.2 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.88.2...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-29 13:48:22 +08:00
Gauthier Roebroeck
cefd527225 ci: ignore conveyor steps on forks 2024-08-29 11:55:56 +08:00
Jens van Almsick
435458107c
feat(metadata): use group-position for epub series index 2024-08-29 11:46:49 +08:00
Gauthier Roebroeck
85a9934ff1 fix(api): incorrect query param name
Closes: #1670
2024-08-29 10:51:40 +08:00
Gauthier Roebroeck
0d19aa17a5 fix(api): properly handle simple read progress for divina compatible epub 2024-08-27 12:06:58 +08:00
dependabot[bot]
14887f5a50 deps(ci): bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-26 16:34:49 +08:00
github-actions
8040eb45fc chore(release): 1.11.3 [skip ci] 2024-08-26 03:22:49 +00:00
Snd-R
eeb5898210
perf: faster zip entry extraction 2024-08-26 10:58:04 +08:00
Gauthier Roebroeck
6794e2490c fix(webui): footer text displayed over book content
Closes: #1489
2024-08-23 16:25:45 +08:00
Gauthier Roebroeck
da35140928 fix(api): some metrics are not updated
Closes: #1643
2024-08-23 16:01:08 +08:00
Gauthier Roebroeck
835bff4f52 fix(webui): auto-scroll upward does not work when dragging elements
Closes: #1652
2024-08-23 15:49:23 +08:00
Gauthier Roebroeck
bf71f8e505 fix(api): known page hash cannot be sorted by file size
Closes: #1610
2024-08-23 15:35:35 +08:00
dependabot[bot]
f177fab0f2 deps(webui): bump axios from 1.6.0 to 1.7.4 in /komga-webui
Bumps [axios](https://github.com/axios/axios) from 1.6.0 to 1.7.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.0...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-23 15:29:06 +08:00
github-actions[bot]
eec2474194 build(webui): update Browserslist db 2024-08-23 15:22:17 +08:00
Gauthier Roebroeck
b93459a56f ci: add browserlist update action 2024-08-23 15:19:16 +08:00
Gauthier Roebroeck
6482b3496a deps(ci): bump gradle/actions from 3 to 4 2024-08-23 15:14:39 +08:00
Gauthier Roebroeck
6a51f3483a refactor: better logging for sqlite pools 2024-08-21 15:34:34 +08:00
Gauthier Roebroeck
f743aaef17 fix(komga-tray): libheif.dll had no avif support
Closes: #1624
2024-08-21 15:33:15 +08:00
Gauthier
6fce56e8c3
chore: update mihon extension repo url for issues 2024-08-12 10:57:15 +08:00
Gauthier Roebroeck
796a4ed218 fix(docker): broken Dockerfile 2024-07-25 13:37:55 +08:00
581 changed files with 52243 additions and 22277 deletions

View file

@ -7,5 +7,5 @@ contact_links:
url: https://komga.org/docs/faq
about: Guides, troubleshooting, and answers to common questions
- name: ⚠️ Mihon extension
url: https://github.com/keiyoushi/extensions
url: https://github.com/keiyoushi/extensions-source
about: Issues and requests about the Mihon extension should be opened in the keiyoushi/extensions repository instead

View file

@ -44,7 +44,9 @@ body:
attributes:
label: Logs
description: |
If applicable, add an excerpt of the log file (max 20 lines) _AND_ attach the complete log file or a link to a gist/pastebin containing the log file ([where to find the logs](https://komga.org/faq/#where-can-i-find-the-log-files)).
:warning: **Do not share logs with Kobo Sync information publicly !**
If applicable, add an excerpt of the log file (max 20 lines) _AND_ attach the complete log file or a link to a gist/pastebin containing the log file ([where to find the logs](https://komga.org/docs/faq#where-can-i-find-the-log-files)).
placeholder: |
You can paste the logs in pure text or upload it as an attachment.

13
.github/readme-images/jetbrains.svg vendored Normal file
View file

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="298" height="64" fill="none" viewBox="0 0 298 64">
<defs>
<linearGradient id="a" x1=".850001" x2="62.62" y1="62.72" y2="1.81" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9419"/>
<stop offset=".43" stop-color="#FF021D"/>
<stop offset=".99" stop-color="#E600FF"/>
</linearGradient>
</defs>
<path fill="#000" d="M86.4844 40.5858c0 .8464-.1792 1.5933-.5377 2.2505-.3585.6573-.8564 1.1651-1.5137 1.5236-.6572.3585-1.3941.5378-2.2406.5378H78v6.1044h5.0787c1.912 0 3.6248-.4282 5.1484-1.2846 1.5236-.8564 2.7186-2.0415 3.585-3.5452.8663-1.5037 1.3045-3.1966 1.3045-5.0886V21.0178h-6.6322v19.568Zm17.8556-1.8224h13.891v-5.6065H104.34v-6.3633h15.355v-5.7758H97.8766v29.9743h22.2464v-5.7757H104.34v-6.453Zm17.865-11.8005h8.882v24.0193h6.633V26.9629h8.842v-5.9451h-24.367v5.9551l.01-.01Zm47.022 9.0022c-.517-.2788-1.085-.4879-1.673-.6472.449-.1295.877-.2888 1.275-.488 1.096-.5676 1.962-1.3643 2.579-2.39.618-1.0257.936-2.2007.936-3.5351 0-1.5237-.418-2.8879-1.244-4.0929-.827-1.195-1.992-2.131-3.486-2.8082-1.494-.6672-3.206-1.0058-5.118-1.0058h-13.315v29.9743h13.574c2.011 0 3.804-.3485 5.387-1.0556 1.573-.707 2.798-1.6829 3.675-2.9476.866-1.2547 1.304-2.6887 1.304-4.302 0-1.4837-.338-2.8082-1.026-3.9833-.687-1.175-1.633-2.0812-2.858-2.7285l-.01.0099Zm-13.603-9.9184h5.886c.816 0 1.533.1494 2.161.4382.627.2888 1.115.707 1.464 1.2547.348.5378.527 1.1751.527 1.9021 0 .7269-.179 1.414-.527 1.9817-.349.5676-.837.9958-1.464 1.3045-.628.3087-1.345.4581-2.161.4581h-5.886v-7.3492.0099Zm10.138 18.134c-.378.5676-.916 1.0058-1.603 1.3145-.697.3087-1.484.4581-2.39.4581h-6.145v-7.6878h6.145c.886 0 1.673.1693 2.37.4979.687.3286 1.235.7867 1.613 1.3842.378.5975.578 1.2747.578 2.0414 0 .7668-.19 1.4241-.568 1.9917Zm29.596-5.3077c1.663-.7967 2.947-1.922 3.864-3.3659.916-1.444 1.374-3.117 1.374-5.0289 0-1.912-.448-3.5253-1.344-4.9592-.897-1.434-2.171-2.5394-3.814-3.3261-1.644-.7867-3.546-1.1751-5.717-1.1751h-13.124v29.9743h6.642V40.0779h4.322l6.084 10.9142h7.578l-6.851-11.7208c.339-.1195.677-.249.996-.3983h-.01Zm-2.151-6.1244c-.369.6274-.896 1.1154-1.583 1.444-.688.3386-1.494.5079-2.42.5079h-5.975v-8.2953h5.975c.926 0 1.732.1693 2.42.4979.687.3287 1.214.8166 1.583 1.434.368.6174.558 1.3544.558 2.1908 0 .8365-.19 1.5734-.558 2.2008v.0199Zm20.594-11.7308-10.706 29.9743h6.742l2.121-6.6122h11.114l2.27 6.6122h6.612L220.99 21.0178h-7.189Zm-.339 18.3431 3.445-10.5756.409-1.922.408 1.922 3.685 10.5756h-7.947Zm20.693 11.6312h6.851V21.0178h-6.851v29.9743Zm31.02-9.6993-12.896-20.275h-6.463v29.9743h6.055V30.7172l12.826 20.2749h6.533V21.0178h-6.055v20.275Zm31.528-3.3559c-.647-1.2448-1.564-2.2904-2.729-3.1369-1.165-.8464-2.509-1.4041-4.023-1.6929l-5.098-1.0456c-.797-.1892-1.434-.5178-1.902-.9958-.469-.478-.708-1.0755-.708-1.7825 0-.6473.17-1.205.518-1.683.339-.478.827-.8464 1.444-1.1153.618-.2689 1.335-.3983 2.151-.3983.817 0 1.554.1394 2.181.4182.627.2788 1.115.6672 1.464 1.1751s.528 1.0755.528 1.7228h6.642c-.04-1.7427-.528-3.2863-1.444-4.6207-.916-1.3443-2.201-2.3899-3.834-3.1468-1.633-.7568-3.505-1.1352-5.597-1.1352-2.091 0-3.943.3884-5.566 1.1751-1.623.7867-2.898 1.8721-3.804 3.2663-.906 1.3941-1.364 2.9775-1.364 4.76 0 1.444.288 2.7485.876 3.9036.587 1.1652 1.414 2.1311 2.479 2.8979 1.076.7668 2.311 1.3045 3.725 1.6033l5.397 1.1153c.886.2091 1.584.5975 2.101 1.1551.518.5577.767 1.2448.767 2.0813 0 .6672-.189 1.2747-.567 1.8025-.379.5277-.907.936-1.584 1.2248-.677.2888-1.474.4282-2.39.4282-.916 0-1.782-.1593-2.529-.478-.747-.3186-1.325-.7767-1.733-1.3742-.418-.5875-.617-1.2747-.617-2.0414h-6.642c.029 1.8721.527 3.5152 1.513 4.9492.976 1.424 2.32 2.5394 4.033 3.336 1.713.7967 3.675 1.195 5.886 1.195 2.21 0 4.202-.4083 5.915-1.2249 1.723-.8165 3.057-1.9418 4.023-3.3758.966-1.434 1.444-3.0572 1.444-4.8696 0-1.4838-.329-2.848-.976-4.1028l.02.01Z"/>
<path fill="url(#a)" d="M20.34 3.66 3.66 20.34C1.32 22.68 0 25.86 0 29.18V59c0 2.76 2.24 5 5 5h29.82c3.32 0 6.49-1.32 8.84-3.66l16.68-16.68c2.34-2.34 3.66-5.52 3.66-8.84V5c0-2.76-2.24-5-5-5H29.18c-3.32 0-6.49 1.32-8.84 3.66Z"/>
<path fill="#000" d="M48 16H8v40h40V16Z"/>
<path fill="#fff" d="M30 47H13v4h17v-4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -0,0 +1,35 @@
name: Update Browserslist database
on:
workflow_dispatch:
schedule:
- cron: '0 2 1 * *'
permissions:
contents: write
pull-requests: write
jobs:
update-browserslist-database:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Configure git
run: |
# Setup for commiting using built-in token. See https://github.com/actions/checkout#push-a-commit-using-the-built-in-token
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Update Browserslist database and create PR if applies
uses: c2corg/browserslist-update-action@v2
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: browserslist-update
base_branch: master
directory: ./komga-webui
commit_message: 'build(webui): update Browserslist db'
title: 'Browserslist database update'
body: Auto-generated by [browserslist-update-action](https://github.com/c2corg/browserslist-update-action/)
labels: 'github_actions'

18
.github/workflows/dispatch.yml vendored Normal file
View file

@ -0,0 +1,18 @@
name: Dispatch events
on:
push:
branches: [ master ]
paths:
- '**/openapi.json'
jobs:
dispatch:
runs-on: ubuntu-latest
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v4
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}
repository: gotson/komga-website
event-type: openapi

View file

@ -15,7 +15,7 @@ jobs:
steps:
- uses: actions/checkout@master
- name: DockerHub Description
uses: peter-evans/dockerhub-description@v4.0.0
uses: peter-evans/dockerhub-description@v5.0.0
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

View file

@ -1,14 +0,0 @@
name: "Validate Gradle Wrapper"
on:
pull_request:
push:
branches-ignore:
- 'dependabot/**'
jobs:
validation:
name: "Validation"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: gradle/actions/wrapper-validation@v3

View file

@ -12,7 +12,7 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
- uses: dessant/lock-threads@v6
with:
github-token: ${{ github.token }}
issue-inactive-days: '30'

View file

@ -43,24 +43,24 @@ jobs:
version_next: ${{ steps.versions.outputs.version_next }}
should_release: ${{ steps.versions.outputs.should_release }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Homebrew
id: set-up-homebrew
uses: Homebrew/actions/setup-homebrew@master
uses: Homebrew/actions/setup-homebrew@main
- name: Install svu
run: brew install caarlos0/tap/svu
run: brew install --cask caarlos0/tap/svu
- name: Compute next version for release
run: |
echo "VERSION_NEXT=`svu --pattern="[0-9]*" --strip-prefix ${{ inputs.bump }}`" | tee -a $GITHUB_ENV
echo "VERSION_NEXT_SUFFIX=`svu --pattern="[0-9]*" --strip-prefix ${{ inputs.bump }}`" | tee -a $GITHUB_ENV
echo "VERSION_NEXT=`svu ${{ inputs.bump }}`" | tee -a $GITHUB_ENV
echo "VERSION_NEXT_SUFFIX=`svu ${{ inputs.bump }}`" | tee -a $GITHUB_ENV
- name: Set Versions
id: versions
run: |
echo "version_current=`svu --pattern="[0-9]*" --strip-prefix current`" >> $GITHUB_OUTPUT
echo "version_current=`svu current`" >> $GITHUB_OUTPUT
echo "version_next=${{ env.VERSION_NEXT_SUFFIX }}" >> $GITHUB_OUTPUT
[[ `svu --pattern="[0-9]*" --strip-prefix current` != ${{ env.VERSION_NEXT }} ]] && echo "should_release=true" >> $GITHUB_OUTPUT || echo
[[ `svu current` != ${{ env.VERSION_NEXT }} ]] && echo "should_release=true" >> $GITHUB_OUTPUT || echo
release:
name: Release
@ -72,7 +72,7 @@ jobs:
sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
@ -84,44 +84,40 @@ jobs:
if: needs.version.outputs.should_release #only redo if the version changed
run: sed -i -e "s/version=.*/version=${{ needs.version.outputs.version_next }}/" gradle.properties
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'
cache-dependency-path: komga-webui/package-lock.json
- uses: actions/setup-java@v4
- name: Setup Java 21
uses: actions/setup-java@v5
with:
java-version: 21
java-package: 'jdk'
distribution: 'temurin'
- uses: actions/setup-java@v4
with:
java-version: 17
java-package: 'jdk'
distribution: 'temurin'
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: gradle/actions/setup-gradle@v3
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: ./gradlew :komga:prepareThymeLeaf :komga:bootJar :komga-tray:jar
@ -147,7 +143,7 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Changelog output
if: always() && needs.version.outputs.should_release
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: jreleaser-changelog
path: |
@ -155,7 +151,7 @@ jobs:
build/jreleaser/output.properties
- name: Release commit and push
uses: EndBug/add-and-commit@v9
uses: EndBug/add-and-commit@v10
if: needs.version.outputs.should_release #only redo if the version changed
with:
message: 'chore(release): ${{ needs.version.outputs.version_next }} [skip ci]'
@ -171,7 +167,7 @@ jobs:
echo $APPLE_PRIVATE_KEY | base64 --decode > ./secret/apple_private_key.p8
- name: Conveyor make copied-site
uses: hydraulic-software/conveyor/actions/build@v14.3
uses: hydraulic-software/conveyor/actions/build@v22.0
if: inputs.conveyor-copied-site
with:
command: --cache-limit=2.0 -f conveyor.ci.conf make copied-site -o ./output/site
@ -186,7 +182,7 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log
if: always() && inputs.conveyor-copied-site
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: conveyor-make-copied-site
path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt
@ -198,27 +194,13 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Release output
if: always() && inputs.github_release
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: jreleaser-release
path: |
build/jreleaser/trace.log
build/jreleaser/output.properties
- name: JReleaser Announce
if: inputs.github_release
run: ./gradlew jreleaserAnnounce
env:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Announce output
if: always() && inputs.github_release
uses: actions/upload-artifact@v4
with:
name: jreleaser-announce
path: |
build/jreleaser/trace.log
build/jreleaser/output.properties
# Sometimes the workflow will fail because it's out of disk space
- name: Cleanup Conveyor output
run: rm -fr ./output
@ -230,7 +212,7 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Publish output
if: always() && inputs.docker_release
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: jreleaser-publish
path: |
@ -238,7 +220,7 @@ jobs:
build/jreleaser/output.properties
- name: Conveyor - publish to Microsoft Store
uses: hydraulic-software/conveyor/actions/build@v14.3
uses: hydraulic-software/conveyor/actions/build@v22.0
if: inputs.msstore_release
with:
command: --cache-limit=2.0 -f conveyor.msstore.ci.conf make ms-store-release -o ./output/msstore
@ -254,7 +236,18 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log
if: always() && inputs.msstore_release
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: conveyor-ms-store-release
path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt
dispatch:
needs: release
runs-on: ubuntu-latest
steps:
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v4
with:
token: ${{ secrets.REPO_ACCESS_TOKEN }}
repository: gotson/komga-website
event-type: komga-release

View file

@ -12,43 +12,51 @@ on:
jobs:
test:
runs-on: ubuntu-latest
name: Test server
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
fail-fast: false
name: Test server - ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
- uses: actions/checkout@v6
- name: Setup Java 21
uses: actions/setup-java@v5
with:
java-version: 21
java-package: 'jdk'
distribution: 'temurin'
- uses: actions/setup-java@v4
with:
java-version: 17
java-package: 'jdk'
distribution: 'temurin'
- uses: gradle/actions/setup-gradle@v3
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: ./gradlew build :komga-tray:jar
- name: Upload Unit Test Results
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: test-results
name: test-results-${{ matrix.os }}
path: komga/build/test-results/
- name: Upload Unit Test Reports
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: test-reports
name: test-reports-${{ matrix.os }}
path: komga/build/reports/tests/
- name: Publish Test Report
uses: mikepenz/action-junit-report@v6
if: always()
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
check_name: 'JUnit Test Report: ${{ matrix.os }}'
- name: Conveyor - compute JDK module list
if: github.event_name == 'push'
uses: hydraulic-software/conveyor/actions/build@v14.3
if: github.event_name == 'push' && github.repository_owner == 'gotson' && contains(matrix.os, 'ubuntu')
uses: hydraulic-software/conveyor/actions/build@v22.0
with:
command: -f conveyor.detect.conf -Kapp.machines=mac.aarch64 make processed-jars
signing_key: ${{ secrets.CONVEYOR_SIGNING_KEY }}
@ -56,12 +64,12 @@ jobs:
- name: Compare JDK required modules
id: conveyor_compare
if: github.event_name == 'push'
if: github.event_name == 'push' && github.repository_owner == 'gotson' && contains(matrix.os, 'ubuntu')
run: diff --unified ./komga-tray/conveyor/required-jdk-modules.txt ./output/required-jdk-modules.txt
- name: Upload JDK required modules
if: steps.conveyor_compare.outcome == 'failure'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: conveyor-required-jdk-modules
path: ./output/required-jdk-modules.txt
@ -70,8 +78,8 @@ jobs:
runs-on: ubuntu-latest
name: Test webui builds
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'

3
.gitignore vendored
View file

@ -2,6 +2,9 @@
.gradle
!gradle/wrapper/gradle-wrapper.jar
### Kotlin
.kotlin
### NodeJS
node_modules

3
.svu.yml Normal file
View file

@ -0,0 +1,3 @@
tag:
prefix: ''
pattern: '[0-9]*'

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
1. **Before reporting a new issue, take a look at the [FAQ](https://komga.org/faq/), the [changelog](https://github.com/gotson/komga/blob/master/CHANGELOG.md) and the already opened [issues](https://github.com/gotson/komga/issues).**
1. **Before reporting a new issue, take a look at the [FAQ](https://komga.org/docs/faq/), the [changelog](https://github.com/gotson/komga/blob/master/CHANGELOG.md) and the already opened [issues](https://github.com/gotson/komga/issues).**
1. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/678794935368941569?label=Discord)](https://discord.gg/TdRpkDu)
1. **DO NOT** reply on existing issues to say _"+1"_ or _"I am interested in this"_.
1. **DO** show your enthusiasm for an existing issue by adding a :+1: reaction on the first message in the discussion.

View file

@ -6,7 +6,7 @@ Thanks a lot for contributing to Komga!
You will need:
- Java JDK version 17 & 21
- Java JDK version 21+
- Nodejs version 18+ (check the `.nvmrc` file)
## Setting up the project

View file

@ -37,3 +37,9 @@
| ERR_1031 | ComicRack CBL Book is missing series or number |
| ERR_1032 | EPUB file has wrong media type |
| ERR_1033 | Some entries are missing |
| ERR_1034 | An API key with that comment already exists |
| ERR_1035 | Error while getting EPUB TOC |
| ERR_1036 | Error while getting EPUB Landmarks |
| ERR_1037 | Error while getting EPUB page list |
| ERR_1038 | Error while getting EPUB divina pages |
| ERR_1039 | Error while getting EPUB positions |

View file

@ -22,6 +22,9 @@ Komga is a media server for your comics, mangas, BDs, magazines and eBooks.
- Webreader with multiple reading modes
- Manage multiple users, with per-library access control, age restrictions, and labels restrictions
- Offers a REST API, many community tools and scripts can interact with Komga
- OPDS v1 and v2 support
- Kobo Sync with your Kobo eReader
- KOReader Sync
- Download book files, whole series, or read lists
- Duplicate files detection
- Duplicate pages detection and removal
@ -44,9 +47,15 @@ Check the [development guidelines](./DEVELOPING.md).
[![Translation status](https://hosted.weblate.org/widgets/komga/-/webui/horizontal-auto.svg)](https://hosted.weblate.org/engage/komga/)
## Sponsors
## Powered by
[![Jetbrains_logo](./.github/readme-images/sponsors-jetbrains.png)](https://www.jetbrains.com/?from=Komga)
[![Jetbrains_logo](./.github/readme-images/jetbrains.svg)](https://www.jetbrains.com/?from=Komga)
Thanks to [JetBrains](https://www.jetbrains.com/?from=Komga) for providing the development environment that helps us develop Komga.
[![Chromatic logo](https://user-images.githubusercontent.com/321738/84662277-e3db4f80-af1b-11ea-88f5-91d67a5e59f6.png)](https://www.chromatic.com)
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
## Credits

View file

@ -7,14 +7,14 @@ import kotlin.io.path.exists
plugins {
run {
val kotlinVersion = "1.9.21"
val kotlinVersion = "2.2.0"
kotlin("jvm") version kotlinVersion
kotlin("plugin.spring") version kotlinVersion
kotlin("kapt") version kotlinVersion
}
id("org.jlleitschuh.gradle.ktlint") version "12.1.0"
id("com.github.ben-manes.versions") version "0.50.0"
id("org.jreleaser") version "1.10.0"
id("org.jlleitschuh.gradle.ktlint") version "13.0.0"
id("com.github.ben-manes.versions") version "0.52.0"
id("org.jreleaser") version "1.19.0"
}
fun isNonStable(version: String): Boolean {
@ -44,12 +44,16 @@ allprojects {
}
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
version = "1.1.1"
version = "1.7.1"
filter {
exclude("**/generated-src/**")
exclude("**/generated/**")
}
}
}
tasks.wrapper {
gradleVersion = "8.5"
gradleVersion = "8.14.3"
distributionType = Wrapper.DistributionType.ALL
}
@ -160,7 +164,7 @@ jreleaser {
packagers {
docker {
active = Active.RELEASE
continueOnError = true
continueOnError = false
templateDirectory = rootDir.resolve("komga/docker")
repository.active = Active.NEVER
buildArgs = listOf("--cache-from", "gotson/komga:latest")

View file

@ -1,4 +1,5 @@
include "#!./gradlew -q :komga-tray:printConveyorConfig"
include required("/stdlib/jdk/23/eclipse.conf")
app {
display-name = Komga
@ -9,9 +10,14 @@ app {
license = MIT
icons = "res/komga_text_as_path.svg"
machines = [
windows.amd64,
mac
]
jvm {
// for NightMonkeys
options += "--enable-preview"
// for NightMonkeys & NightCompress
options += "--enable-native-access=ALL-UNNAMED"
mac.options += "-Dspring.profiles.include=mac"
@ -45,12 +51,16 @@ app {
exe-installer-basename = "KomgaInstaller"
manifests.msix.background-color = transparent
inputs += ./komga-tray/lib/windows/x64/
amd64.inputs += "https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-windows-64bit.exe" -> kepubify.exe
aarch64.inputs += "https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-windows-arm64.exe" -> kepubify.exe
}
mac {
info-plist.LSMinimumSystemVersion = 12
info-plist.LSMinimumSystemVersion = 13
aarch64.inputs += ./komga-tray/lib/mac/aarch64/
aarch64.inputs += "https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-darwin-arm64" -> kepubify
amd64.inputs += ./komga-tray/lib/mac/x64/
amd64.inputs += "https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-darwin-64bit" -> kepubify
}
site {
@ -58,4 +68,4 @@ app {
}
}
conveyor.compatibility-level = 13
conveyor.compatibility-level = 18

View file

@ -1,2 +1,2 @@
version=1.11.2
version=1.24.4
org.gradle.jvmargs=-Xmx2G

10
gradle/libs.versions.toml Normal file
View file

@ -0,0 +1,10 @@
[versions]
sqliteJdbc = "3.50.2.0"
nightmonkeys = "1.0.0"
twelvemonkeys = "3.12.0"
springboot = "3.5.14"
lucene = "9.9.1" # v10 requires JDK 21
jooq = "3.19.32" # should be aligned with the version provided by Spring Boot
[plugins]
gradleGitProperties = {id = "com.gorylenko.gradle-git-properties", version = "2.5.7"}

Binary file not shown.

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

12
gradlew vendored
View file

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -84,7 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -112,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@ -203,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
@ -211,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.

26
gradlew.bat vendored
View file

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -57,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell

View file

@ -1,20 +1,28 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
run {
kotlin("jvm")
kotlin("plugin.spring")
}
id("com.gorylenko.gradle-git-properties") version "2.4.1"
id("org.jetbrains.compose") version "1.5.11"
id("dev.hydraulic.conveyor") version "1.8"
alias(libs.plugins.gradleGitProperties)
id("org.jetbrains.compose") version "1.8.2"
id("org.jetbrains.kotlin.plugin.compose") version "2.2.0"
id("dev.hydraulic.conveyor") version "1.12"
application
}
group = "org.gotson"
repositories {
mavenCentral()
google()
}
kotlin {
jvmToolchain(21)
compilerOptions {
jvmTarget = JvmTarget.JVM_17
}
}
tasks {
@ -22,17 +30,13 @@ tasks {
sourceCompatibility = "17"
targetCompatibility = "17"
}
withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "17"
}
}
}
dependencies {
implementation(project(":komga"))
implementation(compose.desktop.currentOs)
implementation(compose.components.resources)
linuxAmd64(compose.desktop.linux_x64)
macAmd64(compose.desktop.macos_x64)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -16,7 +16,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.loadSvgPainter
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpSize
@ -27,6 +26,7 @@ import androidx.compose.ui.window.WindowPosition
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.application
import org.gotson.komga.RB
import org.jetbrains.compose.resources.decodeToSvgPainter
import org.springframework.core.io.ClassPathResource
@Preview
@ -50,7 +50,7 @@ fun showErrorDialog(
Dp.Unspecified,
),
),
icon = loadSvgPainter(ClassPathResource("icons/komga-color.svg").inputStream, LocalDensity.current),
icon = ClassPathResource("icons/komga-color.svg").inputStream.readAllBytes().decodeToSvgPainter(LocalDensity.current),
) {
Column(
modifier = Modifier.padding(16.dp),
@ -60,7 +60,7 @@ fun showErrorDialog(
modifier = Modifier.padding(bottom = 16.dp),
) {
Image(
painter = loadSvgPainter(ClassPathResource("icons/komga-color.svg").inputStream, LocalDensity.current),
painter = ClassPathResource("icons/komga-color.svg").inputStream.readAllBytes().decodeToSvgPainter(LocalDensity.current),
contentDescription = "Komga logo",
modifier =
Modifier

View file

@ -1,13 +1,13 @@
package org.gotson.komga.application.gui
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.loadSvgPainter
import androidx.compose.ui.window.Tray
import androidx.compose.ui.window.application
import org.gotson.komga.RB
import org.gotson.komga.infrastructure.web.WebServerEffectiveSettings
import org.gotson.komga.openExplorer
import org.gotson.komga.openUrl
import org.jetbrains.compose.resources.decodeToSvgPainter
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
@ -21,8 +21,8 @@ import java.io.File
@Profile("!test")
@Component
class TrayIconRunner(
@Value("#{komgaProperties.configDir}") komgaConfigDir: String,
@Value("\${logging.file.name}") logFileName: String,
@param:Value("#{komgaProperties.configDir}") komgaConfigDir: String,
@param:Value($$"${logging.file.name}") logFileName: String,
serverSettings: WebServerEffectiveSettings,
env: Environment,
) : ApplicationRunner {
@ -39,7 +39,7 @@ class TrayIconRunner(
private fun runTray() {
application {
Tray(
icon = loadSvgPainter(ClassPathResource("icons/$iconFileName").inputStream, LocalDensity.current),
icon = ClassPathResource("icons/$iconFileName").inputStream.readAllBytes().decodeToSvgPainter(LocalDensity.current),
menu = {
Item(RB.getString("menu.open_komga"), onClick = { openUrl(komgaUrl) })
Item(RB.getString("menu.show_log"), onClick = { openExplorer(logFile) })

View file

@ -3,3 +3,10 @@ logging:
name: ${user.home}/Library/Logs/Komga/komga.log
komga:
config-dir: ${user.home}/Library/Application Support/Komga
kobo.kepubify-path: kepubify
spring:
config:
import:
- "optional:file:${komga.config-dir}/application.yml"
- "optional:file:${komga.config-dir}/application.yaml"
- "optional:file:${komga.config-dir}/application.properties"

View file

@ -1,2 +1,9 @@
komga:
config-dir: ${LOCALAPPDATA}/Komga
kobo.kepubify-path: kepubify.exe
spring:
config:
import:
- "optional:file:${komga.config-dir}/application.yml"
- "optional:file:${komga.config-dir}/application.yaml"
- "optional:file:${komga.config-dir}/application.properties"

View file

@ -0,0 +1,9 @@
dialog_error.close=إغلاق
dialog_error.copy_clipboard=النسخ إلى الحافظة
dialog_error.title=Komga لم يقدر على البدء
error_message.port_in_use=الباب {} على قيد الاستعمال.\nربما Komga جارٍ بالفعل.\nتحقق أيقونة علبة النظام أو القائمة لأيقونة Komga.
error_message.unexpected=حصل خطأ غير متوقع.
menu.open_komga=فتح Komga
menu.quit=إغلاق Komga
menu.show_conf_dir=فتح موقع الإعدادات
menu.show_log=إظهار ملف السجل

View file

@ -0,0 +1,9 @@
dialog_error.close=বন্ধ কৰক
dialog_error.copy_clipboard=ক্লিপব’ৰ্ডলৈ কপি কৰক
dialog_error.title=কমগা আৰম্ভ কৰাত বিফল
error_message.port_in_use={} প’ৰ্ট ইতিমধ্যে ব্যৱহৃত।\nকমগা সম্ভৱতঃ ইতিমধ্যে চলি আছে।\nকমগা আইকনৰ বাবে ট্ৰে আইকন বা মেনু বাৰ পৰীক্ষা কৰক।
error_message.unexpected=এক অপ্ৰত্যাশিত ত্ৰুটি ঘটিল।
menu.open_komga=কমগা খোলক
menu.quit=কমগা বন্ধ কৰক
menu.show_conf_dir=বিন্যাস ডাইৰেক্টৰি খোলক
menu.show_log=লগ ফাইল দেখুৱাওক

View file

@ -0,0 +1,9 @@
dialog_error.close=Затвори
dialog_error.copy_clipboard=Копирай в клипборда
dialog_error.title=Komga не успя да стартира
error_message.port_in_use=Порт {} вече се използва.\nKomga сигурно вече работи.\nПровери tray иконите или menu лентата за иконата на Komga.
error_message.unexpected=Възникна неочаквана грешка.
menu.open_komga=Отвори Komga
menu.quit=Изключи Komga
menu.show_conf_dir=Отвори конфигурационната директория
menu.show_log=Отвори файла с логовете

View file

@ -1,9 +1,9 @@
dialog_error.close=Zavřít
dialog_error.copy_clipboard=Zkopírovat do schránky
dialog_error.title=Komga se nepodařila spustit
error_message.port_in_use=Port {} je aktuálně používán.\nKomga je pravděpodobně již zapnutá.\nZkontrolujte, zda ikona Komga není již v systémové liště nebo mezi schovanými ikony.
error_message.unexpected=Nastal neočekávaný error.
menu.open_komga=Otevřít Komga
menu.quit=Zavřít Komga
dialog_error.title=Aplikace Komga se nepodařila spustit
error_message.port_in_use=Port {} je aktuálně používán.\nAplikace Komga je pravděpodobně již spuštěna.\nZkontrolujte, zda ikona Komga není již v systémové liště nebo mezi schovanými ikonami.
error_message.unexpected=Nastala neočekávaná chyba.
menu.open_komga=Otevřít aplikaci Komga
menu.quit=Ukončit aplikaci Komga
menu.show_conf_dir=Otevřít konfigurační složku
menu.show_log=Zobrazit logy

View file

@ -0,0 +1,9 @@
dialog_error.close=Luk
dialog_error.copy_clipboard=Kopier til udklipsholder
dialog_error.title=Komga kunne ikke starte
error_message.port_in_use=Port {} er allerede i brug.\nKomga kører sandsynligvis allerede.\nTjek systembakken eller menulinjen for Komga-ikonet.
error_message.unexpected=Der opstod en uventet fejl.
menu.open_komga=Åbn Komga
menu.quit=Afslut Komga
menu.show_conf_dir=Åbn konfigurationsmappen
menu.show_log=Vis logfil

View file

@ -0,0 +1,9 @@
dialog_error.close=Pechar
dialog_error.copy_clipboard=Copiar ao portapapeis
dialog_error.title=Komga fallou ao iniciar
error_message.port_in_use=O porto {} está en uso.\nÉ probable que Komga xa esté a executarse.\nBusca a icona de Komga na bandexa de sistema ou a barra de menú.
error_message.unexpected=Aconteceu un erro imprevisto.
menu.open_komga=Abrir Komga
menu.quit=Saír de Komga
menu.show_conf_dir=Abrir o cartafol de configuración
menu.show_log=Amosar o ficheiro de rexistro

View file

@ -0,0 +1,9 @@
dialog_error.close=Zatvori
dialog_error.copy_clipboard=Kopiraj u međuspremnik
dialog_error.title=Komga se nije mogao pokrenuti
error_message.port_in_use=Priključak {} se već koristi.\nKomga vjerojatno već radi.\nPotraži Komga ikonu u traci ikona ili traci izbornika.
error_message.unexpected=Dogodila se neočekivana greška.
menu.open_komga=Otvori Komga
menu.quit=Zatvori Komga
menu.show_conf_dir=Otvori mapu konfiguracije
menu.show_log=Prikaži log-datoteku

View file

@ -0,0 +1,9 @@
dialog_error.close=Bezárás
dialog_error.copy_clipboard=Másolás a vágólapra
dialog_error.title=A Komga elindulása meghiúsult
error_message.port_in_use=A Port {} már használatban van.\nValószínűleg már fut a Komga.\nKeresd a Komga ikont a tálcán, vagy a menüsávon.
error_message.unexpected=Váratlan hiba történt.
menu.open_komga=Komga megnyitása
menu.quit=Komga bezárása
menu.show_conf_dir=Konfigurációs könyvtár megnyitása
menu.show_log=Eseménynapló fájl megjelenítése

View file

@ -0,0 +1,9 @@
dialog_error.close=Tutup
dialog_error.copy_clipboard=Salin ke papan klip
dialog_error.title=Komga gagal dimuat
error_message.port_in_use=Port {} telah digunakan.\nKomga telah berjalan.\nCari ikon Komga di baki ikon atau menu bar.
error_message.unexpected=Terjadi galat tak terduga.
menu.open_komga=Buka Komga
menu.quit=Tutup komga
menu.show_conf_dir=Buka direktori pengaturan
menu.show_log=Buka berkas catatan

View file

@ -0,0 +1,9 @@
dialog_error.close=Zamknij
dialog_error.copy_clipboard=Skopiuj do schowka
dialog_error.title=Nie udało się uruchomić Komgi
error_message.port_in_use=Port {} jest już używany.\nNajprawdopodobniej Komga jest już uruchomiona.\nSprawdź czy w zasobniku jest ikona Komgi.
error_message.unexpected=Napotkano nieoczekiwany błąd.
menu.open_komga=Otwórz Komgę
menu.quit=Wyjdź z Komgi
menu.show_conf_dir=Otwórz katalog z konfiguracją
menu.show_log=Pokaż dziennik

View file

@ -0,0 +1,9 @@
dialog_error.close=Fechar
dialog_error.copy_clipboard=Copiar para área de transferência
dialog_error.title=Falha no arranque do Konga
error_message.port_in_use=A porta {} já está em utilização.\nO Komga provavelmente já está em execução.\nVerifique o ícone do Komga na barra de tarefas/barra de menus.
error_message.unexpected=Ocorreu um erro inesperado.
menu.open_komga=Abrir Komga
menu.quit=Fechar Komga
menu.show_conf_dir=Abrir pasta de configuração
menu.show_log=Mostrar ficheiro de historial

View file

@ -0,0 +1,9 @@
dialog_error.close=Fechar
dialog_error.copy_clipboard=Copiar para área de transferência
dialog_error.title=Komga falhou ao inicializar
error_message.port_in_use=A porta {} já está em uso.\nProvavelmente o Komga já está rodando.\nVerifique o ícone na barra de tarefas ou a barra de menu.
error_message.unexpected=Ocorreu um erro inesperado.
menu.open_komga=Abrir Komga
menu.quit=Sair do Komga
menu.show_conf_dir=Abrir configuração de diretório
menu.show_log=Mostrar arquivo de logs

View file

@ -1,7 +1,7 @@
dialog_error.close=Закрыть
dialog_error.copy_clipboard=Скопировать в буфер обмена
dialog_error.title=Komga не смог запуститься
error_message.port_in_use=Порт {] уже используется.\nKomga возможно уже работает.\nПроверьте панель задач или меню на наличие иконки Komga.
dialog_error.title=Komga не удалось запустить
error_message.port_in_use=Порт {} уже используется.\nВероятно, Komga уже запущен.\nПроверьте область уведомлений или панель меню на наличие иконки Komga.
error_message.unexpected=Произошла непредвиденная ошибка.
menu.open_komga=Открыть Komga
menu.quit=Закрыть Komga

View file

@ -0,0 +1,9 @@
dialog_error.close=Zavrieť
dialog_error.copy_clipboard=Skopírovať do schránky
dialog_error.title=Aplikáciu Komga sa nepodarilo spustiť
error_message.port_in_use=Port {} sa aktuálne používa.\nAplikácia Komga je pravdepodobne už spustená.\nSkontrolujte, či ikona Komga už nie je v systémovej lište alebo medzi schovanými ikonami.
error_message.unexpected=Nastala neočakávaná chyba.
menu.open_komga=Otvoriť aplikáciu Komga
menu.quit=Zavrieť aplikáciu Komga
menu.show_conf_dir=Otvoriť konfiguračný priečinok
menu.show_log=Zobraziť logy

View file

@ -0,0 +1,9 @@
dialog_error.close=மூடு
dialog_error.copy_clipboard=இடைநிலைப்பலகைக்கு நகலெடுக்கவும்
dialog_error.title=கோம்கா தொடங்கத் தவறிவிட்டார்
error_message.port_in_use=துறைமுகம் {} ஏற்கனவே பயன்பாட்டில் உள்ளது.\n கோம்கா ஏற்கனவே இயங்குகிறது.\n கோம்கா ஐகானுக்கான தட்டு படவுரு அல்லது பட்டியல் பட்டியை சரிபார்க்கவும்.
error_message.unexpected=எதிர்பாராத பிழை ஏற்பட்டது.
menu.open_komga=திறந்த கொம்கா
menu.quit=கொங்காவை விட்டு வெளியேறவும்
menu.show_conf_dir=திறந்த உள்ளமைவு அடைவு
menu.show_log=பதிவு கோப்பைக் காட்டு

View file

@ -0,0 +1,9 @@
dialog_error.close=ปิด
dialog_error.copy_clipboard=คัดลอกไปยังคลิปบอร์ด
dialog_error.title=Komga ไม่สามารถเริ่มต้นได้
error_message.port_in_use=พอร์ต {} ถูกใช้งานอยู่แล้ว\nKomga อาจกำลังทำงานอยู่แล้ว\nตรวจสอบ ไอคอน Komga บนถาดไอคอนหรือแถบเมนู
error_message.unexpected=เกิดข้อผิดพลาดที่ไม่คาดคิด
menu.open_komga=เปิด Komga
menu.quit=ออก Komga
menu.show_conf_dir=เปิดไดเรกทอรีการกำหนดค่า
menu.show_log=แสดงไฟล์บันทึก

View file

@ -0,0 +1,9 @@
dialog_error.close=Закрити
dialog_error.copy_clipboard=Копіювати в буфер обміну
dialog_error.title=Помилка при запуску Komga
error_message.port_in_use=Порт {} вже використовується.\nKomga напевно вже запущена.\nПеревірте панель запущених програм на наявність іконки Komga.
error_message.unexpected=Сталася невідома помилка.
menu.open_komga=Відкрити Komga
menu.quit=Закрити Komga
menu.show_conf_dir=Відкрити теку з налаштуваннями
menu.show_log=Відкрити log журнал

File diff suppressed because it is too large Load diff

View file

@ -10,16 +10,17 @@
},
"dependencies": {
"@d-i-t-a/reader": "github:gotson/R2D2BC#fork",
"@saekitominaga/isbn-verify": "^2.0.1",
"axios": "^1.6.0",
"@w0s/isbn-verify": "^3.1.2",
"axios": "^1.15.0",
"chart.js": "^2.9.4",
"core-js": "^3.8.3",
"date-fns": "^2.30.0",
"filesize": "^10.0.12",
"js-file-downloader": "^1.1.25",
"language-tags": "^1.0.9",
"lodash": "^4.17.21",
"qs": "^6.11.2",
"lodash": "^4.18.1",
"marked": "^15.0.4",
"qs": "^6.14.2",
"screenfull": "^5.2.0",
"vue": "^2.6.14",
"vue-chartkick": "^0.6.1",

View file

@ -0,0 +1,182 @@
<template>
<div style="position: relative">
<div v-if="apiKeys">
<div v-if="apiKeys.length > 0">
<v-list elevation="3"
three-line
>
<div v-for="(apiKey, index) in apiKeys" :key="apiKey.id">
<v-list-item>
<v-list-item-content>
<v-list-item-title>{{ apiKey.comment }}</v-list-item-title>
<v-list-item-subtitle>
{{
$t('account_settings.api_key.created_date', {
date:
new Intl.DateTimeFormat($i18n.locale, {
dateStyle: 'medium',
timeStyle: 'short'
}).format(apiKey.createdDate)
})
}}
</v-list-item-subtitle>
<v-list-item-subtitle v-if="apiKeyLastActivity[apiKey.id] !== undefined">
{{
$t('settings_user.latest_activity', {
date:
new Intl.DateTimeFormat($i18n.locale, {
dateStyle: 'medium',
timeStyle: 'short'
}).format(apiKeyLastActivity[apiKey.id])
})
}}
</v-list-item-subtitle>
<v-list-item-subtitle v-else>{{ $t('settings_user.no_recent_activity') }}</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-btn icon @click="promptSyncPointDelete(apiKey)" v-on="on">
<v-icon>mdi-book-refresh</v-icon>
</v-btn>
</template>
<span>{{ $t('account_settings.api_key.force_kobo_sync') }}</span>
</v-tooltip>
</v-list-item-action>
<v-list-item-action>
<v-btn icon @click="promptDeleteApiKey(apiKey)">
<v-icon>mdi-delete</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
<v-divider v-if="index !== apiKeys.length-1"/>
</div>
</v-list>
<v-btn fab absolute bottom color="primary"
:right="!$vuetify.rtl"
:left="$vuetify.rtl"
class="mx-6"
small
@click="generateApiKey"
>
<v-icon>mdi-plus</v-icon>
</v-btn>
</div>
<div v-else>
<v-container fluid class="pa-0">
<v-row>
<v-col>{{ $t('account_settings.api_key.no_keys') }}</v-col>
</v-row>
<v-row>
<v-col>
<v-btn color="primary" @click="generateApiKey">{{
$t('account_settings.api_key.generate_api_key')
}}
</v-btn>
</v-col>
</v-row>
</v-container>
</div>
</div>
<confirmation-dialog
v-model="modalDeleteSyncPoints"
:title="$t('dialog.force_kobo_sync.dialog_title')"
:body-html="$t('dialog.force_kobo_sync.warning_html')"
:button-confirm="$t('common.i_understand')"
button-confirm-color="warning"
@confirm="deleteSyncPoint"
/>
<confirmation-dialog
v-model="modalDeleteApiKey"
:title="$t('dialog.delete_apikey.dialog_title')"
:body-html="$t('dialog.delete_apikey.warning_html')"
:confirm-text=" $t('dialog.delete_apikey.confirm_delete', {name: apiKeyToDelete.comment})"
:button-confirm="$t('dialog.delete_apikey.button_confirm')"
button-confirm-color="error"
@confirm="deleteApiKey"
/>
<api-key-add-dialog
v-model="modalGenerateApiKey"
@generate="loadApiKeys"
/>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import {ApiKeyDto} from '@/types/komga-users'
import {ERROR} from '@/types/events'
import ConfirmationDialog from '@/components/dialogs/ConfirmationDialog.vue'
import ApiKeyAddDialog from '@/components/dialogs/ApiKeyAddDialog.vue'
export default Vue.extend({
name: 'ApiKeyTable',
components: {ApiKeyAddDialog, ConfirmationDialog},
data: () => {
return {
apiKeys: undefined as ApiKeyDto[],
apiKeyToDelete: {} as ApiKeyDto,
apiKeySyncPointsToDelete: {} as ApiKeyDto,
modalDeleteApiKey: false,
modalDeleteSyncPoints: false,
modalGenerateApiKey: false,
apiKeyLastActivity: {} as any,
}
},
mounted() {
this.loadApiKeys()
},
methods: {
async loadApiKeys() {
try {
this.apiKeys = await this.$komgaUsers.getApiKeys()
this.apiKeys.forEach((a: ApiKeyDto) => {
this.$komgaUsers.getLatestAuthenticationActivityForUser(a.userId, a.id)
.then(value => this.$set(this.apiKeyLastActivity, `${a.id}`, value.dateTime))
.catch(e => {
})
})
} catch (e) {
this.$eventHub.$emit(ERROR, {message: e.message} as ErrorEvent)
}
},
promptDeleteApiKey(apiKey: ApiKeyDto) {
this.apiKeyToDelete = apiKey
this.modalDeleteApiKey = true
},
promptSyncPointDelete(apiKey: ApiKeyDto) {
this.apiKeySyncPointsToDelete = apiKey
this.modalDeleteSyncPoints = true
},
async deleteSyncPoint() {
try {
await this.$komgaSyncPoints.deleteMySyncPointsByApiKey(this.apiKeySyncPointsToDelete.id)
} catch (e) {
this.$eventHub.$emit(ERROR, {message: e.message} as ErrorEvent)
}
},
async deleteApiKey() {
try {
await this.$komgaUsers.deleteApiKey(this.apiKeyToDelete.id)
await this.loadApiKeys()
} catch (e) {
this.$eventHub.$emit(ERROR, {message: e.message} as ErrorEvent)
}
},
generateApiKey() {
this.modalGenerateApiKey = true
},
},
})
</script>

View file

@ -33,7 +33,7 @@
<script lang="ts">
import Vue from 'vue'
import {ERROR} from '@/types/events'
import { AuthenticationActivityDto } from '@/types/komga-users'
import {AuthenticationActivityDto} from '@/types/komga-users'
export default Vue.extend({
name: 'AuthenticationActivityTable',
@ -68,6 +68,7 @@ export default Vue.extend({
{text: this.$t('authentication_activity.user_agent').toString(), value: 'userAgent'},
{text: this.$t('authentication_activity.success').toString(), value: 'success'},
{text: this.$t('authentication_activity.source').toString(), value: 'source'},
{text: this.$t('authentication_activity.api_key').toString(), value: 'apiKeyComment'},
{text: this.$t('authentication_activity.error').toString(), value: 'error'},
{text: this.$t('authentication_activity.datetime').toString(), value: 'dateTime', groupable: false},
)

View file

@ -10,6 +10,7 @@
@scroll-changed="(percent) => scrollChanged(collectionsLoaders[index], percent)"
>
<template v-slot:prepend>
<slot name="prepend" v-bind:collection="c"/>
<router-link class="text-overline"
:to="{name: 'browse-collection', params: {collectionId: c.id}}"
>{{ $t('collections_expansion_panel.manage_collection') }}

View file

@ -31,17 +31,19 @@
<template v-else>
<div style="height: 2em" class="missing"></div>
</template>
<series-picker-dialog v-model="modalSeriesPicker" @update:series="pickedSeries" :include-oneshots="false"/>
<series-picker-dialog v-model="modalSeriesPicker" @update:series="pickedSeries" :include-oneshots="true"/>
</td>
<!-- Book number chooser -->
<td>
<v-text-field v-model.number="bookNumber"
<v-text-field v-if="!selectedSeries?.oneshot"
v-model.number="bookNumber"
type="number"
step="0.1"
dense
:disabled="!selectedSeries"
/>
<span v-else>{{ $t('common.oneshot') }}</span>
</td>
<!-- Book details -->
@ -129,7 +131,8 @@ import TransientBookViewerDialog from '@/components/dialogs/TransientBookViewerD
import {bookPageUrl, transientBookPageUrl} from '@/functions/urls'
import {convertErrorCodes} from '@/functions/error-codes'
import FileNameChooserDialog from '@/components/dialogs/FileNameChooserDialog.vue'
import {ReadListRequestBookMatchSeriesDto} from '@/types/komga-readlists'
import {SeriesSelected} from '@/types/series-slim'
import {BookSearch, SearchConditionSeriesId, SearchOperatorIs} from '@/types/komga-search'
export default Vue.extend({
name: 'FileImportRow',
@ -167,6 +170,7 @@ export default Vue.extend({
if (val) this.selectedSeries = {
seriesId: val.id,
title: val.metadata.title,
oneshot: val.oneshot,
}
},
immediate: true,
@ -189,7 +193,7 @@ export default Vue.extend({
convertErrorCodes,
innerSelect: false,
bookAnalyzed: undefined as unknown as TransientBookDto,
selectedSeries: undefined as ReadListRequestBookMatchSeriesDto | undefined,
selectedSeries: undefined as SeriesSelected | undefined,
seriesBooks: [] as BookDto[],
bookToUpgrade: undefined as BookDto | undefined,
bookToUpgradePages: [] as PageDto[],
@ -253,12 +257,18 @@ export default Vue.extend({
this.selectedSeries = {
seriesId: seriesDto.id,
title: seriesDto.metadata.title,
oneshot: seriesDto.oneshot,
}
}
},
async getSeriesBooks(series: ReadListRequestBookMatchSeriesDto) {
async getSeriesBooks(series: SeriesSelected) {
if (series) {
this.seriesBooks = (await this.$komgaSeries.getBooks(series.seriesId, {unpaged: true})).content
this.seriesBooks = (await this.$komgaBooks.getBooksList({
condition: new SearchConditionSeriesId(new SearchOperatorIs(series.seriesId)),
} as BookSearch, {unpaged: true, sort: 'metadata.numberSort'})).content
if (series.oneshot) {
this.bookNumber = this.seriesBooks[0].metadata.numberSort
}
this.checkForUpgrade(this.bookNumber)
}
},
@ -271,6 +281,7 @@ export default Vue.extend({
this.selectedSeries = {
seriesId: series.id,
title: series.metadata.title,
oneshot: series.oneshot,
}
},
},

View file

@ -5,14 +5,14 @@
>
<v-subheader v-if="f.name">{{ f.name }}</v-subheader>
<v-list-item v-for="v in f.values"
:key="v.value"
:key="JSON.stringify(v.value)"
@click.stop="click(key, v.value, v.nValue)"
>
<v-list-item-icon>
<v-icon v-if="key in filtersActive && filtersActive[key].includes(v.nValue)" color="secondary">
<v-icon v-if="key in filtersActive && includes(filtersActive[key], v.nValue)" color="secondary">
mdi-minus-box
</v-icon>
<v-icon v-else-if="key in filtersActive && filtersActive[key].includes(v.value)" color="secondary">
<v-icon v-else-if="key in filtersActive && includes(filtersActive[key], v.value)" color="secondary">
mdi-checkbox-marked
</v-icon>
<v-icon v-else>
@ -27,6 +27,7 @@
<script lang="ts">
import Vue from 'vue'
import {FiltersActive, FiltersOptions} from '@/types/filter'
export default Vue.extend({
name: 'FilterList',
@ -41,16 +42,24 @@ export default Vue.extend({
},
},
methods: {
click(key: string, value: string, nValue?: string) {
includes(array: any[], value: any): boolean {
return this.$_.isObject(value) ? this.$_.some(array, value) : this.$_.includes(array, value)
},
click(key: string, value: any, nValue?: any) {
let r = this.$_.cloneDeep(this.filtersActive)
if (!(key in r)) r[key] = []
if (nValue && r[key].includes(nValue))
this.$_.pull(r[key], (nValue))
else if (r[key].includes(value)) {
this.$_.pull(r[key], (value))
const pull = this.$_.isObject(value) ? this.$_.remove : this.$_.pull
const includes = this.$_.isObject(value) ? this.$_.some : this.$_.includes
if (nValue && includes(r[key], nValue))
pull(r[key], nValue)
else if (includes(r[key], value)) {
pull(r[key], value)
if (nValue)
r[key].push(nValue)
} else r[key].push(value)
} else
r[key].push(value)
this.$emit('update:filtersActive', r)
},

View file

@ -5,11 +5,18 @@
:key="key"
:disabled="(f.values && f.values.length === 0) && !f.search"
>
<v-expansion-panel-header class="text-uppercase">
<v-expansion-panel-header class="text-uppercase ps-1">
<v-icon
color="secondary"
style="max-width: 24px"
class="mx-2"
class="mx-0"
@click.stop="clickFilterMode(key, false)"
>{{ groupAllOfActive(key) ? 'mdi-filter-multiple' : '' }}
</v-icon>
<v-icon
color="secondary"
style="max-width: 24px"
class="me-2"
@click.stop="clear(key)"
>{{ groupActive(key) ? 'mdi-checkbox-marked' : '' }}
</v-icon>
@ -26,11 +33,35 @@
</template>
</search-box-base>
<div style="position: absolute; right: 0; z-index: 1">
<v-btn-toggle v-if="f.anyAllSelector || groupAllOfActive(key)" mandatory class="semi-transparent"
:value="filtersActiveMode[key]?.allOf">
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-btn small icon :value="false" v-on="on" @click.stop="clickFilterMode(key, false)">
<v-icon small>mdi-filter-outline</v-icon>
</v-btn>
</template>
<span>{{ $t('common.any_of') }}</span>
</v-tooltip>
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-btn small icon :value="true" v-on="on" @click.stop="clickFilterMode(key, true)">
<v-icon small>mdi-filter-multiple-outline</v-icon>
</v-btn>
</template>
<span>{{ $t('common.all_of') }}</span>
</v-tooltip>
</v-btn-toggle>
</div>
<v-list
v-if="f.search"
v-if="f.search || f.values"
dense
>
<v-list-item v-for="(v, i) in filtersActive[key]"
<!-- Dynamic content from search -->
<v-list-item v-for="(v, i) in searchFiltersActive(key)"
:key="i"
@click.stop="click(key, v)"
>
@ -39,18 +70,17 @@
</v-list-item-icon>
<v-list-item-title>{{ v }}</v-list-item-title>
</v-list-item>
</v-list>
<v-list
v-if="f.values"
dense
>
<!-- Static content from filters options -->
<v-list-item v-for="v in f.values"
:key="v.value"
@click.stop="click(key, v.value)"
:key="JSON.stringify(v.value)"
@click.stop="click(key, v.value, v.nValue)"
>
<v-list-item-icon>
<v-icon v-if="key in filtersActive && filtersActive[key].includes(v.value)" color="secondary">
<v-icon v-if="key in filtersActive && includes(filtersActive[key], v.nValue)" color="secondary">
mdi-minus-box
</v-icon>
<v-icon v-else-if="key in filtersActive && includes(filtersActive[key], v.value)" color="secondary">
mdi-checkbox-marked
</v-icon>
<v-icon v-else>
@ -68,6 +98,7 @@
<script lang="ts">
import Vue, {PropType} from 'vue'
import SearchBoxBase from '@/components/SearchBoxBase.vue'
import {FiltersActive, FiltersActiveMode, FiltersOptions} from '@/types/filter'
export default Vue.extend({
name: 'FilterPanels',
@ -81,11 +112,25 @@ export default Vue.extend({
type: Object as PropType<FiltersActive>,
required: true,
},
filtersActiveMode: {
type: Object as PropType<FiltersActiveMode>,
required: false,
},
},
methods: {
// filtersActive, filtered to not show options that are in filtersOptions
searchFiltersActive(key: string): FiltersActive[] {
if (!(key in this.filtersActive)) return []
const listedOptions = this.filtersOptions[key]?.values?.flatMap(x => [x.value, x.nValue]).map(x => JSON.stringify(x))
return this.filtersActive[key].filter((x: string) => !this.$_.includes(listedOptions, JSON.stringify(x)))
},
includes(array: any[], value: any): boolean {
return this.$_.isObject(value) ? this.$_.some(array, value) : this.$_.includes(array, value)
},
clear(key: string) {
let r = this.$_.cloneDeep(this.filtersActive)
r[key] = []
if (!this.filtersOptions[key].anyAllSelector) this.clickFilterMode(key, false)
this.$emit('update:filtersActive', r)
},
@ -93,14 +138,39 @@ export default Vue.extend({
if (!(key in this.filtersActive)) return false
return this.filtersActive[key].length > 0
},
click(key: string, value: string) {
groupAllOfActive(key: string): boolean {
if (!this.filtersActiveMode || !(key in this.filtersActiveMode)) return false
return this.filtersActiveMode[key].allOf
},
click(key: string, value: any, nValue?: any) {
let r = this.$_.cloneDeep(this.filtersActive)
if (!(key in r)) r[key] = []
if (r[key].includes(value)) this.$_.pull(r[key], (value))
else r[key].push(value)
const pull = this.$_.isObject(value) ? this.$_.remove : this.$_.pull
const includes = this.$_.isObject(value) ? this.$_.some : this.$_.includes
if (nValue && includes(r[key], nValue))
pull(r[key], nValue)
else if (includes(r[key], value)) {
pull(r[key], value)
if (nValue) {
r[key].push(nValue)
this.clickFilterMode(key, true)
}
} else
r[key].push(value)
if (!this.filtersOptions[key].anyAllSelector && r[key].length == 0) this.clickFilterMode(key, false)
this.$emit('update:filtersActive', r)
},
clickFilterMode(key: string, value: boolean) {
if (!this.filtersActiveMode) return
let r = this.$_.cloneDeep(this.filtersActiveMode)
r[key] = {allOf: value}
this.$emit('update:filtersActiveMode', r)
},
},
})
</script>
@ -109,4 +179,12 @@ export default Vue.extend({
.no-padding .v-expansion-panel-content__wrap {
padding: 0;
}
.semi-transparent {
opacity: 0.5;
}
.semi-transparent:hover {
opacity: 1;
}
</style>

View file

@ -8,9 +8,13 @@
:class="flexClass"
handle=".handle"
v-bind="dragOptions"
:forceFallback="true"
:scroll-sensitivity="200"
@start="transitions = false"
@end="transitions = true"
>
<transition-group type="transition"
:name="!draggable ? 'flip-list' : null"
:name="transitions ? 'flip-list' : null"
:class="flexClass"
>
<v-item
@ -33,9 +37,24 @@
:preselect="shouldPreselect"
:onEdit="(draggable || deletable) ? undefined : editFunction"
:onSelected="(draggable || deletable) ? undefined : selectable ? (item, event) => handleSelectClick(toggle, item, event): undefined"
:action-menu="actionMenu"
:action-menu="(draggable || deletable) ? false : actionMenu"
:disable-fab="draggable || deletable"
></item-card>
<v-slide-y-reverse-transition>
<v-text-field v-if="draggable"
v-model="localItemsIndex[JSON.stringify(item)]"
type="number"
min="0"
:max="localItems.length - 1"
solo
style="position: absolute; top: 0; left: 0;"
ref=""
@blur="updateIndex(item)"
@keydown.enter="updateIndex(item)"
/>
</v-slide-y-reverse-transition>
<v-slide-y-reverse-transition>
<v-icon v-if="draggable"
class="handle"
@ -129,10 +148,12 @@ export default Vue.extend({
data: () => {
return {
selectedItems: [] as any[],
localItems: [],
localItems: [] as any[],
localItemsIndex: {} as Record<string, any>,
lastClickedNoShift: undefined as any,
lastClickedShift: undefined as any,
width: 150,
transitions: true,
}
},
watch: {
@ -151,6 +172,10 @@ export default Vue.extend({
items: {
handler() {
this.localItems = this.items as []
this.localItemsIndex = {}
for (const [i, value] of this.localItems.entries()) {
this.$set(this.localItemsIndex, JSON.stringify(value), i)
}
},
immediate: true,
},
@ -224,6 +249,12 @@ export default Vue.extend({
const index = this.localItems.findIndex((e: any) => e.id === item.id)
this.localItems.splice(index, 1)
},
updateIndex(item: any) {
const oldIndex = this.localItems.indexOf(item)
const newIndex = Math.min(Math.max(this.localItemsIndex[JSON.stringify(item)], 0), this.localItems.length - 1)
if (oldIndex != newIndex)
this.localItems.splice(oldIndex, 1, this.localItems.splice(newIndex, 1, this.localItems[oldIndex])[0])
},
},
})
</script>

View file

@ -12,7 +12,9 @@
:src="thumbnailUrl"
:lazy-src="thumbnailError ? coverBase64 : undefined"
aspect-ratio="0.7071"
contain
:contain="!isStretch"
:position="isStretch ? 'top' : undefined"
:class="shouldBlurPoster ? 'blur' : undefined"
@error="thumbnailError = true"
@load="thumbnailError = false"
>
@ -48,7 +50,7 @@
<!-- FAB reading (center) -->
<v-btn
v-if="bookReady && !selected && !preselect && canReadPages"
v-if="showFab"
fab
x-large
color="accent"
@ -175,6 +177,7 @@ import {
import {coverBase64} from '@/types/image'
import {ReadListDto} from '@/types/komga-readlists'
import OneShotActionsMenu from '@/components/menus/OneshotActionsMenu.vue'
import {CLIENT_SETTING} from '@/types/komga-clientsettings'
export default Vue.extend({
name: 'ItemCard',
@ -230,6 +233,11 @@ export default Vue.extend({
type: Boolean,
default: true,
},
// force disable fab
disableFab: {
type: Boolean,
default: false,
},
},
data: () => {
return {
@ -267,11 +275,20 @@ export default Vue.extend({
this.$eventHub.$off(THUMBNAILCOLLECTION_DELETED, this.thumbnailCollectionChanged)
},
computed: {
isStretch(): boolean {
return this.$store.getters.getClientSettings[CLIENT_SETTING.WEBUI_POSTER_STRETCH]?.value === 'true'
},
isBlurUnread(): boolean {
return this.$store.getters.getClientSettings[CLIENT_SETTING.WEBUI_POSTER_BLUR_UNREAD]?.value === 'true'
},
shouldBlurPoster(): boolean | undefined {
return (this.isUnread || this.allUnread) && this.isBlurUnread
},
canReadPages(): boolean {
return this.$store.getters.mePageStreaming && this.computedItem.type() === ItemTypes.BOOK
},
overlay(): boolean {
return this.onEdit !== undefined || this.onSelected !== undefined || this.bookReady || this.canReadPages || this.actionMenu
return this.onEdit !== undefined || this.onSelected !== undefined || this.showFab || this.actionMenu
},
computedItem(): Item<BookDto | SeriesDto | CollectionDto | ReadListDto> {
let item = this.item
@ -307,6 +324,10 @@ export default Vue.extend({
if (this.computedItem.type() === ItemTypes.SERIES) return (this.item as SeriesDto).booksUnreadCount + (this.item as SeriesDto).booksInProgressCount
return undefined
},
allUnread(): boolean | undefined {
if (this.computedItem.type() === ItemTypes.SERIES) return (this.item as SeriesDto).booksCount == (this.item as SeriesDto).booksUnreadCount
return undefined
},
readProgressPercentage(): number {
if (this.computedItem.type() === ItemTypes.BOOK) return getReadProgressPercentage(this.item as BookDto)
return 0
@ -317,6 +338,9 @@ export default Vue.extend({
}
return false
},
showFab(): boolean {
return !this.disableFab && this.bookReady && !this.selected && !this.preselect && this.canReadPages
},
to(): RawLocation {
return this.computedItem.to()
},
@ -372,6 +396,10 @@ export default Vue.extend({
</script>
<style>
.blur > .v-image__image {
filter: blur(5px);
}
.no-link {
cursor: default;
}

View file

@ -1,7 +1,7 @@
<template>
<div>
<v-bottom-navigation
v-if="show && bottomNavigation"
v-if="bottomNavigation"
grow color="primary"
:app="$vuetify.breakpoint.smAndUp"
:fixed="bottomNavigation"
@ -9,20 +9,25 @@
<v-btn v-if="showRecommended"
:to="{name: 'recommended-libraries', params: {libraryId: libraryId}}"
>
<span>{{ $t('library_navigation.recommended') }}</span>
<span class="caption">{{ $t('library_navigation.recommended') }}</span>
<v-icon>mdi-star</v-icon>
</v-btn>
<v-btn :to="{name: 'browse-libraries', params: {libraryId: libraryId}}">
<span>{{ $t('library_navigation.browse') }}</span>
<span class="caption">{{ $t('library_navigation.browse_series') }}</span>
<v-icon>mdi-bookshelf</v-icon>
</v-btn>
<v-btn :to="{name: 'browse-books', params: {libraryId: libraryId}}">
<span class="caption">{{ $t('library_navigation.browse_books') }}</span>
<v-icon>mdi-book-multiple</v-icon>
</v-btn>
<v-btn
v-if="collectionsCount > 0"
:to="{name: 'browse-collections', params: {libraryId: libraryId}}"
>
<span>{{ $t('library_navigation.collections') }}</span>
<span class="caption">{{ $t('library_navigation.collections') }}</span>
<v-icon>mdi-layers-triple</v-icon>
</v-btn>
@ -30,14 +35,14 @@
v-if="readListsCount > 0"
:to="{name: 'browse-readlists', params: {libraryId: libraryId}}"
>
<span>{{ $t('library_navigation.readlists') }}</span>
<v-icon>mdi-book-multiple</v-icon>
<span class="caption">{{ $t('library_navigation.readlists') }}</span>
<v-icon>mdi-bookmark-multiple</v-icon>
</v-btn>
</v-bottom-navigation>
<template
v-if="show && !bottomNavigation"
v-if="!bottomNavigation"
>
<v-btn v-if="showRecommended"
:to="{name: 'recommended-libraries', params: {libraryId: libraryId}}"
@ -51,7 +56,14 @@
text
class="mx-1"
>
{{ $t('library_navigation.browse') }}
{{ $t('library_navigation.browse_series') }}
</v-btn>
<v-btn :to="{name: 'browse-books', params: {libraryId: libraryId}}"
text
class="mx-1"
>
{{ $t('library_navigation.browse_books') }}
</v-btn>
<v-btn
@ -80,6 +92,7 @@
import Vue from 'vue'
import {COLLECTION_ADDED, COLLECTION_DELETED, READLIST_ADDED, READLIST_DELETED} from '@/types/events'
import {LIBRARIES_ALL} from '@/types/library'
import {LibraryDto} from '@/types/komga-libraries'
export default Vue.extend({
name: 'LibraryNavigation',
@ -107,6 +120,14 @@ export default Vue.extend({
},
immediate: true,
},
'$store.getters.getLibrariesPinned': {
handler(val) {
if (this.libraryId === LIBRARIES_ALL) {
this.loadCollectionCounts(this.libraryId)
this.loadReadListCounts(this.libraryId)
}
},
},
},
created() {
this.$eventHub.$on(COLLECTION_ADDED, this.collectionAdded)
@ -124,9 +145,6 @@ export default Vue.extend({
showRecommended(): boolean {
return this.libraryId !== LIBRARIES_ALL
},
show(): boolean {
return this.collectionsCount > 0 || this.readListsCount > 0 || this.showRecommended
},
},
methods: {
readListAdded() {
@ -142,12 +160,12 @@ export default Vue.extend({
if(this.collectionsCount === 1) this.loadCollectionCounts(this.libraryId)
},
async loadCollectionCounts(libraryId: string) {
const lib = libraryId !== LIBRARIES_ALL ? [libraryId] : undefined
const lib = libraryId !== LIBRARIES_ALL ? [libraryId] : this.$store.getters.getLibrariesPinned.map((it: LibraryDto) => it.id)
this.$komgaCollections.getCollections(lib, {size: 0})
.then(v => this.collectionsCount = v.totalElements)
},
async loadReadListCounts(libraryId: string) {
const lib = libraryId !== LIBRARIES_ALL ? [libraryId] : undefined
const lib = libraryId !== LIBRARIES_ALL ? [libraryId] : this.$store.getters.getLibrariesPinned.map((it: LibraryDto) => it.id)
await this.$komgaReadLists.getReadLists(lib, {size: 0})
.then(v => this.readListsCount = v.totalElements)
},

View file

@ -5,7 +5,7 @@
<v-icon>mdi-view-grid-plus</v-icon>
</v-btn>
</template>
<v-list>
<v-list :dark="dark">
<v-list-item-group v-model="selection">
<v-list-item v-for="(item, index) in items"
@ -38,6 +38,10 @@ export default Vue.extend({
type: Number,
required: true,
},
dark: {
type: Boolean,
default: false,
},
},
watch: {
value: {

View file

@ -15,7 +15,8 @@
year: 'numeric',
timeZone: 'UTC'
}).format(new Date(series.releaseDate))
}}</div>
}}
</div>
</template>
<template v-else>
<div style="height: 2em" class="missing"></div>
@ -71,6 +72,7 @@ import {
ReadListRequestBookMatchSeriesDto,
} from '@/types/komga-readlists'
import BookPickerDialog from '@/components/dialogs/BookPickerDialog.vue'
import {BookSearch, SearchConditionSeriesId, SearchOperatorIs} from '@/types/komga-search'
export default Vue.extend({
name: 'ReadListMatchRow',
@ -95,6 +97,10 @@ export default Vue.extend({
type: Boolean,
default: false,
},
error: {
type: String,
default: '',
},
},
watch: {
series: {
@ -116,16 +122,13 @@ export default Vue.extend({
existingFileNames(): string[] {
return this.seriesBooks.map(x => x.name)
},
error(): string {
if (!this.series) return this.$t('book_import.row.error_choose_series').toString()
if (!this.book) return this.$t('readlist_import.row.error_choose_book').toString()
return ''
},
},
methods: {
openBookPicker() {
if (!this.seriesBooksCached) {
this.$komgaSeries.getBooks(this.series?.seriesId, {unpaged: true})
this.$komgaBooks.getBooksList({
condition: new SearchConditionSeriesId(new SearchOperatorIs(this.series?.seriesId)),
} as BookSearch, {unpaged: true, sort: 'metadata.numberSort'})
.then(r => {
this.seriesBooks = r.content
this.seriesBooksCached = true

View file

@ -10,6 +10,7 @@
@scroll-changed="(percent) => scrollChanged(readListsLoaders[index], percent)"
>
<template v-slot:prepend>
<slot name="prepend" v-bind:readlist="r"/>
<router-link class="text-overline"
:to="{name: 'browse-readlist', params: {readListId: r.id}}"
>{{ $t('readlists_expansion_panel.manage_readlist') }}

View file

@ -1,5 +1,5 @@
<template>
<vue-read-more-smooth no-shadow :lines="4">
<vue-read-more-smooth no-shadow :lines="4" :open.sync="open">
<div style="white-space: pre-wrap" class="body-2">
<slot/>
</div>
@ -19,8 +19,25 @@ import Vue from 'vue'
export default Vue.extend({
name: 'ReadMore',
components: { VueReadMoreSmooth },
components: {VueReadMoreSmooth},
data: () => {
return {
open: false,
}
},
watch: {
value(val) {
this.open = val
},
open(val) {
this.$emit('input', val)
},
},
props: {
value: {
type: Boolean,
default: false,
},
i18nMore: {
type: String,
default: 'read_more.more',

View file

@ -0,0 +1,126 @@
<template>
<div>
<v-list>
<v-list-item class="contrast-1">
<v-list-item-content>
<v-list-item-title class="text-uppercase">{{ $t('common.reorder') }}</v-list-item-title>
</v-list-item-content>
<v-list-item-action class="ma-0">
<v-btn icon @click.stop.capture.prevent="dismiss">
<v-icon>mdi-close</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
<v-list-item class="text--disabled">
<v-list-item-icon>
<v-icon>mdi-home</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ $t('navigation.home') }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<draggable
v-model="localItems"
v-bind="dragOptions"
handle=".handle"
>
<v-list-item v-for="l in localItems" :key="l.id">
<v-list-item-icon>
<v-icon class="handle">mdi-drag-horizontal-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title class="handle">{{ l.name }}</v-list-item-title>
</v-list-item-content>
<v-list-item-icon>
<v-btn icon v-if="!l.unpinned" @click.stop.capture.prevent="unpin(l.id)" x-small>
<v-icon>mdi-pin</v-icon>
</v-btn>
<v-btn icon v-if="l.unpinned" @click.stop.capture.prevent="pin(l.id)" x-small>
<v-icon>mdi-pin-off</v-icon>
</v-btn>
</v-list-item-icon>
</v-list-item>
</draggable>
</v-list>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import draggable from 'vuedraggable'
import {LibraryDto} from '@/types/komga-libraries'
import {ClientSettingLibraryUpdate} from '@/types/komga-clientsettings'
export default Vue.extend({
name: 'ReorderLibraries',
components: {draggable},
data: () => {
return {
localItems: [] as LibraryDto[],
unwatch: false,
}
},
computed: {
dragOptions(): any {
return {
animation: 200,
ghostClass: 'ghost',
}
},
},
mounted() {
this.localItems = this.$store.getters.getLibraries
},
watch: {
localItems: {
handler(val: LibraryDto[]) {
const newSettings = val.map((it, index) => ({
libraryId: it.id,
patch: {
order: index,
},
} as ClientSettingLibraryUpdate))
this.$store.dispatch('updateLibrariesSettings', newSettings)
},
immediate: true,
},
},
methods: {
dismiss() {
this.$emit('dismiss')
},
unpin(libraryId: string) {
this.$store.dispatch('updateLibrarySetting', {
libraryId: libraryId,
patch: {
unpinned: true,
},
} as ClientSettingLibraryUpdate)
this.localItems.find(it => it.id == libraryId).unpinned = true
},
pin(libraryId: string) {
this.$store.dispatch('updateLibrarySetting', {
libraryId: libraryId,
patch: {
unpinned: false,
},
} as ClientSettingLibraryUpdate)
this.localItems.find(it => it.id == libraryId).unpinned = false
},
},
})
</script>
<style scoped>
.handle {
cursor: grab !important;
}
.ghost {
opacity: 0.5;
background: #c8ebfb;
}
</style>

View file

@ -123,6 +123,12 @@ import {SeriesDto} from '@/types/komga-series'
import {getReadProgress} from '@/functions/book-progress'
import {ReadStatus} from '@/types/enum-books'
import {ReadListDto} from '@/types/komga-readlists'
import {
BookSearch,
SearchConditionOneShot,
SearchOperatorIsFalse,
SeriesSearch,
} from '@/types/komga-search'
export default Vue.extend({
name: 'SearchBox',
@ -202,8 +208,13 @@ export default Vue.extend({
searchItems: debounce(async function (this: any, query: string) {
if (query) {
this.loading = true
this.series = (await this.$komgaSeries.getSeries(undefined, {size: this.pageSize}, query, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, false)).content
this.books = (await this.$komgaBooks.getBooks(undefined, {size: this.pageSize}, query)).content
this.series = (await this.$komgaSeries.getSeriesList({
fullTextSearch: query,
condition: new SearchConditionOneShot(new SearchOperatorIsFalse()),
} as SeriesSearch, {size: this.pageSize})).content
this.books = (await this.$komgaBooks.getBooksList({
fullTextSearch: query,
} as BookSearch, {size: this.pageSize})).content
this.collections = (await this.$komgaCollections.getCollections(undefined, {size: this.pageSize}, query)).content
this.readLists = (await this.$komgaReadLists.getReadLists(undefined, {size: this.pageSize}, query)).content
this.showResults = true

View file

@ -161,7 +161,7 @@ export default Vue.extend({
watch: {
users(val) {
val.forEach((u: UserDto) => {
this.$komgaUsers.getLatestAuthenticationActivityForUser(u)
this.$komgaUsers.getLatestAuthenticationActivityForUser(u.id)
.then(value => this.$set(this.usersLastActivity, `${u.id}`, value.dateTime))
.catch(e => {
})

View file

@ -52,7 +52,7 @@
</v-tooltip>
</v-btn>
<v-btn icon @click="addToReadList" v-if="isAdmin && (kind === 'books' || (kind === 'series' && oneshots))">
<v-btn icon @click="addToReadList" v-if="isAdmin && (kind === 'books' || kind === 'series')">
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-icon v-on="on">mdi-book-plus-multiple</v-icon>

View file

@ -0,0 +1,172 @@
<template>
<v-dialog v-model="modal"
max-width="600"
>
<v-card>
<v-card-title>{{ $t('dialog.add_api_key.dialog_title') }}</v-card-title>
<v-btn icon absolute top right @click="dialogClose">
<v-icon>mdi-close</v-icon>
</v-btn>
<v-card-text>
<v-container fluid>
<v-row>
<v-col>{{ $t('dialog.add_api_key.context') }}</v-col>
</v-row>
<v-row v-if="!apiKey">
<v-col>
<v-text-field v-model.trim="form.comment"
autofocus
:label="$t('dialog.add_api_key.field_comment')"
:hint="$t('dialog.add_api_key.field_comment_hint')"
:error-messages="getErrors('comment')"
@blur="$v.form.comment.$touch()"
/>
</v-col>
</v-row>
<v-row v-if="apiKey">
<v-col>
<v-alert type="info" class="body-2">{{ $t('dialog.add_api_key.info_copy') }}</v-alert>
</v-col>
</v-row>
<v-row v-if="apiKey">
<v-col>
<v-icon color="success">mdi-check</v-icon>
{{ apiKey.key }}
<v-tooltip top v-model="copied" v-if="isClipboardApiAvailable">
<template v-slot:activator="on">
<v-btn v-on="on"
icon
x-small
class="align-content-end"
@click="copyApiKeyToClipboard"
>
<v-icon v-if="copied" color="success">mdi-check</v-icon>
<v-icon v-else>mdi-content-copy</v-icon>
</v-btn>
</template>
<span>{{ $t('common.copied') }}</span>
</v-tooltip>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer/>
<v-btn text @click="dialogClose">{{ $t('common.close') }}</v-btn>
<v-btn color="primary" @click="generateApiKey" :disabled="!!apiKey">{{ $t('dialog.add_api_key.button_confirm') }}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script lang="ts">
import {UserRoles} from '@/types/enum-users'
import Vue from 'vue'
import {required} from 'vuelidate/lib/validators'
import {ERROR} from '@/types/events'
import {ApiKeyDto, ApiKeyRequestDto} from '@/types/komga-users'
function validComment(value: string) {
return !this.alreadyUsedComment.includes(value)
}
export default Vue.extend({
name: 'ApiKeyAddDialog',
data: function () {
return {
UserRoles,
modal: false,
apiKey: undefined as ApiKeyDto,
copied: false,
alreadyUsedComment: [] as string[],
form: {
comment: '',
},
}
},
props: {
value: Boolean,
},
watch: {
value(val) {
this.modal = val
if (val) {
this.clear()
}
},
modal(val) {
!val && this.dialogClose()
},
},
validations: {
form: {
comment: {required, validComment},
},
},
computed: {
isClipboardApiAvailable(): boolean {
return !!navigator.clipboard
},
},
methods: {
clear() {
this.apiKey = undefined
this.alreadyUsedComment = []
this.form.comment = ''
this.$v.$reset()
},
dialogClose() {
this.$emit('input', false)
},
getErrors(fieldName: string): string[] {
const errors = [] as string[]
const field = this.$v.form!![fieldName] as any
if (field && field.$invalid && field.$dirty) {
if (!field.validComment) errors.push(this.$t('error_codes.ERR_1034').toString())
if (!field.required) errors.push(this.$t('common.required').toString())
}
return errors
},
validateInput(): ApiKeyRequestDto {
this.$v.$touch()
if (!this.$v.$invalid) {
return {
comment: this.form.comment,
}
}
return undefined
},
async generateApiKey() {
const apiKeyRequest = this.validateInput()
if (apiKeyRequest) {
try {
this.apiKey = await this.$komgaUsers.createApiKey(apiKeyRequest)
this.$emit('generate')
} catch (e) {
if (e.message.includes('ERR_1034'))
this.alreadyUsedComment.push(this.form.comment)
else
this.$eventHub.$emit(ERROR, {message: e.message} as ErrorEvent)
}
}
},
copyApiKeyToClipboard() {
navigator.clipboard.writeText(this.apiKey.key)
this.copied = true
setTimeout(() => this.copied = false, 3000)
},
},
})
</script>
<style scoped>
</style>

View file

@ -122,7 +122,7 @@
<!-- Sort Number -->
<v-col cols="2">
<v-text-field v-model="form[book.id].numberSort"
<v-text-field v-model.number="form[book.id].numberSort"
type="number"
step="0.1"
dense
@ -200,7 +200,7 @@
<script lang="ts">
import Vue from 'vue'
import {BookDto} from '@/types/komga-books'
import IsbnVerify from '@saekitominaga/isbn-verify'
import IsbnVerify from '@w0s/isbn-verify'
import {isMatch} from 'date-fns'
import {ERROR} from '@/types/events'
@ -283,7 +283,7 @@ export default Vue.extend({
return value || value === 0 ? true : this.$t('common.required').toString()
},
validateReleaseDate(date: string): string | boolean {
return date && !isMatch(date, 'yyyy-MM-dd') ? this.$t('dialog.edit_books.field_release_date_error').toString() : true
return date && (!isMatch(date, 'yyyy-MM-dd') || date.length !== 10) ? this.$t('dialog.edit_books.field_release_date_error').toString() : true
},
bookDisplayName(book: BookDto): string {
const parts = book.url.split('/')

View file

@ -100,7 +100,6 @@
import {UserRoles} from '@/types/enum-users'
import Vue from 'vue'
import {ERROR, ErrorEvent} from '@/types/events'
import {LibraryDto} from '@/types/komga-libraries'
import ThumbnailCard from '@/components/ThumbnailCard.vue'
import DropZone from '@/components/DropZone.vue'
@ -152,9 +151,6 @@ export default Vue.extend({
},
},
computed: {
libraries(): LibraryDto[] {
return this.$store.state.komgaLibraries.libraries
},
getErrorsName(): string {
if (this.form.name === '') return this.$t('common.required').toString()
if (this.form.name?.toLowerCase() !== this.collection.name?.toLowerCase() && this.collections.some(e => e.name.toLowerCase() === this.form.name.toLowerCase())) {

View file

@ -430,14 +430,15 @@ import {authorRoles} from '@/types/author-roles'
import Vue from 'vue'
import {helpers, requiredIf} from 'vuelidate/lib/validators'
import {BookDto, BookThumbnailDto} from '@/types/komga-books'
import IsbnVerify from '@saekitominaga/isbn-verify'
import IsbnVerify from '@w0s/isbn-verify'
import {isMatch} from 'date-fns'
import {debounce} from 'lodash'
import {ERROR, ErrorEvent} from '@/types/events'
import DropZone from '@/components/DropZone.vue'
import ThumbnailCard from '@/components/ThumbnailCard.vue'
import {NameValue} from '@/types/filter'
const validDate = (value: string) => !helpers.req(value) || isMatch(value, 'yyyy-MM-dd')
const validDate = (value: string) => !helpers.req(value) || isMatch(value, 'yyyy-MM-dd') && value.length == 10
const validIsbn = (value: string) => !helpers.req(value) || new IsbnVerify(value).isIsbn13({check_digit: true})
export default Vue.extend({

View file

@ -570,7 +570,7 @@ import DropZone from '@/components/DropZone.vue'
import ThumbnailCard from '@/components/ThumbnailCard.vue'
import {BookDto, BookThumbnailDto} from '@/types/komga-books'
import {isMatch} from 'date-fns'
import IsbnVerify from '@saekitominaga/isbn-verify'
import IsbnVerify from '@w0s/isbn-verify'
import {debounce} from 'lodash'
import {authorRoles} from '@/types/author-roles'
import {groupAuthorsByRole} from '@/functions/authors'

View file

@ -0,0 +1,136 @@
<template>
<v-dialog v-model="modal"
max-width="450"
:fullscreen="$vuetify.breakpoint.xsOnly"
>
<v-card>
<v-card-title>{{ $t('dialog.edit_recommended.dialog_title') }}</v-card-title>
<v-btn icon absolute top right @click="dialogClose">
<v-icon>mdi-close</v-icon>
</v-btn>
<v-card-text :class="$vuetify.breakpoint.xsOnly ? 'px-0' : undefined">
<v-list>
<draggable
v-model="localItems"
v-bind="dragOptions"
handle=".handle"
>
<v-list-item v-for="(l, index) in localItems" :key="index">
<v-list-item-icon>
<v-icon class="handle">mdi-drag-horizontal-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title class="handle">{{ $t(`dashboard.${l.section.toLowerCase()}`) }}</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-switch v-model="enabled[l.section]"/>
</v-list-item-action>
</v-list-item>
</draggable>
</v-list>
</v-card-text>
<v-card-actions>
<v-spacer/>
<v-btn v-if="$vuetify.breakpoint.smAndUp" text @click="dialogClose">{{ $t('common.cancel') }}</v-btn>
<v-btn color="error" @click="resetToDefault">{{
$t('dialog.edit_recommended.button_reset')
}}
</v-btn>
<v-btn color="primary" @click="saveChanges">{{
$t('dialog.edit_recommended.button_confirm')
}}
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script lang="ts">
import {UserRoles} from '@/types/enum-users'
import draggable from 'vuedraggable'
import Vue, {PropType} from 'vue'
import {
ClientSettingsRecommendedView,
ClientSettingsRecommendedViewSection,
RECOMMENDED_DEFAULT,
} from '@/types/komga-clientsettings'
export default Vue.extend({
name: 'EditRecommendedDialog',
components: {draggable},
data: function () {
return {
UserRoles,
modal: false,
localItems: [] as ClientSettingsRecommendedViewSection[],
enabled: {} as Record<string, boolean>,
}
},
props: {
value: Boolean,
viewConfig: {
type: Object as PropType<ClientSettingsRecommendedView>,
required: true,
},
},
watch: {
value(val) {
this.modal = val
if (val) {
this.reset(this.viewConfig)
}
},
modal(val) {
!val && this.dialogClose()
},
},
computed: {
dragOptions(): any {
return {
animation: 200,
ghostClass: 'ghost',
}
},
},
methods: {
reset(viewConfig: ClientSettingsRecommendedView) {
this.localItems = viewConfig?.sections || []
this.enabled = []
this.localItems.forEach(it => this.enabled[it.section] = true)
RECOMMENDED_DEFAULT.sections
.filter(it => !viewConfig?.sections.some(s => s.section === it.section))
.forEach(it => this.localItems.push(it))
},
dialogClose() {
this.$emit('input', false)
},
resetToDefault() {
this.$emit('reset-defaults')
this.dialogClose()
},
saveChanges() {
const sections = this.localItems.filter(it => this.enabled[it.section])
const updated = {
sections: sections,
} as ClientSettingsRecommendedView
this.$emit('update:viewConfig', updated)
this.dialogClose()
},
},
})
</script>
<style scoped>
.handle {
cursor: grab !important;
}
.ghost {
opacity: 0.5;
background: #c8ebfb;
}
</style>

View file

@ -17,7 +17,7 @@
<template v-if="directoryListing.hasOwnProperty('parent')">
<v-list-item
@click.prevent="select(directoryListing.parent)"
@click.prevent="selectParent(directoryListing.parent)"
>
<v-list-item-icon>
<v-icon>mdi-arrow-left</v-icon>
@ -32,7 +32,7 @@
<div v-for="(d, index) in directoryListing.directories" :key="index">
<v-list-item
@click.prevent="select(d.path)"
@click.prevent="select(d)"
>
<v-list-item-icon>
<v-icon>{{ d.type === 'directory' ? 'mdi-folder' : 'mdi-file' }}</v-icon>
@ -47,6 +47,24 @@
<v-divider v-if="index !== directoryListing.directories.length-1"/>
</div>
<div v-for="(d, index) in directoryListing.files" :key="index">
<v-list-item
@click.prevent="select(d)"
>
<v-list-item-icon>
<v-icon>{{ d.type === 'directory' ? 'mdi-folder' : 'mdi-file' }}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>
{{ d.name }}
</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-divider v-if="index !== directoryListing.files.length-1"/>
</div>
</v-list>
</v-card-text>
@ -91,6 +109,10 @@ export default Vue.extend({
type: String,
required: false,
},
showFiles: {
type: Boolean,
default: false,
},
dialogTitle: {
type: String,
default: function (): string {
@ -119,18 +141,23 @@ export default Vue.extend({
dialogConfirm() {
this.$emit('input', false)
this.$emit('update:path', this.selectedPath)
this.$emit('confirm')
},
async getDirs(path?: string) {
try {
this.directoryListing = await this.$komgaFileSystem.getDirectoryListing(path)
this.directoryListing = await this.$komgaFileSystem.getDirectoryListing(path, this.showFiles)
} catch (e) {
this.$eventHub.$emit(ERROR, {message: e.message} as ErrorEvent)
}
},
select(path: string) {
selectParent(path: string) {
this.selectedPath = path
this.getDirs(path)
},
select(path: PathDto) {
this.selectedPath = path.path
if(path.type == 'directory') this.getDirs(path.path)
},
},
})
</script>

View file

@ -108,6 +108,9 @@ export default Vue.extend({
},
immediate: true,
},
modal(val) {
!val && this.dialogClose()
},
},
methods: {
clear() {

View file

@ -215,6 +215,22 @@
</template>
</v-checkbox>
<v-checkbox
v-model="form.hashKoreader"
:label="$t('dialog.edit_library.field_analysis_hash_koreader')"
hide-details
class="mx-4"
>
<template v-slot:append>
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-icon v-on="on" color="warning">mdi-alert-circle-outline</v-icon>
</template>
{{ $t('dialog.edit_library.tooltip_use_resources') }}
</v-tooltip>
</template>
</v-checkbox>
<v-checkbox
v-model="form.analyzeDimensions"
:label="$t('dialog.edit_library.field_analysis_analyze_dimensions')"
@ -465,6 +481,7 @@ export default Vue.extend({
seriesCover: SeriesCoverDto.FIRST as SeriesCoverDto,
hashFiles: true,
hashPages: false,
hashKoreader: false,
analyzeDimensions: true,
oneshotsDirectory: '',
},
@ -624,6 +641,7 @@ export default Vue.extend({
this.form.seriesCover = library ? library.seriesCover : SeriesCoverDto.FIRST
this.form.hashFiles = library ? library.hashFiles : true
this.form.hashPages = library ? library.hashPages : false
this.form.hashKoreader = library ? library.hashKoreader : false
this.form.analyzeDimensions = library ? library.analyzeDimensions : true
this.form.oneshotsDirectory = library ? library.oneshotsDirectory : ''
this.$v.$reset()
@ -658,6 +676,7 @@ export default Vue.extend({
seriesCover: this.form.seriesCover,
hashFiles: this.form.hashFiles,
hashPages: this.form.hashPages,
hashKoreader: this.form.hashKoreader,
analyzeDimensions: this.form.analyzeDimensions,
oneshotsDirectory: this.form.oneshotsDirectory,
}

View file

@ -113,7 +113,6 @@
import {UserRoles} from '@/types/enum-users'
import Vue from 'vue'
import {ERROR, ErrorEvent} from '@/types/events'
import {LibraryDto} from '@/types/komga-libraries'
import DropZone from '@/components/DropZone.vue'
import ThumbnailCard from '@/components/ThumbnailCard.vue'
import {ReadListDto, ReadListThumbnailDto, ReadListUpdateDto} from '@/types/komga-readlists'
@ -167,9 +166,6 @@ export default Vue.extend({
},
},
computed: {
libraries(): LibraryDto[] {
return this.$store.state.komgaLibraries.libraries
},
getErrorsName(): string {
if (this.form.name === '') return this.$t('common.required').toString()
if (this.form.name?.toLowerCase() !== this.readList.name?.toLowerCase() && this.readLists.some(e => e.name.toLowerCase() === this.form.name.toLowerCase())) {

View file

@ -82,6 +82,7 @@ import Vue, {PropType} from 'vue'
import {SeriesDto} from '@/types/komga-series'
import {debounce} from 'lodash'
import {seriesThumbnailUrl} from '@/functions/urls'
import {SearchConditionOneShot, SearchOperatorIsFalse, SeriesSearch} from '@/types/komga-search'
export default Vue.extend({
name: 'SeriesPickerDialog',
@ -123,7 +124,10 @@ export default Vue.extend({
searchItems: debounce(async function (this: any, query: string) {
if (query) {
this.showResults = false
this.results = (await this.$komgaSeries.getSeries(undefined, {unpaged: true}, query, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, this.includeOneshots ? undefined : false)).content
this.results = (await this.$komgaSeries.getSeriesList({
fullTextSearch: query,
condition: this.includeOneshots ? undefined : new SearchConditionOneShot(new SearchOperatorIsFalse()),
} as SeriesSearch, {unpaged: true})).content
this.showResults = true
} else {
this.clear()

View file

@ -9,6 +9,12 @@
:total-visible="perPage"
:length="Math.ceil(thumbnails.length/perPage)"
></v-pagination>
<page-size-select
v-model="perPage"
dark
:items="[10, 20, 50, 100]"
/>
</v-card-title>
<v-card-text>
<v-container fluid>
@ -29,7 +35,7 @@
@click="input = false; goTo(((page - 1 ) * perPage + i + 1))"
style="cursor: pointer"
/>
<div class="white--text text-center font-weight-bold">{{ (page - 1 ) * perPage + i + 1 }}</div>
<div class="white--text text-center font-weight-bold">{{ (page - 1) * perPage + i + 1 }}</div>
</div>
</v-row>
@ -42,9 +48,11 @@
<script lang="ts">
import Vue from 'vue'
import {bookPageThumbnailUrl} from '@/functions/urls'
import PageSizeSelect from '@/components/PageSizeSelect.vue'
export default Vue.extend({
name: 'ThumbnailExplorerDialog',
components: {PageSizeSelect},
props: {
pagesCount: {
type: Number,
@ -60,39 +68,45 @@ export default Vue.extend({
return {
input: '',
page: 1,
perPage: 8,
perPage: 10,
}
},
watch: {
value (val) {
value(val) {
this.input = val
},
input (val) {
input(val) {
!val && this.$emit('input', false)
},
perPage(val) {
this.$store.commit('setThumbnailsPageSize', val)
},
},
mounted() {
this.perPage = this.$store.state.persistedState.thumbnailsPageSize || this.perPage
},
computed: {
thumbnails (): string[] {
thumbnails(): string[] {
let thumbnails = []
for (let p = 1; p <= this.pagesCount; p++) {
thumbnails.push(this.getThumbnailUrl(p))
}
return thumbnails
},
visibleThumbnails (): String[] {
visibleThumbnails(): String[] {
let a: number = (this.page - 1) * this.perPage
let b: number = this.page * this.perPage
return this.thumbnails.slice(a, b)
},
},
methods: {
updateInput () {
updateInput() {
this.$emit('input', this.input)
},
goTo (page: number) {
goTo(page: number) {
this.$emit('go', page)
},
getThumbnailUrl (page: number): string {
getThumbnailUrl(page: number): string {
return bookPageThumbnailUrl(this.bookId, page)
},
},

View file

@ -39,7 +39,7 @@
<tr>
<td class="font-weight-medium">{{ $t('dialog.transient_book_details.label_format') }}</td>
<td :class="rightBook ? 'diff' : ''">{{ getBookFormatFromMediaType(leftBook.mediaType).type }}</td>
<td v-if="rightBook">{{ getBookFormatFromMediaType(rightBook.media.mediaType).type }}</td>
<td v-if="rightBook">{{ getBookFormatFromMedia(rightBook.media).type }}</td>
</tr>
<tr>
@ -69,7 +69,7 @@
import Vue, {PropType} from 'vue'
import {TransientBookDto} from '@/types/komga-transientbooks'
import {BookDto, PageDto} from '@/types/komga-books'
import {getBookFormatFromMediaType} from '@/functions/book-format'
import {getBookFormatFromMedia, getBookFormatFromMediaType} from '@/functions/book-format'
import PagesTable from '@/components/PagesTable.vue'
export default Vue.extend({
@ -78,7 +78,8 @@ export default Vue.extend({
data: () => {
return {
modal: false,
getBookFormatFromMediaType,
getBookFormatFromMediaType: getBookFormatFromMediaType,
getBookFormatFromMedia: getBookFormatFromMedia,
}
},
props: {

View file

@ -50,24 +50,12 @@
<v-row>
<v-col>
<span>{{ $t('dialog.add_user.label_roles') }}</span>
<v-checkbox
v-model="form.roles"
:label="$t('dialog.add_user.field_role_administrator')"
:value="UserRoles.ADMIN"
hide-details
/>
<v-checkbox
v-model="form.roles"
:label="$t('dialog.add_user.field_role_page_streaming')"
:value="UserRoles.PAGE_STREAMING"
hide-details
/>
<v-checkbox
v-model="form.roles"
:label="$t('dialog.add_user.field_role_file_download')"
:value="UserRoles.FILE_DOWNLOAD"
hide-details
<span>{{ $t('common.roles') }}</span>
<v-checkbox v-for="role in userRoles" :key="role.value"
v-model="form.roles"
:label="role.text"
:value="role.value"
hide-details
/>
</v-col>
</v-row>
@ -95,7 +83,6 @@ export default Vue.extend({
name: 'UserAddDialog',
data: function () {
return {
UserRoles,
modalAddUser: true,
showPassword: false,
dialogTitle: this.$i18n.t('dialog.add_user.dialog_title').toString(),
@ -118,6 +105,14 @@ export default Vue.extend({
password: {required},
},
},
computed: {
userRoles(): any[] {
return Object.keys(UserRoles).map(x => ({
text: this.$t(`user_roles.${x}`),
value: x,
}))
},
},
methods: {
getErrors(fieldName: string): string[] {
const errors = [] as string[]

View file

@ -15,23 +15,11 @@
<v-row>
<v-col>
<v-checkbox
v-model="roles"
:label="$t('dialog.add_user.field_role_administrator')"
:value="UserRoles.ADMIN"
hide-details
/>
<v-checkbox
v-model="roles"
:label="$t('dialog.add_user.field_role_page_streaming')"
:value="UserRoles.PAGE_STREAMING"
hide-details
/>
<v-checkbox
v-model="roles"
:label="$t('dialog.add_user.field_role_file_download')"
:value="UserRoles.FILE_DOWNLOAD"
hide-details
<v-checkbox v-for="role in userRoles" :key="role.value"
v-model="roles"
:label="role.text"
:value="role.value"
hide-details
/>
</v-col>
</v-row>
@ -55,14 +43,12 @@
import {UserRoles} from '@/types/enum-users'
import Vue from 'vue'
import {ERROR} from '@/types/events'
import {LibraryDto} from '@/types/komga-libraries'
import {UserDto, UserUpdateDto} from '@/types/komga-users'
export default Vue.extend({
name: 'UserEditDialog',
data: () => {
return {
UserRoles,
modal: false,
roles: [] as string[],
}
@ -86,8 +72,11 @@ export default Vue.extend({
},
},
computed: {
libraries(): LibraryDto[] {
return this.$store.state.komgaLibraries.libraries
userRoles(): any[] {
return Object.keys(UserRoles).map(x => ({
text: this.$t(`user_roles.${x}`),
value: x,
}))
},
},
methods: {

View file

@ -0,0 +1,70 @@
<template>
<div>
<v-menu offset-y>
<template v-slot:activator="{ on }">
<v-btn icon v-on="on" @click.prevent="">
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</template>
<v-list dense>
<v-list-item @click="reorder">
<v-list-item-title>{{ $t('common.reorder') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="scan(false)" v-if="isAdmin">
<v-list-item-title>{{ $t('server.server_management.button_scan_libraries') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="scan(true)" class="list-warning" v-if="isAdmin">
<v-list-item-title>{{ $t('server.server_management.button_scan_libraries_deep') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="confirmEmptyTrash = true" v-if="isAdmin">
<v-list-item-title>{{ $t('server.server_management.button_empty_trash') }}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<confirmation-dialog
v-model="confirmEmptyTrash"
:title="$t('dialog.empty_trash.title')"
:body="$t('dialog.empty_trash.body')"
:button-confirm="$t('dialog.empty_trash.button_confirm')"
@confirm="emptyTrash"
/>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
import ConfirmationDialog from '@/components/dialogs/ConfirmationDialog.vue'
export default Vue.extend({
name: 'LibrariesActionsMenu',
components: {ConfirmationDialog},
data: () => {
return {
confirmEmptyTrash: false,
}
},
computed: {
isAdmin(): boolean {
return this.$store.getters.meAdmin
},
},
methods: {
reorder() {
this.$emit('reorder')
},
scan(scanDeep: boolean) {
this.$store.state.komgaLibraries.libraries.forEach(library => {
this.$komgaLibraries.scanLibrary(library, scanDeep)
})
},
emptyTrash() {
this.$store.state.komgaLibraries.libraries.forEach(library => {
this.$komgaLibraries.emptyTrash(library)
})
},
},
})
</script>
<style scoped>
@import "../../styles/list-warning.css";
</style>

View file

@ -1,32 +1,34 @@
<template>
<div>
<v-menu offset-y v-if="isAdmin">
<v-menu offset-y>
<template v-slot:activator="{ on }">
<v-btn icon v-on="on" @click.prevent="">
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</template>
<v-list dense>
<v-list-item @click="scan(false)">
<v-list-item @click="scan(false)" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.scan_library_files') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="scan(true)" class="list-warning">
<v-list-item @click="scan(true)" class="list-warning" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.scan_library_files_deep') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="confirmAnalyzeModal = true">
<v-list-item @click="confirmAnalyzeModal = true" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.analyze') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="confirmRefreshMetadataModal = true">
<v-list-item @click="confirmRefreshMetadataModal = true" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.refresh_metadata') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="confirmEmptyTrash = true">
<v-list-item @click="confirmEmptyTrash = true" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.empty_trash') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="edit">
<v-list-item @click="edit" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.edit') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="promptDeleteLibrary"
class="list-danger">
class="list-danger"
v-if="isAdmin"
>
<v-list-item-title>{{ $t('menu.delete') }}</v-list-item-title>
</v-list-item>
</v-list>

View file

@ -38,6 +38,7 @@ import {ReadStatus} from '@/types/enum-books'
import Vue from 'vue'
import {BookDto} from '@/types/komga-books'
import {SeriesDto} from '@/types/komga-series'
import {BookSearch, SearchConditionSeriesId, SearchOperatorIs} from '@/types/komga-search'
export default Vue.extend({
name: 'OneShotActionsMenu',
@ -93,7 +94,9 @@ export default Vue.extend({
this.$store.dispatch('dialogAddSeriesToCollection', [this.seriesId])
},
async addToReadList() {
if (!this.book && !this.localBookId) this.localBookId = (await this.$komgaSeries.getBooks(this.seriesId)).content[0].id
if (!this.book && !this.localBookId) this.localBookId = (await this.$komgaBooks.getBooksList({
condition: new SearchConditionSeriesId(new SearchOperatorIs(this.seriesId)),
} as BookSearch)).content[0].id
this.$store.dispatch('dialogAddBooksToReadList', [this.book?.id || this.localBookId])
},
async markRead() {

View file

@ -16,6 +16,9 @@
<v-list-item @click="addToCollection" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.add_to_collection') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="addToReadList" v-if="isAdmin">
<v-list-item-title>{{ $t('menu.add_to_readlist') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="markRead" v-if="!isRead">
<v-list-item-title>{{ $t('menu.mark_read') }}</v-list-item-title>
</v-list-item>
@ -32,6 +35,7 @@
<script lang="ts">
import Vue from 'vue'
import {SeriesDto} from '@/types/komga-series'
import {BookSearch, SearchConditionSeriesId, SearchOperatorIs} from '@/types/komga-search'
export default Vue.extend({
name: 'SeriesActionsMenu',
@ -76,6 +80,12 @@ export default Vue.extend({
addToCollection() {
this.$store.dispatch('dialogAddSeriesToCollection', [this.series.id])
},
async addToReadList() {
const books = await this.$komgaBooks.getBooksList({
condition: new SearchConditionSeriesId(new SearchOperatorIs(this.series.id)),
} as BookSearch, {unpaged: true, sort: ['metadata.numberSort']})
this.$store.dispatch('dialogAddBooksToReadList', books.content.map(b => b.id))
},
async markRead() {
await this.$komgaSeries.markAsRead(this.series.id)
},

Some files were not shown because too many files have changed in this diff Show more