My Own Memory Hole
Blog♯Spotify

ncspot, un client ncurse pour Spotify

Si mes recherches pour utiliser Spotify depuis mon Raspverry Pi sous Raspbian Buster m'ont tout d'abord conduit à la prise en charge des DRM pour utiliser le client web open.spotify.com puis au client Spotify Connect raspotify, j'ai enfin découvert un client Spotify ne nécessitant pas de serveur X : ncspot est ainsi un client ncurse pour Spotify écrit en Rust et hautement inspiré des clients ncmpc ou ncmpcpp pour MPD.

Installation

On commence par installer les dépendances :

sudo apt install libncursesw5-dev libdbus-1-dev libpulse-dev libssl-dev libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev

On installe ensuite une « instance » de Rust, grâce au script rustup :

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

avant de lancer l'installation à proprement parler de ncspot :

cargo install ncspot

Usage et configuration

Il suffit alors de lancer la commande ncspot et l'on peut alors naviguer entre trois écrans grâce aux touches F1, F2 et F3 : queue, recherche, bibliothèque.

Pour en savoir plus, il suffit d'accéder à l'écran d'aide avec la touche ?.

La configuration se fait dans le fichier ~/.config/ncspot/config.toml avec a possibilité de définir soi-même des raccourcis clavier au sein d'une section [keybindings] et un thème au sein d'une section [theme] (un générateur vous en facilite la création) :

backend = "pulseaudio"

[saved_state]
volume = 70
repeat = "no"
shuffle = true

[keybindings]

"Shift+p" = "pause"

[theme]
background = "black"
primary = "green"
secondary = "cyan"
title = "magenta"
playing = "black"
playing_selected = "blue"
playing_bg = "magenta"
highlight = "black"
highlight_bg = "green"
error = "white"
error_bg = "red"
statusbar = "magenta"
statusbar_progress = "magenta"
statusbar_bg = "black"
cmdline = "cyan"
cmdline_bg = "light black"

Scrobbling

Si l'on souhaite scrobbler ce que l'on écoute avec ncspot, il convient d'installer rescrobbled, écrit lui aussi en Rust :

wget https://github.com/InputUsername/rescrobbled/archive/v0.2.0.tar.gz
tar xvzf v0.2.0.tar.gz
cd rescrobbled-0.2.0/
cargo install --path .

La configuration se fait à travers le fichier ~/.config/rescrobbled/config.toml mais nécessite d'avoir généré au préalable un couple clé-secret via cette page de Last.fm :

mkdir ~/.config/rescrobbled/
nano ~/.config/rescrobbled/config.toml
lastfm-key = "Last.fm API key"
lastfm-secret = "Last.fm API secret"
#listenbrainz-token = "ListenBrainz API token"
enable-notifications = false
min-play-time = 0 # in seconds
player-whitelist = [ "ncspot" ] # if empty or ommitted, will allow all players

Il faut ensuite lancer la commande rescrobbled alors que le lecteur ncspot fonctionne ; il vous sera alors demander votre identifiant et votre mot de passe.
Pour lancer le service en tant que démon, il faut placer le fichier ~/rescrobbled-0.2.0/rescrobbled.service dans votre répertoire ~/.config/systemd/user/ :

mkdir -p ~/.config/systemd/user
cp ~/rescrobbled-0.2.0/rescrobbled.service ~/.config/systemd/user/

Lancez ensuite la commande suivante pour lancer rescrobbled au démarrage :

systemctl --user enable rescrobbled.service

et pour le lancer sans avoir à redémarrer :

systemctl --user start rescrobbled.service

Raspbian, Spotify et PulseAudio

Il est possible d'utiliser son Raspberry Pi sous Raspbian comme client Spotify Connect, c'est-à-dire d'en faire une sorte de module de sortie audio, et ce grâce à Raspotify.

Installation

Pour l'installer, rien de plus simple :

# Install curl and https apt transport
sudo apt-get -y install curl apt-transport-https

# Add repo and its GPG key
curl -sSL https://dtcooper.github.io/raspotify/key.asc | sudo apt-key add -v -
echo 'deb https://dtcooper.github.io/raspotify raspotify main' | sudo tee /etc/apt/sources.list.d/raspotify.list

# Install package
sudo apt-get update
sudo apt-get -y install raspotify

Ensuite, depuis votre application Spotify, il suffit de sélectionner la sortie « Raspotify » dans les options proposées dans le menu accessible depuis l'icone dans le bas inférieur gauche de l'écran de lecture :

spotify select outspotify select out raspotify

Configuration

Raspotify est fonctionnel out of the box mais, s'il en est besoin, il est possible de jouer sur certains paramètres dans le fichier /etc/default/raspotify.

En cas de modification, il convient alors de relancer le service raspotify :

sudo service raspotify restart

Raspotify & PulseAudio

Pour que Raspotify utilise PulseAudio, il suffit de suivre la démarche proposée par Marc Fauvain  :

cd /var/cache/raspotify
sudo mkdir .pulse
sudo sh -c 'echo "default-server = 127.0.0.1" > .pulse/client.conf'
sudo chown -R raspotify:raspotify .pulse

Il faut également éditer le fichier /etc/asound.rc :

sudo nano /etc/asound.rc
pcm.!default {
    type pulse
}

ctl.!default {
    type pulse
}

Gestion des DRM sous Raspbian Buster

Le passage de mon Raspberry Pi dans sa vieillissante version 2 à une version 4 m'a permis d'étendre les usages que je fais de ce nano-ordinateur, et notamment de pouvoir regarder myCanal – sans avoir à brancher un autre ordinateur sur la télé... – ou encore de basculer sur le lecteur web de Spotify lorsque ma discothèque personnelle ne me suffit plus.
Mais ces plateformes, comme tant d'autres, protègent leurs contenus avec des DRM qui ne sont pas pris en charge sur l'architecture ARM...

La solution la plus simple à mettre en œuvre, sous réserve que vous ayiez opté pour une version 32 bit de Raspbian, c'est encore de délaisser Chromium pour Vivaldi et de suivre leurs astuces pour une utilisation sur le Raspberry Pi, qui renvoie notamment à ce script.

On commence par récupérer le contenu du script :

wget https://gist.githubusercontent.com/ruario/19a28d98d29d34ec9b184c42e5f8bf29/raw/6ff95fa30a291319700b5a75dd558038d3e202c5/widevine-flash_armhf.sh

On le rend exécutable et on le lance :

chmod +x widevine-flash_armhf.sh && ./widevine-flash_armhf.sh

avant de suivre les instructions fournies :

sudo tar Cfx / widevine-flash-20200124_armhf.tgz
mkdir -p ~/.config/vivaldi{,-snapshot}/WidevineCdm
echo '{"Path":"/opt/WidevineCdm"}' | tee ~/.config/vivaldi/WidevineCdm/latest-component-updated-widevine-cdm > ~/.config/vivaldi-snapshot/WidevineCdm/latest-component-updated-widevine-cdm