volted.net

A blog about openSUSE and free thoughts

Écouter sa musique avec mpd et ncmpcpp et être notifié dans Gnome

November 30, 2018 — sogal

Dans cet article, je vous propose de découvrir ou redécouvrir un trio de logiciels qui va bien pour gérer sa musique : mpd (un démon lecteur de musique en mode serveur), mpc (un client en CLI) et ncmpcpp (un client évolué en ncurses écrit en C++), configurer leurs raccourcis clavier et obtenir des notifications intégrées à notre environnement de bureau :

Installation

Ces deux paquets sont disponibles dans openSUSE :

zypper install mpd mpclient ncmpcpp

Note: le nom d'utilisateur dans les fichiers qui suivent, ici sogal, est bien entendu à adapter !

Configuration du serveur de musique mpd

Nous allons nous inspirer de la configuration proposée en exemple :

mkdir ~/.config/mpd
mkdir ~/.config/mpd/playlists

# Sous openSUSE :

cp /usr/share/doc/packages/mpd/mpdconf.example ~/.config/mpd/mpd.conf
vim ~/.config/mpd/mpd.conf

Voici, pour exemple, les passages de ma configuration :

grep -v "^#|^$" ~/.config/mpd/mpd.conf

music_directory         "/path/to/music"
playlist_directory              "~/.config/mpd/playlists"
db_file                 "~/.config/mpd/mpd.db"
log_file                        "~/.config/mpd/log"
pid_file                        "~/.config/mpd/mpd.pid"
state_file                      "~/.config/mpd/mpdstate"
sticker_file                    "~/.config/mpd/sticker.sql"
user                            "sogal"
bind_to_address         "localhost"
port                            "6600"
log_level                       "default"
restore_paused "yes"
input {
        plugin "curl"
}
audio_output {
        type            "pulse"
        name            "Pulse MPD Output"
}
audio_output {
    type        "fifo"
    name        "mpd_fifo"
    path        "/tmp/mpd.fifo"
    format      "44100:16:2"
}
filesystem_charset              "UTF-8"

Il est surtout important de bien configurer l'emplacement de vos fichiers audio ainsi que la sortie sonore. Ici j'utilise Pulseaudio mais la configuration inclus un modèle pour une sortie avec ALSA seul. J'ai ajouté une sortie vers un fifo qui nous servira avec ncmpcpp pour activer le visualiseur graphique (oui, oui dans un terminal !).

Activer mpd en tant que service systemd en espace utilisateur

Nous allons configurer le serveur de musique mpd en tant que service systemd en espace utilisateur. De la sorte, mpd démarrera avec votre session.

mkdir -p ~/.config/systemd/user
cp /usr/lib/systemd/system/mpd.service ~/.config/systemd/user
vim ~/.config/systemd/user/mpd.service

[Unit]
Description=Music Player Daemon

[Service]
ExecStart=/usr/bin/mpd --no-daemon /home/sogal/.config/mpd/mpd.conf
ExecStop=/usr/bin/mpd --kill
PIDFile=/home/sogal/.config/mpd/mpd.pid

[Install]
WantedBy=default.target

Il est nécessaire de mettre les chemins absolus dans ce fichier.

Puis nous démarrons et activons le service :

systemctl --user start mpd
systemctl --user enable mpd

Configuration de ncmpcpp :

mkdir ~/.ncmpcpp
cp /usr/share/doc/packages/ncmpcpp/config ~/.ncmpcpp/
vim ~/.ncmpcpp/config

Je vous propose à nouveau ma configuration :

grep -v "^#|^$" ~/.ncmpcpp/config

ncmpcpp_directory = ~/.ncmpcpp
lyrics_directory = ~/.ncmpcpp/lyrics
mpd_host = localhost
mpd_port = 6600
mpd_connection_timeout = 5
mpd_music_dir = /path/to/music
mpd_crossfade_time = 5
visualizer_fifo_path = /tmp/mpd.fifo
visualizer_output_name = mpd_fifo
visualizer_in_stereo = yes
visualizer_sync_interval = 30
visualizer_type = ellipse
visualizer_look = ▮●
visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
system_encoding = "UTF-8"
playlist_disable_highlight_delay = 5
message_delay_time = 5
song_list_format = {%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
song_status_format = {{%a{ "%b"{ (%y)}} - }{%t}}|{%f}
song_library_format = {%n - }{%t}|{%f}
alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
now_playing_prefix = $b
now_playing_suffix = $/b
song_window_title_format = {%a - }{%t}|{%f}
browser_sort_mode = name
browser_sort_format = {%a - }{%t}|{%f} {(%l)}
song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
playlist_show_mpd_host = no
playlist_show_remaining_time = yes
playlist_shorten_total_times = no
playlist_separate_albums = no
playlist_display_mode = columns
browser_display_mode = classic
search_engine_display_mode = classic
playlist_editor_display_mode = classic
incremental_seeking = yes
seek_time = 1
volume_change_step = 2
autocenter_mode = yes
centered_cursor = yes
progressbar_look = =>
default_place_to_search_in = database
user_interface = alternative
media_library_primary_tag = genre
default_find_mode = wrapped
header_visibility = yes
statusbar_visibility = yes
titles_visibility = yes
header_text_scrolling = yes
cyclic_scrolling = yes
lines_scrolled = 2
follow_now_playing_lyrics = yes
fetch_lyrics_for_current_song_in_background = yes
store_lyrics_in_song_dir = yes
allow_for_physical_item_deletion = no
screen_switcher_mode = browser, media_library, visualizer
startup_screen = playlist
startup_slave_screen = "visualizer"
startup_slave_screen_focus = no
locked_screen_width_part = 50
jump_to_now_playing_song_at_start = yes
ask_before_clearing_playlists = yes
clock_display_seconds = no
display_volume_level = yes
display_bitrate = no
display_remaining_time = yes
ignore_leading_the = no
mouse_support = yes
enable_window_title = yes
external_editor = vim
use_console_editor = yes
colors_enabled = yes

Ceci me permettra d'obtenir un écran partagé avec, par défaut, l'affichage de ma bibliothèque musicale et du visualiseur. Si vous ne voulez pas d'écran partagé, commentez les paramètres relatifs au slave_screen. Chez moi, ça donne ça :

ncmpcpp

Quelques raccourcis pour bien démarrer :

  • F1 : afficher l'aide ;
  • 1 : playlist ;
  • 2 : navigateur par dossiers ;
  • 3 : moteur de recherche ;
  • 4 : audiothèque (vue en panneaux) ;
  • 5 : éditeur de playlists ;
  • 6 : éditeur de tags ;
  • 8 : visualiseur ;
  • p : mettre en pause ;
  • a : ajouter la sélection à la playlist.

Exemple de création d'un raccourci clavier pour mpc sous Gnome :

Par défaut, la touche p met ncmpcpp en pause. Mais si l'on n'est pas devant, comment faire ? C'est là que mpc (du paquet mpclient sous openSUSE) est intéressant. Nous allons créer des raccourcis clavier destiné à mettre mpd en pause. Pour cela, ouvrons les préfèrences système puis Clavier et Raccourcis personnalisés et en créer 3 nouveaux :

  • MPD Pause : commande mpc toggle ;
  • MPD Précédent : commande mpc prev ;
  • MPD Suivant : commande mpc next

Vous pouvez affecter les touches que vous voulez, sur une machine j'ai mis Ctrl

  • Alt + Z, sur une autre j'ai réaffecter les touches multimédias.

Notifications dans Gnome Shell :

Pour être notifié des changements de chansons dans gnome-shell, il faut passer un nouveau paramètre de configuration dans ncmpcpp :

execute_on_song_change =

Je vous propose 2 méthodes :

Méthode notify-send :

Nous allons utiliser la commande notify-send :

execute_on_song_change = "notify-send --hint=int:transient:1 -t 2 -i $HOME/path/to/icon "Music Player Daemon" "$(ncmpcpp -c ~/.ncmpcpp/config --current-song "%a - %t (%b)" 2>/dev/null)""

Note : --hint=int:transient:1 permet que les notifications ne se stockent pas dans le centre de notification et l'option -i prend un chemin vers une icône en paramètre.

Ainsi vous avez de jolies notifications, non persistentes. Le seul inconvénient c'est qu'elles se stockent sur l'écran de verrouillage et affichent " notify-send" au lieu de "Music Player Demon".

Méthode script python :

Pour pallier ça, je vous propose un petit script python, qui utilise deux bibliothèques très pratiques :

  • python-notify2
  • python-mpd2

    zypper in python-notify2 pip3 install python-mpd2

Et voici le script (je l'ai mis dans mon $HOME/bin) :

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Notify', '0.7')
from gi.repository import Notify
from gi.repository import GLib
from mpd import MPDClient

client = MPDClient()
client.timeout = 10
client.idletimeout = None
client.connect("localhost", 6600)

mpd_song = MPDClient.currentsong(client)

s_artist = mpd_song['artist']
s_title = mpd_song['title']
s_album = mpd_song['album']

s_notification = s_artist + " - " + s_title + " - (" + s_album +")"

Notify.init("Music Player Demon")
show_song = Notify.Notification.new("Music Player Demon", s_notification,
    icon="/home/sogal/.icons/Vivacious-Colors/apps/scalable/deadbeef.svg")

show_song.set_hint("transient", GLib.Variant.new_boolean(True))

show_song.show()

Puis ajoutez ceci à la config de ncmpcpp :

execute_on_song_change = "/usr/bin/python3 /home/$USER/bin/script_notif.py"

pysend

Et voilà, j'espère que cet article vous sera utile et que vous prendrez plaisir à gérer votre musique avec ces outils, notamment ncmpcpp qui est très puissant en terme de possibilité d'affichages différents, de recherche et d'édition (tags) de votre audiothèque. Cet article n'est destiné qu'à vous permettre de découvrir et à vous aider à démarrer, je vous conseille de lire tout de même les pages de manuel de ces outils ou les commentaires inclus dans les fichiers de configuration, très simples à comprendre, pour ajuster tout ça aux petits oignons !

Enjoy !

Tags: music