mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-02 18:34:39 -05:00
Compare commits
9 Commits
renovate/m
...
renovate/e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d8556fe87 | ||
|
|
9ca66c18de | ||
|
|
b3c7962503 | ||
|
|
ca93783e72 | ||
|
|
c1d0df8e3a | ||
|
|
612768faeb | ||
|
|
9a1745b626 | ||
|
|
323d58717e | ||
|
|
4d7b7617a9 |
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -42,7 +42,7 @@ body:
|
|||||||
label: Suwayomi-Server version
|
label: Suwayomi-Server version
|
||||||
description: You can find your Suwayomi-Server version in **More → About**.
|
description: You can find your Suwayomi-Server version in **More → About**.
|
||||||
placeholder: |
|
placeholder: |
|
||||||
Example: "v2.2.2100"
|
Example: "v2.3.2226"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
|||||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -6,10 +6,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|||||||
|
|
||||||
## [Unreleased] (Preview)
|
## [Unreleased] (Preview)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- .
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- .
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- .
|
||||||
|
|
||||||
|
## [v2.3.2226] - 2026-07-01
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- (**Extension/API**) Fix GQL handling of extensions without an extension store
|
||||||
|
- (**Build/Bundler**) Fix build continuing if errors happen
|
||||||
|
|
||||||
|
## [v2.3.2223] + [WebUI: v20260509.01] - 2026-06-30
|
||||||
|
|
||||||
|
### Major Changes
|
||||||
|
|
||||||
|
#### Added [SyncYomi](https://github.com/syncyomi/syncyomi) support
|
||||||
|
This allows you to sync your server manga with other Mihon-based forks! As long as the fork supports SyncYomi it can be sync with!
|
||||||
|
|
||||||
|
#### Support Extension API v1.6
|
||||||
|
This update allows Suwayomi to load and use v1.6 extensions, it is a minor improvement over the existing 1.4 extension API that cleans up much of what we had! It is the basis of future extension APIs that will allow for further development.
|
||||||
|
|
||||||
|
This also allows us to move to Mihon's Extension Store system and replace our Extension Repo system. Old Extension Repos are still compatible and will be automatically migrated if they move to the Extension Store system.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Please back up your Extension Repos, because of the new Extension Stores system you may lose them in the update process and may need to re-add them.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- (**Sync**) Added [SyncYomi](https://github.com/syncyomi/syncyomi) support
|
- (**Sync**) Added [SyncYomi](https://github.com/syncyomi/syncyomi) support
|
||||||
- (**OPDS**) Add option to skip chapter metadata feed providing direct stream/download links
|
- (**OPDS**) Add option to skip chapter metadata feed providing direct stream/download links
|
||||||
- (**Extension/API**) Support Extensions API v1.6
|
- (**Extension/API**) Support Extensions API v1.6
|
||||||
|
- (**Tracker/API**) Add mutation to bind existing track record
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- (**Database/H2**) Use the latest H2 database engine
|
- (**Database/H2**) Use the latest H2 database engine
|
||||||
@@ -426,6 +457,7 @@ Huge thanks to @martinek who pulled the most of the weight this release!
|
|||||||
|
|
||||||
<!-- WEBUI LINKS -->
|
<!-- WEBUI LINKS -->
|
||||||
|
|
||||||
|
[WebUI: v20260509.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2026050901-r3147---2026-05-09
|
||||||
[WebUI: v20260508.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2026050801-r3136---2026-05-08
|
[WebUI: v20260508.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2026050801-r3136---2026-05-08
|
||||||
[WebUI: v20251230.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2025123001-r2937---2025-12-30
|
[WebUI: v20251230.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2025123001-r2937---2025-12-30
|
||||||
[WebUI: v20250801.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2025080101-r2717---2025-08-01
|
[WebUI: v20250801.01]: https://github.com/Suwayomi/Suwayomi-WebUI/blob/master/CHANGELOG.md#2025080101-r2717---2025-08-01
|
||||||
@@ -452,7 +484,9 @@ Huge thanks to @martinek who pulled the most of the weight this release!
|
|||||||
|
|
||||||
<!-- SERVER LINKS -->
|
<!-- SERVER LINKS -->
|
||||||
|
|
||||||
[unreleased]: https://github.com/suwayomi/suwayomi-server/compare/v2.2.2100...HEAD
|
[unreleased]: https://github.com/suwayomi/suwayomi-server/compare/v2.3.2226...HEAD
|
||||||
|
[v2.3.2226]: https://github.com/suwayomi/suwayomi-server/compare/v2.3.2223...v2.3.2226
|
||||||
|
[v2.3.2223]: https://github.com/suwayomi/suwayomi-server/compare/v2.2.2100...v2.3.2223
|
||||||
[v2.2.2100]: https://github.com/suwayomi/suwayomi-server/compare/v2.1.1867...v2.2.2100
|
[v2.2.2100]: https://github.com/suwayomi/suwayomi-server/compare/v2.1.1867...v2.2.2100
|
||||||
[v2.1.1867]: https://github.com/suwayomi/suwayomi-server/compare/v2.0.1727...v2.1.1867
|
[v2.1.1867]: https://github.com/suwayomi/suwayomi-server/compare/v2.0.1727...v2.1.1867
|
||||||
[v2.0.1727]: https://github.com/suwayomi/suwayomi-server/compare/v1.1.1...v2.0.1727
|
[v2.0.1727]: https://github.com/suwayomi/suwayomi-server/compare/v1.1.1...v2.0.1727
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import java.io.BufferedReader
|
|||||||
const val MainClass = "suwayomi.tachidesk.MainKt"
|
const val MainClass = "suwayomi.tachidesk.MainKt"
|
||||||
|
|
||||||
// should be bumped with each stable release
|
// should be bumped with each stable release
|
||||||
val getTachideskVersion = { "v2.2.${getCommitCount()}" }
|
val getTachideskVersion = { "v2.3.${getCommitCount()}" }
|
||||||
|
|
||||||
val webUIRevisionTag = "r3136"
|
val webUIRevisionTag = "r3147"
|
||||||
|
|
||||||
val webviewJbrRelease = "jbr-release-25.0.3b508.4"
|
val webviewJbrRelease = "jbr-release-25.0.3b508.4"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ okhttp = "5.4.0" # Major version is locked by Tachiyomi extensions
|
|||||||
javalin = "7.2.2"
|
javalin = "7.2.2"
|
||||||
jte = "3.2.4"
|
jte = "3.2.4"
|
||||||
jackson = "3.2.0" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency`
|
jackson = "3.2.0" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency`
|
||||||
exposed = "1.2.0"
|
exposed = "1.3.1"
|
||||||
dex2jar = "2.4.37"
|
dex2jar = "2.4.37"
|
||||||
polyglot = "25.0.3"
|
polyglot = "25.0.3"
|
||||||
settings = "1.3.0"
|
settings = "1.3.0"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ main() {
|
|||||||
set -- "${POSITIONAL_ARGS[@]}"
|
set -- "${POSITIONAL_ARGS[@]}"
|
||||||
|
|
||||||
OS="$1"
|
OS="$1"
|
||||||
JAR="$(ls server/build/*.jar | tail -n1)"
|
JAR="$(ls server/build/*.jar | tail -n1)" || error $LINENO "No JAR found in server/build/" 1
|
||||||
RELEASE_NAME="$(echo "${JAR%.*}" | xargs basename)-$OS"
|
RELEASE_NAME="$(echo "${JAR%.*}" | xargs basename)-$OS"
|
||||||
RELEASE_VERSION=$(echo "$JAR" | grep -oP "v\K[0-9]+\.[0-9]+\.[0-9]+")
|
RELEASE_VERSION=$(echo "$JAR" | grep -oP "v\K[0-9]+\.[0-9]+\.[0-9]+")
|
||||||
#RELEASE_REVISION_NUMBER="$(tmp="${JAR%.*}" && echo "${tmp##*-}" | tr -d r)"
|
#RELEASE_REVISION_NUMBER="$(tmp="${JAR%.*}" && echo "${tmp##*-}" | tr -d r)"
|
||||||
@@ -34,12 +34,12 @@ main() {
|
|||||||
|
|
||||||
# clean temporary directory on function return
|
# clean temporary directory on function return
|
||||||
trap "rm -rf $RELEASE_NAME/" RETURN
|
trap "rm -rf $RELEASE_NAME/" RETURN
|
||||||
mkdir "$RELEASE_NAME/"
|
mkdir "$RELEASE_NAME/" || error $LINENO "Failed to create release directory" 1
|
||||||
|
|
||||||
download_launcher
|
download_launcher
|
||||||
|
|
||||||
if [ ! -f scripts/resources/catch_abort.so ]; then
|
if [ ! -f scripts/resources/catch_abort.so ]; then
|
||||||
gcc -fPIC -shared scripts/resources/catch_abort.c -lpthread -o scripts/resources/catch_abort.so
|
gcc -fPIC -shared scripts/resources/catch_abort.c -lpthread -o scripts/resources/catch_abort.so || error $LINENO "Failed to compile catch_abort" 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
JRE_ZULU="25.34.17_25.0.3"
|
JRE_ZULU="25.34.17_25.0.3"
|
||||||
@@ -67,7 +67,7 @@ main() {
|
|||||||
linux-assets)
|
linux-assets)
|
||||||
RELEASE="$RELEASE_NAME.tar.gz"
|
RELEASE="$RELEASE_NAME.tar.gz"
|
||||||
copy_linux_package_assets_to "$RELEASE_NAME/"
|
copy_linux_package_assets_to "$RELEASE_NAME/"
|
||||||
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/"
|
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/" || error $LINENO "Failed to create tar.gz" 1
|
||||||
move_release_to_output_dir
|
move_release_to_output_dir
|
||||||
;;
|
;;
|
||||||
linux-x64)
|
linux-x64)
|
||||||
@@ -145,52 +145,55 @@ move_release_to_output_dir() {
|
|||||||
if [ -f "$OUTPUT_DIR/$RELEASE" ]; then
|
if [ -f "$OUTPUT_DIR/$RELEASE" ]; then
|
||||||
rm "$OUTPUT_DIR/$RELEASE"
|
rm "$OUTPUT_DIR/$RELEASE"
|
||||||
fi
|
fi
|
||||||
mv "$RELEASE" "$OUTPUT_DIR/"
|
mv "$RELEASE" "$OUTPUT_DIR/" || error $LINENO "Failed to move release to output dir" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
download_launcher() {
|
download_launcher() {
|
||||||
LAUNCHER_URL=$(curl -sf "https://api.github.com/repos/Suwayomi/Suwayomi-Launcher/releases/latest" | grep "browser_download_url" | grep ".jar" | head -n 1 | cut -d '"' -f 4)
|
LAUNCHER_URL=$(curl -sf "https://api.github.com/repos/Suwayomi/Suwayomi-Launcher/releases/latest" | grep "browser_download_url" | grep ".jar" | head -n 1 | cut -d '"' -f 4)
|
||||||
curl -fL "$LAUNCHER_URL" -o "Suwayomi-Launcher.jar"
|
if [ -z "$LAUNCHER_URL" ]; then
|
||||||
mv "Suwayomi-Launcher.jar" "$RELEASE_NAME/Suwayomi-Launcher.jar"
|
error $LINENO "Failed to determine launcher URL from GitHub API" 1
|
||||||
|
fi
|
||||||
|
curl -fL "$LAUNCHER_URL" -o "Suwayomi-Launcher.jar" || error $LINENO "Failed to download launcher JAR" 1
|
||||||
|
mv "Suwayomi-Launcher.jar" "$RELEASE_NAME/Suwayomi-Launcher.jar" || error $LINENO "Failed to move launcher JAR" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
download_jogamp() {
|
download_jogamp() {
|
||||||
local platform="$1"
|
local platform="$1"
|
||||||
if [ ! -f jogamp-all-platforms.7z ]; then
|
if [ ! -f jogamp-all-platforms.7z ]; then
|
||||||
curl -f "https://jogamp.org/deployment/jogamp-current/archive/jogamp-all-platforms.7z" -o jogamp-all-platforms.7z
|
curl -f "https://jogamp.org/deployment/jogamp-current/archive/jogamp-all-platforms.7z" -o jogamp-all-platforms.7z || error $LINENO "Failed to download jogamp archive" 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
7z x jogamp-all-platforms.7z "jogamp-all-platforms/lib/$platform/"
|
7z x jogamp-all-platforms.7z "jogamp-all-platforms/lib/$platform/" || error $LINENO "Failed to extract jogamp archive" 1
|
||||||
mkdir -p "$RELEASE_NAME/natives/"
|
mkdir -p "$RELEASE_NAME/natives/"
|
||||||
mv jogamp-all-platforms/lib/* "$RELEASE_NAME/natives/"
|
mv jogamp-all-platforms/lib/* "$RELEASE_NAME/natives/" || error $LINENO "Failed to move natives" 1
|
||||||
rm -rf jogamp-all-platforms
|
rm -rf jogamp-all-platforms
|
||||||
}
|
}
|
||||||
|
|
||||||
download_electron() {
|
download_electron() {
|
||||||
if [ ! -f "$ELECTRON" ]; then
|
if [ ! -f "$ELECTRON" ]; then
|
||||||
curl -fL "$ELECTRON_URL" -o "$ELECTRON"
|
curl -fL "$ELECTRON_URL" -o "$ELECTRON" || error $LINENO "Failed to download electron" 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
unzip "$ELECTRON" -d "$RELEASE_NAME/electron/"
|
unzip "$ELECTRON" -d "$RELEASE_NAME/electron/" || error $LINENO "Failed to extract electron" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_jre() {
|
setup_jre() {
|
||||||
if [ -d "jre" ]; then
|
if [ -d "jre" ]; then
|
||||||
chmod +x ./jre/bin/java
|
chmod +x ./jre/bin/java || error $LINENO "Failed to set java executable permission" 1
|
||||||
chmod +x ./jre/lib/jspawnhelper
|
chmod +x ./jre/lib/jspawnhelper || error $LINENO "Failed to set jspawnhelper executable permission" 1
|
||||||
mv "jre" "$RELEASE_NAME/jre"
|
mv "jre" "$RELEASE_NAME/jre" || error $LINENO "Failed to move jre" 1
|
||||||
else
|
else
|
||||||
if [ ! -f "$JRE" ]; then
|
if [ ! -f "$JRE" ]; then
|
||||||
curl -fL "$JRE_URL" -o "$JRE"
|
curl -fL "$JRE_URL" -o "$JRE" || error $LINENO "Failed to download JRE" 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local ext="${JRE##*.}"
|
local ext="${JRE##*.}"
|
||||||
if [ "$ext" = "zip" ]; then
|
if [ "$ext" = "zip" ]; then
|
||||||
unzip "$JRE"
|
unzip "$JRE" || error $LINENO "Failed to extract JRE zip" 1
|
||||||
else
|
else
|
||||||
tar xvf "$JRE"
|
tar xvf "$JRE" || error $LINENO "Failed to extract JRE tar" 1
|
||||||
fi
|
fi
|
||||||
mv "$JRE_DIR" "$RELEASE_NAME/jre"
|
mv "$JRE_DIR" "$RELEASE_NAME/jre" || error $LINENO "Failed to move extracted JRE" 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,31 +201,31 @@ copy_linux_package_assets_to() {
|
|||||||
local output_dir
|
local output_dir
|
||||||
output_dir="$(readlink -e "$1" || exit 1)"
|
output_dir="$(readlink -e "$1" || exit 1)"
|
||||||
|
|
||||||
cp "scripts/resources/pkg/suwayomi-server.sh" "$output_dir/"
|
cp "scripts/resources/pkg/suwayomi-server.sh" "$output_dir/" || error $LINENO "Failed to copy server script" 1
|
||||||
cp "scripts/resources/pkg/suwayomi-server.desktop" "$output_dir/"
|
cp "scripts/resources/pkg/suwayomi-server.desktop" "$output_dir/" || error $LINENO "Failed to copy server desktop file" 1
|
||||||
cp "scripts/resources/pkg/suwayomi-launcher.sh" "$output_dir/"
|
cp "scripts/resources/pkg/suwayomi-launcher.sh" "$output_dir/" || error $LINENO "Failed to copy launcher script" 1
|
||||||
cp "scripts/resources/pkg/suwayomi-launcher.desktop" "$output_dir/"
|
cp "scripts/resources/pkg/suwayomi-launcher.desktop" "$output_dir/" || error $LINENO "Failed to copy launcher desktop file" 1
|
||||||
cp "scripts/resources/pkg/systemd"/* "$output_dir/"
|
cp "scripts/resources/pkg/systemd"/* "$output_dir/" || error $LINENO "Failed to copy systemd files" 1
|
||||||
cp "server/src/main/resources/icon/faviconlogo-128.png" \
|
cp "server/src/main/resources/icon/faviconlogo-128.png" \
|
||||||
"$output_dir/suwayomi-server.png"
|
"$output_dir/suwayomi-server.png" || error $LINENO "Failed to copy icon" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
make_linux_bundle() {
|
make_linux_bundle() {
|
||||||
mkdir "$RELEASE_NAME/bin"
|
mkdir "$RELEASE_NAME/bin"
|
||||||
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar"
|
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar" || error $LINENO "Failed to copy server jar" 1
|
||||||
cp "scripts/resources/suwayomi-launcher.sh" "$RELEASE_NAME/"
|
cp "scripts/resources/suwayomi-launcher.sh" "$RELEASE_NAME/" || error $LINENO "Failed to copy launcher script" 1
|
||||||
cp "scripts/resources/suwayomi-server.sh" "$RELEASE_NAME/"
|
cp "scripts/resources/suwayomi-server.sh" "$RELEASE_NAME/" || error $LINENO "Failed to copy server script" 1
|
||||||
cp "scripts/resources/catch_abort.so" "$RELEASE_NAME/bin/"
|
cp "scripts/resources/catch_abort.so" "$RELEASE_NAME/bin/" || error $LINENO "Failed to copy catch_abort" 1
|
||||||
|
|
||||||
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/"
|
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/" || error $LINENO "Failed to create tar.gz" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
make_macos_bundle() {
|
make_macos_bundle() {
|
||||||
mkdir "$RELEASE_NAME/bin"
|
mkdir "$RELEASE_NAME/bin"
|
||||||
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar"
|
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar" || error $LINENO "Failed to copy server jar" 1
|
||||||
cp "scripts/resources/Suwayomi Launcher.command" "$RELEASE_NAME/"
|
cp "scripts/resources/Suwayomi Launcher.command" "$RELEASE_NAME/" || error $LINENO "Failed to copy launcher command" 1
|
||||||
|
|
||||||
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/"
|
tar -I "gzip -9" -cvf "$RELEASE" "$RELEASE_NAME/" || error $LINENO "Failed to create tar.gz" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# https://wiki.debian.org/SimplePackagingTutorial
|
# https://wiki.debian.org/SimplePackagingTutorial
|
||||||
@@ -233,28 +236,28 @@ make_deb_package() {
|
|||||||
#behind $RELEASE_VERSION is underscore "_"
|
#behind $RELEASE_VERSION is underscore "_"
|
||||||
local upstream_source="suwayomi-server_$RELEASE_VERSION.orig.tar.gz"
|
local upstream_source="suwayomi-server_$RELEASE_VERSION.orig.tar.gz"
|
||||||
|
|
||||||
mkdir "$RELEASE_NAME/$source_dir/"
|
mkdir "$RELEASE_NAME/$source_dir/" || error $LINENO "Failed to create source directory" 1
|
||||||
mv "$RELEASE_NAME/natives" "$RELEASE_NAME/$source_dir/natives"
|
mv "$RELEASE_NAME/natives" "$RELEASE_NAME/$source_dir/natives" || error $LINENO "Failed to move natives" 1
|
||||||
mv "$RELEASE_NAME/Suwayomi-Launcher.jar" "$RELEASE_NAME/$source_dir/Suwayomi-Launcher.jar"
|
mv "$RELEASE_NAME/Suwayomi-Launcher.jar" "$RELEASE_NAME/$source_dir/Suwayomi-Launcher.jar" || error $LINENO "Failed to move launcher jar" 1
|
||||||
cp "$JAR" "$RELEASE_NAME/$source_dir/Suwayomi-Server.jar"
|
cp "$JAR" "$RELEASE_NAME/$source_dir/Suwayomi-Server.jar" || error $LINENO "Failed to copy server jar" 1
|
||||||
copy_linux_package_assets_to "$RELEASE_NAME/$source_dir/"
|
copy_linux_package_assets_to "$RELEASE_NAME/$source_dir/"
|
||||||
cp "scripts/resources/catch_abort.so" "$RELEASE_NAME/$source_dir/"
|
cp "scripts/resources/catch_abort.so" "$RELEASE_NAME/$source_dir/" || error $LINENO "Failed to copy catch_abort" 1
|
||||||
tar -I "gzip" -C "$RELEASE_NAME/" -cvf "$upstream_source" "$source_dir"
|
tar -I "gzip" -C "$RELEASE_NAME/" -cvf "$upstream_source" "$source_dir" || error $LINENO "Failed to create source tar.gz" 1
|
||||||
|
|
||||||
cp -r "scripts/resources/deb/" "$RELEASE_NAME/$source_dir/debian/"
|
cp -r "scripts/resources/deb/" "$RELEASE_NAME/$source_dir/debian/" || error $LINENO "Failed to copy debian resources" 1
|
||||||
sed -i "s/\$pkgver/$RELEASE_VERSION/" "$RELEASE_NAME/$source_dir/debian/changelog"
|
sed -i "s/\$pkgver/$RELEASE_VERSION/" "$RELEASE_NAME/$source_dir/debian/changelog" || error $LINENO "Failed to update changelog" 1
|
||||||
sed -i "s/\$pkgrel/1/" "$RELEASE_NAME/$source_dir/debian/changelog"
|
sed -i "s/\$pkgrel/1/" "$RELEASE_NAME/$source_dir/debian/changelog" || error $LINENO "Failed to update changelog" 1
|
||||||
|
|
||||||
if [ "${CI:-}" = true ]; then
|
if [ "${CI:-}" = true ]; then
|
||||||
sudo apt update
|
sudo apt update || error $LINENO "Failed to update apt" 1
|
||||||
sudo apt install devscripts build-essential dh-exec
|
sudo apt install devscripts build-essential dh-exec || error $LINENO "Failed to install build deps" 1
|
||||||
fi
|
fi
|
||||||
cd "$RELEASE_NAME/$source_dir/"
|
cd "$RELEASE_NAME/$source_dir/" || error $LINENO "Failed to change directory" 1
|
||||||
dpkg-buildpackage --no-sign --build=all
|
dpkg-buildpackage --no-sign --build=all || error $LINENO "Debian package build failed" 1
|
||||||
cd -
|
cd - || error $LINENO "Failed to return to previous directory" 1
|
||||||
|
|
||||||
local deb="suwayomi-server_$RELEASE_VERSION-1_all.deb"
|
local deb="suwayomi-server_$RELEASE_VERSION-1_all.deb"
|
||||||
mv "$RELEASE_NAME/$deb" "$RELEASE"
|
mv "$RELEASE_NAME/$deb" "$RELEASE" || error $LINENO "Failed to move resulting .deb" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# https://linuxconfig.org/building-a-hello-world-appimage-on-linux
|
# https://linuxconfig.org/building-a-hello-world-appimage-on-linux
|
||||||
@@ -262,20 +265,20 @@ make_appimage() {
|
|||||||
local APPIMAGE_URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
local APPIMAGE_URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||||
local APPIMAGE_TOOLNAME="appimagetool-x86_64.AppImage"
|
local APPIMAGE_TOOLNAME="appimagetool-x86_64.AppImage"
|
||||||
mkdir "$RELEASE_NAME/bin/"
|
mkdir "$RELEASE_NAME/bin/"
|
||||||
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar"
|
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar" || error $LINENO "Failed to copy server jar" 1
|
||||||
|
|
||||||
cp "scripts/resources/pkg/suwayomi-server.desktop" "$RELEASE_NAME/suwayomi-server.desktop"
|
cp "scripts/resources/pkg/suwayomi-server.desktop" "$RELEASE_NAME/suwayomi-server.desktop" || error $LINENO "Failed to copy desktop file" 1
|
||||||
cp "server/src/main/resources/icon/faviconlogo.png" "$RELEASE_NAME/suwayomi-server.png"
|
cp "server/src/main/resources/icon/faviconlogo.png" "$RELEASE_NAME/suwayomi-server.png" || error $LINENO "Failed to copy icon" 1
|
||||||
cp "scripts/resources/appimage/AppRun" "$RELEASE_NAME/AppRun"
|
cp "scripts/resources/appimage/AppRun" "$RELEASE_NAME/AppRun" || error $LINENO "Failed to copy AppRun" 1
|
||||||
chmod +x "$RELEASE_NAME/AppRun"
|
chmod +x "$RELEASE_NAME/AppRun" || error $LINENO "Failed to make AppRun executable" 1
|
||||||
|
|
||||||
if [ "${CI:-}" = true ]; then
|
if [ "${CI:-}" = true ]; then
|
||||||
sudo apt update
|
sudo apt update || error $LINENO "Failed to update apt" 1
|
||||||
sudo apt install libfuse2
|
sudo apt install libfuse2 || error $LINENO "Failed to install libfuse2" 1
|
||||||
fi
|
fi
|
||||||
curl -fL $APPIMAGE_URL -o $APPIMAGE_TOOLNAME
|
curl -fL $APPIMAGE_URL -o $APPIMAGE_TOOLNAME || error $LINENO "Failed to download appimagetool" 1
|
||||||
chmod +x $APPIMAGE_TOOLNAME
|
chmod +x $APPIMAGE_TOOLNAME || error $LINENO "Failed to make appimagetool executable" 1
|
||||||
ARCH=x86_64 ./$APPIMAGE_TOOLNAME "$RELEASE_NAME" "$RELEASE"
|
ARCH=x86_64 ./$APPIMAGE_TOOLNAME "$RELEASE_NAME" "$RELEASE" || error $LINENO "AppImage creation failed" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
make_windows_bundle() {
|
make_windows_bundle() {
|
||||||
@@ -300,7 +303,7 @@ make_windows_bundle() {
|
|||||||
#local rcedit_url="https://github.com/electron/rcedit/releases/download/v0.1.1/$rcedit"
|
#local rcedit_url="https://github.com/electron/rcedit/releases/download/v0.1.1/$rcedit"
|
||||||
## change electron's icon
|
## change electron's icon
|
||||||
#if [ ! -f "$rcedit" ]; then
|
#if [ ! -f "$rcedit" ]; then
|
||||||
#curl -fL "$rcedit_url" -o "$rcedit"
|
#curl -fL "$rcedit_url" -o "$rcedit" || error $LINENO "Failed to download rcedit" 1
|
||||||
#fi
|
#fi
|
||||||
|
|
||||||
#local icon="server/src/main/resources/icon/faviconlogo.ico"
|
#local icon="server/src/main/resources/icon/faviconlogo.ico"
|
||||||
@@ -308,38 +311,38 @@ make_windows_bundle() {
|
|||||||
# --set-icon "$icon"
|
# --set-icon "$icon"
|
||||||
|
|
||||||
mkdir "$RELEASE_NAME/bin"
|
mkdir "$RELEASE_NAME/bin"
|
||||||
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar"
|
cp "$JAR" "$RELEASE_NAME/bin/Suwayomi-Server.jar" || error $LINENO "Failed to copy server jar" 1
|
||||||
cp "scripts/resources/Suwayomi Launcher.bat" "$RELEASE_NAME"
|
cp "scripts/resources/Suwayomi Launcher.bat" "$RELEASE_NAME" || error $LINENO "Failed to copy launcher bat" 1
|
||||||
|
|
||||||
zip -9 -r "$RELEASE" "$RELEASE_NAME"
|
zip -9 -r "$RELEASE" "$RELEASE_NAME" || error $LINENO "Failed to create windows bundle zip" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
make_windows_package() {
|
make_windows_package() {
|
||||||
if [ "${CI:-}" = true ]; then
|
if [ "${CI:-}" = true ]; then
|
||||||
sudo apt update
|
sudo apt update || error $LINENO "Failed to update apt" 1
|
||||||
sudo apt install -y wixl
|
sudo apt install -y wixl || error $LINENO "Failed to install wixl" 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find "$RELEASE_NAME/jre" \
|
find "$RELEASE_NAME/jre" \
|
||||||
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
||||||
--directory-ref jre --component-group jre >"$RELEASE_NAME/jre.wxs"
|
--directory-ref jre --component-group jre >"$RELEASE_NAME/jre.wxs" || error $LINENO "Failed to heat jre" 1
|
||||||
find "$RELEASE_NAME/electron" \
|
find "$RELEASE_NAME/electron" \
|
||||||
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
||||||
--directory-ref electron --component-group electron >"$RELEASE_NAME/electron.wxs"
|
--directory-ref electron --component-group electron >"$RELEASE_NAME/electron.wxs" || error $LINENO "Failed to heat electron" 1
|
||||||
find "$RELEASE_NAME/natives" \
|
find "$RELEASE_NAME/natives" \
|
||||||
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
||||||
--directory-ref natives --component-group natives >"$RELEASE_NAME/natives.wxs"
|
--directory-ref natives --component-group natives >"$RELEASE_NAME/natives.wxs" || error $LINENO "Failed to heat natives" 1
|
||||||
|
|
||||||
find "$RELEASE_NAME/bin" \
|
find "$RELEASE_NAME/bin" \
|
||||||
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
| wixl-heat --var var.SourceDir -p "$RELEASE_NAME/" \
|
||||||
--directory-ref bin --component-group bin >"$RELEASE_NAME/bin.wxs"
|
--directory-ref bin --component-group bin >"$RELEASE_NAME/bin.wxs" || error $LINENO "Failed to heat bin" 1
|
||||||
|
|
||||||
local icon="server/src/main/resources/icon/faviconlogo.ico"
|
local icon="server/src/main/resources/icon/faviconlogo.ico"
|
||||||
local arch=${OS##*-}
|
local arch=${OS##*-}
|
||||||
|
|
||||||
wixl -D ProductVersion="$RELEASE_VERSION" -D SourceDir="$RELEASE_NAME" \
|
wixl -D ProductVersion="$RELEASE_VERSION" -D SourceDir="$RELEASE_NAME" \
|
||||||
-D Icon="$icon" --arch "$arch" "scripts/resources/msi/suwayomi-server-$arch.wxs" \
|
-D Icon="$icon" --arch "$arch" "scripts/resources/msi/suwayomi-server-$arch.wxs" \
|
||||||
"$RELEASE_NAME/jre.wxs" "$RELEASE_NAME/electron.wxs" "$RELEASE_NAME/natives.wxs" "$RELEASE_NAME/bin.wxs" -o "$RELEASE"
|
"$RELEASE_NAME/jre.wxs" "$RELEASE_NAME/electron.wxs" "$RELEASE_NAME/natives.wxs" "$RELEASE_NAME/bin.wxs" -o "$RELEASE" || error $LINENO "Windows package build failed" 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Error handler
|
# Error handler
|
||||||
|
|||||||
@@ -148,6 +148,36 @@ class TrackMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class BindTrackRecordInput(
|
||||||
|
val clientMutationId: String? = null,
|
||||||
|
val mangaId: Int,
|
||||||
|
val trackRecordId: Int,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BindTrackRecordPayload(
|
||||||
|
val clientMutationId: String?,
|
||||||
|
val trackRecord: TrackRecordType,
|
||||||
|
)
|
||||||
|
|
||||||
|
@RequireAuth
|
||||||
|
fun bindTrackRecord(input: BindTrackRecordInput): CompletableFuture<BindTrackRecordPayload?> {
|
||||||
|
val (clientMutationId, mangaId, trackRecordId) = input
|
||||||
|
|
||||||
|
return future {
|
||||||
|
val boundTrackRecordId = Track.bindTrackRecord(mangaId, trackRecordId)
|
||||||
|
|
||||||
|
val trackRecord =
|
||||||
|
transaction {
|
||||||
|
TrackRecordTable.selectAll().where { TrackRecordTable.id eq boundTrackRecordId }.first()
|
||||||
|
}
|
||||||
|
|
||||||
|
BindTrackRecordPayload(
|
||||||
|
clientMutationId,
|
||||||
|
TrackRecordType(trackRecord),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data class FetchTrackInput(
|
data class FetchTrackInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
val recordId: Int,
|
val recordId: Int,
|
||||||
|
|||||||
@@ -71,8 +71,8 @@ class ExtensionType(
|
|||||||
fun source(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<SourceNodeList> =
|
fun source(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<SourceNodeList> =
|
||||||
dataFetchingEnvironment.getValueFromDataLoader<String, SourceNodeList>("SourcesForExtensionDataLoader", pkgName)
|
dataFetchingEnvironment.getValueFromDataLoader<String, SourceNodeList>("SourcesForExtensionDataLoader", pkgName)
|
||||||
|
|
||||||
fun extensionStore(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<ExtensionStoreType> =
|
fun extensionStore(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<ExtensionStoreType?> =
|
||||||
dataFetchingEnvironment.getValueFromDataLoader<String, ExtensionStoreType>("ExtensionStoreDataLoader", storeIndexUrl.orEmpty())
|
dataFetchingEnvironment.getValueFromDataLoader<String, ExtensionStoreType?>("ExtensionStoreDataLoader", storeIndexUrl.orEmpty())
|
||||||
}
|
}
|
||||||
|
|
||||||
data class ExtensionNodeList(
|
data class ExtensionNodeList(
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ object Manga {
|
|||||||
it[MangaTable.lastFetchedAt] = Instant.now().epochSecond
|
it[MangaTable.lastFetchedAt] = Instant.now().epochSecond
|
||||||
|
|
||||||
it[MangaTable.updateStrategy] = sManga.update_strategy.name
|
it[MangaTable.updateStrategy] = sManga.update_strategy.name
|
||||||
|
it[MangaTable.memo] = Json.encodeToString(sManga.memo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ package suwayomi.tachidesk.manga.impl.backup.proto.handlers
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||||
import kotlinx.serialization.json.Json
|
|
||||||
import org.jetbrains.exposed.v1.core.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.v1.core.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.v1.core.and
|
import org.jetbrains.exposed.v1.core.and
|
||||||
@@ -78,7 +77,7 @@ object BackupMangaHandler {
|
|||||||
lastModifiedAt = mangaRow[MangaTable.lastModifiedAt],
|
lastModifiedAt = mangaRow[MangaTable.lastModifiedAt],
|
||||||
version = mangaRow[MangaTable.version],
|
version = mangaRow[MangaTable.version],
|
||||||
initialized = mangaRow[MangaTable.initialized],
|
initialized = mangaRow[MangaTable.initialized],
|
||||||
memo = Json.encodeToString(mangaRow[MangaTable.memo]).encodeToByteArray(),
|
memo = mangaRow[MangaTable.memo].encodeToByteArray(),
|
||||||
)
|
)
|
||||||
|
|
||||||
val mangaId = mangaRow[MangaTable.id].value
|
val mangaId = mangaRow[MangaTable.id].value
|
||||||
@@ -116,6 +115,7 @@ object BackupMangaHandler {
|
|||||||
sourceOrder = chapters.size - it[ChapterTable.sourceOrder],
|
sourceOrder = chapters.size - it[ChapterTable.sourceOrder],
|
||||||
lastModifiedAt = it[ChapterTable.lastModifiedAt],
|
lastModifiedAt = it[ChapterTable.lastModifiedAt],
|
||||||
version = it[ChapterTable.version],
|
version = it[ChapterTable.version],
|
||||||
|
memo = it[ChapterTable.memo].encodeToByteArray(),
|
||||||
).apply {
|
).apply {
|
||||||
if (flags.includeClientData) {
|
if (flags.includeClientData) {
|
||||||
this.meta = chapterToMeta[it[ChapterTable.id].value] ?: emptyMap()
|
this.meta = chapterToMeta[it[ChapterTable.id].value] ?: emptyMap()
|
||||||
|
|||||||
@@ -222,6 +222,48 @@ object Track {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun bindTrackRecord(
|
||||||
|
mangaId: Int,
|
||||||
|
trackRecordId: Int,
|
||||||
|
): Int {
|
||||||
|
val (trackRecord, existingTrackRecord) =
|
||||||
|
transaction {
|
||||||
|
val trackRecord =
|
||||||
|
TrackRecordTable
|
||||||
|
.selectAll()
|
||||||
|
.where {
|
||||||
|
(TrackRecordTable.id eq trackRecordId)
|
||||||
|
}.first()
|
||||||
|
.toTrackRecordDataClass()
|
||||||
|
|
||||||
|
val existingTrackRecord =
|
||||||
|
TrackRecordTable
|
||||||
|
.selectAll()
|
||||||
|
.where {
|
||||||
|
(TrackRecordTable.mangaId eq mangaId) and (TrackRecordTable.trackerId eq trackRecord.trackerId)
|
||||||
|
}.firstOrNull()
|
||||||
|
?.toTrackRecordDataClass()
|
||||||
|
|
||||||
|
trackRecord to existingTrackRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
val isAlreadyBoundToManga = trackRecord.mangaId == mangaId
|
||||||
|
if (isAlreadyBoundToManga) {
|
||||||
|
return trackRecordId
|
||||||
|
}
|
||||||
|
|
||||||
|
val hasRecordForTracker = existingTrackRecord != null
|
||||||
|
if (hasRecordForTracker) {
|
||||||
|
val updatedTrack = trackRecord.copy(id = existingTrackRecord.id, mangaId = mangaId).toTrack()
|
||||||
|
|
||||||
|
return updateTrackRecord(updatedTrack)
|
||||||
|
}
|
||||||
|
|
||||||
|
val newTrack = trackRecord.copy(mangaId = mangaId).toTrack()
|
||||||
|
|
||||||
|
return insertTrackRecord(newTrack)
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun refresh(recordId: Int) {
|
suspend fun refresh(recordId: Int) {
|
||||||
val recordDb =
|
val recordDb =
|
||||||
transaction {
|
transaction {
|
||||||
@@ -423,9 +465,9 @@ object Track {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateTrackRecord(track: Track) = updateTrackRecords(listOf(track))
|
fun updateTrackRecord(track: Track): Int = updateTrackRecords(listOf(track)).first()
|
||||||
|
|
||||||
fun updateTrackRecords(tracks: List<Track>) =
|
fun updateTrackRecords(tracks: List<Track>): List<Int> =
|
||||||
transaction {
|
transaction {
|
||||||
if (tracks.isNotEmpty()) {
|
if (tracks.isNotEmpty()) {
|
||||||
BatchUpdateStatement(TrackRecordTable)
|
BatchUpdateStatement(TrackRecordTable)
|
||||||
@@ -447,6 +489,8 @@ object Track {
|
|||||||
}.toExecutable()
|
}.toExecutable()
|
||||||
.execute(this@transaction)
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tracks.map { it.id!! }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun insertTrackRecord(track: Track): Int = insertTrackRecords(listOf(track)).first()
|
fun insertTrackRecord(track: Track): Int = insertTrackRecords(listOf(track)).first()
|
||||||
|
|||||||
Reference in New Issue
Block a user