mirror of
https://github.com/KRTirtho/spotube.git
synced 2026-11-04 10:13:59 +00:00
Compare commits
7 Commits
50f79f3c4d
...
def946c549
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
def946c549 | ||
|
|
069b586d44 | ||
|
|
ced26462a9 | ||
|
|
d4d8ebd853 | ||
|
|
2f7eb742cf | ||
|
|
b333c299d1 | ||
|
|
b0327fd224 |
106
.github/workflows/spotube-release-binary.yml
vendored
106
.github/workflows/spotube-release-binary.yml
vendored
@ -22,17 +22,18 @@ on:
|
|||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
|
|
||||||
|
# Read-only by default; only create-release gets write access
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
# Never cancel a running release when another is dispatched, and let stable and nightly run side by side
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.release_type }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
COMPOSE_WEBVIEW_REPO: KRTirtho/ComposeNativeWebview
|
COMPOSE_WEBVIEW_REPO: KRTirtho/ComposeNativeWebview
|
||||||
COMPOSE_WEBVIEW_COMMIT: cbd36f88927298a28a2d64c6acf7ec3b2def6f9d
|
COMPOSE_WEBVIEW_COMMIT: cbd36f88927298a28a2d64c6acf7ec3b2def6f9d
|
||||||
GRADLE_PLUGIN_REPO: team-spotube/gradle-plugin
|
|
||||||
VLCJ_BUNDLER_REPO: team-spotube/vlcj-bundler-gradle-plugin
|
|
||||||
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit on shared runners
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
prepare-deps:
|
prepare-deps:
|
||||||
@ -47,20 +48,6 @@ jobs:
|
|||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
path: compose-webview
|
path: compose-webview
|
||||||
|
|
||||||
- name: Checkout gradle-plugin
|
|
||||||
uses: actions/checkout@v7
|
|
||||||
with:
|
|
||||||
repository: ${{ env.GRADLE_PLUGIN_REPO }}
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
path: gradle-plugin
|
|
||||||
|
|
||||||
- name: Checkout vlcj-bundler
|
|
||||||
uses: actions/checkout@v7
|
|
||||||
with:
|
|
||||||
repository: ${{ env.VLCJ_BUNDLER_REPO }}
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
path: vlcj-bundler
|
|
||||||
|
|
||||||
- name: Set up JDK 21
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v6
|
uses: actions/setup-java@v6
|
||||||
with:
|
with:
|
||||||
@ -82,18 +69,6 @@ jobs:
|
|||||||
chmod +x gradlew
|
chmod +x gradlew
|
||||||
./gradlew publishToMavenLocal
|
./gradlew publishToMavenLocal
|
||||||
|
|
||||||
- name: Publish gradle-plugin to mavenLocal
|
|
||||||
working-directory: gradle-plugin
|
|
||||||
run: |
|
|
||||||
chmod +x gradlew
|
|
||||||
./gradlew publishToMavenLocal
|
|
||||||
|
|
||||||
- name: Publish vlcj-bundler to mavenLocal
|
|
||||||
working-directory: vlcj-bundler
|
|
||||||
run: |
|
|
||||||
chmod +x gradlew
|
|
||||||
./gradlew publishToMavenLocal
|
|
||||||
|
|
||||||
- name: Upload maven local
|
- name: Upload maven local
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
@ -103,6 +78,7 @@ jobs:
|
|||||||
build-android:
|
build-android:
|
||||||
name: Android
|
name: Android
|
||||||
needs: prepare-deps
|
needs: prepare-deps
|
||||||
|
timeout-minutes: 120
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
@ -129,17 +105,23 @@ jobs:
|
|||||||
run: chmod +x gradlew
|
run: chmod +x gradlew
|
||||||
|
|
||||||
- name: Decode keystore
|
- name: Decode keystore
|
||||||
|
env:
|
||||||
|
KEYSTORE: ${{ secrets.KEYSTORE }}
|
||||||
run: |
|
run: |
|
||||||
echo '${{ secrets.KEYSTORE }}' | base64 --decode > "${{ github.workspace }}/composeApp/upload-keystore.jks"
|
echo "$KEYSTORE" | base64 --decode > "${{ github.workspace }}/composeApp/upload-keystore.jks"
|
||||||
|
|
||||||
- name: Configure Android signing
|
- name: Configure Android signing
|
||||||
working-directory: composeApp
|
working-directory: composeApp
|
||||||
|
env:
|
||||||
|
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
|
||||||
|
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
|
||||||
|
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
cat >> local.properties <<EOF
|
cat >> local.properties <<EOF
|
||||||
release.signing.storeFile=${{ github.workspace }}/composeApp/upload-keystore.jks
|
release.signing.storeFile=${{ github.workspace }}/composeApp/upload-keystore.jks
|
||||||
release.signing.storePassword=${{ secrets.KEYSTORE_PASSWORD }}
|
release.signing.storePassword=${KEYSTORE_PASSWORD}
|
||||||
release.signing.keyAlias=${{ secrets.KEYSTORE_KEY_ALIAS }}
|
release.signing.keyAlias=${KEYSTORE_KEY_ALIAS}
|
||||||
release.signing.keyPassword=${{ secrets.KEYSTORE_KEY_PASSWORD }}
|
release.signing.keyPassword=${KEYSTORE_KEY_PASSWORD}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
- name: Assemble Release
|
- name: Assemble Release
|
||||||
@ -170,6 +152,7 @@ jobs:
|
|||||||
build-linux:
|
build-linux:
|
||||||
name: Linux Desktop
|
name: Linux Desktop
|
||||||
needs: prepare-deps
|
needs: prepare-deps
|
||||||
|
timeout-minutes: 120
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
@ -204,9 +187,13 @@ jobs:
|
|||||||
uses: actions/cache@v6
|
uses: actions/cache@v6
|
||||||
with:
|
with:
|
||||||
path: ~/.gradle/nucleus/graalvm
|
path: ~/.gradle/nucleus/graalvm
|
||||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||||
|
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||||
|
|
||||||
- name: Package Linux
|
- name: Package Linux
|
||||||
|
env:
|
||||||
|
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
- name: Rename Linux artifacts
|
- name: Rename Linux artifacts
|
||||||
@ -237,13 +224,17 @@ jobs:
|
|||||||
build-linux-arm64:
|
build-linux-arm64:
|
||||||
name: Linux Desktop (aarch64)
|
name: Linux Desktop (aarch64)
|
||||||
needs: prepare-deps
|
needs: prepare-deps
|
||||||
|
timeout-minutes: 120
|
||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-24.04-arm
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
# The arm64 runner image ships without an Android SDK, but :composeApp configuration requires one
|
# The arm64 runner image ships without an Android SDK/NDK, but :composeApp configuration needs both
|
||||||
|
# (Gobley's cargo plugin resolves the NDK directory for the Android Rust targets)
|
||||||
- name: Set up Android SDK
|
- name: Set up Android SDK
|
||||||
uses: android-actions/setup-android@v4
|
uses: android-actions/setup-android@v4
|
||||||
|
with:
|
||||||
|
packages: tools platform-tools ndk;28.2.13676358
|
||||||
|
|
||||||
- name: Download maven local
|
- name: Download maven local
|
||||||
uses: actions/download-artifact@v8
|
uses: actions/download-artifact@v8
|
||||||
@ -275,10 +266,14 @@ jobs:
|
|||||||
uses: actions/cache@v6
|
uses: actions/cache@v6
|
||||||
with:
|
with:
|
||||||
path: ~/.gradle/nucleus/graalvm
|
path: ~/.gradle/nucleus/graalvm
|
||||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||||
|
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||||
|
|
||||||
- name: Package Linux
|
- name: Package Linux
|
||||||
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm --stacktrace -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
env:
|
||||||
|
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: ./gradlew :composeApp:packageGraalvmDeb :composeApp:packageGraalvmRpm -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
- name: Rename Linux artifacts
|
- name: Rename Linux artifacts
|
||||||
run: |
|
run: |
|
||||||
@ -308,6 +303,7 @@ jobs:
|
|||||||
build-windows:
|
build-windows:
|
||||||
name: Windows Desktop
|
name: Windows Desktop
|
||||||
needs: prepare-deps
|
needs: prepare-deps
|
||||||
|
timeout-minutes: 120
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
@ -338,9 +334,13 @@ jobs:
|
|||||||
uses: actions/cache@v6
|
uses: actions/cache@v6
|
||||||
with:
|
with:
|
||||||
path: ~/.gradle/nucleus/graalvm
|
path: ~/.gradle/nucleus/graalvm
|
||||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||||
|
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||||
|
|
||||||
- name: Package EXE
|
- name: Package EXE
|
||||||
|
env:
|
||||||
|
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: ./gradlew :composeApp:packageGraalvmExe -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
run: ./gradlew :composeApp:packageGraalvmExe -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
- name: Rename Windows artifacts
|
- name: Rename Windows artifacts
|
||||||
@ -366,6 +366,7 @@ jobs:
|
|||||||
build-macos:
|
build-macos:
|
||||||
name: macOS Desktop
|
name: macOS Desktop
|
||||||
needs: prepare-deps
|
needs: prepare-deps
|
||||||
|
timeout-minutes: 120
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
@ -395,9 +396,13 @@ jobs:
|
|||||||
uses: actions/cache@v6
|
uses: actions/cache@v6
|
||||||
with:
|
with:
|
||||||
path: ~/.gradle/nucleus/graalvm
|
path: ~/.gradle/nucleus/graalvm
|
||||||
key: graalvm-${{ runner.os }}-${{ runner.arch }}
|
key: graalvm-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('gradle/libs.versions.toml', 'composeApp/build.gradle.kts') }}
|
||||||
|
restore-keys: graalvm-${{ runner.os }}-${{ runner.arch }}-
|
||||||
|
|
||||||
- name: Package DMG
|
- name: Package DMG
|
||||||
|
env:
|
||||||
|
# Nucleus lists GraalVM CE releases via the GitHub API; unauthenticated calls hit the 60/hour limit
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: ./gradlew :composeApp:packageGraalvmDmg -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
run: ./gradlew :composeApp:packageGraalvmDmg -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
- name: Rename macOS artifact
|
- name: Rename macOS artifact
|
||||||
@ -427,6 +432,8 @@ jobs:
|
|||||||
- build-windows
|
- build-windows
|
||||||
- build-macos
|
- build-macos
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v7
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
@ -472,7 +479,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "## Downloads" > release-notes.md
|
echo "## Downloads" > release-notes.md
|
||||||
echo "" >> release-notes.md
|
echo "" >> release-notes.md
|
||||||
for dir in android-apk android-aab linux-deb linux-rpm linux-appimage linux-deb-arm64 linux-rpm-arm64 windows-msi windows-exe macos-dmg; do
|
for dir in android-apk linux-deb linux-rpm linux-deb-arm64 linux-rpm-arm64 windows-exe macos-dmg; do
|
||||||
if [ -d "$dir" ]; then
|
if [ -d "$dir" ]; then
|
||||||
echo "### $dir" >> release-notes.md
|
echo "### $dir" >> release-notes.md
|
||||||
for f in "$dir"/*; do
|
for f in "$dir"/*; do
|
||||||
@ -482,22 +489,29 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# The rolling nightly tag already exists, and the release action never moves an existing tag
|
||||||
|
- name: Move nightly tag to this commit
|
||||||
|
if: ${{ inputs.release_type == 'nightly' }}
|
||||||
|
run: |
|
||||||
|
git tag -f nightly "$GITHUB_SHA"
|
||||||
|
git push -f origin refs/tags/nightly
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v3
|
uses: softprops/action-gh-release@v3
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.vars.outputs.tag }}
|
tag_name: ${{ steps.vars.outputs.tag }}
|
||||||
|
# A new tag (stable) would otherwise point at the default branch instead of the built commit
|
||||||
|
target_commitish: ${{ github.sha }}
|
||||||
|
fail_on_unmatched_files: true
|
||||||
name: ${{ steps.vars.outputs.release_name }}
|
name: ${{ steps.vars.outputs.release_name }}
|
||||||
body_path: release-notes.md
|
body_path: release-notes.md
|
||||||
draft: ${{ steps.vars.outputs.is_draft }}
|
draft: ${{ steps.vars.outputs.is_draft }}
|
||||||
prerelease: ${{ steps.vars.outputs.is_prerelease }}
|
prerelease: ${{ steps.vars.outputs.is_prerelease }}
|
||||||
files: |
|
files: |
|
||||||
android-apk/*.apk
|
android-apk/*.apk
|
||||||
android-aab/*.aab
|
|
||||||
linux-deb/*.deb
|
linux-deb/*.deb
|
||||||
linux-rpm/*.rpm
|
linux-rpm/*.rpm
|
||||||
linux-appimage/*.AppImage
|
|
||||||
linux-deb-arm64/*.deb
|
linux-deb-arm64/*.deb
|
||||||
linux-rpm-arm64/*.rpm
|
linux-rpm-arm64/*.rpm
|
||||||
windows-msi/*.msi
|
|
||||||
windows-exe/*.exe
|
windows-exe/*.exe
|
||||||
macos-dmg/*.dmg
|
macos-dmg/*.dmg
|
||||||
|
|||||||
@ -59,9 +59,7 @@
|
|||||||
|
|
||||||
## Release workflow (`.github/workflows/release.yml`)
|
## Release workflow (`.github/workflows/release.yml`)
|
||||||
- Triggered by `workflow_dispatch` with a `release_type` choice input (`stable` | `nightly`).
|
- Triggered by `workflow_dispatch` with a `release_type` choice input (`stable` | `nightly`).
|
||||||
- `prepare-deps` job checks out & publishes to `mavenLocal`:
|
- `prepare-deps` job checks out & publishes `kdroidFilter/ComposeNativeWebview` (compose-webview) to `mavenLocal`. The spotube gradle plugin and vlcj-bundler now come from Maven Central.
|
||||||
- `kdroidFilter/ComposeNativeWebview` (compose-webview)
|
|
||||||
- `team-spotube/gradle-plugin` (spotubeGradle + vlcjBundler plugins)
|
|
||||||
- Build jobs per platform (Android, Linux, Windows, macOS), all `needs: prepare-deps`. Desktop jobs ship GraalVM native installers (`packageGraalvm{Deb,Rpm,Exe,Dmg}`, output in `composeApp/build/compose/binaries/main/graalvm-<format>/`), not jpackage/JVM ones.
|
- Build jobs per platform (Android, Linux, Windows, macOS), all `needs: prepare-deps`. Desktop jobs ship GraalVM native installers (`packageGraalvm{Deb,Rpm,Exe,Dmg}`, output in `composeApp/build/compose/binaries/main/graalvm-<format>/`), not jpackage/JVM ones.
|
||||||
- **Stable**: reads `versionName` from `composeApp/build.gradle.kts`, tag = `v{version}`, draft release.
|
- **Stable**: reads `versionName` from `composeApp/build.gradle.kts`, tag = `v{version}`, draft release.
|
||||||
- **Nightly**: builds with `-PversionName=nightly`, tag = `nightly` (updates existing), prerelease.
|
- **Nightly**: builds with `-PversionName=nightly`, tag = `nightly` (updates existing), prerelease.
|
||||||
|
|||||||
@ -54,10 +54,8 @@ Spotube is a Kotlin Multiplatform + Compose Multiplatform app. The desktop app i
|
|||||||
- **JDK 21** to run Gradle. The Gradle daemon JDK and the GraalVM toolchain are provisioned automatically.
|
- **JDK 21** to run Gradle. The Gradle daemon JDK and the GraalVM toolchain are provisioned automatically.
|
||||||
- **Rust** (`rustup` + `cargo`). The `composeApp` Rust library is built through [Gobley](https://gobley.dev).
|
- **Rust** (`rustup` + `cargo`). The `composeApp` Rust library is built through [Gobley](https://gobley.dev).
|
||||||
- **Android SDK**, only for Android builds.
|
- **Android SDK**, only for Android builds.
|
||||||
- **Unpublished dependencies.** Three dependencies aren't on Maven Central yet. Clone each one and run `./gradlew publishToMavenLocal` in it:
|
- **Unpublished dependency.** One dependency isn't on Maven Central yet. Clone it and run `./gradlew publishToMavenLocal` in it:
|
||||||
- [kdroidFilter/ComposeNativeWebview](https://github.com/kdroidFilter/ComposeNativeWebview), at the commit pinned in [`spotube-release-binary.yml`](.github/workflows/spotube-release-binary.yml) (`COMPOSE_WEBVIEW_COMMIT`)
|
- [kdroidFilter/ComposeNativeWebview](https://github.com/kdroidFilter/ComposeNativeWebview), at the commit pinned in [`spotube-release-binary.yml`](.github/workflows/spotube-release-binary.yml) (`COMPOSE_WEBVIEW_COMMIT`)
|
||||||
- [team-spotube/gradle-plugin](https://github.com/team-spotube/gradle-plugin)
|
|
||||||
- [team-spotube/vlcj-bundler-gradle-plugin](https://github.com/team-spotube/vlcj-bundler-gradle-plugin)
|
|
||||||
- **Linux runtime:** `webkit2gtk-4.1` for the embedded webview.
|
- **Linux runtime:** `webkit2gtk-4.1` for the embedded webview.
|
||||||
|
|
||||||
Always use the Gradle wrapper (`./gradlew`, or `gradlew.bat` on Windows).
|
Always use the Gradle wrapper (`./gradlew`, or `gradlew.bat` on Windows).
|
||||||
|
|||||||
@ -543,3 +543,20 @@ cargo {
|
|||||||
embedRustLibrary = (rustTarget == GobleyHost.current.rustTarget)
|
embedRustLibrary = (rustTarget == GobleyHost.current.rustTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Google only ships x86_64 Linux NDK toolchains, so on a Linux arm64 host the Android Rust targets can never
|
||||||
|
// link (clang: "Exec format error"). Desktop packaging doesn't need them; Android is built on x86_64 runners.
|
||||||
|
run {
|
||||||
|
val isLinuxArm64Host = System.getProperty("os.name").lowercase().contains("linux") &&
|
||||||
|
System.getProperty("os.arch").lowercase() in setOf("aarch64", "arm64")
|
||||||
|
if (isLinuxArm64Host) {
|
||||||
|
// Gobley generates the UniFFI bindings from the first Android build's library by default; use the host's.
|
||||||
|
uniffi {
|
||||||
|
generateFromLibrary {
|
||||||
|
build = GobleyHost.current.rustTarget
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tasks.matching { it.name.startsWith("cargoBuildAndroid") || it.name.startsWith("rustUpTargetAddAndroid") }
|
||||||
|
.configureEach { enabled = false }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
22
composeApp/src/androidMain/res/values-sv/strings.xml
Normal file
22
composeApp/src/androidMain/res/values-sv/strings.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2026 Kingkor Roy Tirtho and Spotube Contributors
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU Affero General Public License as published by
|
||||||
|
~ the Free Software Foundation, either version 3 of the License, or
|
||||||
|
~ (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU Affero General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU Affero General Public License
|
||||||
|
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Spotube</string>
|
||||||
|
<string name="now_playing">Spelas nu</string>
|
||||||
|
<string name="car_connect_hint">Spela musik från telefonen för att börja lyssna i bilen</string>
|
||||||
|
</resources>
|
||||||
169
composeApp/src/commonMain/composeResources/values-sv/strings.xml
Normal file
169
composeApp/src/commonMain/composeResources/values-sv/strings.xml
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2026 Kingkor Roy Tirtho and Spotube Contributors
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU Affero General Public License as published by
|
||||||
|
~ the Free Software Foundation, either version 3 of the License, or
|
||||||
|
~ (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU Affero General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU Affero General Public License
|
||||||
|
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string name="settings_screen_title">Inställningar</string>
|
||||||
|
|
||||||
|
<string name="settings_section_plugins">Tillägg</string>
|
||||||
|
<string name="settings_section_language_region">Språk och region</string>
|
||||||
|
<string name="settings_section_appearance">Utseende</string>
|
||||||
|
<string name="settings_section_playback">Uppspelning</string>
|
||||||
|
<string name="settings_section_downloads">Nedladdningar</string>
|
||||||
|
<string name="settings_section_caching">Cachelagring</string>
|
||||||
|
<string name="settings_section_desktop">Dator</string>
|
||||||
|
<string name="settings_section_updates">Uppdateringar</string>
|
||||||
|
|
||||||
|
<string name="settings_action_close">Stäng</string>
|
||||||
|
<string name="settings_action_save">Spara</string>
|
||||||
|
<string name="settings_action_cancel">Avbryt</string>
|
||||||
|
|
||||||
|
<string name="settings_language_title">Språk</string>
|
||||||
|
<string name="settings_language_subtitle_current">Språk för appens gränssnitt. Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_country_title">Land</string>
|
||||||
|
<string name="settings_country_subtitle_current">Land som styr innehåll och tillgänglighet. Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_option_name_and_code">%1$s (%2$s)</string>
|
||||||
|
|
||||||
|
<string name="settings_theme_title">Tema</string>
|
||||||
|
<string name="settings_theme_subtitle_current">Välj hur Spotube anpassar sig till systemets utseende. Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_theme_light">Ljust</string>
|
||||||
|
<string name="settings_theme_dark">Mörkt</string>
|
||||||
|
<string name="settings_theme_system">System</string>
|
||||||
|
|
||||||
|
<string name="settings_accent_title">Accentfärg</string>
|
||||||
|
<string name="settings_accent_subtitle_current">Nuvarande färgpalett: %1$s</string>
|
||||||
|
<string name="settings_accent_dialog_title">Accentfärg</string>
|
||||||
|
<string name="settings_accent_dialog_description">Välj en accentpalett och förhandsgranska den i både ljust och mörkt tema.</string>
|
||||||
|
<string name="settings_preview_light">Ljust</string>
|
||||||
|
<string name="settings_preview_dark">Mörkt</string>
|
||||||
|
<string name="settings_preview_label">Förhandsgranskning</string>
|
||||||
|
<string name="settings_preview_button">Knapp</string>
|
||||||
|
<string name="settings_accent_green_goblin">Gröna trollet</string>
|
||||||
|
<string name="settings_accent_electric_violet">Elektriskt violett</string>
|
||||||
|
<string name="settings_accent_oceanic_cyan">Havscyan</string>
|
||||||
|
<string name="settings_accent_sunset_orange">Solnedgångsorange</string>
|
||||||
|
<string name="settings_accent_rose_garden">Rosenträdgård</string>
|
||||||
|
<string name="settings_accent_midnight_blue">Midnattsblått</string>
|
||||||
|
<string name="settings_accent_metallic_slate">Metalliskt skiffergrått</string>
|
||||||
|
|
||||||
|
<string name="settings_download_folder_title">Egen nedladdningsmapp</string>
|
||||||
|
<string name="settings_download_folder_current">Nuvarande mapp: %1$s</string>
|
||||||
|
<string name="settings_download_folder_default">Nuvarande mapp: standardmappen för musik</string>
|
||||||
|
<string name="settings_download_folder_description">Lämna fältet tomt för att använda standardmappen för musik.</string>
|
||||||
|
<string name="settings_download_folder_placeholder">C:\Music\Spotube</string>
|
||||||
|
<string name="settings_local_media_folders_title">Lokala mediemappar</string>
|
||||||
|
<string name="settings_local_media_folders_subtitle_current">Egna mappar att skanna på datorn. Tillagda: %1$d</string>
|
||||||
|
<string name="settings_local_media_folders_subtitle_empty">Ingen egen mapp har lagts till ännu</string>
|
||||||
|
<string name="settings_local_media_folders_description">Lägg till mappar med mappväljaren. Den egna nedladdningsmappen tas med automatiskt.</string>
|
||||||
|
<string name="settings_local_media_folders_manage">Hantera</string>
|
||||||
|
<string name="settings_local_media_folders_add_action">Lägg till mapp</string>
|
||||||
|
<string name="settings_local_media_folders_remove_action">Ta bort mapp</string>
|
||||||
|
<string name="settings_local_media_folders_none_added">Inga egna mappar har lagts till.</string>
|
||||||
|
<string name="settings_download_format_title">Musikformat för nedladdning</string>
|
||||||
|
<string name="settings_download_format_subtitle_current">Önskad kodek och önskat behållarformat för nedladdningar. Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_download_quality_title">Musikkvalitet för nedladdning</string>
|
||||||
|
|
||||||
|
<string name="settings_streaming_format_title">Musikformat för strömning</string>
|
||||||
|
<string name="settings_streaming_format_subtitle_current">Önskad kodek och önskat behållarformat för musikströmning. Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_streaming_quality_title">Musikkvalitet för strömning</string>
|
||||||
|
<string name="settings_subtitle_current">Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_enable_music_caching_title">Aktivera cachelagring av musik</string>
|
||||||
|
<string name="settings_enable_music_caching_subtitle">Lagra strömmat ljud lokalt så att det går snabbare att spela upp igen.</string>
|
||||||
|
<string name="settings_cache_folder_title">Cachemapp</string>
|
||||||
|
<string name="settings_cache_folder_current">Nuvarande: %1$s</string>
|
||||||
|
<string name="settings_cache_folder_default">Nuvarande: appens standardcache</string>
|
||||||
|
<string name="settings_cache_size_limit_title">Maximal cachestorlek</string>
|
||||||
|
<string name="settings_cache_size_limit_unlimited">Ingen gräns</string>
|
||||||
|
<string name="settings_cache_size_limit_current">Nuvarande gräns: %1$d MB</string>
|
||||||
|
<string name="settings_cache_size_limit_description">Ange den maximala cachestorleken i MB. Ange 0 eller lämna tomt för obegränsad storlek.</string>
|
||||||
|
<string name="settings_cache_size_limit_placeholder">500</string>
|
||||||
|
<string name="settings_error_cache_size_range">Storleken måste vara 0 eller ett positivt tal.</string>
|
||||||
|
<string name="settings_enable_endless_playback_title">Fortsätt spela automatiskt</string>
|
||||||
|
<string name="settings_enable_endless_playback_subtitle">Fortsätt spela rekommenderade låtar när kön tar slut.</string>
|
||||||
|
<string name="settings_enable_connect_title">Aktivera Connect</string>
|
||||||
|
<string name="settings_enable_connect_subtitle">Gör det möjligt att fjärrstyra uppspelningen via Spotube Connect.</string>
|
||||||
|
<string name="settings_playback_port_title">Port för uppspelningens proxyserver</string>
|
||||||
|
<string name="settings_playback_port_subtitle_current">Port som uppspelningens proxyserver använder. Nuvarande: %1$d</string>
|
||||||
|
<string name="settings_playback_port_description">Välj en port mellan 1 och 65535.</string>
|
||||||
|
<string name="settings_playback_port_placeholder">14769</string>
|
||||||
|
<string name="settings_error_whole_number">Ange ett giltigt heltal.</string>
|
||||||
|
<string name="settings_error_port_range">Porten måste vara mellan 1 och 65535.</string>
|
||||||
|
|
||||||
|
<string name="settings_blacklist_title">Spärrlista</string>
|
||||||
|
<string name="settings_blacklist_subtitle">Hantera spärrade låtar och artister</string>
|
||||||
|
|
||||||
|
<string name="settings_desktop_minimize_title">Minimera till meddelandefältet</string>
|
||||||
|
<string name="settings_desktop_minimize_subtitle">Låt Spotube fortsätta köras i meddelandefältet när fönstret minimeras.</string>
|
||||||
|
<string name="settings_desktop_discord_title">Discord Rich Presence</string>
|
||||||
|
<string name="settings_desktop_discord_subtitle">Visa din aktuella uppspelningsstatus i Discord på datorn.</string>
|
||||||
|
|
||||||
|
<string name="settings_updates_auto_check_title">Sök automatiskt efter uppdateringar</string>
|
||||||
|
<string name="settings_updates_auto_check_subtitle">Sök efter nya versioner av Spotube i bakgrunden.</string>
|
||||||
|
|
||||||
|
<string name="settings_plugins_manage_title">Hantera tillägg</string>
|
||||||
|
<string name="settings_plugins_manage_subtitle">Hantera dina tillägg</string>
|
||||||
|
<string name="settings_plugins_default_ability_title">Standardtillägg: %1$s</string>
|
||||||
|
<string name="settings_plugins_ability_metadata">Metadata</string>
|
||||||
|
<string name="settings_plugins_ability_audio">Ljud</string>
|
||||||
|
<string name="settings_plugins_ability_lyrics">Låttexter</string>
|
||||||
|
<string name="settings_plugins_ability_scrobble">Skrobbling</string>
|
||||||
|
<string name="settings_plugins_no_selection">Inget tillägg valt</string>
|
||||||
|
<string name="settings_plugins_action_change">Ändra</string>
|
||||||
|
<string name="settings_plugins_action_select">Välj</string>
|
||||||
|
<string name="settings_plugins_selected">Valt</string>
|
||||||
|
<string name="settings_plugins_clear">Rensa val</string>
|
||||||
|
<string name="settings_plugins_no_plugins">Inga tillägg är tillgängliga</string>
|
||||||
|
<string name="settings_plugins_plugin_content_description">Tillägget %1$s</string>
|
||||||
|
<string name="settings_plugins_clear_content_description">Rensa</string>
|
||||||
|
|
||||||
|
<string name="plugin_configure_title">Konfigurera</string>
|
||||||
|
<string name="plugin_screen_title">Tilläggshanterare</string>
|
||||||
|
<string name="plugin_error_enter_url">Ange en URL</string>
|
||||||
|
<string name="plugin_error_url_scheme">URL:en måste börja med http:// eller https://</string>
|
||||||
|
<string name="plugin_error_download_failed">Det gick inte att ladda ner tillägget</string>
|
||||||
|
<string name="plugin_empty_title">Inga tillägg har installerats ännu</string>
|
||||||
|
<string name="plugin_empty_subtitle">Klistra in en nedladdningsadress eller välj en fil ovan.</string>
|
||||||
|
<string name="plugin_installed_count">Installerade %2$s: %1$d</string>
|
||||||
|
<string name="plugin_installed_singular">tillägg</string>
|
||||||
|
<string name="plugin_installed_plural">tillägg</string>
|
||||||
|
<string name="plugin_install_section_title">Installera ett tillägg</string>
|
||||||
|
<string name="plugin_url_placeholder">https://example.com/plugin.smplug</string>
|
||||||
|
<string name="plugin_action_download">Ladda ner</string>
|
||||||
|
<string name="plugin_action_install_from_file">Installera från fil (.smplug)</string>
|
||||||
|
<string name="plugin_state_active">Aktivt</string>
|
||||||
|
<string name="plugin_version_label">v%1$s</string>
|
||||||
|
<string name="plugin_state_builtin">Inbyggt</string>
|
||||||
|
<string name="plugin_action_remove">Ta bort tillägg</string>
|
||||||
|
<string name="plugin_action_login">Logga in</string>
|
||||||
|
<string name="plugin_action_logout">Logga ut</string>
|
||||||
|
<string name="plugin_section_url_title">Ladda ner från URL</string>
|
||||||
|
<string name="plugin_section_file_title">Installera från fil</string>
|
||||||
|
<string name="plugin_section_install">Installera</string>
|
||||||
|
|
||||||
|
<string name="plugin_permissions_author_version">• %1$s</string>
|
||||||
|
<string name="plugin_permissions_requested_title">Begärda behörigheter</string>
|
||||||
|
<string name="plugin_permissions_none">Det här tillägget kräver inga särskilda behörigheter.</string>
|
||||||
|
<string name="plugin_permissions_compare_title">Installerat och tillhandahållet</string>
|
||||||
|
<string name="plugin_permissions_installed_label">Installerat</string>
|
||||||
|
<string name="plugin_permissions_supplied_label">Tillhandahållet</string>
|
||||||
|
<string name="plugin_permissions_api_diff">API %1$s → %2$s</string>
|
||||||
|
<string name="plugin_permissions_capability_storage_title">Beständig lagring</string>
|
||||||
|
<string name="plugin_permissions_capability_storage_desc">Läsa och skriva data på disken</string>
|
||||||
|
<string name="plugin_permissions_capability_network_title">Nätverksförfrågningar</string>
|
||||||
|
<string name="plugin_permissions_capability_network_desc">Skicka och ta emot data via internet</string>
|
||||||
|
<string name="plugin_permissions_capability_webview_title">WebView</string>
|
||||||
|
<string name="plugin_permissions_capability_webview_desc">Visa webbinnehåll i appen</string>
|
||||||
|
</resources>
|
||||||
Loading…
Reference in New Issue
Block a user