如何从命令行确定 rhythmbox 是否正在播放?

如何从命令行确定 rhythmbox 是否正在播放?

rhythmbox-client --print-playing告诉我歌曲的名称,无论它是否正在播放。我只需要知道 rhythmbox 当前是否正在生成声音(这样我就知道是否要暂停它并稍后取消暂停)。

更新:

一位丑陋的候选人回答道:

我认为 rhythmbox 可能确实缺乏这个基本界面。

但是当我运行pacmd list-sink-inputs 它时,我向搅拌器询问正在喂食什么,它仍然无论是否正在播放,都会列出 rhythmbox。但是,它在输出中有一个“状态”行,根据音乐是否暂停,该行是“RUNNING”或“CORKED”。

答案1

媒体播放器远程接口规范 (MPRIS)

您可以使用MPRIS2 DBus 接口,它是一个非常成熟的标准并且被几乎所有玩家所采用。

与 Ubuntu Unity 声音指示器用于检测、显示和控制播放器的标准相同。因此您的脚本将是通用的,可以与您喜欢的任何播放器配合使用。

暗示:用来D-Feet探索它,d-feet 是 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'>,)
    

答案2

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)

相关内容