Compare commits

..

No commits in common. "master" and "v0.154.2" have entirely different histories.

997 changed files with 64443 additions and 114022 deletions

View file

@ -24,7 +24,6 @@ tab_width=2
max_line_length=off max_line_length=off
ij_kotlin_allow_trailing_comma=true ij_kotlin_allow_trailing_comma=true
ij_kotlin_allow_trailing_comma_on_call_site=true ij_kotlin_allow_trailing_comma_on_call_site=true
ktlint_standard_multiline-if-else=disabled
[{*.yml,*.yaml}] [{*.yml,*.yaml}]
indent_size=2 indent_size=2

View file

@ -1,11 +1,8 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: 💡Feature idea
url: https://github.com/gotson/komga/discussions/new?category=ideas
about: Suggest a feature to improve Komga
- name: 🖥️ Komga website - name: 🖥️ Komga website
url: https://komga.org/docs/faq url: https://komga.org/faq/
about: Guides, troubleshooting, and answers to common questions about: Guides, troubleshooting, and answers to common questions
- name: ⚠️ Mihon extension - name: ⚠️ Tachiyomi extension
url: https://github.com/keiyoushi/extensions-source url: https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose
about: Issues and requests about the Mihon extension should be opened in the keiyoushi/extensions repository instead about: Issues and requests about the Tachiyomi extension should be opened in the tachiyomi-extensions repository instead

View file

@ -0,0 +1,38 @@
name: ⭐ Feature request
description: Suggest a feature to improve Komga
labels:
- enhancement
body:
- type: textarea
id: feature-description
attributes:
label: Describe your suggested feature
description: How can Komga be improved?
placeholder: |
Example:
"It should work like this..."
validations:
required: true
- type: textarea
id: other-details
attributes:
label: Other details
placeholder: |
Additional details and attachments.
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Read this carefully, we will close and ignore your issue if you skimmed through this.
options:
- label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
required: true
- label: I have written a short but informative title.
required: true
- label: I have updated the app to the latest version.
required: true
- label: I will fill out all of the requested information in this form.
required: true

View file

@ -1,7 +1,7 @@
name: 🐞 Issue report name: 🐞 Issue report
description: Report an issue in Komga description: Report an issue in Komga
labels: labels:
- triage - bug
body: body:
- type: textarea - type: textarea
@ -44,9 +44,7 @@ body:
attributes: attributes:
label: Logs label: Logs
description: | description: |
: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/faq/#where-can-i-find-the-log-files)).
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: | placeholder: |
You can paste the logs in pure text or upload it as an attachment. You can paste the logs in pure text or upload it as an attachment.
@ -56,7 +54,7 @@ body:
label: Komga version label: Komga version
description: You can find your Komga version at the bottom of the side bar. description: You can find your Komga version at the bottom of the side bar.
placeholder: | placeholder: |
Example: "1.7.1" Example: "0.143.0"
validations: validations:
required: true required: true
@ -69,20 +67,6 @@ body:
validations: validations:
required: true required: true
- type: dropdown
attributes:
label: Installation method
description: How did you install Komga?
multiple: false
options:
- jar
- Docker
- Microsoft Store
- from download.komga.org
- other (please provide more details below)
validations:
required: true
- type: textarea - type: textarea
id: other-details id: other-details
attributes: attributes:
@ -96,11 +80,11 @@ body:
label: Acknowledgements label: Acknowledgements
description: Read this carefully, we will close and ignore your issue if you skimmed through this. description: Read this carefully, we will close and ignore your issue if you skimmed through this.
options: options:
- label: I have searched the existing issues (open AND closed) and this is a new ticket, **NOT** a duplicate or related to another open issue. - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
required: true required: true
- label: I have written a short but informative title. - label: I have written a short but informative title.
required: true required: true
- label: I have checked the [FAQ](https://komga.org/docs/faq). - label: I have checked the [FAQ](https://komga.org/faq/).
required: true required: true
- label: I have updated the app to the latest version. - label: I have updated the app to the latest version.
required: true required: true

View file

@ -1,37 +1,26 @@
version: 2 version: 2
updates: updates:
- package-ecosystem: "npm"
directory: "/"
open-pull-requests-limit: 0
schedule:
interval: "weekly"
- package-ecosystem: "npm" - package-ecosystem: "npm"
directory: "/komga-webui" directory: "/komga-webui"
open-pull-requests-limit: 0 open-pull-requests-limit: 0
commit-message:
prefix: "deps(webui)"
# include: "scope"
schedule: schedule:
interval: "weekly" interval: "weekly"
- package-ecosystem: "gradle" - package-ecosystem: "gradle"
directory: "/komga" directory: "/komga"
open-pull-requests-limit: 0 open-pull-requests-limit: 0
commit-message:
prefix: "deps(komga)"
# include: "scope"
schedule:
interval: "weekly"
- package-ecosystem: "gradle"
directory: "/komga-tray"
open-pull-requests-limit: 0
commit-message:
prefix: "deps(komga-tray)"
# include: "scope"
schedule: schedule:
interval: "weekly" interval: "weekly"
# Maintain dependencies for GitHub Actions # Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/" directory: "/"
commit-message: open-pull-requests-limit: 0
prefix: "deps(ci)"
# include: "scope"
schedule: schedule:
interval: "weekly" interval: "weekly"

View file

@ -1,13 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,35 +0,0 @@
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'

99
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,99 @@
name: CI
on:
pull_request:
paths-ignore:
- 'komga-webui/src/locales/*'
push:
branches-ignore:
- 'dependabot/**'
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 8, 11, 17, 18 ]
name: Test JDK ${{ matrix.java }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v2
with:
java-version: ${{ matrix.java }}
java-package: 'jdk'
distribution: 'temurin'
- name: Build
uses: gradle/gradle-build-action@v2
with:
arguments: build
- name: Upload Unit Test Results
if: always()
uses: actions/upload-artifact@v2
with:
name: test-results-jdk-${{ matrix.java }}
path: komga/build/test-results/
- name: Upload Unit Test Reports
if: always()
uses: actions/upload-artifact@v2
with:
name: test-reports-jdk-${{ matrix.java }}
path: komga/build/reports/tests/
webui:
runs-on: ubuntu-latest
name: Test webui builds
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v2
with:
node-version: '16'
cache: 'npm'
cache-dependency-path: |
package-lock.json
komga-webui/package-lock.json
- name: npm install
working-directory: komga-webui
run: npm install
- name: npm build
working-directory: komga-webui
run: npm run build
- name: npm test
working-directory: komga-webui
run: npm run test:unit
release:
name: Semantic Release
runs-on: ubuntu-latest
needs: [ test, webui ]
if: ${{ github.event_name == 'workflow_dispatch' }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v2
with:
node-version: '16'
cache: 'npm'
cache-dependency-path: |
package-lock.json
komga-webui/package-lock.json
- uses: actions/setup-java@v2
with:
java-version: '8'
java-package: 'jdk'
distribution: 'temurin'
cache: 'gradle'
- name: Install dependencies
run: npm install --only=production
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx semantic-release

View file

@ -1,18 +0,0 @@
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: steps:
- uses: actions/checkout@master - uses: actions/checkout@master
- name: DockerHub Description - name: DockerHub Description
uses: peter-evans/dockerhub-description@v5.0.0 uses: peter-evans/dockerhub-description@v2.0.0
env: env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKERHUB_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKERHUB_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

View file

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

View file

@ -1,19 +0,0 @@
name: Lock threads
on:
# Daily
schedule:
- cron: '0 0 * * *'
# Manual trigger
workflow_dispatch:
inputs:
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v6
with:
github-token: ${{ github.token }}
issue-inactive-days: '30'
pr-inactive-days: '30'

View file

@ -1,253 +0,0 @@
name: Release
on:
workflow_dispatch:
inputs:
release_notes:
description: Release notes (use \n for newlines)
type: string
required: false
bump:
description: 'Bump type'
required: false
default: 'next'
type: choice
options:
- 'next'
- 'major'
- 'minor'
- 'patch'
- 'current'
github_release:
description: 'Create Github Release'
default: true
type: boolean
conveyor-copied-site:
description: 'Conveyor copied site'
default: true
type: boolean
docker_release:
description: 'Push Docker images'
default: true
type: boolean
msstore_release:
description: 'Release to the MS Store'
default: true
type: boolean
jobs:
version:
runs-on: macos-latest
outputs:
version_current: ${{ steps.versions.outputs.version_current }}
version_next: ${{ steps.versions.outputs.version_next }}
should_release: ${{ steps.versions.outputs.should_release }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Homebrew
id: set-up-homebrew
uses: Homebrew/actions/setup-homebrew@main
- name: Install svu
run: brew install --cask caarlos0/tap/svu
- name: Compute next version for release
run: |
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 current`" >> $GITHUB_OUTPUT
echo "version_next=${{ env.VERSION_NEXT_SUFFIX }}" >> $GITHUB_OUTPUT
[[ `svu current` != ${{ env.VERSION_NEXT }} ]] && echo "should_release=true" >> $GITHUB_OUTPUT || echo
release:
name: Release
runs-on: ubuntu-latest
needs: version
steps:
- name: Remove unnecessary files
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Display versions
run: |
echo "Current version: ${{ needs.version.outputs.version_current }}, should release: ${{ needs.version.outputs.version_next }}"
- name: Update version in gradle.properties
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@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'
cache-dependency-path: komga-webui/package-lock.json
- name: Setup Java 21
uses: actions/setup-java@v5
with:
java-version: 21
java-package: 'jdk'
distribution: 'temurin'
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: ./gradlew :komga:prepareThymeLeaf :komga:bootJar :komga-tray:jar
env:
NODE_OPTIONS: "--max-old-space-size=4096"
- name: Generate OpenAPI docs
if: needs.version.outputs.should_release #only redo if the version changed
run: ./gradlew :komga:generateOpenApiDocs
- name: Create release notes
run: |
mkdir release_notes
echo -e "${{ inputs.release_notes }}" >> release_notes/release_notes.md
echo "Release notes:"
cat release_notes/release_notes.md
echo ""
- name: JReleaser Changelog append
if: needs.version.outputs.should_release #only redo if the version changed
run: ./gradlew jreleaserChangelog
env:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Changelog output
if: always() && needs.version.outputs.should_release
uses: actions/upload-artifact@v7
with:
name: jreleaser-changelog
path: |
build/jreleaser/trace.log
build/jreleaser/output.properties
- name: Release commit and push
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]'
tag: '${{ needs.version.outputs.version_next }}'
default_author: github_actions
- name: Retrieve the Apple private key and decode it to a file
if: inputs.github_release || inputs.conveyor-copied-site
env:
APPLE_PRIVATE_KEY: ${{ secrets.APPLE_PRIVATE_KEY }}
run: |
mkdir ./secret
echo $APPLE_PRIVATE_KEY | base64 --decode > ./secret/apple_private_key.p8
- name: Conveyor make copied-site
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
signing_key: ${{ secrets.CONVEYOR_SIGNING_KEY }}
agree_to_license: 1
env:
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
AWS_S3_BUCKET: ${{ secrets.B2_BUCKET }}
AWS_S3_ENDPOINT: 'https://s3.us-east-005.backblazeb2.com'
AWS_ACCESS_KEY_ID: ${{ secrets.B2_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log
if: always() && inputs.conveyor-copied-site
uses: actions/upload-artifact@v7
with:
name: conveyor-make-copied-site
path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt
- name: JReleaser Release
if: inputs.github_release
run: ./gradlew jreleaserRelease
env:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Release output
if: always() && inputs.github_release
uses: actions/upload-artifact@v7
with:
name: jreleaser-release
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
- name: JReleaser Publish
if: inputs.docker_release
run: ./gradlew jreleaserPublish
env:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Publish output
if: always() && inputs.docker_release
uses: actions/upload-artifact@v7
with:
name: jreleaser-publish
path: |
build/jreleaser/trace.log
build/jreleaser/output.properties
- name: Conveyor - publish to Microsoft Store
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
signing_key: ${{ secrets.CONVEYOR_SIGNING_KEY }}
agree_to_license: 1
env:
CONVEYOR_MSSTORE_CLIENT_ID: ${{ secrets.CONVEYOR_MSSTORE_CLIENT_ID }}
CONVEYOR_MSSTORE_CLIENT_SECRET: ${{ secrets.CONVEYOR_MSSTORE_CLIENT_SECRET }}
CONVEYOR_MSSTORE_TENANT_ID: ${{ secrets.CONVEYOR_MSSTORE_TENANT_ID }}
AWS_S3_BUCKET: ${{ secrets.B2_BUCKET }}
AWS_S3_ENDPOINT: 'https://s3.us-east-005.backblazeb2.com'
AWS_ACCESS_KEY_ID: ${{ secrets.B2_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log
if: always() && inputs.msstore_release
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

@ -1,97 +0,0 @@
name: Tests
on:
pull_request:
paths-ignore:
- 'komga-webui/src/locales/*'
- 'komga-tray/src/main/resources/org/gotson/komga/*'
push:
branches-ignore:
- 'dependabot/**'
workflow_dispatch:
jobs:
test:
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@v6
- name: Setup Java 21
uses: actions/setup-java@v5
with:
java-version: 21
java-package: 'jdk'
distribution: 'temurin'
- 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@v7
with:
name: test-results-${{ matrix.os }}
path: komga/build/test-results/
- name: Upload Unit Test Reports
if: always()
uses: actions/upload-artifact@v7
with:
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' && 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 }}
agree_to_license: 1
- name: Compare JDK required modules
id: conveyor_compare
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@v7
with:
name: conveyor-required-jdk-modules
path: ./output/required-jdk-modules.txt
webui:
runs-on: ubuntu-latest
name: Test webui builds
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'npm'
cache-dependency-path: komga-webui/package-lock.json
- name: npm install
working-directory: komga-webui
run: npm install
- name: npm build
working-directory: komga-webui
run: npm run build
env:
NODE_OPTIONS: "--max-old-space-size=4096"
- name: npm test
working-directory: komga-webui
run: npm run test:unit

12
.gitignore vendored
View file

@ -2,9 +2,6 @@
.gradle .gradle
!gradle/wrapper/gradle-wrapper.jar !gradle/wrapper/gradle-wrapper.jar
### Kotlin
.kotlin
### NodeJS ### NodeJS
node_modules node_modules
@ -36,9 +33,6 @@ node_modules
*.iml *.iml
*.ipr *.ipr
### IntelliJ Fleet
.fleet/
### NetBeans ### NetBeans
nbproject/private/ nbproject/private/
build/ build/
@ -51,9 +45,3 @@ nbdist/
/komga/src/main/resources/public/ /komga/src/main/resources/public/
/config-dir/ /config-dir/
application-oauth2.yml application-oauth2.yml
/benchmark
/release_notes
### Conveyor
output/
secret/

1
.husky/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
_

31
.husky/_/husky.sh Normal file
View file

@ -0,0 +1,31 @@
#!/bin/sh
if [ -z "$husky_skip_init" ]; then
debug () {
if [ "$HUSKY_DEBUG" = "1" ]; then
echo "husky (debug) - $1"
fi
}
readonly hook_name="$(basename "$0")"
debug "starting $hook_name..."
if [ "$HUSKY" = "0" ]; then
debug "HUSKY env variable is set to 0, skipping hook"
exit 0
fi
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
export readonly husky_skip_init=1
sh -e "$0" "$@"
exitCode="$?"
if [ $exitCode != 0 ]; then
echo "husky - $hook_name hook exited with code $exitCode (error)"
fi
exit $exitCode
fi

4
.husky/commit-msg Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit $1

5
.husky/pre-commit Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run --prefix komga-webui lint
./gradlew ktlintCheck

View file

@ -7,7 +7,7 @@
</map> </map>
</option> </option>
<option name="executionName" /> <option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$/komga" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" /> <option name="scriptParameters" value="" />
<option name="taskDescriptions"> <option name="taskDescriptions">
@ -20,10 +20,7 @@
</option> </option>
<option name="vmOptions" value="" /> <option name="vmOptions" value="" />
</ExternalSystemSettings> </ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> <GradleScriptDebugEnabled>true</GradleScriptDebugEnabled>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" /> <method v="2" />
</configuration> </configuration>
</component> </component>

View file

@ -7,7 +7,7 @@
</map> </map>
</option> </option>
<option name="executionName" /> <option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$/komga" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" /> <option name="scriptParameters" value="" />
<option name="taskDescriptions"> <option name="taskDescriptions">
@ -20,10 +20,7 @@
</option> </option>
<option name="vmOptions" value="" /> <option name="vmOptions" value="" />
</ExternalSystemSettings> </ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> <GradleScriptDebugEnabled>true</GradleScriptDebugEnabled>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" /> <method v="2" />
</configuration> </configuration>
</component> </component>

View file

@ -7,7 +7,7 @@
</map> </map>
</option> </option>
<option name="executionName" /> <option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$/komga" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" /> <option name="scriptParameters" value="" />
<option name="taskDescriptions"> <option name="taskDescriptions">
@ -23,7 +23,6 @@
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess> <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled> <DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" /> <method v="2" />
</configuration> </configuration>
</component> </component>

View file

@ -7,7 +7,7 @@
</map> </map>
</option> </option>
<option name="executionName" /> <option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$/komga" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" /> <option name="scriptParameters" value="" />
<option name="taskDescriptions"> <option name="taskDescriptions">
@ -20,10 +20,7 @@
</option> </option>
<option name="vmOptions" value="" /> <option name="vmOptions" value="" />
</ExternalSystemSettings> </ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> <GradleScriptDebugEnabled>true</GradleScriptDebugEnabled>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" /> <method v="2" />
</configuration> </configuration>
</component> </component>

1
.nvmrc
View file

@ -1 +0,0 @@
18

View file

@ -1,3 +0,0 @@
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/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. **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. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/678794935368941569?label=Discord)](https://discord.gg/TdRpkDu) 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 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. 1. **DO** show your enthusiasm for an existing issue by adding a :+1: reaction on the first message in the discussion.

View file

@ -6,23 +6,25 @@ Thanks a lot for contributing to Komga!
You will need: You will need:
- Java JDK version 21+ - Java JDK version 8+
- Nodejs version 18+ (check the `.nvmrc` file) - Nodejs version 16+
## Setting up the project ## Setting up the project
- run `npm install` in the root folder of the project. This will install the necessary commit hooks.
- run `npm install` in the `komga-webui` folder of the project. This will install the necessary tooling for the webui. - run `npm install` in the `komga-webui` folder of the project. This will install the necessary tooling for the webui.
## Commit messages ## Commit messages
Komga's commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/) standard. This enables automatic versioning, releases, and release notes generation. Komga's commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/) standard. This enables automatic versioning, releases, and release notes generation.
Commit messages are enforced using commit hooks ran on the developer's PC.
## Project organization ## Project organization
Komga is composed of 3 projects: Komga is composed of 2 projects:
- `komga`: a Spring Boot backend server that hosts the APIs, but also serves the static assets of the frontend. - `komga`: a Spring Boot backend server that hosts the APIs, but also serves the static assets of the frontend.
- `komga-webui`: a VueJS frontend, built at compile time and served by the backend at runtime. - `komga-webui`: a VueJS frontend, built at compile time and served by the backend at runtime.
- `komga-tray`: a thin desktop wrapper that displays a tray-icon
## Backend development ## Backend development
@ -41,8 +43,7 @@ The backend project uses `gradle` to run all the necessary tasks. If your IDE do
Here is a list of useful tasks: Here is a list of useful tasks:
- `bootRun`: run the application locally, useful for testing your changes. - `bootRun`: run the application locally, useful for testing your changes.
- `prepareThymeLeaf`: build the frontend, and copy the bundle to `/resources/public`. You need to run this manually if - `copyWebDist`: build the frontend, and copy the bundle to `/resources/public`. You need to run this manually if you want to test the latest frontend build hosted by Spring.
you want to test the latest frontend build hosted by Spring.
- `test`: run automated tests. Always run this before committing. - `test`: run automated tests. Always run this before committing.
- `jooq-codegen-primary`: generates the jOOQ DSL. - `jooq-codegen-primary`: generates the jOOQ DSL.
@ -62,14 +63,14 @@ SET SPRING_PROFILES_ACTIVE=dev
## Frontend development ## Frontend development
You can run a live development server with `npm run serve` from `/komga-webui`. The dev server will override the URL to connect to `localhost:25600`, so you can also run `gradle bootRun` to have a backend running, serving the API requests. The frontend will be loaded from `localhost:8081`. You can run a live development server with `npm run serve` from `/komga-webui`. The dev server will override the URL to connect to `localhost:8080`, so you can also run `gradle bootRun` to have a backend running, serving the API requests. The frontend will be loaded from `localhost:8081`.
Make sure you start the backend with the `dev` profile, else the frontend requests will be denied because of CORS. Make sure you start the backend with the `dev` profile, else the frontend requests will be denied because of CORS.
## Docker ## Docker
To build the Docker image, you need to: To build the Docker image, you need to:
- have the webui built and copied to `/resources/public`. To do so, run `./gradlew copyWebDist`
- unpack the jar into layers expected by the `Dockerfile`. To do so, run `./gradlew unpack`
- have the webui built and copied to `/resources/public`. To do so, run `./gradlew prepareThymeLeaf` Then you can run `docker build -f ./komga/Dockerfile .`
- prepare the docker image via JReleaser. To do so, run `./gradlew jreleaserPackage`
- the `Dockerfile` will be available in `komga/build/jreleaser/package/docker/`

View file

@ -1,7 +1,7 @@
[![Open Collective backers and sponsors](https://img.shields.io/opencollective/all/komga?label=OpenCollective%20Sponsors&color=success)](https://opencollective.com/komga) ![GitHub Sponsors](https://img.shields.io/github/sponsors/gotson?label=Github%20Sponsors&color=success) [![Open Collective backers and sponsors](https://img.shields.io/opencollective/all/komga?label=OpenCollective%20Sponsors&color=success)](https://opencollective.com/komga) ![GitHub Sponsors](https://img.shields.io/github/sponsors/gotson?label=Github%20Sponsors&color=success)
[![Discord](https://img.shields.io/discord/678794935368941569?label=Discord&color=blue)](https://discord.gg/TdRpkDu) [![Discord](https://img.shields.io/discord/678794935368941569?label=Discord&color=blue)](https://discord.gg/TdRpkDu)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/gotson/komga/ci.yml?branch=master)](https://github.com/gotson/komga/actions?query=workflow%3ACI+branch%3Amaster) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/gotson/komga/CI)](https://github.com/gotson/komga/actions?query=workflow%3ACI+branch%3Amaster)
[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gotson/komga?color=blue&label=download&sort=semver)](https://github.com/gotson/komga/releases) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gotson/komga?color=blue&label=download&sort=semver)](https://github.com/gotson/komga/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/gotson/komga)](https://hub.docker.com/r/gotson/komga) [![Docker Pulls](https://img.shields.io/docker/pulls/gotson/komga)](https://hub.docker.com/r/gotson/komga)
@ -9,8 +9,8 @@
# ![app icon](https://github.com/gotson/komga/raw/master/.github/readme-images/app-icon.png) Komga # ![app icon](https://github.com/gotson/komga/raw/master/.github/readme-images/app-icon.png) Komga
[Komga](https://github.com/gotson/komga) is a media server for your comics, mangas, BDs, magazines and eBooks. [Komga](https://github.com/gotson/komga) is a free and open source comics/mangas/magazines server.
## Usage ## Usage
Please refer to the [official documentation](https://komga.org/docs/installation/docker). Please refer to the [official documentation](https://komga.org/installation/docker.html).

View file

@ -1,45 +1,32 @@
# Error codes # Error codes
| Code | Description | Code | Description
|--------------|---------------------------------------------------------| ---|---
| ERR_1000 | File could not be accessed during analysis | ERR_1000 | File could not be accessed during analysis
| ERR_1001 | Media type is not supported during analysis | ERR_1001 | Media type is not supported during analysis
| ERR_1002 | Encrypted RAR archives are not supported | ERR_1002 | Encrypted RAR archives are not supported
| ERR_1003 | Solid RAR archives are not supported | ERR_1003 | Solid RAR archives are not supported
| ERR_1004 | Multi-Volume RAR archives are not supported | ERR_1004 | Multi-Volume RAR archives are not supported
| ERR_1005 | Unknown error while analyzing book | ERR_1005 | Unknown error while analyzing book
| ERR_1006 | Book does not contain any page | ERR_1006 | Book does not contain any page
| ERR_1007 | Some entries could not be analyzed | ERR_1007 | Some entries could not be analyzed
| ERR_1008 | Unknown error while getting book's entries | ERR_1008 | Unknown error while getting book's entries
| ~~ERR_1009~~ | ~~A read list with that name already exists~~ | ERR_1009 | A read list with that name already exists
| ~~ERR_1010~~ | ~~No books were matched within the read list request~~ | ERR_1010 | No books were matched within the read list request
| ~~ERR_1011~~ | ~~No unique match for series~~ | ERR_1011 | No unique match for series
| ~~ERR_1012~~ | ~~No match for series~~ | ERR_1012 | No match for series
| ~~ERR_1013~~ | ~~No unique match for book number within series~~ | ERR_1013 | No unique match for book number within series
| ~~ERR_1014~~ | ~~No match for book number within series~~ | ERR_1014 | No match for book number within series
| ERR_1015 | Error while deserializing ComicRack ReadingList | ERR_1015 | Error while deserializing ComicRack ReadingList
| ERR_1016 | Directory not accessible or not a directory | ERR_1016 | Directory not accessible or not a directory
| ERR_1017 | Cannot scan folder that is part of an existing library | ERR_1017 | Cannot scan folder that is part of an existing library
| ERR_1018 | File not found | ERR_1018 | File not found
| ERR_1019 | Cannot import file that is part of an existing library | ERR_1019 | Cannot import file that is part of an existing library
| ERR_1020 | Book to upgrade does not belong to provided series | ERR_1020 | Book to upgrade does not belong to provided series
| ERR_1021 | Destination file already exists | ERR_1021 | Destination file already exists
| ERR_1022 | Newly imported book could not be scanned | ERR_1022 | Newly imported book could not be scanned
| ERR_1023 | Book already present in ReadingList | ERR_1023 | Book already present in ReadingList
| ERR_1024 | OAuth2 login error: no email attribute | ERR_1024 | OAuth2 login error: no email attribute
| ERR_1025 | OAuth2 login error: no local user exist with that email | ERR_1025 | OAuth2 login error: no local user exist with that email
| ERR_1026 | OpenIDConnect login error: email not verified | ERR_1026 | OpenIDConnect login error: email not verified
| ERR_1027 | OpenIDConnect login error: no email_verified attribute |
| ERR_1028 | OpenIDConnect login error: no email attribute |
| ERR_1029 | ComicRack CBL does not contain any Book element |
| ERR_1030 | ComicRack CBL has no Name element |
| 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

@ -1,17 +0,0 @@
# Privacy Policy
Komga is a self-hosted application. It does not transmit any data outside the machine hosting it.
## Data collected
Data collected is stored in the local SQLite database required for the application to function, and never leaves your
machine.
### Information provided by the user(s)
- **Email address**: required to create an account
### Information collected automatically
- **IP address and User-Agent of authentication connections**: stored in the local database during authentication
attempts. That information is automatically deleted after one month.

View file

@ -1,7 +1,7 @@
[![Open Collective backers and sponsors](https://img.shields.io/opencollective/all/komga?label=OpenCollective%20Sponsors&color=success)](https://opencollective.com/komga) [![GitHub Sponsors](https://img.shields.io/github/sponsors/gotson?label=Github%20Sponsors&color=success)](https://github.com/sponsors/gotson) [![Open Collective backers and sponsors](https://img.shields.io/opencollective/all/komga?label=OpenCollective%20Sponsors&color=success)](https://opencollective.com/komga) [![GitHub Sponsors](https://img.shields.io/github/sponsors/gotson?label=Github%20Sponsors&color=success)](https://github.com/sponsors/gotson)
[![Discord](https://img.shields.io/discord/678794935368941569?label=Discord&color=blue)](https://discord.gg/TdRpkDu) [![Discord](https://img.shields.io/discord/678794935368941569?label=Discord&color=blue)](https://discord.gg/TdRpkDu)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/gotson/komga/tests.yml?branch=master)](https://github.com/gotson/komga/actions?query=workflow%3ATests+branch%3Amaster) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/gotson/komga/CI)](https://github.com/gotson/komga/actions?query=workflow%3ACI+branch%3Amaster)
[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gotson/komga?color=blue&label=download&sort=semver)](https://github.com/gotson/komga/releases) [![GitHub all releases](https://img.shields.io/github/downloads/gotson/komga/total?color=blue&label=github%20downloads)](https://github.com/gotson/komga/releases) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gotson/komga?color=blue&label=download&sort=semver)](https://github.com/gotson/komga/releases) [![GitHub all releases](https://img.shields.io/github/downloads/gotson/komga/total?color=blue&label=github%20downloads)](https://github.com/gotson/komga/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/gotson/komga)](https://hub.docker.com/r/gotson/komga) [![Docker Pulls](https://img.shields.io/docker/pulls/gotson/komga)](https://hub.docker.com/r/gotson/komga)
@ -9,7 +9,7 @@
# ![app icon](./.github/readme-images/app-icon.png) Komga # ![app icon](./.github/readme-images/app-icon.png) Komga
Komga is a media server for your comics, mangas, BDs, magazines and eBooks. Komga is a free and open source comics/mangas server.
#### Chat on [Discord](https://discord.gg/TdRpkDu) #### Chat on [Discord](https://discord.gg/TdRpkDu)
@ -22,18 +22,15 @@ Komga is a media server for your comics, mangas, BDs, magazines and eBooks.
- Webreader with multiple reading modes - Webreader with multiple reading modes
- Manage multiple users, with per-library access control, age restrictions, and labels restrictions - 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 - 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 - Download book files, whole series, or read lists
- Duplicate files detection - Duplicate files detection
- Duplicate pages detection and removal - Duplicate pages detection and removal
- Import books from outside your libraries directly into your series folder - Import books from outside your libraries directly into your series folder
- Import ComicRack `cbl` read lists - Import ComicRack `cbl` read lists
## Installation ## Download
Refer to the [website](https://komga.org/docs/category/installation) for instructions. Get the app from our [releases page](https://github.com/gotson/komga/releases) or through [Docker](https://hub.docker.com/r/gotson/komga).
## Documentation ## Documentation
@ -47,15 +44,9 @@ Check the [development guidelines](./DEVELOPING.md).
[![Translation status](https://hosted.weblate.org/widgets/komga/-/webui/horizontal-auto.svg)](https://hosted.weblate.org/engage/komga/) [![Translation status](https://hosted.weblate.org/widgets/komga/-/webui/horizontal-auto.svg)](https://hosted.weblate.org/engage/komga/)
## Powered by ## Sponsors
[![Jetbrains_logo](./.github/readme-images/jetbrains.svg)](https://www.jetbrains.com/?from=Komga) [![Jetbrains_logo](./.github/readme-images/sponsors-jetbrains.png)](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 ## Credits

BIN
apple.cer

Binary file not shown.

View file

@ -1,32 +1,24 @@
import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask
import org.jreleaser.model.Active
import org.jreleaser.model.Distribution.DistributionType.SINGLE_JAR
import org.jreleaser.model.api.common.Apply
import kotlin.io.path.Path
import kotlin.io.path.exists
plugins { plugins {
run { run {
val kotlinVersion = "2.2.0" val kotlinVersion = "1.6.21"
kotlin("jvm") version kotlinVersion kotlin("jvm") version kotlinVersion
kotlin("plugin.spring") version kotlinVersion kotlin("plugin.spring") version kotlinVersion
kotlin("kapt") version kotlinVersion kotlin("kapt") version kotlinVersion
} }
id("org.jlleitschuh.gradle.ktlint") version "13.0.0" id("org.jlleitschuh.gradle.ktlint") version "10.2.1"
id("com.github.ben-manes.versions") version "0.52.0" id("com.github.ben-manes.versions") version "0.42.0"
id("org.jreleaser") version "1.19.0"
} }
fun isNonStable(version: String): Boolean { fun isNonStable(version: String): Boolean {
val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.uppercase().contains(it) } val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.toUpperCase().contains(it) }
val unstableKeyword = listOf("ALPHA", "RC").any { version.uppercase().contains(it) } val unstableKeyword = listOf("ALPHA", "RC").any { version.toUpperCase().contains(it) }
val regex = "^[0-9,.v-]+(-r)?$".toRegex() val regex = "^[0-9,.v-]+(-r)?$".toRegex()
val isStable = stableKeyword || regex.matches(version) val isStable = stableKeyword || regex.matches(version)
return unstableKeyword || !isStable return unstableKeyword || !isStable
} }
group = "org.gotson"
allprojects { allprojects {
repositories { repositories {
mavenCentral() mavenCentral()
@ -44,150 +36,14 @@ allprojects {
} }
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> { configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
version = "1.7.1" version.set("0.45.2")
filter { filter {
exclude("**/generated-src/**") exclude("**/db/migration/**")
exclude("**/generated/**")
} }
} }
} }
tasks.wrapper { tasks.wrapper {
gradleVersion = "8.14.3" gradleVersion = "7.4.2"
distributionType = Wrapper.DistributionType.ALL distributionType = Wrapper.DistributionType.ALL
} }
jreleaser {
project {
description = "Media server for comics/mangas/BDs with API and OPDS support"
copyright = "Gauthier Roebroeck"
authors.add("Gauthier Roebroeck")
license = "MIT"
links {
homepage = "https://komga.org"
}
}
release {
github {
discussionCategoryName = "Announcements"
skipTag = true
tagName = "{{projectVersion}}"
changelog {
formatted = Active.ALWAYS
preset = "conventional-commits"
skipMergeCommits = true
links = true
content = (if (Path("./release_notes/release_notes.md").exists()) "{{#f_file_read}}{{basedir}}/release_notes/release_notes.md{{/f_file_read}}" else "") +
"""
## Changelog
{{changelogChanges}}
{{changelogContributors}}
""".trimIndent()
format = "- {{#commitIsConventional}}{{#conventionalCommitIsBreakingChange}}🚨 {{/conventionalCommitIsBreakingChange}}{{#conventionalCommitScope}}**{{conventionalCommitScope}}**: {{/conventionalCommitScope}}{{conventionalCommitDescription}}{{#conventionalCommitBreakingChangeContent}}: *{{conventionalCommitBreakingChangeContent}}*{{/conventionalCommitBreakingChangeContent}} ({{commitShortHash}}){{/commitIsConventional}}{{^commitIsConventional}}{{commitTitle}} ({{commitShortHash}}){{/commitIsConventional}}{{#commitHasIssues}}, closes{{#commitIssues}} {{issue}}{{/commitIssues}}{{/commitHasIssues}}"
hide {
uncategorized = true
contributors = listOf("Weblate", "GitHub", "semantic-release-bot", "[bot]", "github-actions")
}
excludeLabels.add("chore")
category {
title = "🏎 Perf"
key = "perf"
labels.add("perf")
order = 25
}
category {
title = "🌐 Translation"
key = "i18n"
labels.add("i18n")
order = 70
}
category {
title = "⚙️ Dependencies"
key = "dependencies"
labels.add("dependencies")
order = 80
}
labeler {
label = "perf"
title = "regex:^(?:perf(?:\\(.*\\))?!?):\\s.*"
order = 120
}
labeler {
label = "i18n"
title = "regex:^(?:i18n(?:\\(.*\\))?!?):\\s.*"
order = 130
}
labeler {
label = "dependencies"
title = "regex:^(?:deps(?:\\(.*\\))?!?):\\s.*"
order = 140
}
extraProperties.put("categorizeScopes", true)
append {
enabled = true
title = "# [{{projectVersion}}]({{repoUrl}}/compare/{{previousTagName}}...{{tagName}}) ({{#f_now}}YYYY-MM-dd{{/f_now}})"
target = rootDir.resolve("CHANGELOG.md")
content =
"""
{{changelogTitle}}
{{changelogChanges}}
""".trimIndent()
}
}
issues {
enabled = true
comment = "🎉 This issue has been resolved in `{{tagName}}` ([Release Notes]({{releaseNotesUrl}}))"
applyMilestone = Apply.ALWAYS
label {
name = "released"
description = "Issue has been released"
color = "#ededed"
}
}
}
}
distributions {
create("komga") {
active = Active.RELEASE
distributionType = SINGLE_JAR
artifact {
path = rootDir.resolve("komga/build/libs/komga-{{projectVersion}}.jar")
}
}
}
packagers {
docker {
active = Active.RELEASE
continueOnError = false
templateDirectory = rootDir.resolve("komga/docker")
repository.active = Active.NEVER
buildArgs = listOf("--cache-from", "gotson/komga:latest")
imageNames =
listOf(
"komga:latest",
"komga:{{projectVersion}}",
"komga:{{projectVersionMajor}}.x",
)
registries {
create("docker.io") { externalLogin = true }
create("ghcr.io") { externalLogin = true }
}
buildx {
enabled = true
createBuilder = false
platforms =
listOf(
"linux/amd64",
"linux/arm/v7",
"linux/arm64/v8",
)
}
}
}
}

18
ci/docker-common.sh Normal file
View file

@ -0,0 +1,18 @@
# Arguments
# 1: next version
# 2: channel
export DOCKER_CLI_EXPERIMENTAL=enabled
PLATFORMS=linux/amd64,linux/arm/v7,linux/arm64/v8
if [ -z "$2" ]; then
DOCKER_CHANNEL="latest"
else
DOCKER_CHANNEL=$2
fi
VERSION_ARRAY=( ${1//./ } )
VERSION_MAJOR="${VERSION_ARRAY[0]}"
echo "DockerHub channel: $DOCKER_CHANNEL"
echo "Major version: $VERSION_MAJOR"

28
ci/prepare-dockerhub.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Arguments:
# 1: next version
# 2: channel
source "$(dirname "$0")/docker-common.sh" $1 $2
# Unpack fat jar
./gradlew unpack
# Build docker images (no push)
cd komga
docker buildx build \
--platform $PLATFORMS \
--cache-from gotson/komga:$DOCKER_CHANNEL \
--tag gotson/komga:$DOCKER_CHANNEL \
--tag gotson/komga:$VERSION_MAJOR.x \
--tag gotson/komga:$1 \
--file ./Dockerfile .
# Temporary: build legacy adoptopenjdk image
docker buildx build \
--platform $PLATFORMS \
--cache-from gotson/komga:$DOCKER_CHANNEL-legacy \
--tag gotson/komga:$DOCKER_CHANNEL-legacy \
--tag gotson/komga:$VERSION_MAJOR.x-legacy \
--tag gotson/komga:$1-legacy \
--file ./Dockerfile.legacy .

10
ci/prepare-release.sh Executable file
View file

@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Arguments:
# 1: next version
# 2: channel
# Build jar
./gradlew copyWebDist assemble generateOpenApiDocs checksums
# Prepare Dockerhub release
source "$(dirname "$0")/prepare-dockerhub.sh" $1 $2

27
ci/publish-dockerhub.sh Executable file
View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Arguments:
# 1: next version
# 2: channel
source "$(dirname "$0")/docker-common.sh" $1 $2
# Push docker images (built previously)
cd komga
docker buildx build \
--platform $PLATFORMS \
--cache-from gotson/komga:$DOCKER_CHANNEL \
--tag gotson/komga:$DOCKER_CHANNEL \
--tag gotson/komga:$VERSION_MAJOR.x \
--tag gotson/komga:$1 \
--file ./Dockerfile . \
--push
# Temporary: build legacy adoptopenjdk image
docker buildx build \
--platform $PLATFORMS \
--cache-from gotson/komga:$DOCKER_CHANNEL-legacy \
--tag gotson/komga:$DOCKER_CHANNEL-legacy \
--tag gotson/komga:$VERSION_MAJOR.x-legacy \
--tag gotson/komga:$1-legacy \
--file ./Dockerfile.legacy . \
--push

View file

@ -1,69 +0,0 @@
{
"types": {
"refactor": {
"description": "Changes which neither fix a bug nor add a feature"
},
"fix": {
"description": "Changes which patch a bug"
},
"feat": {
"description": "Changes which introduce a new feature"
},
"build": {
"description": "Changes which affect the build system or external dependencies.<br/>Example scopes: gulp, broccoli, npm"
},
"chore": {
"description": "Changes which aren't user-facing"
},
"style": {
"description": "Changes which don't affect code logic, such as white-spaces, formatting, missing semi-colons"
},
"test": {
"description": "Changes which add missing tests or correct existing tests"
},
"docs": {
"description": "Changes which affect documentation"
},
"perf": {
"description": "Changes which improve performance"
},
"i18n": {
"description": "Changes which affect translation"
},
"deps": {
"description": "Changes which affect dependencies"
},
"ci": {
"description": "Changes which affect CI configuration files and scripts.<br/>Example scopes: travis, circle, browser-stack, sauce-labs"
},
"revert": {
"description": "Changes which revert a previous commit"
}
},
"footerTypes": [
{
"name": "BREAKING-CHANGE",
"description": "The commit introduces breaking API changes"
},
{
"name": "Closes",
"description": "The commit closes issues or pull requests"
},
{
"name": "Implements",
"description": "The commit implements features"
},
{
"name": "Author",
"description": "The commit's author"
},
{
"name": "Co-authored-by",
"description": "The commit is co-authored by another person.<br/>For multiple people use one line each"
},
{
"name": "Refs",
"description": "The commit references other commits by their hash ID.<br/>For multiple hash IDs use a comma as separator"
}
]
}

View file

@ -1,24 +0,0 @@
include required("conveyor.conf")
app {
mac.certificate = apple.cer
mac.notarization {
issuer-id = ${env.APPLE_ISSUER_ID}
key-id = ${env.APPLE_KEY_ID}
# the secret is written to file by CI from Github Secrets
private-key = ./secret/apple_private_key.p8
}
site {
consistency-checks = warn
copy-to = "s3:"${env.AWS_S3_BUCKET}/
s3 {
# Still required by Conveyor even though endpoint is set
region = "unused"
access-key-id = ${env.AWS_ACCESS_KEY_ID}
secret-access-key = ${env.AWS_SECRET_ACCESS_KEY}
endpoint = ${env.AWS_S3_ENDPOINT}
}
}
}

View file

@ -1,71 +0,0 @@
include "#!./gradlew -q :komga-tray:printConveyorConfig"
include required("/stdlib/jdk/23/eclipse.conf")
app {
display-name = Komga
fsname = komga
vcs-url = "https://github.com/gotson/komga"
vendor = "Gotson"
description = "Media server for comics/mangas/BDs with API and OPDS support"
license = MIT
icons = "res/komga_text_as_path.svg"
machines = [
windows.amd64,
mac
]
jvm {
// for NightMonkeys & NightCompress
options += "--enable-native-access=ALL-UNNAMED"
mac.options += "-Dspring.profiles.include=mac"
windows.options += "-Dspring.profiles.include=windows"
modules = [
java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.security.jgss
java.sql
java.sql.rowset
java.transaction.xa
java.xml
jdk.jfr
jdk.management
jdk.unsupported
]
}
windows {
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 = 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 {
base-url = "https://download.komga.org"
}
}
conveyor.compatibility-level = 18

View file

@ -1,3 +0,0 @@
include required("conveyor.conf")
app.jvm.modules = detect

View file

@ -1,11 +0,0 @@
include required("conveyor.msstore.conf")
app {
windows {
store {
client-id = ${env.CONVEYOR_MSSTORE_CLIENT_ID}
client-secret = ${env.CONVEYOR_MSSTORE_CLIENT_SECRET}
tenant-id = ${env.CONVEYOR_MSSTORE_TENANT_ID}
}
}
}

View file

@ -1,16 +0,0 @@
include required("conveyor.conf")
app {
fsname = komga-msstore
windows {
manifests.msix.use-update-escape-hatch = false
store {
identity-name = 612Gotson.Komga
publisher = "CN=CF37C563-9649-4277-990F-CDD0CDCB78C1"
publisher-display-name = Gotson
store-id = 9N924KC4S4HG
}
certificate = self signed by ${app.windows.store.publisher}
}
}

View file

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

View file

@ -1,10 +0,0 @@
[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,7 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

47
gradlew vendored
View file

@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -82,11 +80,13 @@ do
esac esac
done done
# This is normally unused APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH="\\\"\\\"" CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@ -133,29 +133,22 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
if ! command -v java >/dev/null 2>&1 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -200,28 +193,18 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# Collect all arguments for the java command: # * put everything else in single quotes, so that it's not re-expanded.
# * 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.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

41
gradlew.bat vendored
View file

@ -13,10 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%" == "" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@ -27,8 +25,7 @@
if "%OS%"=="Windows_NT" setlocal if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%" == "" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -43,13 +40,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if "%ERRORLEVEL%" == "0" goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail
@ -59,34 +56,32 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH= set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @rem Execute Gradle
"%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" %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd if "%ERRORLEVEL%"=="0" goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL% if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
if %EXIT_CODE% equ 0 set EXIT_CODE=1 exit /b 1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View file

@ -1,56 +0,0 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
run {
kotlin("jvm")
kotlin("plugin.spring")
}
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 {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
}
}
tasks {
withType<JavaCompile> {
sourceCompatibility = "17"
targetCompatibility = "17"
}
}
dependencies {
implementation(project(":komga"))
implementation(compose.desktop.currentOs)
implementation(compose.components.resources)
linuxAmd64(compose.desktop.linux_x64)
macAmd64(compose.desktop.macos_x64)
macAarch64(compose.desktop.macos_arm64)
windowsAmd64(compose.desktop.windows_x64)
}
application {
mainClass = "org.gotson.komga.DesktopApplicationKt"
}
// Work around temporary Compose bugs
configurations.all {
attributes {
attribute(Attribute.of("ui", String::class.java), "awt")
}
}

View file

@ -1,20 +0,0 @@
java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.security.jgss
java.sql
java.sql.rowset
java.transaction.xa
java.xml
jdk.jfr
jdk.management
jdk.unsupported

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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