Giter VIP home page Giter VIP logo

spt-terminal's Introduction

spt-terminal

Spotify for terminal written in Go.
with builtin cover-art view and much more.
Discussion


In a very experimental stage.

Please Note

  • You will need Spotify Premium.
  • spt-terminal 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.
  • Images are rendered using the X child windows. Currently there is no support for Wayland.
  • Everything except Image Rendering works on Windows and Mac

Table of Contents

Setup

Manually
# If you have Go Path set up you can directly install spt-terminal using
$ go install github.com/phuonganhniie/spt-terminal

# Alternately
$ git clone https://github.com/phuonganhniie/spt-terminal.git # Cloning
$ cd spt-terminal
$ go build -v # Building
$ sudo install spt-terminal -t "/usr/bin/" # Linux/Mac

# You can merge this into a one liner
$ git clone https://github.com/phuonganhniie/spt-terminal && cd spt-terminal && GOFLAGS="-buildmode=pie -trimpath -mod=readonly -modcacherw" go build -v && sudo install spt-terminal -t "/usr/bin/"

Afer Installation Steps

Generate an API Key from Spotify Dashboard

If you want to use Spotify's API to create applications that interact with their music streaming service, you will need an API key. Here's how you can generate one from the Spotify Dashboard:

  1. Go to the Spotify Developer Dashboard and log in with your Spotify account credentials.

  2. Click on the "Create an App" button to create a new application.

    Create an App

  3. Give your application a name and description, and agree to the terms of service. In the Redirect URI section add http://localhost:8080/callback as a callback URL. This is necessary for the OAuth 2.0 authentication flow to work. Click on "Create" to proceed. Create an App Form

  4. On the next page, you'll see the details of your newly created application. In the Settings Look for the section labeled "Client ID" and click on the "Show Client Secret" button. You will now see your Client ID and Client Secret. You will need both of these to use the Spotify API in "gspt"

Using the Generated Credentials

  1. Set the following environment variables from the credentials you generated.
# Add this to ~/.bashrc (or your $SHELL equivalent)
export SPOTIFY_ID= # client id
export SPOTIFY_SECRET= # client secret
  1. After this you can just run spt-terminal. And follow the link that it generates, and Login.
$ spt-terminal

Default Key Mappings

  1. d Open the device menu to choose a device from
  2. 1, 2, 3 Switch between the views
  3. enter - Select an entry
  4. ? Search
  5. v Toggle Visual Mode (Only works in some views)
  6. a Add to Playlist (Only works in some views)
  7. ctrl-p Start playing the entry under the cursor in some views (PlaylistNavigator, Albums, etc.)
  8. Toggle Playback (Space)
  9. o Open the Current Track's Album
  10. O Open the Current Track's Artist
  11. ctrl-o Open the Current Context (Album/Artist/Playlist)
  12. n Play Next Song in Queue
  13. p Play Previous Song in Queue

Command-line Parameters

NOTE: Command-line flags take priority over config values.

Usage of spt-terminal:
  -c string
        Specify The Directory to check for config.yml file. (default "$XDG_CONFIG_HOME spt-terminal")
  -hide-image
        Do not display the cover art image.
  -icons
        Use Icons
  -rounded-corners
        Enable Rounded Corners

Configuration

The configuration is done through $XDG_CONFIG_HOME/spt-terminal/config.yml or the path to the folder provided by the -c flag before starting the app. See Command-line Parameters

Also, Configuration is live updated when you make a change except for some parts (Key Mappings, Border Colors).

Config Parameters

# Parameter followed by default values
# For the default configuration used by gspt please see:
# https://github.com/phuonganhniie/spt-terminal/blob/master/extras/CONFIG.md

# Path to where the cached images should be stored.
cache_dir: $XDG_CACHE_HOME

# The amount of milliseconds after which the cover art should be redrawn if there is a event.
redraw_interval: 500

# Do not display the cover art image.
hide_image: false

# Enable Rounded Corners
rounded_corners: false

# Use Special Characters to display information
use_icons: false

# Image Drawing related parameters. You aren't supposed to define them manually.
# See the next section to see how you can calibrate the Image placement.
additional_padding_x : 0
additional_padding_y : 0
image_width_extra_x  : 0
image_width_extra_y  : 0

---

# Color configuration has the following api
colors:
    entity:
        fg: # foreground (Can be Hex value or a color name)
        bg: # background (Can be Hex value or a color name)
        bold: # true/false (boolean)
        italic: # true/false (boolean)

# for e.g
colors:
    artist:
        fg: "#ff0000"
        bg: black # Background will be ignored in most cases. (Terminals default background color is used)
        bold: false
        italic: true

# For the default colors used for the "entities" please see:
# https://github.com/phuonganhniie/spt-terminal/blob/master/extras/CONFIG.md
# Available color names (i.e. pink, green, etc.) can be seen here:
# https://github.com/gdamore/tcell/blob/main/color.go#L845

---

# Key mappings has the following API
mappings:
    view:
        mode: # normal/visual
            function: key_mapping

# for e.g
mappings:
    recently_played_view:
        normal:
            play_entry: "ctrl-p"
        visual:
            add_to_playlist: "a"

# "global" mappings are special mappings that are not view specific
# ( "toggle_playback", "next", "previous", etc.)
# These mappings can be changed for different views.
# for e.g

mappings:
    global:
        normal:
            previous: "N"
    recently_played_view:
        normal:
            previous: "P"

# As you can assume, here "N" will be globally mapped to the "previous" function,
# and then "P" will too be mapped to "previous" in the recently_played_view (keep
# in mind that "N" will still be mapped to the "previous" function i.e "N" and
# "P" will both be mapped to the same function in recently_played_view)

# Visual Mode is similar to vim. Only some views support it.
# (viz. playlist_view, recently_played_view, liked_songs_view, album_view)

# For the default mappings for each view please see:
# https://github.com/phuonganhniie/spt-terminal/blob/master/extras/CONFIG.md

---

# Icons have the following API
icons:
    icon_name: "icon_string"

# for e.g
icons:
    computer: "๐Ÿ–ฅ๏ธ"

# Note: icons are used only if `use_icons` is true
# For the default icons used and all available icon names please see:
# https://github.com/phuonganhniie/spt-terminal/blob/master/extras/CONFIG.md

Calibrating Image Placement

  1. To make it easier for users to adjust the position and size of the image preview box, we have added key mappings to the application. These mappings allow you to move the image up, down, left, or right, as well as adjust its height and width. The mappings are as follows:

    • ctrl+h Move the image left
    • ctrl+j Move the image down
    • ctrl+k Move the image up
    • ctrl+l Move the image right
    • H Decrease the width of the image (from the right)
    • J Increase the height of the image (from the bottom)
    • K Decrease the height of the image (from the bottom)
    • L Increase the width of the image (from the right)

Note that when you increase or decrease the image height, it only affects the bottom of the image. Similarly, when you increase or decrease the image width, it only affects the right side of the image.

  1. After you have made the changes according to your needs you can save the config by pressing ctrl-s
Video Example
gspt.mp4

Special thanks to spotify-tui for the idea & aditya-K2 for the utils.

spt-terminal's People

Contributors

anhdev-hanet avatar phuonganhniie avatar

Stargazers

 avatar

Watchers

Kostas Georgiou avatar  avatar

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.