Как определить из командной строки, играет ли ритмбокс?

rhythmbox-client --print-playing говорит мне название песни, независимо от того, играет ли она на самом деле. Мне просто нужно знать, генерируется ли в данный момент звук с помощью ритмбокса (чтобы я знал, хочу ли я его приостановить, а затем отключить).

Обновить:

Один уродливый кандидат ответ:

Я думаю, что Rhythmbox действительно может быть лишен этого базового интерфейса.

Но когда я бегу pacmd list-sink-inputsкоторый я собираю, запрашивает микшер о том, что кормит, он все еще перечисляет ритмбокс независимо от того, играет ли он Тем не менее, он имеет строку "state" на выходе, которая является "RUNNING" или "CORKED" в зависимости от того, приостановлена ​​ли музыка.

2 ответа

Спецификация удаленного интерфейса медиаплеера (MPRIS)

Вы можете использовать интерфейс MPRIS2 DBus, он является общепризнанным стандартом и реализован практически всеми игроками.

Тот же стандарт, который используется звуковым индикатором Ubuntu Unity для обнаружения, отображения и управления игроками. Таким образом, ваш сценарий будет общим и может работать с любым плеером, который вам нравится.

Подсказка: используйте D-Feet чтобы исследовать его, d-foot является монитором DBus и может напрямую взаимодействовать с интерфейсами DBus.

  • Пауза

    gdbus call \
      --session \
      --dest org.mpris.MediaPlayer2.rhythmbox \
      --object-path /org/mpris/MediaPlayer2 \
      --method org.mpris.MediaPlayer2.Player.Pause
    
  • Пауза / Возобновление

    gdbus call \
      --session \
      --dest org.mpris.MediaPlayer2.rhythmbox \
      --object-path /org/mpris/MediaPlayer2 \
      --method org.mpris.MediaPlayer2.Player.PlayPause
    
  • Проверить состояние

    ~$ 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'>,)
    

pacmd list-sink-inputs дает список всех запущенных игроков, так что вам даже не нужно заранее знать, кого вы ищете, и сообщает, кто из них играет / приостановлен и т. д. Я написал это для Python, но вы могли бы сделать лучше работать с awk или bash, я уверен:

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)
Другие вопросы по тегам