Skip to content
kota-zoPublic

Latest commit

 

History

96 Commits

Folders and files

Repository files navigation

Myspoti

Latest release License: GPL-3.0 Discord

Spotify on Android, free account, no ads. A native Jetpack Compose client with synced lyrics and official music videos.

Myspoti: home, player, artist and album screens

⬇ Download the latest APK

The official Spotify Web Player runs in a hidden WebView and does the actual playback, with the phone's DRM and Spotify's own reporting. The native UI drives it, so plays count on your account exactly as they do in a browser. You always sign in yourself, on Spotify's own login page.

Support Myspoti on Ko-fi Sponsor kota-zo on GitHub

Features

  • No ads. The ad audio is refused, so the player skips each ad within a second. It works with a free account: no Premium, no patched Spotify app, and the DRM is left untouched.
  • Home (with Music, Podcasts and Audiobooks filters), search (songs, artists, albums, playlists, podcasts, episodes), New releases, Spotify's real Browse categories, library (folders, sorting, drag to reorder), artist, album and playlist pages, with Spotify's official labels.
  • Podcasts and audiobooks: shows, episodes, chapters, Your Episodes, playback speed.
  • Jam: join a Jam with an invite link.
  • Synced lyrics: Spotify first, then LRCLIB; optionally Apple Music (word by word), NetEase and Genius.
  • Your recap: your top tracks, artists and albums, counting Spotify, downloads and local files. It stays on your phone.
  • Official music videos, when one exists. The video plays muted, in sync with the song. The app only uses YouTube videos marked as official clips, and shows nothing when no clip exists.
  • Spotify Connect, media notification, lock screen, Bluetooth and Android Auto.
  • Offline downloads. Download a song, an album, a playlist or your Liked Songs, then play them without a connection. The audio comes lossless (FLAC, 16-bit or 24-bit hi-res when it exists), or as Tidal's own AAC for the smallest files: the very recording, found on Tidal (or Qobuz) by its exact ISRC, through the same signed servers as SpotiFLAC Mobile's extensions, after a one-off verification in Settings. Each file is checked against the recording's official preview (looked up by ISRC), so a live take, a remix or a cover is rejected. Files stay in Myspoti's private storage.
  • Sound quality and Settings. Streaming quality (Automatic, Low, Normal, High) and download quality are picked at the first start and kept in one Settings page, with data saver, battery, display and language.
  • Connect with your headphones. Their name shows instead of "This phone", one tap sends the sound back to the speaker, and a quality badge shows what plays now. The music pauses when headphones or Bluetooth go away.
  • English, French and Italian.

How it works

The app is split in two:

  • :api is the contract the UI talks to: plain Kotlin models and interfaces (player, search, catalog, library, playlists, home, podcasts, users, lyrics, devices, Jam).
  • :api-spotify implements it on Spotify's Web Player. Playback stays in the official player, in a hidden WebView (:host-android), driven by a small bridge script. Catalog, search and library calls go straight to Spotify's servers, which is faster. When Spotify ships a new Web Player, the app reads its new operation list from the public files by itself.
  • :host-cdp runs the same API on desktop Chrome: the whole API is tested against the real Web Player, without a phone.

Details for developers: base/api-spotify/README.md and docs/api.

Screenshots

Home Player Artist Album
Home Player Artist Album

Not included

  • No DRM circumvention. No Amazon stream decryption.
  • No Spotify audio download. Offline downloads are resolved from lossless catalogues through the open-backends community of SpotiFLAC; a track with no lossless source is simply marked unavailable.
  • Downloaded songs played on the phone are not reported to Spotify: they do not count in Wrapped or in artists' play counts. They are kept in Myspoti's own Recap only. No ad is marked as heard.

Credits

  • SpotiFLAC (MIT) — the lossless resolving idea, its community backend protocol and the gated-session flow.
  • Spotui (GPL-3.0) — the Kotlin port of the resolver, the signed-session verification screen and the DASH-to-FLAC remux that Myspoti builds on.
  • SpotiFLAC Mobile (MIT) and its extensions (Apache-2.0) — the signed download sessions and the Tidal / Qobuz download requests.

Full notices: THIRD_PARTY_NOTICES.md.

Disclaimer

Blocking ads goes against Spotify's Terms of Use, and Spotify may suspend accounts that do it. Use this app at your own risk. If you can, support artists with Premium or by buying their music.

Support

Myspoti is free, has no ads and is made in my spare time. If you enjoy it, you can support it on Ko-fi or GitHub Sponsors, also from About in the app's profile menu. Nothing in the app is locked behind a donation.

Support Myspoti on Ko-fi Sponsor kota-zo on GitHub

News, help and ideas: join the Discord server. Bugs and requests are also welcome in GitHub issues.

Build

The Android project is in base/. Requirements: JDK 17+ and the Android SDK (compileSdk 37).

cd base
./gradlew assembleDebug
./gradlew testDebugUnitTest

Live API tests (desktop Chrome with a signed-in Web Player):

google-chrome --user-data-dir="$HOME/.myspoti-chrome" --remote-debugging-port=9222
./gradlew :host-cdp:test -Pcdp=http://localhost:9222

Every push builds and tests on GitHub Actions. A v* tag publishes a signed APK in Releases; the app finds it, downloads it and installs it through Android's installer.

Credits

License

GPL-3.0.

Not affiliated with or endorsed by Spotify. Spotify is a trademark of Spotify AB.

Releases

Packages

Contributors

Languages