Giter Site home page Giter Site logo

spotify-tui's Introduction

Spotify TUI

Continuous Integration Crates.io

All Contributors

Follow Alexander Keliris (Rigellute)

A Spotify client for the terminal written in Rust.

Demo

The terminal in the demo above is using the Rigel theme.

Installation

The binary executable is spt.

Homebrew

For both macOS and Linux

brew install spotify-tui

To update, run

brew upgrade spotify-tui

Snap

For a system with Snap installed, run

snap install spt

The stable version will be installed for you automatically.

If you want to install the nightly build, run

snap install spt --edge

AUR

For those on Arch Linux you can find the package on AUR here. If however you're using an AUR helper you can install directly from that, for example (in the case of yay), run

yay -S spotify-tui

Nix

Available as the package spotify-tui. To install run:

nix-env -iA nixpkgs.spotify-tui

Where nixpkgs is the channel name in your configuration. For a more up-to-date installation, use the unstable channel. It is also possible to add the package to environment.systemPackages (for NixOS), or home.packages when using home-manager.

Void Linux

Available on the official repositories. To install, run

sudo xbps-install -Su spotify-tui

Fedora/CentOS

Available on the Copr repositories. To install, run

sudo dnf copr enable atim/spotify-tui -y && sudo dnf install spotify-tui

Cargo

Use this option if your architecture is not supported by the pre-built binaries found on the releases page.

First, install Rust (using the recommended rustup installation method) and then

cargo install spotify-tui

This method will build the binary from source.

To update, run the same command again.

Note on Linux

For compilation on Linux the development packages for libssl are required. For basic installation instructions, see install OpenSSL. In order to locate dependencies, the compilation also requires pkg-config to be installed.

If you are using the Windows Subsystem for Linux, you'll need to install additional dependencies.

Windows 10

Scoop installer

First, make sure scoop installer is on your windows box, for instruction please visit scoop.sh

Then open powershell and run following two commands:

scoop bucket add scoop-bucket https://github.com/Rigellute/scoop-bucket
scoop install spotify-tui

After that program is available as: spt or spt.exe

Manual

  1. Download the latest binary for your OS.
  2. cd to the file you just downloaded and unzip
  3. cd to spotify-tui and run with ./spt

Connecting to Spotifyโ€™s API

spotify-tui needs to connect to Spotifyโ€™s API in order to find music by name, play tracks etc.

Instructions on how to set this up will be shown when you first run the app.

But here they are again:

  1. Go to the Spotify dashboard
  2. Click Create an app
    • You now can see your Client ID and Client Secret
  3. Now click Edit Settings
  4. Add http://localhost:8888/callback to the Redirect URIs
  5. Scroll down and click Save
  6. You are now ready to authenticate with Spotify!
  7. Go back to the terminal
  8. Run spt
  9. Enter your Client ID
  10. Enter your Client Secret
  11. Press enter to confirm the default port (8888) or enter a custom port
  12. You will be redirected to an official Spotify webpage to ask you for permissions.
  13. After accepting the permissions, you'll be redirected to localhost. If all goes well, the redirect URL will be parsed automatically and now you're done. If the local webserver fails for some reason you'll be redirected to a blank webpage that might say something like "Connection Refused" since no server is running. Regardless, copy the URL and paste into the prompt in the terminal.

And now you are ready to use the spotify-tui ๐ŸŽ‰

You can edit the config at anytime at ${HOME}/.config/spotify-tui/client.yml. (for snap ${HOME}/snap/spt/current/.config/spotify-tui/client.yml)

Usage

The binary is named spt.

Running spt with no arguments will bring up the UI. Press ? to bring up a help menu that shows currently implemented key events and their actions. There is also a CLI that is able to do most of the stuff the UI does. Use spt --help to learn more.

Here are some example to get you excited.

spt --completions zsh # Prints shell completions for zsh to stdout (bash, power-shell and more are supported)

spt play --name "Your Playlist" --playlist --random # Plays a random song from "Your Playlist"
spt play --name "A cool song" --track # Plays 'A cool song'

spt playback --like --shuffle # Likes the current song and toggles shuffle mode
spt playback --toggle # Plays/pauses the current playback

spt list --liked --limit 50 # See your liked songs (50 is the max limit)

# Looks for 'An even cooler song' and gives you the '{name} from {album}' of up to 30 matches
spt search "An even cooler song" --tracks --format "%t from %b" --limit 30

Configuration

A configuration file is located at ${HOME}/.config/spotify-tui/config.yml, for snap ${HOME}/snap/spt/current/.config/spotify-tui/config.yml (not to be confused with client.yml which handles spotify authentication)

The following is a sample config.yml file:

# Sample config file

# The theme colours can be an rgb string of the form "255, 255, 255" or a string that references the colours from your terminal theme: Reset, Black, Red, Green, Yellow, Blue, Magenta, Cyan, Gray, DarkGray, LightRed, LightGreen, LightYellow, LightBlue, LightMagenta, LightCyan, White.
theme:
  active: Cyan # current playing song in list
  banner: LightCyan # the "spotify-tui" banner on launch
  error_border: Red # error dialog border
  error_text: LightRed # error message text (e.g. "Spotify API reported error 404")
  hint: Yellow # hint text in errors
  hovered: Magenta # hovered pane border
  inactive: Gray # borders of inactive panes
  playbar_background: Black # background of progress bar
  playbar_progress: LightCyan # filled-in part of the progress bar
  playbar_progress_text: Cyan # song length and time played/left indicator in the progress bar
  playbar_text: White # artist name in player pane
  selected: LightCyan # a) selected pane border, b) hovered item in list, & c) track title in player
  text: "255, 255, 255" # text in panes
  header: White # header text in panes (e.g. 'Title', 'Artist', etc.)

behavior:
  seek_milliseconds: 5000
  volume_increment: 10
  # The lower the number the higher the "frames per second". You can decrease this number so that the audio visualisation is smoother but this can be expensive!
  tick_rate_milliseconds: 250
  # Enable text emphasis (typically italic/bold text styling). Disabling this might be important if the terminal config is otherwise restricted and rendering text escapes interferes with the UI.
  enable_text_emphasis: true
  # Controls whether to show a loading indicator in the top right of the UI whenever communicating with Spotify API
  show_loading_indicator: true
  # Disables the responsive layout that makes the search bar smaller on bigger
  # screens and enforces a wide search bar
  enforce_wide_search_bar: false
  # Determines the text icon to display next to "liked" Spotify items, such as
  # liked songs and albums, or followed artists. Can be any length string.
  # These icons require a patched nerd font.
  liked_icon: โ™ฅ
  shuffle_icon: ๐Ÿ”€
  repeat_track_icon: ๐Ÿ”‚
  repeat_context_icon: ๐Ÿ”
  playing_icon: โ–ถ
  paused_icon: โธ
  # Sets the window title to "spt - Spotify TUI" via ANSI escape code.
  set_window_title: true

keybindings:
  # Key stroke can be used if it only uses two keys:
  # ctrl-q works,
  # ctrl-alt-q doesn't.
  back: "ctrl-q"

  jump_to_album: "a"

  # Shift modifiers use a capital letter (also applies with other modifier keys
  # like ctrl-A)
  jump_to_artist_album: "A"

  manage_devices: "d"
  decrease_volume: "-"
  increase_volume: "+"
  toggle_playback: " "
  seek_backwards: "<"
  seek_forwards: ">"
  next_track: "n"
  previous_track: "p"
  copy_song_url: "c"
  copy_album_url: "C"
  help: "?"
  shuffle: "ctrl-s"
  repeat: "r"
  search: "/"
  audio_analysis: "v"
  jump_to_context: "o"
  basic_view: "B"
  add_item_to_queue: "z"

Limitations

This app uses the Web API from Spotify, which doesn't handle streaming itself. So you'll need either an official Spotify client open or a lighter weight alternative such as spotifyd.

If you want to play tracks, Spotify requires that you have a Premium account.

Using with spotifyd

Follow the spotifyd documentation to get set up.

After that there is not much to it.

  1. Start running the spotifyd daemon.
  2. Start up spt
  3. Press d to go to the device selection menu and the spotifyd "device" should be there - if not check these docs

Libraries used

Development

  1. Install OpenSSL
  2. Install Rust
  3. Install xorg-dev (required for clipboard support)
  4. Clone or fork this repo and cd to it
  5. And then cargo run

Windows Subsystem for Linux

You might get a linking error. If so, you'll probably need to install additional dependencies required by the clipboard package

sudo apt-get install -y -qq pkg-config libssl-dev libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev

Contributors

Thanks goes to these wonderful people (emoji key):


Alexander Keliris

๐Ÿ’ป ๐Ÿ“– ๐ŸŽจ ๐Ÿ“ ๐Ÿค” ๐Ÿš‡ ๐Ÿšง ๐Ÿ“ฆ ๐Ÿ‘€

Mickael Marques

๐Ÿ’ต

Grzegorz Koperwas

๐Ÿ“–

Austin Gassert

๐Ÿ’ป

Calen Robinette

๐Ÿ’ป

M*C*O

๐Ÿš‡

Andrew Chin

๐Ÿ’ป

Sam Naser

๐Ÿ’ป

Micha

๐Ÿ’ป

neriglissar

๐Ÿ’ป

Timon

๐Ÿ’ป

echoSayonara

๐Ÿ’ป

D-Nice

๐Ÿ“– ๐Ÿš‡

Grzegorz Pawlik

๐Ÿ’ป

Lennart Bernhardt

๐Ÿ’ป

Arnaud Lefebvre

๐Ÿ’ป

tem1029

๐Ÿ’ป

Peter K. Moss

๐Ÿ’ป

Geoff Shannon

๐Ÿ’ป

Zachary Mayhew

๐Ÿ’ป

jfaltis

๐Ÿ’ป

Marcel Schramm

๐Ÿ“–

Fangyi Zhou

๐Ÿ’ป

Max

๐Ÿ’ป

Sven van der Vlist

๐Ÿ’ป

jacobchrismarsh

๐Ÿ’ป

Nils Rauch

๐Ÿ’ป

Nick Stockton

๐Ÿ’ป ๐Ÿ› ๐Ÿšง ๐Ÿ’ฌ ๐Ÿ“–

Stuart Hinson

๐Ÿ’ป

Sam Calvert

๐Ÿ’ป ๐Ÿ“–

Jeroen Wijenbergh

๐Ÿ“–

Kimberley Cook

๐Ÿ“–

Audrey Baxter

๐Ÿ’ป

Norman

๐Ÿ“–

Peter Maatman

๐Ÿ’ป

AlexandreS

๐Ÿ’ป

Finn Vos

๐Ÿ’ป

Carlos Hernandez

๐Ÿ“ฆ

Pedro Alves

๐Ÿ’ป

jtagcat

๐Ÿ“–

Benjamin Kitor

๐Ÿ’ป

Aleลก Najmann

๐Ÿ“– ๐Ÿ“ฆ

Jeremy Stucki

๐Ÿ’ป

(ยดโŒฃ`สƒฦช)

๐Ÿ’ป

Artem Polishchuk

๐Ÿ“ฆ

Chris Sosnin

๐Ÿ’ป

Ben Buhse

๐Ÿ“–

Sean Li

๐Ÿ’ป

TimotheeGerber

๐Ÿ’ป ๐Ÿ“–

Ferdinand Ratajczak

๐Ÿ’ป

Sheel Choksi

๐Ÿ’ป

Michael Hellwig

๐Ÿ“–

Oliver Daniel

๐Ÿ’ป

Drew Fisher

๐Ÿ’ป

ncoder-1

๐Ÿ“–

Macguire Rintoul

๐Ÿ“–

Ricardo Holguin

๐Ÿ’ป

Keisuke Toyota

๐Ÿ’ป

Craig Astill

๐Ÿ’ป

Onielfa

๐Ÿ’ป

usrme

๐Ÿ“–

Sergey A.

๐Ÿ’ป

Hideyuki Okada

๐Ÿ’ป

kepae

๐Ÿ’ป ๐Ÿ“–

ร‰rico Nogueira Rolim

๐Ÿ’ป

Alexander Meinhardt Scheurer

๐Ÿ’ป

Ondล™ej Kinลกt

๐Ÿ’ป

Kryan90

๐Ÿ“–

n-ivanov

๐Ÿ’ป

bi1yeu

๐Ÿ’ป ๐Ÿ“–

May

๐Ÿ’ป

Bruno A. Muciรฑo

๐Ÿ’ป

Finn Hediger

๐Ÿ’ป

dp304

๐Ÿ’ป

Marco Micera

๐Ÿ“–

Marco Ieni

๐Ÿš‡

Artรบr Kovรกcs

๐Ÿ’ป

Antony Kellermann

๐Ÿ’ป

Rasmus Pedersen

๐Ÿ’ป

noir-Z

๐Ÿ“–

David Bailey

๐Ÿ“–

sheepwall

๐Ÿ’ป

Hwatwasthat

๐Ÿ’ป

Jesse

๐Ÿ’ป

Sang

๐Ÿ“–

Yuuki Takahashi

๐Ÿ“–

Alejandro Angulo

๐Ÿ’ป

Anton Kostin

๐Ÿ“–

Justin Sexton

๐Ÿ’ป

Jiati Le

๐Ÿ“–

Matthew Cobbing

๐Ÿ’ป

Milo

๐Ÿš‡

Diego Veralli

๐Ÿ’ป

Maja Bojarska

๐Ÿ’ป

This project follows the all-contributors specification. Contributions of any kind welcome!

Roadmap

The goal is to eventually implement almost every Spotify feature.

High-level requirements yet to be implemented

  • Add songs to a playlist
  • Be able to scroll through result pages in every view

This table shows all that is possible with the Spotify API, what is implemented already, and whether that is essential.

API method Implemented yet? Explanation Essential?
track No returns a single track given the track's ID, URI or URL No
tracks No returns a list of tracks given a list of track IDs, URIs, or URLs No
artist No returns a single artist given the artist's ID, URI or URL Yes
artists No returns a list of artists given the artist IDs, URIs, or URLs No
artist_albums Yes Get Spotify catalog information about an artist's albums Yes
artist_top_tracks Yes Get Spotify catalog information about an artist's top 10 tracks by country. Yes
artist_related_artists Yes Get Spotify catalog information about artists similar to an identified artist. Similarity is based on analysis of the Spotify community's listening history. Yes
album Yes returns a single album given the album's ID, URIs or URL Yes
albums No returns a list of albums given the album IDs, URIs, or URLs No
search_album Yes Search album based on query Yes
search_artist Yes Search artist based on query Yes
search_track Yes Search track based on query Yes
search_playlist Yes Search playlist based on query Yes
album_track Yes Get Spotify catalog information about an album's tracks Yes
user No Gets basic profile information about a Spotify User No
playlist Yes Get full details about Spotify playlist Yes
current_user_playlists Yes Get current user playlists without required getting his profile Yes
user_playlists No Gets playlists of a user No
user_playlist No Gets playlist of a user No
user_playlist_tracks Yes Get full details of the tracks of a playlist owned by a user Yes
user_playlist_create No Creates a playlist for a user Yes
user_playlist_change_detail No Changes a playlist's name and/or public/private state Yes
user_playlist_unfollow Yes Unfollows (deletes) a playlist for a user Yes
user_playlist_add_track No Adds tracks to a playlist Yes
user_playlist_replace_track No Replace all tracks in a playlist No
user_playlist_recorder_tracks No Reorder tracks in a playlist No
user_playlist_remove_all_occurrences_of_track No Removes all occurrences of the given tracks from the given playlist No
user_playlist_remove_specific_occurrenes_of_track No Removes all occurrences of the given tracks from the given playlist No
user_playlist_follow_playlist Yes Add the current authenticated user as a follower of a playlist. Yes
user_playlist_check_follow No Check to see if the given users are following the given playlist Yes
me No Get detailed profile information about the current user. Yes
current_user No Alias for me Yes
current_user_playing_track Yes Get information about the current users currently playing track. Yes
current_user_saved_albums Yes Gets a list of the albums saved in the current authorized user's "Your Music" library Yes
current_user_saved_tracks Yes Gets the user's saved tracks or "Liked Songs" Yes
current_user_followed_artists Yes Gets a list of the artists followed by the current authorized user Yes
current_user_saved_tracks_delete Yes Remove one or more tracks from the current user's "Your Music" library. Yes
current_user_saved_tracks_contain No Check if one or more tracks is already saved in the current Spotify userโ€™s โ€œYour Musicโ€ library. Yes
current_user_saved_tracks_add Yes Save one or more tracks to the current user's "Your Music" library. Yes
current_user_top_artists No Get the current user's top artists Yes
current_user_top_tracks No Get the current user's top tracks Yes
current_user_recently_played Yes Get the current user's recently played tracks Yes
current_user_saved_albums_add Yes Add one or more albums to the current user's "Your Music" library. Yes
current_user_saved_albums_delete Yes Remove one or more albums from the current user's "Your Music" library. Yes
user_follow_artists Yes Follow one or more artists Yes
user_unfollow_artists Yes Unfollow one or more artists Yes
user_follow_users No Follow one or more users No
user_unfollow_users No Unfollow one or more users No
featured_playlists No Get a list of Spotify featured playlists Yes
new_releases No Get a list of new album releases featured in Spotify Yes
categories No Get a list of categories used to tag items in Spotify Yes
recommendations Yes Get Recommendations Based on Seeds Yes
audio_features No Get audio features for a track No
audios_features No Get Audio Features for Several Tracks No
audio_analysis Yes Get Audio Analysis for a Track Yes
device Yes Get a Userโ€™s Available Devices Yes
current_playback Yes Get Information About The Userโ€™s Current Playback Yes
current_playing No Get the Userโ€™s Currently Playing Track No
transfer_playback Yes Transfer a Userโ€™s Playback Yes
start_playback Yes Start/Resume a Userโ€™s Playback Yes
pause_playback Yes Pause a Userโ€™s Playback Yes
next_track Yes Skip Userโ€™s Playback To Next Track Yes
previous_track Yes Skip Userโ€™s Playback To Previous Track Yes
seek_track Yes Seek To Position In Currently Playing Track Yes
repeat Yes Set Repeat Mode On Userโ€™s Playback Yes
volume Yes Set Volume For Userโ€™s Playback Yes
shuffle Yes Toggle Shuffle For Userโ€™s Playback Yes

spotify-tui's People

Contributors

allcontributors[bot] avatar amgassert avatar bios-marcel avatar bkitor avatar dependabot-preview[bot] avatar dependabot[bot] avatar dp304 avatar fangyi-zhou avatar fratajczak avatar gpawlik avatar ilnaes avatar jfaltis avatar lennypenny avatar littleli avatar marcoieni avatar orangefran avatar peterwmoss avatar radicalzephyr avatar ricardo-he avatar rigellute avatar skrewby avatar slumber avatar sputnick1124 avatar stuarth avatar svenvnl avatar tem1029 avatar timonpost avatar timotheegerber avatar utagai avatar zacklukem avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spotify-tui's Issues

dyld: Symbol not found: __cg_jpeg_resync_to_restart

macOS Mojava 10.14.6, install by brew:

spt

dyld: Symbol not found: __cg_jpeg_resync_to_restart
  Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /usr/local/lib/libJPEG.dylib
 in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
[1]    5267 abort      spt

Windows Installation

Hi,

About spotify-tui windows installation, there is a tutorial to use it?

Greetings

cargo install spotify-tui fails on Ubuntu 19.10

Hi. First time Rust user so excuse my naivety.

Running cargo install spotify-tui produces:

   ...
   Compiling idna v0.2.0
   Compiling idna v0.1.5
   Compiling want v0.2.0
error: failed to run custom build command for `openssl-sys v0.9.50`

Caused by:
  process didn't exit successfully: `/tmp/cargo-installsXx3mo/release/build/openssl-sys-29b8e6cd7dd78066/build-script-main` (exit code: 101)
--- stdout
cargo:rustc-cfg=const_fn
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
run pkg_config fail: "Failed to run `\"pkg-config\" \"--libs\" \"--cflags\" \"openssl\"`: No such file or directory (os error 2)"

--- stderr
thread 'main' panicked at '

Could not find directory of OpenSSL installation, and this `-sys` crate cannot
proceed without this knowledge. If OpenSSL is installed and this crate had
trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the
compilation process.

Make sure you also have the development packages of openssl installed.
For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.

If you're in a situation where you think the directory *should* be found
automatically, please open a bug at https://github.com/sfackler/rust-openssl
and include information about your system as well as this message.

$HOST = x86_64-unknown-linux-gnu
$TARGET = x86_64-unknown-linux-gnu
openssl-sys = 0.9.50


It looks like you're compiling on Linux and also targeting Linux. Currently this
requires the `pkg-config` utility to find OpenSSL but unfortunately `pkg-config`
could not be found. If you have OpenSSL installed you can likely fix this by
installing `pkg-config`.

', /home/tim/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.50/build/find_normal.rs:150:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

warning: build failed, waiting for other jobs to finish...
error: failed to compile `spotify-tui v0.4.0`, intermediate artifacts can be found at `/tmp/cargo-installsXx3mo`

Caused by:
  build failed

~/work via ๐Ÿ 3.6.2 took 3m 25s 
โžœ sudo apt-get install libssl-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libssl-dev is already the newest version (1.1.1c-1ubuntu4).
The following packages were automatically installed and are no longer required:
  apache2-utils authbind libapr1 libaprutil1 libecj-java libjaxb-api-java libjetty9-extra-java libjffi-java libjffi-jni libjnr-constants-java libjnr-enxio-java libjnr-ffi-java libjnr-posix-java libjnr-unixsocket-java libjnr-x86asm-java
  libspring-beans-java libspring-core-java libtaglibs-standard-impl-java libtaglibs-standard-spec-java
Use 'sudo apt autoremove' to remove them.
0 to upgrade, 0 to newly install, 0 to remove and 1 not to upgrade.

~/work via ๐Ÿ 3.6.2 
โžœ openssl version
OpenSSL 1.1.1c  28 May 2019

Looking at sfackler/rust-openssl#1164, it appears that openssl-sys v0.9.50 (which is in your dependency chain?) does not work with OpenSSL 1.1.1

thread '<unnamed>' panicked at 'called `Result::unwrap()`

thread '' panicked at 'called Result::unwrap() on an Err value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:999:5
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace.

Update to new version

First of all, i have tried your tui now for a while and i gotta say that i love it! I follow every new feature and i am really happy to see all the progress.

Sorry if this is not the right forum but do you have a command that updates the tui to the latest version? Or should this command check the latest version when it starts?

Example: I have the older version that does not have "next track". Could it be a good thing to implement a check for your latest version so i know that i could update it? I have to check everything manually now.

Solution: Check if the user has the latest version and ask if you want to update. When new update is installed maybe have some text with new implemented features?

Can't play tracks from spotify-tui

When I try to launch a start a track I get an error message saying:
"Api response: Spotify API reported an error.
If you are trying to play a track, make sure the offical spotify app is open"

And it is open I can even see what song is currently playing.

Implement a configuration file (e.g. for keybindings, etc.)

Create a config for easy customization of keybindings, program behaviour, etc. It could be located at $HOME/.config/spotify-tui/config.yml.

The current client configurations could be moved into this configuration too.
E.g

---
client:
  - client_id:
  - client_secret:
  - device_id:
  
keybindings:
  - left: h
  - down: j
  - up: k
  - right: l

Config broken

It seems that after downloading the binary from cargo, I do not have a working config file

Posting a blank config working could solve this issue.

Error: Message("invalid type: unit value, expected struct ClientConfig", Some(Pos { marker: Marker { index: 6, line: 4, col: 0 }, path: "." }))

This is my error message.

Unable to authorize

Every time I try to authorize I get INVALID_CLIENT: Invalid redirect URI as a reply from Spotify.

The URL generated by spotify-tui is:
https://accounts.spotify.com/authorize?redirect_uri=http:%2F%2Flocalhost:8888%2Fcallback&client_id=[CLIENT_ID]&response_type=code&state=[STATE]&scope=playlist-read-private%20user-library-modify%20user-library-read%20user-modify-playback-state%20user-read-currently-playing%20user-read-playback-state%20user-read-private%20user-read-recently-played&

This happens independent of browser with the homebrew version on MacOs 10.14.5

Unable to scroll past first page of songs in playlist

After selecting a playlist, I can only view the first 30 or so songs and can't scroll beyond that. Scrolling using vim keys or arrow keys brings me back to the top of the list, and ctl+d/u doesn't do anything (although I'm not too sure ctl+d/u should do). Hopefully I'm not missing something easy in the help section.

Can't play tracks through Spotify TUI

Hi, thanks for working on this! Pretty interesting project.

I installed this with cargo (5eaecb0) but for some reason it won't detect that my Spotify Desktop is open and I always end up with this error whenever I try to play a track through TUI:

Api response: Spotify API reported an error
If you are trying to play a track, make sure the official spotify app is open
Press <Esc> to return

However, the TUI displays the current track playing and its position correctly.

Might it be that Spotify API requires a Spotify Premium account for this feature to work?

Publish crate

Would be great if you could $ cargo install spotify-tui.

Looks like a sweet project.

Authentication Error. INVALID_CLIENT: Invalid redirect URI

I have followed the instructions in the README and created the file in ~/.config/spotify-tui/client.yml with the correct credentials, and it's being read correctly.

Here is the request being made with important parts removed:

$ spotify-tui
Opened https://accounts.spotify.com/authorize?scope=user-modify-playback-state%20user-read-playback-state%20user-read-private%20user-read-currently-playing%20playlist-read-private%20user-library-read%20user-read-recently-played&client_id=CLIENT_ID&redirect_uri=http:%2F%2Flocalhost:8888%2Fcallback&response_type=code&state=xvlgXiO7MBaweLQ6& in your browser
Enter the URL you were redirected to: 

Here's the error page I get:

image

I'm noticing that the secret isn't included in the request. Should it be?

cargo install error Ubuntu 18.04

Tried installing via cargo:

cargo install spotify-tui

and got the following error:

    Updating crates.io index
  Installing spotify-tui v0.4.0
error: failed to compile `spotify-tui v0.4.0`, intermediate artifacts can be found at `/tmp/cargo-installls8SWH`

Caused by:
  unable to get packages from source

Caused by:
  failed to parse manifest at `/home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.34/Cargo.toml`

Caused by:
  feature `rename-dependency` is required

this Cargo does not support nightly features, but if you
switch to nightly channel you can add
`cargo-features = ["rename-dependency"]` to enable this feature

Rust installed via rustup on Ubuntu 18.04

Linking error with Ubuntu 18.04

Thanks for this great app! I am trying to build for Ubuntu 18.04 but getting this error. Thank you for any guidance.

Compiling spotify-tui v0.6.2 error: linking withccfailed: exit code: 1 | = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/brendan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.0.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.1.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.10.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.11.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.12.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.13.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.14.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.15.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.2.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.3.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.4.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.5.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.6.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.7.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.8.rcgu.o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.spt.9nqlk0j9-cgu.9.rcgu.o" "-o" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561" "/tmp/cargo-install4Cfs9h/release/deps/spt-7ec6f893f06f5561.47pxari3l4vn7782.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs" "-L" "/tmp/cargo-install4Cfs9h/release/deps" "-L" "/tmp/cargo-install4Cfs9h/release/build/backtrace-sys-6335e9cbc5f67c4d/out" "-L" "/home/brendan/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/tmp/cargo-install4Cfs9h/release/deps/libserde_yaml-8d44eac82564392d.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libyaml_rust-d81429449dc24cbb.rlib" "/tmp/cargo-install4Cfs9h/release/deps/liblinked_hash_map-e4890eadedeb8224.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libclap-ea086e5ba1a1d381.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libvec_map-31dc9a693a4a81e3.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libtextwrap-bdab6b89a06c723b.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libstrsim-4dcff5113b2146ff.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libansi_term-32b6666dc48e585a.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libdirs-bab61cddd523db62.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libdirs_sys-639bdc321521283b.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libtui-20e40b0d40cfb4e2.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libcassowary-d86a96321c02898a.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libunicode_width-9f3924e3e3141e72.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libunicode_segmentation-9a919c577d642cc2.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libtermion-e7792cde031aadd5.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libnumtoa-7557d30a5e9b1a6d.rlib" "/tmp/cargo-install4Cfs9h/release/deps/librspotify-698216f05d0e1fb4.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libdotenv-e89e02bb033aec32.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libitertools-c80bad646a5eab1d.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libwebbrowser-daebd74259dba216.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libchrono-0805c79bb7ee4099.rlib" "/tmp/cargo-install4Cfs9h/release/deps/librustc_serialize-5b0f76bcae5f9800.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libnum_integer-d4c1ffdd4e03d0ed.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libnum_traits-1e075d15ab2edabd.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib" "/tmp/cargo-install4Cfs9h/release/deps/libuuid-5470b3f4ddf64c15.rlib" "/tmp/cargo-install4Cfs9h/release/deps/librand-77ebb0d412a3eec8.rlib" "/tmp/cargo-install4Cfs9h/re = note: /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.15.rcgu.o): In functioncore::ptr::real_drop_in_place':
reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x4d): undefined reference to sk_pop' reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x60): undefined reference to sk_pop'
reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x8f): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.15.rcgu.o): In function core::ptr::real_drop_in_place':
reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x2f): undefined reference to sk_pop' reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x42): undefined reference to sk_pop'
reqwest.f36917vf-cgu.15:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x6d): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.3.rcgu.o): In function core::ptr::real_drop_in_place':
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x4d): undefined reference to sk_pop' reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x60): undefined reference to sk_pop'
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17h8541869b63f84185E+0x8f): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.3.rcgu.o): In function core::ptr::real_drop_in_place':
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x33): undefined reference to sk_pop' reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x46): undefined reference to sk_pop'
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x67): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.3.rcgu.o): In function core::ptr::real_drop_in_place':
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x2f): undefined reference to sk_pop' reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x42): undefined reference to sk_pop'
reqwest.f36917vf-cgu.3:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x6d): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.3.rcgu.o): In function reqwest::connect::Connector::new_default_tls':
reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x257): undefined reference to sk_pop' reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x26a): undefined reference to sk_pop'
reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x288): undefined reference to sk_free' reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x3b5): undefined reference to sk_pop'
reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x3c8): undefined reference to sk_pop' reqwest.f36917vf-cgu.3:(.text._ZN7reqwest7connect9Connector15new_default_tls17h8d3027f3120d2e3cE+0x3e8): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.4.rcgu.o): In function core::ptr::real_drop_in_place': reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17h03f22d935e3f560bE+0x4d): undefined reference to sk_pop'
reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17h03f22d935e3f560bE+0x60): undefined reference to sk_pop' reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17h03f22d935e3f560bE+0x8f): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.4.rcgu.o): In function core::ptr::real_drop_in_place': reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x2f): undefined reference to sk_pop'
reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x42): undefined reference to sk_pop' reqwest.f36917vf-cgu.4:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x6d): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.5.rcgu.o): In function core::ptr::real_drop_in_place': reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x33): undefined reference to sk_pop'
reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x46): undefined reference to sk_pop' reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hbca00f17854cfa86E+0x67): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.5.rcgu.o): In function core::ptr::real_drop_in_place': reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17he55c792f297e5e24E+0x28): undefined reference to sk_pop'
reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17he55c792f297e5e24E+0x3b): undefined reference to sk_pop' reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17he55c792f297e5e24E+0x5d): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.5.rcgu.o): In function core::ptr::real_drop_in_place': reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x2f): undefined reference to sk_pop'
reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x42): undefined reference to sk_pop' reqwest.f36917vf-cgu.5:(.text._ZN4core3ptr18real_drop_in_place17hecff3f6f06deb1d7E+0x6d): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libreqwest-a596dff68d420d29.rlib(reqwest-a596dff68d420d29.reqwest.f36917vf-cgu.5.rcgu.o): In function reqwest::async_impl::client::ClientBuilder::build': reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0x2c6): undefined reference to sk_pop'
reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0x2d9): undefined reference to sk_pop' reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0x2fe): undefined reference to sk_free'
reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0xa62): undefined reference to sk_pop' reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0xa75): undefined reference to sk_pop'
reqwest.f36917vf-cgu.5:(.text._ZN7reqwest10async_impl6client13ClientBuilder5build17hf413fe8b04345345E+0xa9e): undefined reference to sk_free' /tmp/cargo-install4Cfs9h/release/deps/libnative_tls-6bd62f1981dbd61d.rlib(native_tls-6bd62f1981dbd61d.native_tls.1u6r82qc-cgu.0.rcgu.o): In function native_tls::imp::TlsConnector::new':
native_tls.1u6r82qc-cgu.0:(.text._ZN10native_tls3imp12TlsConnector3new17h6c93eca07e6cb695E+0x484): undefined reference to sk_num' native_tls.1u6r82qc-cgu.0:(.text._ZN10native_tls3imp12TlsConnector3new17h6c93eca07e6cb695E+0x4aa): undefined reference to sk_value'
/tmp/cargo-install4Cfs9h/release/deps/libnative_tls-6bd62f1981dbd61d.rlib(native_tls-6bd62f1981dbd61d.native_tls.1u6r82qc-cgu.2.rcgu.o): In function native_tls::TlsConnectorBuilder::identity': native_tls.1u6r82qc-cgu.2:(.text._ZN10native_tls19TlsConnectorBuilder8identity17hebf2175177689622E+0x43): undefined reference to sk_pop'
native_tls.1u6r82qc-cgu.2:(.text._ZN10native_tls19TlsConnectorBuilder8identity17hebf2175177689622E+0x56): undefined reference to sk_pop' native_tls.1u6r82qc-cgu.2:(.text._ZN10native_tls19TlsConnectorBuilder8identity17hebf2175177689622E+0x78): undefined reference to sk_free'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.0.rcgu.o): In function openssl::ssl::SslMethod::tls': openssl.cdqq66go-cgu.0:(.text._ZN7openssl3ssl9SslMethod3tls17hae668f941a8dc151E+0x2): undefined reference to SSLv23_method'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.0.rcgu.o): In function <openssl::ssl::SslContext as core::clone::Clone>::clone': openssl.cdqq66go-cgu.0:(.text._ZN63_$LT$openssl..ssl..SslContext$u20$as$u20$core..clone..Clone$GT$5clone17h97f995de37326510E+0x24): undefined reference to CRYPTO_add_lock'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.0.rcgu.o): In function openssl::ssl::Ssl::new': openssl.cdqq66go-cgu.0:(.text._ZN7openssl3ssl3Ssl3new17h1ea4689978bace7aE+0x9a): undefined reference to CRYPTO_add_lock'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.15.rcgu.o): In function std::sync::once::Once::call_once::{{closure}}': openssl.cdqq66go-cgu.15:(.text._ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h5677c6dfbb7094a0E+0x1a): undefined reference to SSL_get_ex_new_index'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.15.rcgu.o): In function std::sync::once::Once::call_once::{{closure}}': openssl.cdqq66go-cgu.15:(.text._ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17h7f9137704afd4bd0E+0x3e): undefined reference to SSL_get_ex_new_index'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.15.rcgu.o): In function core::ops::function::FnOnce::call_once{{vtable-shim}}': openssl.cdqq66go-cgu.15:(.text._ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h2bf8105945cea7d0E+0x3e): undefined reference to SSL_get_ex_new_index'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.15.rcgu.o): In function core::ops::function::FnOnce::call_once{{vtable-shim}}': openssl.cdqq66go-cgu.15:(.text._ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h3a60acbce837a2ffE+0x1a): undefined reference to SSL_get_ex_new_index'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.15.rcgu.o): In function openssl::ssl::connector::SslConnector::builder': openssl.cdqq66go-cgu.15:(.text._ZN7openssl3ssl9connector12SslConnector7builder17h0c046c5b88fa9875E+0x39): undefined reference to SSLeay'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.2.rcgu.o): In function <openssl::x509::X509Ref as alloc::borrow::ToOwned>::to_owned': openssl.cdqq66go-cgu.2:(.text._ZN65_$LT$openssl..x509..X509Ref$u20$as$u20$alloc..borrow..ToOwned$GT$8to_owned17h0b86f3b926f154f6E+0x21): undefined reference to CRYPTO_add_lock'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl-f1d462493160d7b7.rlib(openssl-f1d462493160d7b7.openssl.cdqq66go-cgu.2.rcgu.o): In function <openssl::x509::X509 as core::clone::Clone>::clone': openssl.cdqq66go-cgu.2:(.text._ZN58_$LT$openssl..x509..X509$u20$as$u20$core..clone..Clone$GT$5clone17h162fdad7cc6a69a7E+0x21): undefined reference to CRYPTO_add_lock'
/tmp/cargo-install4Cfs9h/release/deps/libopenssl_sys-870c6348f4aa41df.rlib(openssl_sys-870c6348f4aa41df.openssl_sys.2czsmp8s-cgu.13.rcgu.o): In function std::sync::once::Once::call_once::{{closure}}': openssl_sys.2czsmp8s-cgu.13:(.text._ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x1f): undefined reference to SSL_library_init'
openssl_sys.2czsmp8s-cgu.13:(.text.ZN3std4sync4once4Once9call_once28$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x25): undefined reference to SSL_load_error_strings' openssl_sys.2czsmp8s-cgu.13:(.text._ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x2b): undefined reference to OPENSSL_add_all_algorithms_noconf'
openssl_sys.2czsmp8s-cgu.13:(.text.ZN3std4sync4once4Once9call_once28$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x31): undefined reference to CRYPTO_num_locks' openssl_sys.2czsmp8s-cgu.13:(.text._ZN3std4sync4once4Once9call_once28_$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x220): undefined reference to CRYPTO_set_locking_callback'
openssl_sys.2czsmp8s-cgu.13:(.text.ZN3std4sync4once4Once9call_once28$u7b$$u7b$closure$u7d$$u7d$17ha5097da62f58cce2E+0x23b): undefined reference to `CRYPTO_set_id_callback'
collect2: error: ld returned 1 exit status

error: aborting due to previous error

error: failed to compile spotify-tui v0.6.2, intermediate artifacts can be found at /tmp/cargo-install4Cfs9h

Caused by:
Could not compile spotify-tui.

`

scroll not in view

When moving cursor up and down, it doesn't show selected/highlighted choice when terminal window is resized. I use tmux, and the pane resizes great to fit the proper space, but it doesn't update the scroll buffer of what is visible to select.
I am selecting songs below the visible song list, because they are still selectable in the current scroll buffer from the tmux resize.

Scroll not in view

Change sort order of playlist

An option to sort the playlist in different ways would be nice: Show the most recently added songs on top for example.

Split the app file and struct

The app struct and file are pretty big and have a lot of responsibility. I think it is better to split the code like it is done in OOP. The code does a lot and is not the easiest to get started in. We can split it in the following groups:

  • navigation
  • input
  • current playback
  • devices
  • search
  • playlists
  • playlist
  • artists
  • artist album
  • albums
  • album tracks
  • liked songs

Duplicate Albums

Some of the albums of an artist are pushed twice. Using Linux Mint 19.1 Tessa.

duplicate

Connection Refused - Linux

You said it only works for mac, but I want to try in Linux, it seems working but returns an error at the below after facebook log in.

Could not connect: Connection refused.

Playback via librespot?

Just gonna leave this here as a suggestion, there exists an on-going effort at an open source Spotify client in Rust over at librespot and there might be some way to collaborate (I'm only a user of librespot though, so don't expect anything from my side).

Not working with spotifyd

Hi, I'm currently trying to get spotify-tui to work with spotifyd. spt sees the currently playing song by spotifyd@MyPC but won't allow me to control the daemon because of this error:

Error
Api response: Spotify API reported an error
If you are trying to play a track make sure the official spotify app is open

My spotifyd is installed from AUR.
kernel: 5.3.4-arch1-1-ARCH

โ†ณspotifyd --version
spotifyd 0.2.18
โ†ณspt --version
spotify-tui 0.4.0
โ†ณsystemctl status --user spotifyd
โ— spotifyd.service - A spotify playing daemon
   Loaded: loaded (/etc/systemd/user/spotifyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-10-08 20:15:26 CEST; 9min ago
     Docs: https://github.com/Spotifyd/spotifyd
 Main PID: 81601 (spotifyd)
   CGroup: /user.slice/user-1000.slice/[email protected]/spotifyd.service
           โ””โ”€81601 /usr/bin/spotifyd --no-daemon

Oct 08 20:15:26 wojtas-arch spotifyd[81601]: 18:15:26 [INFO] Using alsa volume controller.
Oct 08 20:15:26 wojtas-arch spotifyd[81601]: 18:15:26 [INFO] Connecting to AP ""
Oct 08 20:15:26 wojtas-arch spotifyd[81601]: 18:15:26 [INFO] Authenticated as "" !
Oct 08 20:15:26 wojtas-arch spotifyd[81601]: 18:15:26 [INFO] Country: "PL"
Oct 08 20:15:36 wojtas-arch spotifyd[81601]: 18:15:36 [INFO] Loading track "I Hear A Rhapsody" with Spotify URI "spotify:track:2oEvw0AfrT2fPNpEnBwVml"
Oct 08 20:15:37 wojtas-arch spotifyd[81601]: 18:15:37 [INFO] Track "I Hear A Rhapsody" loaded

No device_id selected

I installed spt under Ubuntu 19.04 inside a virtualbox. I was able to connect spt to spotify. E.g. I can see a couple of play lists, I added. But as soon as I tray to play a song, I get the following error message.

Api response: No device_id selected
If you are trying to play a track, make sure the official

spt

$ spt --version
spotify-tui 0.4.0

//EDIT: After I started the spotify desktop app on one of my computers, this computer showed up as a device i can select. After that I can control the playback on that device, but I can't play music where I installed spotify tui. I do have a couple of connected sonos devices here in my network, they don't get detected.

spt2

//EDIT2: Ahaaaaa, when you maximize the terminal with spotify tui some explanations get shown. It's like responsive website. But the problem is, that the wrapping doesn't work properly. With a small window, there's no text at all. If you make the window bigger, the text will be cut. Only when you maximize the terminal application, you'll see the whole text.

spt3

No Devices Available in List

Hey there, when I run spt, there are no devices available in the devices list.

I'm running macOS 10.14.5 (Mojave)

Podcast support

Hey, podcasts don't seem to appear. Although playlists of podcasts do, trying to enter them doesn't do anything. Am I right in thinking the aren't supported right now or have I just misconfigured something?

Implement methods to control playback

Would be awsome if you could add next and previous track.

I know that there is some issues with:
"The auth token does not currently automatically refresh - when you leave spotify-tui running for a while, you won't be able to control playback. And you'll need to quit and restart to get it working again."

I had the same issue, i checked if the current token is valid. You could probably do this in a nicer way but when a user signs in the first time you get:

{
 "access_token" : "NgAagA...Um_SHo",
 "expires_in" : "3600",
 "refresh_token" : "NgCXRK...MzYjw"
}

The expires_in tells you when the access_token expires. You can use it to decide when to get a new access_token. Then use the refresh_token to get a new access_token.

You can renew the access_token by using a refresh_token. This token is provided to you when you first make the request to authenticate the user. You should save that refresh_token if you don't already do so. The refresh_token is valid forever but you can't control playback with the refresh_token.

To get a new access_token with the refresh_token: (JavaScript)

    const res = await fetch(
      `${this.baseUrl}/auth/refresh_token?refresh_token=${refreshKey}`,
      {
        method: 'GET'
      }
    );

You will then get a new access_token that you can use to control playback.

Documentation from Spotify on how to use the refresh_token to access a new access_token.

https://developer.spotify.com/documentation/ios/guides/token-swap-and-refresh/

btw, love what you have made! Great work!

spt: symbol lookup error: spt: undefined symbol: CRYPTO_set_locking_callback

I'm on Ubuntu 19.10 and getting this error

spt: symbol lookup error: spt: undefined symbol: CRYPTO_set_locking_callback
cargo version
cargo 1.38.0 (23ef9a4ef 2019-08-20)

I saw other issues with libssl and I fixed my problems from the recommendations in those tickets but still getting this error.

Here's a quick strace -ff spt I didn't have time to dig into the problem but thought you'd want to know.

$ strace -ff spt | xclip -selection clipboard 
execve("/home/jgarr/.cargo/bin/spt", ["spt"], 0x7ffca3f90b48 /* 78 vars */) = 0
brk(NULL)                               = 0x55ad341f6000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=115558, ...}) = 0
mmap(NULL, 115558, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbfd3127000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/tls/haswell/x86_64/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls/haswell/x86_64", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/tls/haswell/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls/haswell", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/tls/x86_64/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls/x86_64", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/tls/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/haswell/x86_64/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/haswell/x86_64", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/haswell/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/haswell", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/x86_64/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/x86_64", 0x7ffef831d590) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\333\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=585504, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbfd3125000
mmap(NULL, 588080, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd3095000
mmap(0x7fbfd30b1000, 315392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7fbfd30b1000
mmap(0x7fbfd30fe000, 106496, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x69000) = 0x7fbfd30fe000
mmap(0x7fbfd3118000, 53248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x82000) = 0x7fbfd3118000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcrypto.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\220\7\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=2925408, ...}) = 0
mmap(NULL, 2940776, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2dc7000
mmap(0x7fbfd2e3f000, 1671168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x78000) = 0x7fbfd2e3f000
mmap(0x7fbfd2fd7000, 577536, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x210000) = 0x7fbfd2fd7000
mmap(0x7fbfd3064000, 188416, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29c000) = 0x7fbfd3064000
mmap(0x7fbfd3092000, 12136, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbfd3092000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18656, ...}) = 0
mmap(NULL, 20752, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2dc1000
mmap(0x7fbfd2dc2000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7fbfd2dc2000
mmap(0x7fbfd2dc4000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbfd2dc4000
mmap(0x7fbfd2dc5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbfd2dc5000
close(3)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2603\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=39880, ...}) = 0
mmap(NULL, 44000, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2db6000
mmap(0x7fbfd2db9000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbfd2db9000
mmap(0x7fbfd2dbd000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fbfd2dbd000
mmap(0x7fbfd2dbf000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8000) = 0x7fbfd2dbf000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200|\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=149840, ...}) = 0
mmap(NULL, 132288, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2d95000
mmap(0x7fbfd2d9c000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fbfd2d9c000
mmap(0x7fbfd2dab000, 20480, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fbfd2dab000
mmap(0x7fbfd2db0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7fbfd2db0000
mmap(0x7fbfd2db2000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbfd2db2000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0203\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=100736, ...}) = 0
mmap(NULL, 103504, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2d7b000
mmap(0x7fbfd2d7e000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fbfd2d7e000
mmap(0x7fbfd2d8f000, 16384, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7fbfd2d8f000
mmap(0x7fbfd2d93000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7fbfd2d93000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200l\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2000480, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbfd2d79000
mmap(NULL, 2008696, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2b8e000
mmap(0x7fbfd2bb3000, 1519616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fbfd2bb3000
mmap(0x7fbfd2d26000, 299008, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x198000) = 0x7fbfd2d26000
mmap(0x7fbfd2d6f000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e0000) = 0x7fbfd2d6f000
mmap(0x7fbfd2d75000, 13944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbfd2d75000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\362\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1365096, ...}) = 0
mmap(NULL, 1364240, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbfd2a40000
mmap(0x7fbfd2a4f000, 679936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7fbfd2a4f000
mmap(0x7fbfd2af5000, 618496, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb5000) = 0x7fbfd2af5000
mmap(0x7fbfd2b8c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14b000) = 0x7fbfd2b8c000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbfd2a3e000
mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbfd2a3a000
arch_prctl(ARCH_SET_FS, 0x7fbfd2a3ba40) = 0
mprotect(0x7fbfd2d6f000, 12288, PROT_READ) = 0
mprotect(0x7fbfd2b8c000, 4096, PROT_READ) = 0
mprotect(0x7fbfd2d93000, 4096, PROT_READ) = 0
mprotect(0x7fbfd2db0000, 4096, PROT_READ) = 0
mprotect(0x7fbfd2dbf000, 4096, PROT_READ) = 0
mprotect(0x7fbfd2dc5000, 4096, PROT_READ) = 0
mprotect(0x7fbfd3064000, 180224, PROT_READ) = 0
mprotect(0x7fbfd3118000, 36864, PROT_READ) = 0
writev(2, [{iov_base="spt", iov_len=3}, {iov_base=": ", iov_len=2}, {iov_base="symbol lookup error", iov_len=19}, {iov_base=": ", iov_len=2}, {iov_base="spt", iov_len=3}, {iov_base=": ", iov_len=2}, {iov_base="undefined symbol: CRYPTO_set_loc"..., iov_len=45}, {iov_base="", iov_len=0}, {iov_base="", iov_len=0}, {iov_base="\n", iov_len=1}], 10spt: symbol lookup error: spt: undefined symbol: CRYPTO_set_locking_callback
) = 77
exit_group(127)                         = ?
+++ exited with 127 +++

crash on non-ascii symbols in search input

Application exits on any keypress after first appearance of non-ascii symbol in search bar, like ลพ, ะค, or ๐Ÿฅฐ

Steps to reproduce:
Just press / and try to enter any non-ascii character

Version: spotify-tui 0.6.2
Os: Macos 10.15
Terminal: iterm2 Build 3.3.3

No sound.

No sound.
Using on gnome-terminal in budgie desktop environment on the latest version of Arch Linux.

Interface is slow

Scrolling should be asynchronous and fast, or spt defeats its own utility.

Problem with the last step

Hi everyone, let me get to the point fast

I followed all the steps, included the API credentials that are needed and also whitelisted http://localhost/8888/callback
When the client is running I made sure to check that the port is open.
However, when I go to the authentication link and I login I get INVALID_CLIENT: Invalid client. Even when trying to paste in the URL from this into the tool I get an error.

Navigation in search input can go out of bounds

To replicate, type something into the search box and keep pressing the left arrow key- you can keep going past the first character and overflow off to the right side of the screen. the program usually crashes after other input at this point.

Home and end keys don't work either, but I can forgive that. :)

Installed via cargo on Thursday 10 Oct so apologies if this has been fixed since then.

This program is really awesome- thanks a lot! I'm using it to control the office spotify machine without having to get up ;)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.