web-dev-qa-db-fra.com

Comment déterminer, à partir de la ligne de commande, si Rhythmbox joue?

rhythmbox-client --print-playing me dit le nom d'une chanson, qu'elle soit ou non en cours de lecture. J'ai simplement besoin de savoir si un son est actuellement généré par rhythmbox (pour que je sache si je souhaite ou non le suspendre et le réactiver ensuite).

Mise à jour:

Une réponse de candidat laide:

Je pense que rhythmbox peut vraiment être dépourvu de cette interface de base.

Mais quand j’exécute pacmd list-sink-inputs qui rassemble les requêtes du mélangeur sur ce qui est en train de s’alimenter, il liste toujours la liste des boîtes à rythmes, qu’elles soient ou non en cours de lecture. Cependant, la sortie contient une ligne "state", qui est "RUNNING" ou "CORKED", selon que la musique est en pause ou non.

3
CPBL

pacmd list-sink-inputs donne une liste de tous les joueurs qui courent, vous n'avez donc même pas besoin de savoir lesquels vous cherchez à l'avance, et vous indique ceux qui jouent/en pause, etc. Je l'ai écrit pour Python, mais vous pourriez faire un meilleur travail avec awk ou bash, j'en suis sûr:

import commands,re
def linux_musicplayer_check_whether_playing():
    """
    Report which applications are currently sending 
    sound to the mixer, based on the output of the command:
       pacmd list-sink-inputs
    Also list those which are running/connected,
    but not currently sending sound.
    Returns a dict listing applications and a boolean playing state.

    This is very GNU/Linux specific! At least, it works on Ubuntu.  
    On other platforms, there may be direct ways for each application.

    For instance, under Ubuntu, you can ask banshee:

    'playing' in commands.getstatusoutput("banshee --query-current-state")[1])

    but there's nothing like this for rhythmbox.

    """

    found={}

    for cl in commands.getstatusoutput("pacmd list-sink-inputs |grep -e index: -e state: -e client:")[1].split('index:')[1:]:
        found[ re.findall('<(.*?)>', cl.split(':')[2])[0].lower() ]  =
                     'RUNNING' in cl.split(':')[1]
    return(found)
2
CPBL

Spécification d'interfaçage de lecteur multimédia (MPRIS)

Vous pouvez utiliser le interface MPRIS2 DBus , il est bien établi et implémenté par presque tous les joueurs.

Le même standard que celui utilisé par l’indicateur de son Ubuntu Unity pour détecter, montrer et contrôler les lecteurs. Donc, votre script sera générique et pourrait fonctionner avec n'importe quel joueur que vous aimez.

Indice: Utilisez D-Feet pour l'explorer, d-feet est un moniteur DBus et peut directement interagir avec les interfaces DBus.

  • Pause

    gdbus call \
      --session \
      --dest org.mpris.MediaPlayer2.rhythmbox \
      --object-path /org/mpris/MediaPlayer2 \
      --method org.mpris.MediaPlayer2.Player.Pause
    
  • Pause/Reprendre

    gdbus call \
      --session \
      --dest org.mpris.MediaPlayer2.rhythmbox \
      --object-path /org/mpris/MediaPlayer2 \
      --method org.mpris.MediaPlayer2.Player.PlayPause
    
  • Vérifier le statut

    ~$ gdbus call \
         --session \ 
         --dest org.mpris.MediaPlayer2.rhythmbox \
         --object-path /org/mpris/MediaPlayer2 \
         --method org.freedesktop.DBus.Properties.Get \
             org.mpris.MediaPlayer2.Player PlaybackStatus
    (<'Playing'>,)
    
    ~$ gdbus call \
         --session \
         --dest org.mpris.MediaPlayer2.rhythmbox \
         --object-path /org/mpris/MediaPlayer2 \
         --method org.freedesktop.DBus.Properties.Get \
             org.mpris.MediaPlayer2.Player PlaybackStatus
    (<'Stopped'>,)
    
2
user.dz