Commit Graph

2392 Commits

Author SHA1 Message Date
pgwiz
81a6ad7f8c chore: sync with upstream/master (PR #3173 and latest fixes)
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-30 11:27:54 +03:00
pgwiz
cd67806845 feat(diagnostics): add in-app logs viewer and fix proxy port mismatch/startup race
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-30 03:50:58 +03:00
pgwiz
b4f25f0e27 fix(player): log ExoPlayer playback errors and connect errorFlow in DeviceAudioPlayerQueue
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-30 02:10:32 +03:00
Kingkor Roy Tirtho
07ad7124a9
Merge pull request #3173 from team-spotube/dev
Dev
2026-10-29 17:36:52 +06:00
Kingkor Roy Tirtho
fa9b42cf10 cd(build): add support for building WebView native libraries on Linux and Windows 2026-10-29 16:03:55 +06:00
Kingkor Roy Tirtho
8d4ea82a7e fix(build): add headless mode for Linux and update CI to prepare dependencies 2026-10-29 15:01:43 +06:00
Kingkor Roy Tirtho
eb972c8633 fix(dependencies): update Android target SDK and various library versions 2026-10-29 11:25:22 +06:00
pgwiz
182025dbc6 ci: add artifact reuse workflow and fix release upload permissions
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 11:55:33 +03:00
pgwiz
91ea775b77 ci: allow release platforms to run independently with presets and tolerant publishing
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 10:40:04 +03:00
pgwiz
dd098aea0a fix(ios): remove manual setActive calls in IosMediaSession
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 10:16:33 +03:00
pgwiz
7254a8e35d fix(ios): resolve compileKotlinIosArm64 type mismatches in IosMediaSession and stub getRadioMix
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 10:05:38 +03:00
pgwiz
02d903e5ed ci: add fallback keystore generation for multiplatform release workflow
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 08:58:03 +03:00
pgwiz
13fef429f4 fix(player): harden queue resolution, iOS media session controls, endless playback, and download status checks
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 08:46:51 +03:00
pgwiz
2a2ca8c5a6 feat: port upstream PRs #3132, #3170, #3150, #3092, #3134, #3147
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 07:36:57 +03:00
pgwiz
2e84018155 ci: fix yaml syntax indentation for local.properties signing config
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 04:32:15 +03:00
pgwiz
f3be1f98e4 ci: fix webkit2gtk buildNativeLinux failure and heredoc syntax in build-android-apk
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 04:27:21 +03:00
pgwiz
3ce36d624b ci: add standalone build-android-apk workflow with automatic keystore generation
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 04:12:49 +03:00
pgwiz
f622b4b155 fix(player): harden StreamProxy Origin header, YouTube URL regex boundaries, and candidate fallback order
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 01:32:02 +03:00
pgwiz
e4fe197184 fix(player): resolve GoogleVideo 403, YouTube video ID extraction, matching relaxation, and radio mix fallback
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-28 00:34:20 +03:00
Kingkor Roy Tirtho
aca3aeb592 fix(theme): follow the OS dark mode on desktop
Compose's isSystemInDarkTheme never updates under the Tao window, so Theme.SYSTEM
stayed light. Use Nucleus' darkmode-detector on JVM and keep Compose's check on mobile.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 18:53:47 +06:00
Kingkor Roy Tirtho
5b36edd259 fix(windows): make VLC playback work through the stream proxy
The proxy copied every upstream header, duplicating Content-Length, which VLC
rejects. Forward only the range/validator headers. Bump vlcj-bundler to 0.2.1,
which bundles the Matroska demuxer needed for WebM. Make StreamingUrlRepository's
platform injectable and add VLC log switch via DebugConfig.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 18:49:20 +06:00
Kingkor Roy Tirtho
ea01dec6ea fix(settings): palette swatches follow the active light/dark appearance
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 18:49:20 +06:00
pgwiz
a573570de9 fix(plugins): support plugin forks in discovery search and update legacy URL format in docs
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-27 14:09:02 +03:00
Kingkor Roy Tirtho
79266fd483 fix(windows): window not spawning due to early COM initialization 2026-10-27 16:35:27 +06:00
pgwiz
2d4cb02aeb docs: add manual plugin install guide and verify pgwiz plugin
Co-Authored-By: pgwiz <pgwiz@users.noreply.github.com>
2026-10-27 12:42:14 +03:00
Kingkor Roy Tirtho
0d5b5b094e
Merge pull request #3167 from team-spotube/dev
Update URLs, add iOS build process, and prepare for beta release
2026-10-26 19:13:40 +06:00
Kingkor Roy Tirtho
31a3233c79 ci: remove nightly tag movement from release workflow 2026-10-26 18:11:35 +06:00
Kingkor Roy Tirtho
91867f571d ci: remove nightly tag movement from release workflow 2026-10-26 17:39:24 +06:00
Kingkor Roy Tirtho
cde359a9de cd: add iOS build process and package IPA for release 2026-10-26 16:52:56 +06:00
Kingkor Roy Tirtho
1b4fbe8d25 chore: update changelog for 6.0.0-beta.0 and optimize Gradle build settings 2026-10-26 16:40:46 +06:00
Kingkor Roy Tirtho
67e452493a feat(release): add beta release type
A beta is the stable build released as <version>-beta.N, with N set via
betaNumber in composeApp/build.gradle.kts. Betas and stable releases are
drafts; only nightly publishes immediately.
2026-10-26 16:34:02 +06:00
Kingkor Roy Tirtho
d7c7e3108d docs: add new features and enhancements for version 6.0.0 2026-10-26 16:09:24 +06:00
Kingkor Roy Tirtho
1ea5f1d1ee fix: update website URLs from spotube.org to spotube.cc 2026-10-26 15:31:17 +06:00
Kingkor Roy Tirtho
277140f567
Merge pull request #3166 from team-spotube/dev
Release v6.0.0
2026-10-26 15:27:49 +06:00
Kingkor Roy Tirtho
9bb80ebb47 Merge branch 'master' into dev 2026-10-26 15:23:11 +06:00
Kingkor Roy Tirtho
a7e47d0e00
Merge pull request #3165 from team-spotube/ios-crash-fix
Ios crash fix
2026-10-26 15:16:29 +06:00
Kingkor Roy Tirtho
bdf3655a23 fix(ios): make the login WebView identify as Mobile Safari
accounts.spotify.com rejected iOS logins ("Oops, something went wrong") because
the WebView sent WKWebView's default User-Agent, which lacks Safari's
"Version/x ... Safari/604.1" and reads as an embedded browser. The random
User-Agent header never reached any request: the screen replaces the content
before it loads.

Have WebKit build Safari's exact UA (with its frozen OS version) via a probe
WKWebView using Safari's applicationNameForUserAgent, prime it at startup and
apply it through webSettings.customUserAgentString so every request uses it.
2026-10-26 15:04:26 +06:00
Kingkor Roy Tirtho
cc21568457 fix(build): restore version catalog lost in dev merge
The merge of dev resolved the libs.versions.toml conflict by taking the wrong
catalog: it reverted the Kotlin 2.4.21 / Compose 1.12.2 / Zipline 1.28.0
upgrade and dropped dev's jmustache entries, so buildSrc failed with
"Unresolved reference 'jmustache'". Keep both sides: mokkery 3.5.1 plus jmustache.
2026-10-26 15:04:26 +06:00
Kingkor Roy Tirtho
7fa3b029f6 Merge branch 'dev' into ios-crash-fix
# Conflicts:
#	gradle/libs.versions.toml
2026-10-26 13:45:32 +06:00
Kingkor Roy Tirtho
cb8316d141 fix(ios): stream formats AVPlayer can play
AVPlayer can't open WebM/Ogg or DASH, so the default opus/webm stream failed
silently on iOS.

- Rank streams the platform's player can play above format/quality prefs
- Default iOS streaming to aac/mp4, migrate saved WebM/Ogg prefs on iOS and
  hide unplayable formats in the picker (desktop/Android keep opus/webm)
- Normalize codec/container names on iOS like androidJvm (mp4a -> aac, m4a -> mp4)
- Wait up to 30s for the audio plugin to load when resolving, so the queue
  restored at startup isn't failed permanently before plugins are ready
2026-10-26 13:40:00 +06:00
Kingkor Roy Tirtho
99ba08501b fix(server): don't crash when the proxy port is still in use
CIO reports a failed bind from its accept coroutine; unhandled, that
exception terminates the process on Kotlin/Native before the port fallback
can run, so relaunching iOS shortly after playback crashed (EADDRINUSE).
Contain it with a parent CoroutineExceptionHandler and enable reuseAddress
so the preferred port can be rebound while old connections are in TIME_WAIT.
2026-10-26 13:40:00 +06:00
Kingkor Roy Tirtho
0acc457890 feat(plugin): implement automatic plugin updates and enhance JSON parsing 2026-10-26 12:44:04 +06:00
Kingkor Roy Tirtho
7eb56c8593 fix(ios): run Zipline on an 8 MiB stack thread
newSingleThreadContext threads get only 512 KiB of stack on iOS, while
QuickJS may recurse ~6 MiB deep when compiling a plugin, so the app crashed
with SIGBUS at startup once a plugin was installed. Host the dispatcher on an
NSThread with an 8 MiB stack, matching JVM/Android.
2026-10-23 11:54:29 +06:00
Kingkor Roy Tirtho
ff7a1714ff refactor(network): central HttpClientFactory; drop Ktor CIO client
On iOS the CIO client engine competed with Darwin as the default engine and
has no TLS on Kotlin/Native, so HTTPS requests (e.g. plugin discovery) failed.

Remove ktor-client-cio and build every client through a Koin-provided
HttpClientFactory that owns one client on the platform default engine
(Darwin on iOS, OkHttp on Android/desktop). Consumers use the shared
default/json clients or derive their own via create { }, sharing the engine.
2026-10-23 11:54:29 +06:00
Kingkor Roy Tirtho
09df4b494c build: upgrade to Kotlin 2.4.21 and Compose Multiplatform 1.12.2
Several dependencies (coil 3.5.0, millennium, mqtt/ditchoom, composeunstyled,
markdown-renderer, composewebview, kmp-zip, filekit) now ship klibs built with
Kotlin 2.4, which Kotlin/Native 2.3 refuses to read, breaking the iOS build.

- Bump zipline (1.28.0), mokkery (3.5.1) and ksp (2.3.12) for the new compiler
- Type TOP_LEVEL_ROUTES as Set<NavKey> (Kotlin 2.4 inferred Set<Any>)
- Import ComposeApp in iOSApp.swift, which uses ExternalUriHandler
2026-10-23 11:54:29 +06:00
Kingkor Roy Tirtho
2edbfefe93 fix(gradle): restore VFS watch setting and clean up properties 2026-10-23 10:12:10 +06:00
Kingkor Roy Tirtho
8ab9463c9a feat(packaging): Flathub, AUR, WinGet and Chocolatey publishing
- Flatpak manifest (GNOME 51, libvlc built from source) installing from a new
  portable spotube-linux-<version>-<arch>.tar.xz, shared with the AUR package
- Release workflow builds and attaches the Linux tarballs for x86_64 and aarch64
- Package files are JMustache templates rendered by :composeApp:renderPackaging<Target>
  with the version, release asset checksums and git-cliff release notes; the
  metainfo release history is generated
- Publish workflow (workflow_dispatch, release tag input) renders once and pushes to
  Flathub, the AUR, WinGet (PR from team-spotube/winget-pkgs) and Chocolatey
- Chocolatey and WinGet updated for the NSIS installer
2026-10-23 10:08:29 +06:00
Kingkor Roy Tirtho
79d47c1d87 feat: enhance loading states for various UI components and update dependencies 2026-10-20 20:32:47 +06:00
Kingkor Roy Tirtho
08892c2aa0 fix(downloads): respect download format/quality and never save manifests or video
- Downloads resolve streams with the user's download format/quality via a
  new StreamRequest instead of the streaming settings, and bypass the
  playback stream-URL cache in both directions
- Downloads only consider progressive streams; DASH/HLS manifests were
  previously saved as-is instead of audio
- NewPipe: map AAC "mp4a.40.x"/"m4a" to the advertised "aac"/"mp4" so real
  AAC streams can match (previously the hard-coded aac/mp4 manifests always
  won), report each stream's real delivery method, skip streams without a
  format or non-URL content
- Fail the download on non-2xx responses, on a range request answered with
  a full 200, and on video/* content, with localized reasons, instead of
  writing the response body to disk
- Save AAC as .m4a
- Tests for request overrides, manifest exclusion and cache isolation
2026-10-20 16:03:48 +06:00
Kingkor Roy Tirtho
8bbefdfb7d fix(android): app stuck on splash screen from main-thread string loading
PlaybackService.onCreate runs on the main thread and called
runBlocking { getString(...) } for its notification strings. Compose
resources share one in-flight load per strings file (AsyncCache creates the
Deferred in the caller's scope); when App()'s stringResource started that
load on the main dispatcher first, blocking main to await it deadlocked and
the first frame never rendered. Timing-dependent, so mostly seen under the
debugger.

Create the notification channel immediately under the app name and update
its localized name/description from serviceScope. The short-lived
placeholder notification no longer carries localized text.
2026-10-20 16:03:48 +06:00