diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 8a31ee59..4b62e4f8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -76,7 +76,7 @@ body: description: Where did you install Spotube from? multiple: true options: - - "Website (spotube.org)" + - "Website (spotube.cc)" - "GitHub Releases (Binary)" - "GitHub Actions (Nightly Binary)" - "Play Store (Android)" diff --git a/.github/workflows/spotube-release-binary.yml b/.github/workflows/spotube-release-binary.yml index c3ddf0f8..f12a0d2e 100644 --- a/.github/workflows/spotube-release-binary.yml +++ b/.github/workflows/spotube-release-binary.yml @@ -10,6 +10,7 @@ on: default: 'stable' options: - stable + - beta - nightly dry_run: description: 'Dry run (build & upload artifacts only, skip creating release)' @@ -26,7 +27,7 @@ on: permissions: contents: read -# Never cancel a running release when another is dispatched, and let stable and nightly run side by side +# Never cancel a running release when another is dispatched, and let stable, beta and nightly run side by side concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.release_type }} cancel-in-progress: false @@ -215,7 +216,7 @@ jobs: fi # Desktop entry + metainfo, with the release history from git-cliff ./gradlew :composeApp:renderPackagingLinux -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }} - packaging/package-linux-tarball.sh "$VERSION" "${{ inputs.release_type }}" . + packaging/package-linux-tarball.sh "$VERSION" "${{ inputs.release_type == 'nightly' && 'nightly' || 'stable' }}" . - name: Upload tarball uses: actions/upload-artifact@v7 @@ -335,7 +336,7 @@ jobs: fi # Desktop entry + metainfo, with the release history from git-cliff ./gradlew :composeApp:renderPackagingLinux -Pnightly=${{ inputs.release_type == 'nightly' }} -PbuildNumber=${{ github.run_number }} - packaging/package-linux-tarball.sh "$VERSION" "${{ inputs.release_type }}" . + packaging/package-linux-tarball.sh "$VERSION" "${{ inputs.release_type == 'nightly' && 'nightly' || 'stable' }}" . - name: Upload tarball uses: actions/upload-artifact@v7 @@ -485,7 +486,16 @@ jobs: 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 }} + # The free macOS runner has 3 cores / 7 GB. With the default 4g Gradle + 3g Kotlin daemons idling, + # native-image only gets ~3 GB and spends ~40% of its time in GC (47 min build vs ~15 on Linux). + # A single-use daemon with a smaller heap and in-process Kotlin compilation leaves the RAM to it. + run: > + ./gradlew :composeApp:packageGraalvmDmg + --no-daemon + -Dorg.gradle.jvmargs="-Xmx3g -XX:MaxMetaspaceSize=1g" + -Pkotlin.compiler.execution.strategy=in-process + -Pnightly=${{ inputs.release_type == 'nightly' }} + -PbuildNumber=${{ github.run_number }} - name: Rename macOS artifact run: | @@ -504,6 +514,75 @@ jobs: with: limit-access-to-actor: true + build-ios: + name: iOS + needs: prepare-deps + timeout-minutes: 120 + runs-on: macos-latest + steps: + - uses: actions/checkout@v7 + + - name: Download maven local + uses: actions/download-artifact@v8 + with: + name: maven-local + path: ~/.m2/repository/ + + - name: Set up JDK 21 + uses: actions/setup-java@v6 + with: + distribution: temurin + java-version: 21 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v6 + + - name: Make gradlew executable + run: chmod +x gradlew + + # Unsigned on purpose: there is no Apple developer account in CI. The IPA is meant for sideloading + # (AltStore, Sideloadly, ...), which re-signs it with the user's own certificate. + # The Gradle build phase inside Xcode reads these as project properties. + - name: Build unsigned app + env: + ORG_GRADLE_PROJECT_nightly: ${{ inputs.release_type == 'nightly' }} + ORG_GRADLE_PROJECT_buildNumber: ${{ github.run_number }} + run: > + xcodebuild + -project iosApp/iosApp.xcodeproj + -scheme iosApp + -configuration Release + -sdk iphoneos + -destination 'generic/platform=iOS' + -derivedDataPath build/ios + CODE_SIGNING_ALLOWED=NO + CODE_SIGNING_REQUIRED=NO + CODE_SIGN_IDENTITY="" + DEVELOPMENT_TEAM="" + build + + - name: Package IPA + run: | + APP=$(find build/ios/Build/Products/Release-iphoneos -maxdepth 1 -name "*.app" -type d | head -1) + mkdir Payload + cp -R "$APP" Payload/ + zip -qry Spotube-ios.ipa Payload + + - name: Upload IPA + uses: actions/upload-artifact@v7 + with: + name: ios-ipa + path: Spotube-ios.ipa + + - name: Setup tmate session on failure + if: ${{ inputs.debug_ssh && failure() }} + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true + create-release: name: Create GitHub Release if: ${{ !inputs.dry_run }} @@ -513,6 +592,7 @@ jobs: - build-linux-arm64 - build-windows - build-macos + - build-ios runs-on: ubuntu-latest permissions: contents: write @@ -538,8 +618,9 @@ jobs: - name: Set release variables id: vars run: | - if [ "${{ inputs.release_type }}" = "stable" ]; then + if [ "${{ inputs.release_type }}" != "nightly" ]; then chmod +x gradlew + # printVersion includes the -beta.N suffix when betaNumber is set in build.gradle.kts VERSION=$(./gradlew -q :composeApp:printVersion) TAG="v${VERSION}" echo "is_prerelease=false" >> "$GITHUB_OUTPUT" @@ -561,7 +642,7 @@ jobs: run: | echo "## Downloads" > release-notes.md echo "" >> release-notes.md - for dir in android-apk linux-deb linux-rpm linux-appimage linux-tarball linux-deb-arm64 linux-rpm-arm64 linux-appimage-arm64 linux-tarball-arm64 windows-exe macos-dmg; do + for dir in android-apk linux-deb linux-rpm linux-appimage linux-tarball linux-deb-arm64 linux-rpm-arm64 linux-appimage-arm64 linux-tarball-arm64 windows-exe macos-dmg ios-ipa; do if [ -d "$dir" ]; then echo "### $dir" >> release-notes.md for f in "$dir"/*; do @@ -571,13 +652,6 @@ jobs: fi 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 uses: softprops/action-gh-release@v3 with: @@ -601,3 +675,4 @@ jobs: linux-tarball-arm64/*.tar.xz windows-exe/*.exe macos-dmg/*.dmg + ios-ipa/*.ipa diff --git a/CHANGELOG.md b/CHANGELOG.md index 2953c4bc..5bfa5a20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,156 @@ # Changelog +## [6.0.0-beta.0](https://github.com/team-spotube/spotube/compare/v5.1.2...v6.0.0-beta.0) (2026-10-26) + +### Features + +- Migration to Compose Multiplatform +- Add ChipTab component and refactor SearchScreen to use it +- Add AutocompleteTextField component and integrate it into SearchScreen +- Enhance AutocompleteTextField with focus management and dropdown behavior +- Enhance AppSidebar with improved button interactions and visual feedback +- Implement endless playback recommendations in DeviceAudioPlayerQueue +- Add GhostIconButton component and enhance button interactions in TrackList +- Replace IconButton with GhostIconButton in AppExpandedPlayer and AppLargePlayer for improved visual consistency +- Replace IconButton with GhostIconButton in PlayerQueueContent and PlayableCard for visual consistency +- Enhance UI components with LocalBaseUITheme for consistent styling and improved interactions +- Enhance button styles and interactions in Buttons and Theme components for improved UI consistency +- Simplify highlight implementation in UI components for improved readability and maintainability +- Add genre selection and tabs to HomeScreen for improved content navigation +- Implement artist overview screen with loading, error handling, and pagination for albums, related artists, and featured playlists +- Add genre and featured browsing capabilities to MediaBrowseHelper +- Implement playlist creation and editing functionality with UI components +- Add 'Add to Playlist' functionality with UI components and dialogs +- Add Toggle component and update UI to use it in place of Switch +- Implement settings section cards for updates, desktop, language, caching, and plugins +- Update icons in settings sections to use Iconsax library for improved UI consistency +- Replace FeatherIcons with Iconsax in PluginCard and PluginPermissionsDialog for improved UI consistency +- Refactor PluginPermissionsDialog to use custom UI components for improved consistency and readability +- Enhance UI with shared element transitions and improve state management in album and playlist screens +- Integrate Uniffi for audio metadata reading and writing with Lofty library +- Replace FeatherIcons with Iconsax in window controls and update sidebar with better design +- Implement haze effect and UI enhancements in AppLargePlayer and AppShell +- Enhance haze effect integration in AppShell and AppSidebar for improved UI experience +- Add adaptive dialog bottom sheet component and enhance plugin installation UI +- Enhance AdaptiveDialogBottomSheet with dismiss icon and improve plugin screen layout +- Implement CollectionView component and refactor Album, Playlist, SavedTracks screens for improved UI consistency +- Add current time management in AudioPlayer for improved playback control +- Simplify playback control logic in AudioPlayer by removing redundant state checks +- Introduce AudioPlayerInterface and refactor AudioPlayer implementations for better abstraction +- Update skipToNext and skipToPrevious methods in AudioPlayer for improved media item management +- Refactor LyricsViewModel to use AudioPlayerInterface for improved abstraction +- Add Discord Rich Presence integration for enhanced media playback visibility +- Implement System Tray integration for window management and media controls +- Add hover effect to menu items in System Tray for improved user experience +- Add SSH debug session setup on failure for improved troubleshooting +- Implement blacklist functionality for tracks and artists with UI updates +- **systemtray**: Self-manage tray lifecycle via Koin DI +- **plugin_interfaces**: Update Maven publishing configuration and add GitHub Actions workflow +- **plugin_discovery**: Implement GitHub plugin discovery and add logo support in UI +- **plugin_discovery**: Implement GitHub plugin discovery and add logo support and information dialog in UI +- **plugin_install**: Add plugin installation dialog and release fetching functionality +- Update dependencies and configure compose hot reload settings +- Improve NewPipe video rank matching +- Integrate Nucleus framework for enhanced window management and webview support +- Implement system tray functionality with Compose Native Tray integration +- **mediacontrol**: Implement SystemMediaControlService for OS media integration +- **devices**: Add device discovery and remote control features +- **deeplinks**: Implement deep link handling for jam sessions +- **remote-control**: Implement remote playback functionality and UI components +- **remote-control**: Enhance queue management and player state synchronization +- **remote-control**: Enhance remote playback functionality with new commands and UI integration +- **webrtc**: Update ICE server configuration and enhance logging for peer connection events +- **jam-session**: Add connection state management and update UI feedback for session status +- **jam-session**: Enhance jam session functionality with improved playback synchronization and error handling +- **remote-control**: Refactor service registration and cleanup logic for improved reliability +- **jam-session**: Integrate MQTT broker configuration and enhance jam session settings +- **jam-session**: Implement track addition to jam session and enhance UI feedback for jam state +- **jam-session**: Enhance guest functionality with track addition and participant moderation options +- **release**: Add support for Linux ARM64 builds and artifact uploads +- **player-options**: Add PlayerOptionsViewModel and enhance player UI with options menu +- **player-options**: Enhance options menu with localized strings and icons +- **jam-settings**: Implement JamSettings screen and view model for broker configuration +- Refactor track source management to support plugin-specific caching and retrieval +- Implement shuffle play functionality for albums, playlists, and saved tracks +- **navigation**: Refactor sidebar and bottombar navigation structure with new tab and group models +- **search**: Enhance LazyRow with drag scrolling functionality +- **autocomplete**: Simplify focus management and remove unused key event handling +- **update**: Implement update checker with dialog for available updates +- **update**: Refactor update checking mechanism and implement new dialog for app and plugin updates +- **scrobble**: Implement ScrobbleManager to handle track scrobbling and integrate with audio player +- **welcome**: Implement onboarding flow with multiple pages and donation options +- **previews**: Add comprehensive previews for UI components including sliders, toggles, checkboxes, and text fields +- **settings**: Add 'About' section and improve header visibility in settings sections +- **surface**: Implement Frutiger-Aero themed surfaces with glass and acrylic styles +- **ui**: Replace Scaffold with BaseScaffold for consistent surface theming across screens +- **ui**: New custom surface integration on all components +- **onboarding**: Enhance welcome screen with structured guide steps and improved layout +- **player**: Add content descriptions for play, pause, and add to queue actions +- **support**: Implement support reminder dialog and donation options +- **player**: Refactor artist display and improve search field labels +- **search**: Enhance search functionality with recent search suggestions and improved UI components +- **sidebar**: Adjust spacing in sidebar and setting cards for improved layout +- **jam**: Implement group jam functionality with UI components and state management +- **library**: Enhance library UI with new tab titles, filtering options, and improved state management +- **library**: Add Library screen list mode beside grid mode, Local Track, Download screen, Local Library folders dialog visual improvement +- **ui**: Integrate LocalTextStyle for dynamic tinting in player controls and UI components +- **navigation**: Add custom navigation transition specifications for push and pop actions +- **i18n**: Replace hardcoded strings with localized resources across multiple components +- **plugin**: Implement MetadataPluginGuard to manage plugin dependencies and user prompts +- **ui**: Replace IndeterminateProgress with new loading components and enhance dialog structures +- **ui**: Update MillenniumModalBottomSheet with compact padding and spacing adjustments +- **plugin**: Add login prompt for metadata plugin access and implement authentication view model +- **user-agents**: Implement dynamic user agent fetching and caching mechanism +- **lyrics**: Implement SyncedLyricsList component and enhance LyricsViewModel for better state management +- **server**: Implement port fallback mechanism for playback proxy server +- **window**: Implement window state persistence and restoration +- Enhance Android build configuration with stable/nightly flavors and update launcher icons +- **graalvm**: Enable GraalVM native image support and update packaging configurations +- **local-tracks**: Implement LocalFolder screen and view model for folder navigation +- **navigation**: Implement fade-through and stack transition animations for navigation +- **remote**: Redesign remote control and devices screens, fix connection issues +- Download diagnostics, live connect status, remote settings on devices screen +- Enhance loading states for various UI components and update dependencies +- **packaging**: Flathub, AUR, WinGet and Chocolatey publishing +- **plugin**: Implement automatic plugin updates and enhance JSON parsing + +### Bug Fixes + +- **newpipe**: Fallback to muxed streams if no audio stream is available +- Dismiss search dropdown and keyboard on submission +- Custom image helper null exception +- **plugin**: Reload Zipline service on same-version replace +- Convert buildCurrentMediaItemList to a suspend function for coroutine support +- Enhance Discord RPC connection management with cooldown and error handling +- Cached track audio not being invalidated causing alternative track source to not being played +- Play next not working +- Update pendingNextIndex when playing a track from the playlist +- **webview**: Linux webview crashing the app +- Add mavenLocal() to plugin and dependency resolution management +- **plugin**: Handle service closure exception during authentication check +- **sidebar**: Add spacer to AppSidebar for improved layout +- **remote-control**: Update connection handling and improve logging for remote control events +- Add window insets to top bar and bottom navigation bar, queue sheet +- **stream-proxy**: Stream upstream audio instead of buffering the whole track +- **newpipe**: Fall back through multiple searches when ISRC search misses +- **audio-api**: Enhance fallback mechanism for text search results in YouTube +- **audio-player**: Android shuffle wasnt working +- **stream-proxy**: Improve logging for cache timeout and handle disconnection scenarios +- **macos**: Add GraalVM runtime dependency and initialize GraalVm in main function +- **android**: Create intermediate directories for Rust targets to prevent runtime errors +- **android**: Update sharing functionality to use chooser intent with new task flag +- **android**: Simplify service start logic for PlaybackService to avoid crashes on background playback +- **android**: Update playback state management to ensure guests follow host's play state +- **android**: App stuck on splash screen from main-thread string loading +- **downloads**: Respect download format/quality and never save manifests or video +- **ios**: Run Zipline on an 8 MiB stack thread +- **server**: Don't crash when the proxy port is still in use +- **ios**: Stream formats AVPlayer can play +- **gradle**: Restore VFS watch setting and clean up properties +- **build**: Restore version catalog lost in dev merge +- **ios**: Make the login WebView identify as Mobile Safari +- Update website URLs from spotube.org to spotube.cc + ## [5.1.2](https://github.com/team-spotube/spotube/compare/v5.1.1...v5.1.2) (2026-06-05) ### Bug Fixes diff --git a/README.md b/README.md index 86b305fc..2cc7453b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A cross-platform extensible open-source music streaming platform.
Bring your own music metadata/playlist/audio-source with plugins created by community or by yourself. A small step towards the decentralized music streaming era! -Visit the website +Visit the website Discord Server Support me on Patron @@ -37,11 +37,11 @@ Bring your own music metadata/playlist/audio-source with plugins created by comm ### ⬇️ Download -Download Spotube from the Official Website: https://spotube.org +Download Spotube from the Official Website: https://spotube.cc ### 🔄 Nightly Builds -Grab the latest nightly builds of Spotube [from the Offical Website](https://spotube.org/downloads/nightly). +Grab the latest nightly builds of Spotube [from the Offical Website](https://spotube.cc/downloads/nightly). ## 🕳️ Building from source @@ -166,7 +166,7 @@ Android picks the Rust profile from its build type (`debug` or `release`) on its ### Releases -Releases are built by [`spotube-release-binary.yml`](.github/workflows/spotube-release-binary.yml), run manually (`workflow_dispatch`) as `stable` or `nightly`. Each desktop platform (Linux x86_64 and aarch64, Windows, macOS) builds its native installers on its own runner. Android builds a signed APK. +Releases are built by [`spotube-release-binary.yml`](.github/workflows/spotube-release-binary.yml), run manually (`workflow_dispatch`) as `stable`, `beta` or `nightly`. A beta is the stable build released like a stable release (draft, not a pre-release), tagged `v-beta.N` (set `betaNumber` in `composeApp/build.gradle.kts` to N, and back to `null` for stable). Each desktop platform (Linux x86_64 and aarch64, Windows, macOS) builds its native installers on its own runner. Android builds a signed APK. ## 👥 The Spotube team diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index fb121190..a72f675f 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -48,6 +48,10 @@ plugins { val bundleId = "org.spotube.spotube" val version = "6.0.0" +// Set to N to release -beta.N (same app id, icons and name as stable); null for a plain stable release. +// Installer metadata (packageVersion) must stay numeric, so it keeps using plain `version`. +val betaNumber: Int? = 0 +// Betas share the stable app id, so bump this for every beta: Android only updates to a higher versionCode. val buildNumber = 46 // Desktop icon channel; Android picks its icons via the stable/nightly product flavor. Use -Pnightly=true. val isNightly = providers.gradleProperty("nightly").map { it.toBoolean() }.getOrElse(false) @@ -68,9 +72,9 @@ val isProductionBuild = providers.gradleProperty("production").map { it.toBoolea } ) val targetName = "Spotube" -val homePageUrl = "https://spotube.org" +val homePageUrl = "https://spotube.cc" val repositoryUrl = "https://github.com/team-spotube/spotube" -val appVersionName = version +val appVersionName = if (betaNumber != null) "$version-beta.$betaNumber" else version val appBuildNumber = if (isNightly) nightlyBuildNumber else buildNumber val appRepositoryUrl = repositoryUrl // CI reads the release version from here instead of scraping this file. @@ -375,8 +379,8 @@ android { applicationId = bundleId minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() - versionCode = buildNumber - versionName = version + versionCode = appBuildNumber + versionName = appVersionName } // stable = production channel, nightly = beta channel (own icon, name and installable side by side) flavorDimensions += "channel" diff --git a/composeApp/src/commonMain/kotlin/org/spotube/spotube/App.kt b/composeApp/src/commonMain/kotlin/org/spotube/spotube/App.kt index 37a15a6f..ad9f5276 100644 --- a/composeApp/src/commonMain/kotlin/org/spotube/spotube/App.kt +++ b/composeApp/src/commonMain/kotlin/org/spotube/spotube/App.kt @@ -253,7 +253,7 @@ fun App( onDismiss = appUpdateService::dismissUpdate, onIgnore = appUpdateService::ignoreUpdate, onUpdate = { - runCatching { openUrlInBrowser("https://spotube.org/downloads/") } + runCatching { openUrlInBrowser("https://spotube.cc/downloads/") } appUpdateService.dismissUpdate() }) } diff --git a/gradle.properties b/gradle.properties index a49b0977..831e3793 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,9 +20,11 @@ kotlin.code.style=official kotlin.daemon.jvmargs=-Xmx3072M kotlin.mpp.stability.nowarn=true kotlin.incremental=true +kotlin.native.jvmArgs=-Xmx6g #Gradle -org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g +# The Kotlin/Native release framework link (iOS) runs in the Gradle daemon and OOMs below ~6g +org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=1g org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/packaging/aur/PKGBUILD.mustache b/packaging/aur/PKGBUILD.mustache index 0fa2e183..5fa0a92a 100644 --- a/packaging/aur/PKGBUILD.mustache +++ b/packaging/aur/PKGBUILD.mustache @@ -4,7 +4,7 @@ pkgver={{version}} pkgrel={{pkgrel}} pkgdesc="Open source, plugin powered music streaming client" arch=(x86_64 aarch64) -url="https://spotube.org" +url="https://spotube.cc" license=('AGPL-3.0-or-later') # libvlc + plugins for playback (FFmpeg demux/decode, GnuTLS for HTTPS streams, PulseAudio/PipeWire output), # WebKitGTK 4.1 for the webview, and the X11/GL/ALSA libraries the AWT/Skiko natives link diff --git a/packaging/chocolatey/spotube.nuspec.mustache b/packaging/chocolatey/spotube.nuspec.mustache index a864042f..77b2ba0c 100644 --- a/packaging/chocolatey/spotube.nuspec.mustache +++ b/packaging/chocolatey/spotube.nuspec.mustache @@ -13,7 +13,7 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t spotube (Install) Team Spotube - https://spotube.org + https://spotube.cc https://rawcdn.githack.com/team-spotube/spotube/69a310c78f5ceaf4eab7dfee98f187d38211c9ba/assets/branding/spotube-logo.png 2026 Kingkor Roy Tirtho and Spotube Contributors @@ -21,7 +21,7 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t https://github.com/team-spotube/spotube/blob/master/LICENSE true https://github.com/team-spotube/spotube - https://spotube.org + https://spotube.cc https://github.com/team-spotube/spotube/issues/new spotube music audio music-player streaming lyrics plugins foss Open source, plugin powered music streaming client diff --git a/packaging/linux/org.spotube.spotube.metainfo.xml.mustache b/packaging/linux/org.spotube.spotube.metainfo.xml.mustache index 9519ac88..7c952522 100644 --- a/packaging/linux/org.spotube.spotube.metainfo.xml.mustache +++ b/packaging/linux/org.spotube.spotube.metainfo.xml.mustache @@ -47,7 +47,7 @@ lyrics - https://spotube.org + https://spotube.cc https://github.com/team-spotube/spotube/issues https://github.com/team-spotube/spotube https://opencollective.com/spotube diff --git a/packaging/winget/KRTirtho.Spotube.locale.en-US.yaml.mustache b/packaging/winget/KRTirtho.Spotube.locale.en-US.yaml.mustache index fcaae4f9..7a9a168c 100644 --- a/packaging/winget/KRTirtho.Spotube.locale.en-US.yaml.mustache +++ b/packaging/winget/KRTirtho.Spotube.locale.en-US.yaml.mustache @@ -6,10 +6,10 @@ PackageLocale: en-US Publisher: Team Spotube PublisherUrl: https://github.com/team-spotube PublisherSupportUrl: https://github.com/team-spotube/spotube/issues -PrivacyUrl: https://spotube.org/p/privacy +PrivacyUrl: https://spotube.cc/p/privacy Author: Team Spotube PackageName: Spotube -PackageUrl: https://spotube.org +PackageUrl: https://spotube.cc License: AGPL-3.0-or-later LicenseUrl: https://github.com/team-spotube/spotube/blob/master/LICENSE Copyright: Copyright (c) 2022-2026 Kingkor Roy Tirtho and Spotube Contributors