Spotiqueue

February 23, 2022 · View on GitHub

A terribly simple macOS app for keyboard-based, queue-oriented Spotify use. Many years ago i built a version which relied on a now-deprecated library — Spotify doesn't publish libspotify any more, which is a shame. The old Spotiqueue is archived for posterity; this version does pretty much exactly the same as the old one did, and more, although i'd like to think it's a bit more refined.

Spotiqueue now also has support for the GNU Guile extension language built in: this means you can extend its behaviour with arbitrary Scheme! More details below. Beware of rough edges. Scratches my itch, no other guarantees granted.

Obligatory screenshot to give an idea what the app does.

Usage, a crash course

Spotiqueue is intended to be keyboard-driven. As such, you may be surprised that clicking and dragging doesn't work. Read on for instructions!

The left-hand pane is your queue of tracks to be played. The top track is next, and once it has started playing, it's removed from the queue. The right-hand pane is for search results.

  • Searching: To search, enter text (such as britney spears or sandstorm) into the search field, and press (Return, Enter, whatever you call it). This will focus the search results pane and tracks matching your query will start to populate. There's also a filter field at the bottom of the search pane — it understands Regex and will narrow the search results.
  • Navigating: Use the arrow keys to navigate: up and down, or press the left arrow to select the queue, or the right arrow to select the search results pane. Use shift to select multiple items.
  • Playing: Pressing (Return) on a single item plays it immediately. Pressing with multiple tracks selected adds them to the top of the queue and starts playing them.

Of course, you may want to manipulate the queue.

  • When you're in the search pane, ⌘← enqueues at the bottom, and ⌘⇧← enqueues at the top of the queue.
  • When you're in the queue pane, holding (the command key) and using the navigation keys moves selected tracks up or down in the queue.
  • Space bar pauses and unpauses (unless search field has focus).
  • ⌘N skips to the next track. Also useful for starting playback.

Note that instead of the arrows, you can use Vim-like movement keys too!

  • Left and right arrows or h, l switch focus between queue and search results.
  • Supports some Vim keys (e.g., j,k,g,G).
  • Tab cycles through search (or hit ⌘F or ⌘L to search), search results, and queue.

More detail on keybindings

The basic Vim and Emacs movement keys are supported instead of using arrow keys.

KeyDescription
left, right, h, lsearch or queueFocus between search and queue
up, down, j, ksearch or queueMove up or down
/searchFocus the filter field
EntersearchPlace selected items at the top of the queue and immediately play first item
EnterqueuePlay the selected item, removing items above it
⌘F or ⌘LglobalFocus the search bar
⌘QglobalQuit Spotiqueue
⌘OglobalList all of your saved playlists
⌘PglobalList all of your saved tracks
⌘NglobalPlay next track from queue
⌘; or ⌘→search or queueBrowse details of selected item (see description below)
⌘h or ⌘←searchEnqueue selection at the bottom of the queue
⌘⇧h or ⌘⇧←searchEnqueue selection at the top of the queue
?globalShow current track's album in search results
TABglobalCycle focus search field -> search results -> queue
x, d, Delete, BackspacequeueRemove selected item(s) from queue
x, d, Delete, BackspacesearchOnly when viewing user's playlists: delete playlist
⌘SsearchSave current search results to new playlist
⌘SqueueSave current queue to new playlist
^b, ^f, ^u, ^dsearch or queueScroll up/down by full or half page
⌘Csearch or queuePlace highlighted items on clipboard
⌘⇧Csearch or queuePlace highlighted items' album link on clipboard
⌘VqueuePaste items on clipboard into the queue
^⌥sglobalShuffle the contents of the queue

Note:

  • ^ is Control
  • is Alt
  • is Command
  • is Shift

Browsing details

For any item in a list you can press ⌘; or ⌘→, to "dive deeper". If the item you selected is a track, the search pane will be populated by the album it's on. If you dive deeper after having opened an album, you'll get all the artist's tracks. When playlists are listed in the search results, diving deeper will return all the tracks of the playlist.

But wait, there's more! Or, writing Scheme to extend Spotiqueue

What it currently supports:

  • Setting arbitrary keybindings — if you don't like my choices, change them!
  • Hooks — get a callback when the track ends, when items are copied to the clipboard, etc.
  • Remote control — easily hook up media keys, network access, whatever you want. The sky's the limit.

If you already know Scheme and just want to get started, place a file in your home directory, and it'll automatically get loaded next time Spotiqueue starts up:

~/.config/spotiqueue/init.scm

For more details, check out the example init.scm file, which i use myself. You'll probably also want to look at the Scheme internals of Spotiqueue.

# To adopt the example config file:
mkdir -p ~/.config/spotiqueue
(cd ~/.config/spotiqueue; ln -sv ~/src/Spotiqueue/examples/paul-config.scm init.scm)

Download and install

If you don't like hassling about with Xcode (quite rightly so), you can find compiled versions on the Github releases page. Unfortunately, for now you need at least macOS 10.15, because the app makes heavy use of the Combine framework.

If you use Homebrew, you can simply run:

brew install --cask toothbrush/toothbrush/spotiqueue

Development

Have a look at HACKING.md for a run-through of the development tools required.

Copyright © 2021 paul at denknerd dot org