diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 2234fd19..b88af641 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -50,13 +50,19 @@ jobs: cd master curl https://raw.githubusercontent.com/Suwayomi/Tachidesk/android-jar/android.jar -o AndroidCompat/lib/android.jar + - name: Cache node_modules + uses: actions/cache@v2 + with: + path: | + **/webUI/node_modules + key: ${{ runner.os }}-${{ hashFiles('**/webUI/yarn.lock') }} - - name: Build Jar + - name: Build and copy webUI, Build Jar uses: eskatos/gradle-command-action@v1 with: build-root-directory: master wrapper-directory: master - arguments: :server:shadowJar --stacktrace + arguments: :webUI:copyBuild :server:shadowJar --stacktrace wrapper-cache-enabled: true dependencies-cache-enabled: true configuration-cache-enabled: true \ No newline at end of file diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index 3b20b114..dc4b5c66 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -52,14 +52,21 @@ jobs: cd master curl https://raw.githubusercontent.com/Suwayomi/Tachidesk/android-jar/android.jar -o AndroidCompat/lib/android.jar - - name: Build Jar + - name: Cache node_modules + uses: actions/cache@v2 + with: + path: | + **/webUI/node_modules + key: ${{ runner.os }}-${{ hashFiles('**/webUI/yarn.lock') }} + + - name: Build and copy webUI, Build Jar uses: eskatos/gradle-command-action@v1 env: ProductBuildType: "Preview" with: build-root-directory: master wrapper-directory: master - arguments: :server:shadowJar --stacktrace + arguments: :webUI:copyBuild :server:shadowJar --stacktrace wrapper-cache-enabled: true dependencies-cache-enabled: true configuration-cache-enabled: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 34cd9644..17de18e9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -51,14 +51,21 @@ jobs: cd master curl https://raw.githubusercontent.com/Suwayomi/Tachidesk/android-jar/android.jar -o AndroidCompat/lib/android.jar - - name: Build Jar + - name: Cache node_modules + uses: actions/cache@v2 + with: + path: | + **/webUI/node_modules + key: ${{ runner.os }}-${{ hashFiles('**/webUI/yarn.lock') }} + + - name: Build and copy webUI, Build Jar uses: eskatos/gradle-command-action@v1 env: ProductBuildType: "Stable" with: build-root-directory: master wrapper-directory: master - arguments: :server:shadowJar --stacktrace + arguments: :webUI:copyBuild :server:shadowJar --stacktrace wrapper-cache-enabled: true dependencies-cache-enabled: true configuration-cache-enabled: true @@ -74,7 +81,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - file: "master/server/build/*.jar" + file: "master/server/build/*.jar;master/server/build/*.zip" tags: true draft: true verbose: true diff --git a/scripts/resources/Tachidesk Launcher.bat b/scripts/resources/Tachidesk Browser Launcher.bat similarity index 100% rename from scripts/resources/Tachidesk Launcher.bat rename to scripts/resources/Tachidesk Browser Launcher.bat diff --git a/scripts/resources/Tachidesk Electron Launcher.bat b/scripts/resources/Tachidesk Electron Launcher.bat new file mode 100644 index 00000000..3c951c02 --- /dev/null +++ b/scripts/resources/Tachidesk Electron Launcher.bat @@ -0,0 +1 @@ +jre\bin\javaw "-Dsuwayomi.tachidesk.server.webInterface=electron" "-Dsuwayomi.tachidesk.server.electronPath=electron/electron.exe" -jar Tachidesk.jar diff --git a/scripts/resources/Tachidesk Launcher.c b/scripts/resources/Tachidesk Launcher.c new file mode 100644 index 00000000..8d941d9b --- /dev/null +++ b/scripts/resources/Tachidesk Launcher.c @@ -0,0 +1,5 @@ +#include + +int main() { + system("start jre\\bin\\javaw -jar Tachidesk.jar"); +} diff --git a/scripts/windows-bundler.sh b/scripts/windows-bundler.sh index ef2cfb05..debc47a5 100755 --- a/scripts/windows-bundler.sh +++ b/scripts/windows-bundler.sh @@ -6,12 +6,16 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. +electron_version="v12.0.9" + if [ $1 = "win32" ]; then jre="OpenJDK8U-jre_x86-32_windows_hotspot_8u292b10.zip" arch="win32" + electron="electron-$electron_version-win32-ia32.zip" else jre="OpenJDK8U-jre_x64_windows_hotspot_8u292b10.zip" arch="win64" + electron="electron-$electron_version-win32-x64.zip" fi jre_dir="jdk8u292-b10-jre" @@ -34,10 +38,37 @@ fi unzip $jre mv $jre_dir $release_name/jre +echo "Dealing with electron" +if [ ! -f $electron ]; then + curl -L "https://github.com/electron/electron/releases/download/$electron_version/$electron" -o $electron +fi +unzip $electron -d $release_name/electron + +# change electron's icon +rcedit="rcedit-x86.exe" +if [ ! -f $rcedit ]; then + curl -L "https://github.com/electron/rcedit/releases/download/v1.1.1/$rcedit" -o $rcedit +fi + +# check if running under github actions +if [ $CI = true ]; then + # change electron executable's icon + sudo dpkg --add-architecture i386 + wget -qO - https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add - + sudo add-apt-repository ppa:cybermax-dexter/sdl2-backport + sudo apt-add-repository "deb https://dl.winehq.org/wine-builds/ubuntu $(lsb_release -cs) main" + sudo apt install --install-recommends winehq-stable +fi +# this script assumes that wine is installed here on out + +WINEARCH=win32 wine $rcedit $release_name/electron/electron.exe --set-icon ../server/src/main/resources/icon/faviconlogo.ico + # copy artifacts cp $jar $release_name/Tachidesk.jar -cp "resources/Tachidesk Launcher.bat" $release_name +#cp "resources/Tachidesk Launcher-$arch.exe" "$release_name/Tachidesk Launcher.exe" +cp "resources/Tachidesk Browser Launcher.bat" $release_name cp "resources/Tachidesk Debug Launcher.bat" $release_name +cp "resources/Tachidesk Electron Launcher.bat" $release_name zip_name=$release_name.zip zip -9 -r $zip_name $release_name diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 7abbfdf9..1294bad1 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -172,6 +172,7 @@ tasks { named("processResources") { duplicatesStrategy = DuplicatesStrategy.INCLUDE + mustRunAfter(":webUI:copyBuild") } withType { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt index 7d5944d8..b7331fe7 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt @@ -16,6 +16,7 @@ import mu.KotlinLogging import suwayomi.tachidesk.anime.AnimeAPI import suwayomi.tachidesk.global.GlobalAPI import suwayomi.tachidesk.manga.MangaAPI +import suwayomi.tachidesk.server.util.Browser import java.io.IOException import java.util.concurrent.CompletableFuture import kotlin.concurrent.thread @@ -30,8 +31,28 @@ object JavalinSetup { } fun javalinSetup() { + var hasWebUiBundled = false + val app = Javalin.create { config -> + try { + // if the bellow line throws an exception then webUI is not bundled + this::class.java.getResource("/webUI/index.html") + + // no exception so we can tell javalin to serve webUI + hasWebUiBundled = true + config.addStaticFiles("/webUI") + config.addSinglePageRoot("/", "/webUI/index.html") + } catch (e: RuntimeException) { + logger.warn("react build files are missing.") + hasWebUiBundled = false + } config.enableCorsForAllOrigins() + }.events { event -> + event.serverStarted { + if (hasWebUiBundled && serverConfig.initialOpenInBrowserEnabled) { + Browser.openInBrowser() + } + } }.start(serverConfig.ip, serverConfig.port) // when JVM is prompted to shutdown, stop javalin gracefully