Como determinar, a partir da linha de comando, se o rhythmbox está tocando?

3

rhythmbox-client --print-playing diz-me o nome de uma música, independentemente de estar ou não a ser reproduzida. Eu simplesmente preciso saber se o som está ou não sendo gerado pelo rhythmbox (para que eu saiba se quero ou não pausá-lo e depois desmarcá-lo).

Atualização:

Uma resposta do candidato feia:

Eu acho que o rhythmbox realmente pode ser desprovido dessa interface básica.

Mas quando eu corro pacmd list-sink-inputs o qual eu recolho consulta o mixer sobre o que está sendo alimentado, ele ainda lista o rhythmbox independentemente de ele estar tocando. No entanto, ele tem uma linha "state" na saída, que é "RUNNING" ou "CORKED" dependendo se a música está em pausa.

    
por CPBL 01.07.2016 / 19:04

2 respostas

2

Especificação de Interfaces Remotas do Media Player (MPRIS)

Você pode usar a interface MPRIS2 DBus , é um padrão bem estabelecido e implementado por quase todos os jogadores.

O mesmo padrão usado pelo indicador de som do Ubuntu Unity para detectar, mostrar e controlar os jogadores. Então, o seu script será genérico e poderá funcionar com qualquer jogador que você goste.

Dica: Use D-Feet para explorá-lo, d-feet é o monitor DBus e pode interagir diretamente com interfaces DBus.

  • Pausa

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

    gdbus call \
      --session \
      --dest org.mpris.MediaPlayer2.rhythmbox \
      --object-path /org/mpris/MediaPlayer2 \
      --method org.mpris.MediaPlayer2.Player.PlayPause
    
  • Verificar status

    ~$ 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'>,)
    
por user.dz 02.07.2016 / 01:35
2

pacmd list-sink-inputs fornece uma lista de todos os jogadores em execução, assim você nem precisa saber com antecedência quais estão procurando e quais são reproduzidos / pausados, etc. Eu escrevi isso para Python, mas você poderia fazer um trabalho melhor com awk ou bash, tenho certeza:

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)
    
por CPBL 01.07.2016 / 23:12