Skip to content
/ psst Public
forked from jpochyla/psst

Fast and multi-platform Spotify client with native GUI

License

Notifications You must be signed in to change notification settings

isaaclins/psst

 
 

Repository files navigation

Psst

A fast Spotify client with a native GUI written in Rust, without Electron. Psst is still very early in development, lacking in features, stability, and general user experience. It's fully cross-platform, supporting Windows, Linux, and macOS. Contributions are welcome!

Note: A Spotify Premium account is required.

CI

Screenshot

Download

GitHub Actions automatically builds and releases new versions when changes are pushed to the main branch. You can download the latest release for Windows, Linux, and macOS from the GitHub Releases page.

Platform Download Link
Linux (x86_64) Download
Linux (aarch64) Download
Debian Package (amd64) Download
Debian Package (arm64) Download
macOS Download
Windows Download

Unofficial builds of Psst are also available through the AUR and Homebrew.

Automatic Updates

Psst includes automatic update checking to keep you informed about new releases. By default, the app will check for updates on startup (no more than once per 24 hours). You can:

  • View available updates in Preferences > Updates
  • Manually check for updates at any time
  • Disable automatic checks if preferred
  • Dismiss specific versions you don't want to install

See docs/UPDATES.md for more information.

Building

On all platforms, the latest Rust stable (at least 1.65.0) is required. For platform-specific requirements, see the dropdowns below.

Linux

Our user-interface library, Druid, has two possible backends on Linux: GTK and pure X11, with a Wayland backend in the works. The default Linux backend is GTK. Before building on Linux, make sure the required dependencies are installed.

Debian/Ubuntu

sudo apt-get install libssl-dev libgtk-3-dev libcairo2-dev libasound2-dev

RHEL/Fedora

sudo dnf install openssl-devel gtk3-devel cairo-devel alsa-lib-devel
OpenBSD (WIP)

OpenBSD support is still a WIP, and things will likely not function as intended. Similar to Linux, Druid defaults to GTK while also providing a pure X11 backend. Furthermore, bindgen must be able to find LLVM through the expected environment variable. Only OpenBSD/amd64 has been tested so far.

doas pkg_add gtk+3 cairo llvm
export LIBCLANG_PATH=/usr/local/lib

In case rustc(1) fails building bigger crates

memory allocation of xxxx bytes failed
error: could not compile `gtk`
Caused by:
  process didn't exit successfully: `rustc --crate-name gtk [...]` (signal: 6, SIGABRT: process abort signal)
warning: build failed, waiting for other jobs to finish...

try increasing your user's maximum heap size:

ulimit -d $(( 2 * `ulimit -d` ))

Build from Source

cargo build
# Append `--release` for a release build.

Run from Source

cargo run --bin psst-gui
# Append `--release` for a release build.

Build Installation Bundle (i.e., macOS .app)

cargo install cargo-bundle
cargo bundle --release

Roadmap

  • Vorbis track playback
  • Browsing saved albums and tracks
  • Save / unsave albums and tracks
  • Browsing followed playlists
  • Search for artists, albums, and tracks
  • Podcast support
  • Media keys control
  • Open Spotify links through the search bar
  • Audio volume control
  • Audio loudness normalization
  • Genre playlists and "For You" content
  • Dark theme
  • Credits support
  • Resilience to network errors (automatically retry timed-out requests)
  • Managing playlists
    • Follow/unfollow
    • Add/remove tracks
    • Reorder tracks
    • Rename playlist
    • Playlist folders
  • Playback queue
  • Automatic update checking
  • React to audio output device events
    • Pause after disconnecting headphones
    • Transfer playback after connecting headphones
  • Better caching
    • Cache as many WebAPI responses as possible
    • Visualize cache utilization
      • Total cache usage in the config dialog
      • Show time origin of cached data, allow to refresh
  • Trivia on the artist page, Wikipedia links
  • Downloading encrypted tracks
  • Reporting played tracks to Spotify servers
  • OS-specific application bundles
  • UI
    • Rethink the current design, consider a two-pane layout
      • Left pane for browsing
      • Right pane for current playback
    • Detect light/dark OS theme
    • Robust error states, ideally with a retry button
    • Correct playback highlight
      • Highlight now-playing track only in the correct album/playlist
      • Keep highlighted track in viewport
    • Paging or virtualized lists for albums and tracks
    • Grid for albums and artists
    • Robust active/inactive menu visualization
    • Save playback state

Development

Contributions are very welcome!
Here's the basic project structure:

  • /psst-core - Core library, takes care of Spotify TCP session, audio file retrieval, decoding, audio output, playback queue, etc.
  • /psst-gui - GUI application built with Druid
  • /psst-cli - Example CLI that plays a track. Credentials must be configured in the code.
  • /psst-protocol - Internal Protobuf definitions used for Spotify communication.
  • /psst-e2e-tests - End-to-end tests for application workflows and functionality.

Testing

Run all tests including E2E tests:

cargo test --workspace --all-targets

Run only E2E tests:

cargo test -p psst-e2e-tests

For more information about E2E testing, see docs/E2E_TESTING.md.

Testing

The project has a comprehensive test suite with 70+ tests covering unit tests, integration tests, edge cases, and error handling. To run the tests:

./scripts/run-tests.sh

This will run clippy, all workspace tests, and documentation tests with strict warnings enabled.

For more information about testing practices and writing tests, see TESTING.md.

Privacy Policy

Psst connects only to the official Spotify servers and does not call home. Caches of various things are stored locally and can be deleted anytime. User credentials are not stored at all; instead, a re-usable authentication token from Spotify is used.

Thanks

This project would not exist without the following:

  • Big thank you to librespot, the Open Source Spotify client library for Rust. Most of psst-core is directly inspired by the ideas and code of librespot, although with a few differences:
    • Spotify Connect (remote control) is not supported yet.
    • Psst is completely synchronous, without tokio or other async runtime, although it will probably change in the future.
    • Psst is using HTTPS-based CDN audio file retrieval, similar to the official Web client or librespot-java, instead of the channel-based approach in librespot.
  • druid native GUI library for Rust.
  • ncspot cross-platform ncurses Spotify client written in Rust, using librespot.
  • ...and of course other libraries and projects.

About

Fast and multi-platform Spotify client with native GUI

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Rust 99.6%
  • Shell 0.4%