Skip to content

Latest commit

 

History

1,380 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

eXMusic icon

eXMusic

An Android music player for YouTube Music.


Screenshots

Home feed with quick picks
Home feed
Player with aurora background
Player
Synchronized lyrics
Synced lyrics
Playback queue
Queue
Search suggestions while typing
Instant search
Search results grouped by type
Search results
Modern player layout
Modern layout
Player settings
Settings

About

eXMusic is a fast, clean Android music player built on top of ViTune and ViMusic. It streams directly from YouTube Music with zero ads, supports background playback, and caches tracks locally so your music stays available offline.

It is a fork of ViTune, which forked ViMusic. Android 7.0 (API 24) or newer.


Install

Grab the APK from Releases, or add the repo to Obtainium to get updates automatically.


Features

  • Songs, albums, artists, and playlists from YouTube Music, ad free
  • Home feed with charts, new releases, and mood playlists
  • Search that updates while you type, grouped by songs, albums, artists, and playlists
  • Offline cache with a size limit you set
  • Synced and plain lyrics from LRCLIB and KuGou, with search and a time offset
  • Local playlists, plus import from YouTube or a CSV file
  • Background playback, Android Auto, sleep timer
  • Crossfade, audio normalization, skip silence, speed and pitch controls
  • SponsorBlock, to skip sponsored and off-topic segments
  • Opens YouTube and YouTube Music links straight from other apps

What this fork changes

Relative to ViTune:

  • Aurora player. Album art drives a slow gradient behind frosted controls, inside the player or across the whole app. The queue is its own sheet on near-opaque glass.
  • Search rebuilt. One bar above the tabs, so switching between online and library keeps the query and the keyboard. Suggestions are playable while you type, and results open on an "all" tab with the top result and every kind of match, each drawn as the same row.
  • Artwork fixes. YouTube Music moved artwork to yt3.googleusercontent.com, which no resize helper matched, so most thumbnails were a 60x60 image stretched across the player. Also fixed: letterboxed artist banners, video results cropped to their middle third, urls that shifted on rotation and voided the cache, and loads that timed out before the CDN finished resizing.
  • Cheaper rendering. Palette extraction runs off the main thread, and the playback service no longer schedules periodic wakeups.
  • Stream fallback. A blocked or dead stream retries against a different YouTube client. If every client refuses, a bundled yt-dlp resolves the URL instead of the song failing.
  • Home feed and charts. Read from YouTube directly, rather than derived from what you already played.
  • Seekable lyrics. Tap a synced line to jump there. Scrolling no longer snaps back.
  • CSV playlist import. An Import settings screen reads RFC 4180 CSV and matches each row against your library.
  • Refreshed icon and UI, including a themed launcher icon.

Building

Needs JDK 25 and an Android SDK with API 37. The bundled yt-dlp and the QuickJS interpreter it shells out to also need NDK 29.0.14206865, CMake 4.1.2 and Python 3.14.

The app splits into arm64 and x64 flavors, so most tasks carry a flavor name:

./gradlew :app:assembleDebug          # both flavors, APKs in app/build/outputs/apk/
./gradlew :app:assembleArm64Debug     # just one, if you know your device
./gradlew :app:compileX64DebugKotlin  # typecheck only, no packaging
./gradlew :app:detekt                 # static analysis, report in build/reports/detekt/

Release builds need a signing config. app/build.gradle.kts reads one from keystore.properties, or from the ANDROID_KEYSTORE environment variables. There is no universal APK. It would have to rank below the per-ABI builds for version codes to order correctly, which makes it uninstallable over either one.

There is a Nix flake if you would rather not install the toolchain by hand:

nix develop

Project layout

Path What's in it
app/ The Android app: screens, playback service, Room database
app/src/main/python, app/src/main/cpp Bundled yt-dlp and the QuickJS binary it shells out to
core/data Shared models and enums
core/ui Color palettes, typography, dimensions, shared widgets
core/material-compat Bridges Material 3 components into the custom theme
compose/ Small Compose libraries: routing, persistence, preferences, drag-to-reorder
providers/innertube YouTube Music client, including the per-client playback fallbacks
providers/lrclib, providers/kugou Lyrics sources
providers/sponsorblock, providers/piped SponsorBlock segments, Piped account and playlists
providers/github Release checks for in-app updates
ktor-client-brotli Brotli decoding for the Ktor HTTP client

Acknowledgments


License

GPL-3.0, same as ViTune and ViMusic. See LICENSE. Redistributed or modified copies have to stay GPL-3.0 and ship their source.


Disclaimer

Not affiliated with, funded by, or associated with YouTube or Google LLC. All trademarks belong to their respective owners.

About

Stream Music without bounds

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages