Psst - Fast and multi-platform Spotify client with native GUI

Related tags

Audio and Music psst
Overview

Psst

Fast Spotify client with native GUI, without Electron, built in Rust. Very early in development, lacking in features, stability, and general user experience. It is being tested only on Mac so far, but aims for full Windows and Linux support. Contributions welcome!

Note: Spotify Premium account is required.

Build

Screenshot

Pre-built binaries

GitHub Actions automatically runs when new commits are pushed to master. To download prebuilt binaries for x86_64 macOS, Windows or Ubuntu, go to the newest successfully built action.

Linux

Our user-interface library, Druid, has two possible backends to choose from on Linux: GTK and pure X11, with 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
Building

On all platforms, the latest Rust stable (at least 1.54.0) is needed.

Development build:

git submodule update --recursive --init
cargo build

Release build:

git submodule update --recursive --init
cargo build --release
# Use `cargo bundle --release` for building the installation bundle (i.e. macOS .app)
Running and configuration
cd psst-gui
cargo run
# Use `cargo run --release` for the release build.
Roadmap
  • Vorbis track playback
  • Browsing saved albums and tracks
  • Save / unsave albums and tracks
  • Browsing followed playlists
  • Search for artist, albums, and tracks
  • Resilience to network errors (automatically retry timed-out requests)
  • Managing playlists
    • Follow / unfollow
    • Add / remove track
    • Reorder tracks
    • Rename playlist
    • Playlist folders
  • Playback queue
  • Audio volume control
  • Audio loudness normalization
  • React to audio output device events
    • Pause after disconnecting headphones
    • Transfer playback after connecting headphones
  • Better caching
    • Cache as much as possibly of WebAPI responses
    • Visualize cache utilization
      • Total cache usage in the config dialog
      • Show time origin of cached data, allow to refresh
  • Media keys control
  • Open Spotify links
  • Trivia on the artist page, Wikipedia links
  • Genre playlists and "For You" content
  • Downloading encrypted tracks
  • Reporting played tracks to Spotify servers
  • OS-specific application bundles
  • Podcast support
  • UI
    • Rethink current design, consider a two-pane layout
      • Left pane for browsing
      • Right pane for current playback
    • Dark theme
    • Detect light/dark OS theme
    • Icon
    • Robust error states, ideally with 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 last route, volume, playback state
Development

Contributions are very welcome! 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 need to be configured in the code.
  • /psst-protocol - Internal Protobuf definitions used for Spotify communication.
Privacy Policy

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

Thanks

This project would not exist without:

  • 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.
Comments
  • Logo/icon needed!

    Logo/icon needed!

    Hi! We definitely need a proper application icon, ideally with a logotype (the muted-mic logo is a bit of a placeholder). Unfortunately I'm useless with graphics, so I'm looking for help.

    Ideas/inspiration:

    Thanks!

    help wanted 
    opened by jpochyla 25
  • Switch to CPAL, Symphonia, and parking_lot

    Switch to CPAL, Symphonia, and parking_lot

    This is an experimental effort in replacing miniaudio and minivorbis crates with cpal for the raw audio output and symphonia for decoding. This has a few benefits:

    1. We don't have to maintain miniaudio-sys bindings for different platforms.
    2. Building is simpler.
    3. Symphonia is of excellent quality, has low CPU usage and supports multiple codecs (relevant for podcast support and playing local tracks).
    4. The upstream feels a bit closer, we can fork, fix bugs, etc.

    ...and also a few drawbacks:

    1. cpal doesn't do any resampling. Some Windows setups seem to require apps to resample the audio themselves, but so far, the Spotify OGG tracks seem to all be sampled at 41000hz. I suppose that maybe we can assume all audio setups would support this and wait? @H-M-H has integrated dasp with cpal for resampling support: https://github.com/jpochyla/psst/discussions/167
    2. We lose native PulseAudio support. I have a feeling we could have multiple audio backends in Psst and use PA directly.

    While refactoring this, I've also replaced std mutexes with parking_lot, introduced a ringbuffer between the audio thread and the decoding, and split decoding of different audio files into different threads, to avoid deadlocks in case the I/O gets stuck indefinitely.

    Missing:

    • [x] Global volume
    • [x] Normalization
    • [ ] More sample formats (now only f32 is supported)
    opened by jpochyla 18
  • Authentication failure

    Authentication failure

    I'm getting this error with credentials that I tested to work correctly in-browser:

    [2021-01-02T13:51:33Z ERROR psst_gui::delegate] connection error: AuthFailed { code: 11 }
    

    Sorry, don't know where to look for logs, otherwise I'd provide them!

    ~

    EDIT - this is after building e62719de7f1d906632b424e2ae087e27b95698e1 from source

    opened by briankung 17
  • Playing songs not in the cache broken

    Playing songs not in the cache broken

    Describe the bug Playing any song that isn't already in the cache no longer works

    To Reproduce Play a song that isn't already cached.

    Expected behavior The sons plays

    Screenshots image

    Environment

    • OS: Debian stable
    • Version: 11

    Additional context It looks strongly related to authentication. Of particular interest is the psst_core::session::access_token] access token expired, requesting message, which pops by regularly. I've tried going back two commits (to before the change masquerading as librespot) and that version tells me I need a premium account (which I have). The latest master tells me "success" when logging in, but then doesn't play.

    bug 
    opened by omartijn 16
  • Non-stereo audio outputs don't work

    Non-stereo audio outputs don't work

    Describe the bug Every song is resampled to a much higher pitch (big playback speedup)

    To Reproduce Just compile master (96059d95d6a69294c0847bfd0f67d0f6dda11e47) and play anything on Mac.

    Expected behavior Regular play like after reset to 697c61aa052cf9b6a63c8d6090dc8b5bcb01cd75

    Environment

    • OS: macOS on M1
    • Version: 12.0.1 Monterey

    Additional context Unsure it's relevant, but all my devices work in 44.1kHz mode (set via Audio Midi Setup app)

    bug 
    opened by dmilith 16
  • Build error on linux

    Build error on linux

    I did the

    $ git submodule update --recursive --init
    $ cargo build --release 
    

    And then it failed with this lengthy error: https://mystb.in/IntentNaplesCut.sql

    opened by SpyrosRoum 15
  • Login with premium account failing

    Login with premium account failing

    Describe the bug When logging in today, I get the error: Authentication failed: premium account required. This was not a problem yesterday and I have checked that my account is still premium on Spotify's website. I have also confirmed that the password is correct, as i get a different error when typing it wrong deliberately.

    To Reproduce Open settings and enter spotify credentials.

    Expected behavior No error on login.

    Environment Tested on both macOS + ubuntu with latest built action.

    bug 
    opened by askepen 14
  • Build fails on a MacBook Pro M1 running macOS Big Sur version 11.5.2

    Build fails on a MacBook Pro M1 running macOS Big Sur version 11.5.2

    I'm trying to build this on a MacBook Pro M1 running macOS Big Sur version 11.5.2, and the build fails.

    rustup run nightly cargo version

    cargo 1.56.0-nightly (b51439fd8 2021-08-09)
    

    Build invocation and output from the point where it fails.

    rustup run nightly cargo build --release

       Compiling miniaudio v0.10.0 (https://github.com/jpochyla/miniaudio-rs#d75bf62d)
    error[E0425]: cannot find value `MA_SAMPLE_RATE_8000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:507:40
        |
    507 | pub const SAMPLE_RATE_8000: u32 = sys::MA_SAMPLE_RATE_8000;
        |                                        ^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_11025` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:508:41
        |
    508 | pub const SAMPLE_RATE_11025: u32 = sys::MA_SAMPLE_RATE_11025;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_16000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:509:41
        |
    509 | pub const SAMPLE_RATE_16000: u32 = sys::MA_SAMPLE_RATE_16000;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_22050` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:510:41
        |
    510 | pub const SAMPLE_RATE_22050: u32 = sys::MA_SAMPLE_RATE_22050;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_24000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:511:41
        |
    511 | pub const SAMPLE_RATE_24000: u32 = sys::MA_SAMPLE_RATE_24000;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_32000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:512:41
        |
    512 | pub const SAMPLE_RATE_32000: u32 = sys::MA_SAMPLE_RATE_32000;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_44100` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:513:41
        |
    513 | pub const SAMPLE_RATE_44100: u32 = sys::MA_SAMPLE_RATE_44100;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_48000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:514:41
        |
    514 | pub const SAMPLE_RATE_48000: u32 = sys::MA_SAMPLE_RATE_48000;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_88200` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:515:41
        |
    515 | pub const SAMPLE_RATE_88200: u32 = sys::MA_SAMPLE_RATE_88200;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_96000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:516:41
        |
    516 | pub const SAMPLE_RATE_96000: u32 = sys::MA_SAMPLE_RATE_96000;
        |                                         ^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_176400` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:517:42
        |
    517 | pub const SAMPLE_RATE_176400: u32 = sys::MA_SAMPLE_RATE_176400;
        |                                          ^^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_192000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:518:42
        |
    518 | pub const SAMPLE_RATE_192000: u32 = sys::MA_SAMPLE_RATE_192000;
        |                                          ^^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_352800` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:519:42
        |
    519 | pub const SAMPLE_RATE_352800: u32 = sys::MA_SAMPLE_RATE_352800;
        |                                          ^^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0425]: cannot find value `MA_SAMPLE_RATE_384000` in crate `sys`
       --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/base.rs:520:42
        |
    520 | pub const SAMPLE_RATE_384000: u32 = sys::MA_SAMPLE_RATE_384000;
        |                                          ^^^^^^^^^^^^^^^^^^^^^ not found in `sys`
    
    error[E0609]: no field `isBackendAsynchronous` on type `ma_context`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1023:27
         |
    1023 |         from_bool8(self.0.isBackendAsynchronous)
         |                           ^^^^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `callbacks`, `backend`, `logCallback`, `threadPriority`, `threadStackSize` ... and 10 others
    
    error[E0609]: no field `usingDefaultFormat` on type `ma_device__bindgen_ty_3`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1539:27
         |
    1539 |         from_bool8(self.0.usingDefaultFormat)
         |                           ^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    error[E0609]: no field `usingDefaultChannels` on type `ma_device__bindgen_ty_3`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1543:27
         |
    1543 |         from_bool8(self.0.usingDefaultChannels)
         |                           ^^^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    error[E0609]: no field `usingDefaultChannelMap` on type `ma_device__bindgen_ty_3`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1547:27
         |
    1547 |         from_bool8(self.0.usingDefaultChannelMap)
         |                           ^^^^^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    error[E0609]: no field `usingDefaultFormat` on type `ma_device__bindgen_ty_2`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1582:27
         |
    1582 |         from_bool8(self.0.usingDefaultFormat)
         |                           ^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    error[E0609]: no field `usingDefaultChannels` on type `ma_device__bindgen_ty_2`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1586:27
         |
    1586 |         from_bool8(self.0.usingDefaultChannels)
         |                           ^^^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    error[E0609]: no field `usingDefaultChannelMap` on type `ma_device__bindgen_ty_2`
        --> /Users/user/.cargo/git/checkouts/miniaudio-rs-0268a3ab613f78e9/d75bf62/miniaudio/src/device_io.rs:1590:27
         |
    1590 |         from_bool8(self.0.usingDefaultChannelMap)
         |                           ^^^^^^^^^^^^^^^^^^^^^^ unknown field
         |
         = note: available fields are: `id`, `name`, `shareMode`, `format`, `channels` ... and 9 others
    
    Some errors have detailed explanations: E0425, E0609.
    For more information about an error, try `rustc --explain E0425`.
    error: could not compile `miniaudio` due to 21 previous errors
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    
    opened by ctsrc 13
  • Can't type credentials

    Can't type credentials

    XFCE Manjaro Linux 5.10.36-2-MANJARO

    When I open the program, it shows settings and asks for my credentials. I can click on the buttons and on the text fields but when I try to type, nothing gets written, and whatever I type gets typed on whatever the window was that I had opened before opening psst.

    If I click save and go to the main app and try to type there (eg the search bar), typing works fine, but when i open settings again, it doesnt send the text to it, it only sends it to the main app. This means it's probably a problem with the settings specifically.

    This is pretty crucial for me because I can't sign in at all.

    bug upstream 
    opened by ShawkMusic 12
  • Building error on macOS 12.0.1 on mac mini m1

    Building error on macOS 12.0.1 on mac mini m1

    Hi. I try to compile apple sillicon verion but got error:

    The following warnings were emitted during compilation:
    
    warning: ./minivorbis.c:6:10: fatal error: 'minivorbis.h' file not found
    warning: #include "minivorbis.h"
    warning:          ^~~~~~~~~~~~~~
    warning: 1 error generated.
    
    error: failed to run custom build command for `minivorbis-sys v0.1.0 (/Users/naymapl/Downloads/psst-master/minivorbis-sys)`
    
    Caused by:
      process didn't exit successfully: `/Users/naymapl/Downloads/psst-master/target/release/build/minivorbis-sys-b58ea438adc80a5d/build-script-build` (exit status: 1)
      --- stdout
      TARGET = Some("aarch64-apple-darwin")
      OPT_LEVEL = Some("3")
      HOST = Some("aarch64-apple-darwin")
      CC_aarch64-apple-darwin = None
      CC_aarch64_apple_darwin = None
      HOST_CC = None
      CC = None
      CFLAGS_aarch64-apple-darwin = None
      CFLAGS_aarch64_apple_darwin = None
      HOST_CFLAGS = None
      CFLAGS = None
      CRATE_CC_NO_DEFAULTS = None
      DEBUG = Some("false")
      CARGO_CFG_TARGET_FEATURE = None
      running: "cc" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "-arch" "arm64" "-I" "./minivorbis" "-Wall" "-Wextra" "-o" "/Users/naymapl/Downloads/psst-master/target/release/build/minivorbis-sys-49412aa77065d870/out/./minivorbis.o" "-c" "./minivorbis.c"
      cargo:warning=./minivorbis.c:6:10: fatal error: 'minivorbis.h' file not found
      cargo:warning=#include "minivorbis.h"
      cargo:warning=         ^~~~~~~~~~~~~~
      cargo:warning=1 error generated.
      exit status: 1
    
      --- stderr
    
    
      error occurred: Command "cc" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "-arch" "arm64" "-I" "./minivorbis" "-Wall" "-Wextra" "-o" "/Users/naymapl/Downloads/psst-master/target/release/build/minivorbis-sys-49412aa77065d870/out/./minivorbis.o" "-c" "./minivorbis.c" with args "cc" did not execute successfully (status code exit status: 1).
    
    
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    

    Any idea what is wrong ?? Thank you for help.

    Is it build native arm64 version of psst ??

    opened by naymapl 11
  • No audio on playback

    No audio on playback

    [2021-08-31T23:01:21Z INFO  psst_gui::data::config] loading config: "/home/User/.config/Psst/config.json"
    [2021-08-31T23:01:21Z INFO  psst_core::cache] using cache: "/home/User/.cache/Psst"
    [2021-08-31T23:01:21Z INFO  psst_gui::data::config] saved config: "/home/User/.config/Psst/config.json"
    [2021-08-31T23:01:21Z INFO  psst_core::access_token] access token expired, requesting
    [2021-08-31T23:01:29Z INFO  psst_core::access_token] access token expired, requesting
    [2021-08-31T23:01:29Z INFO  psst_core::audio_file] blocked at 7871328
    [2021-08-31T23:01:29Z INFO  psst_core::audio_file] blocked at 7904096
    [2021-08-31T23:01:29Z INFO  psst_core::audio_file] blocked at 7910408
    [2021-08-31T23:01:29Z INFO  psst_core::audio_file] blocked at 7926792
    [2021-08-31T23:01:29Z INFO  psst_core::audio_player] starting playback
    [2021-08-31T23:01:29Z INFO  psst_gui::controller::playback] playing
    [2021-08-31T23:01:40Z INFO  psst_core::audio_player] pausing playback
    [2021-08-31T23:01:41Z INFO  psst_core::audio_player] resuming playback
    [2021-08-31T23:01:45Z INFO  psst_core::audio_file] blocked at 9059660
    [2021-08-31T23:01:46Z INFO  psst_core::audio_file] blocked at 9076044
    [2021-08-31T23:01:46Z INFO  psst_core::audio_file] blocked at 9092428
    [2021-08-31T23:01:46Z INFO  psst_core::audio_file] blocked at 9098740
    [2021-08-31T23:01:46Z INFO  psst_core::audio_file] blocked at 9115124
    [2021-08-31T23:01:46Z INFO  psst_core::audio_player] starting playback
    [2021-08-31T23:01:46Z ERROR psst_core::audio_output] failed to start device: generic
    [2021-08-31T23:01:46Z INFO  psst_gui::controller::playback] playing
    [2021-08-31T23:02:02Z INFO  psst_core::audio_player] pausing playback
    

    Recently Updated my system and preformed a restart. I tried reinstalling, and I got the same results.

    bug linux 
    opened by omnituensaeternum 11
  • [Feature request] Add a setting to hide the Dock icon

    [Feature request] Add a setting to hide the Dock icon

    Is your feature request related to a problem? Please describe.

    I'd love to be able to hide Psst from the Dock. I like apps which run in the background for long periods of time (like playing music throughout the day) to not take up space in the Dock.

    Describe the solution you'd like

    A Show Psst in the Dock checkbox in the Settings > General window, which is checked by default, but can be unchecked and the icon will not be shown in the Dock. Then I can simply hide the main app window with ⌘ + H and come back to it when I want with ⌘ + tab. Or just use the controls in the built-in macOS icon in the menu bar.

    Describe alternatives you've considered

    A more complete solution would be to have a Psst macOS menu bar icon which can be used to select playlist, next song, etc. But this is of course a lot more involved and not what I need. I'm good with just hiding the Dock icon like I described above.

    Additional context

    Take Hammerspoon as an example:

    Screenshot 2022-12-16 at 15 51 31 Screenshot 2022-12-16 at 15 51 22
    opened by gabrielmaldi 0
  • Don't save config on each change in geometry

    Don't save config on each change in geometry

    Changes the WindowSize event handler to not save the config on each geometry change, but rather wait until the application is closed and save it then.

    I've only tested this on Linux so if someone on macOS/Windows could confirm this works as intended that'd be nice.

    Closes #360.

    opened by Insprill 0
  • Fix queue behaviour when switching away from random

    Fix queue behaviour when switching away from random

    Playback should proceed according to the currently selected queue behaviour. The implementation of random/shuffle was causing other options to fail if it had been previously selected.

    This change restores the actual playlist position when switching queue behaviours, allowing for correct queue advancement at the end of the currently playing item.

    To reproduce the original problem: Open a playlist/album. Select and play any item other than number 1*. Select the random queue behaviour. Select the loop all behaviour. Click the skip to next item button. When play advances to the next item, it will not be as expected (item 2 will probably play).

    *The problem still exists from here, but is harder to spot.

    opened by bivhitscar 0
  • Authentication failed: premium account required but account is premium

    Authentication failed: premium account required but account is premium

    When I try to login with my account it says "error Authentication failed: premium account required" I don't have a classical premium account but I do have a family premium account. This used to work, but I haven't used the program in quite a while so I can't pinpoint when it broke. image

    opened by exur00 3
  • MacOS 13 apple build fail/high processor usage

    MacOS 13 apple build fail/high processor usage

    hello again. I try to build fresh psst app - developer app build ok but have large size psst-gui have almost 68MB and use a lot od processor around 30%.

    Zrzut ekranu 2022-11-1 o 09 23 21

    When I try to build Release build:

    cd psst-gui
    cargo build --release
    

    i got error:

    Compiling lock_api v0.4.9
       Compiling num-bigint v0.4.3
    error: failed to run custom build command for `quote v1.0.21`
    
    Caused by:
      process didn't exit successfully: `/Users/naymapl/psst/target/release/build/quote-7267b0cc1d4bd6e3/build-script-build` (signal: 9, SIGKILL: kill)
    warning: build failed, waiting for other jobs to finish...
    
    

    This hight 30% usage od cpu is coming when you start any track. When app is just iopen without plaing anything cpu ussage is around 1.5-1.8%. Any idea ?

    bug 
    opened by naymapl 0
  • Addressing GitHub deprecation warnings in the CI workflow

    Addressing GitHub deprecation warnings in the CI workflow

    This PR addresses some of the deprecation warnings in the CI workflow. By updating the actions in use and fixing one usage of the deprecated ::set-output in the appimage job that I created I brought the deprecation warnings from roughly 30 down to 16 in the master branch.

    The remaining 16 deprecation warnings seem to stem from the different OS images that are in use and should automatically resolve when GitHub points them to newer releases (i.e. ubuntu-latest currently points to ubuntu-20.04 and will pivot to ubuntu-22.04 in the near future as of https://github.blog/changelog/2022-08-09-github-actions-ubuntu-22-04-is-now-generally-available-on-github-hosted-runners/ ).

    opened by swiesmann 0
Owner
Jan Pochyla
Jan Pochyla
ncspot is a ncurses Spotify client written in Rust using librespot.

ncspot is a ncurses Spotify client written in Rust using librespot. It is heavily inspired by ncurses MPD clients, such as ncmpc. My motivation was to provide a simple and resource friendly alternative to the official client as well as to support platforms that currently don't have a Spotify client, such as the *BSDs.

Henrik Friedrichsen 3.4k Jan 8, 2023
Spotify for the terminal written in Rust πŸš€

Spotify TUI A Spotify client for the terminal written in Rust. The terminal in the demo above is using the Rigel theme. Spotify TUI Installation Homeb

Alexander Keliris 14.1k Jan 1, 2023
A spotify daemon

Spotifyd An open source Spotify client running as a UNIX daemon. Spotifyd streams music just like the official client, but is more lightweight and sup

null 8.4k Dec 31, 2022
🎧 a self-hosted Spotify β†’ Discord music bot

Aoede is a Discord music bot that directly streams from Spotify to Discord. The only interface is Spotify itself. Note: a Spotify Premium account is c

Max Isom 159 Dec 29, 2022
A Spotify downloader written in rust, which does not require a premium account

DownOnSpot A Spotify downloader written in Rust Disclaimer DownOnSpot was not developed for piracy. It is meant to be used in compliance with DMCA, Se

oSumAtrIX 273 Jan 7, 2023
code to connect + communicate with a Spotify Car Thing

spotify_carthing_bt A grab-bag of spotify car thing related hacks I'm working on. deskthing-rs A Rust port of https://github.com/relative/deskthing, w

Daniel Prilik 6 Dec 19, 2022
Effortlessly beautify your Spotify playlists with just a single, enchanting script πŸ’« 🎡

harmonia harmonia, effortlessly beautify your Spotify playlists with just a single, enchanting script. ?? ?? HANDLE WITH LOVE: Since harmonia is bloss

GΓΌlce 4 Jun 23, 2023
Procedural engine sound generator controlled via GUI or CLI

enginesound GUI Application used to generate purely synthetic engine sounds with advanced options written in Rust loosely based on this paper Reading

null 198 Dec 30, 2022
A very simple audio synthesizer with a tuix gui

In this tutorial we'll create a very simple audio synthesiser application from scratch with a ui using tuix. The finished code for this tutorial can b

George Atkinson 24 Jan 6, 2023
A simple GUI audio player written in Rust with egui. Inspired by foobar2000.

Music Player A simple GUI music player inspired by foobar2000 written in Rust using egui. The goal of this project is to learn about making gui/ nativ

Ryan Blecher 5 Sep 16, 2022
A simple GUI rust application that keeps track of how much time you spend on each application.

TimeSpent A simple GUI rust application that keeps track of how much time you spend on each application. Installation Click here to download the Setup

Slacked Lime 4 Sep 23, 2022
A multi-threaded GTK 3 application for fetching the lyrics of the current playing song

Lyriek A multi-threaded GTK 3 application for fetching the lyrics of the current playing song. Installation Arch Linux yay -S lyriek Ubuntu apt insta

Bart Willems 18 Feb 9, 2022
Minimalist multi-track audio recorder which may be controlled via OSC or MIDI.

smrec Minimalist multi-track audio recorder which may be controlled via OSC or MIDI. I did this because I needed a simple multi-track audio recorder w

Ali Somay 18 Oct 22, 2023
Auritia is a DAW coded in Rust and Vue in hopes of having cross platform compatability, while also providing enough features for anyone to use professionally

Steps Install WebView if you're not on Windows 11 Install Node deps npm i To run the dev server do npm run tauri dev Compiling Linux You will need to

Auritia 20 Aug 27, 2022
Cross-platform audio I/O library in pure Rust

CPAL - Cross-Platform Audio Library Low-level library for audio input and output in pure Rust. This library currently supports the following: Enumerat

null 1.8k Jan 8, 2023
Cross-platform realtime MIDI processing in Rust.

midir Cross-platform, realtime MIDI processing in Rust. Features midir is inspired by RtMidi and supports the same features*, including virtual ports

Patrick Reisert 392 Dec 27, 2022
Cross-platform audio for Rust

quad-snd High-level, light-weight, and opinionated audio library. Web: WebAudio Android: OpenSLES Linux: Alsa macOS: CoreAudio Windows: Wasapi iOS: Co

Fedor Logachev 86 Nov 7, 2022
TinyAudio is a cross-platform audio output library

TinyAudio TinyAudio is a cross-platform audio output library. Its main goal to provide unified access to a default sound output device of your operati

Dmitry Stepanov 39 Apr 4, 2023
NekoMC (New Efficient Kitten-oriented MPRIS Client)

a waybar/general component for displaying current song data in bars like waybar and controling players using MPRIS

Insert5StarName 5 Mar 20, 2023