仅适用于真正的玩家:vlc、mpv、RhythmBox、网络浏览器、cmus、mpd、spotify 等。
聊天
Playerctl 是一个命令行实用程序和库,用于控制实现 MPRIS D-Bus 接口规范的媒体播放器。 Playerctl 可以轻松地将播放器操作(例如播放和暂停)绑定到媒体键。您还可以获取有关播放曲目的元数据,例如艺术家和标题,以便集成到状态行生成器或其他命令行工具中。
Playerctl 还附带一个守护进程,允许它作用于当前活动的媒体播放器,称为playerctld
。
playerctl [--version] [--list-all] [--all-players] [--player=NAME] [--ignore-player=IGNORE] [--format=FORMAT] [--no-messages] COMMAND
以下是可用命令的列表:
命令 | 描述 |
---|---|
play | 命令玩家进行游戏。 |
pause | 命令玩家暂停 |
play-pause | 命令播放器在播放/暂停之间切换。 |
stop | 命令玩家停止。 |
next | 命令播放器跳到下一首曲目。 |
previous | 命令播放器跳到上一曲目。 |
position [OFFSET][+/-] | 命令玩家在几秒钟内到达该位置或向前或向后寻找 OFFSET。 |
volume [LEVEL][+/-] | 打印或将音量设置为从 0.0 到 1.0 的 LEVEL。 |
status | 获取玩家的播放状态。 “正在播放”、“已暂停”或“已停止”。 |
metadata [KEY...] | 打印当前曲目的元数据。如果传递 KEY,则仅打印元数据中的那些值。 |
open [URI] | 播放器打开给定 URI 的命令。可以是文件路径或远程 URL。 |
loop [STATUS] | 打印或设置循环状态。 “无”、“曲目”或“播放列表”。 |
shuffle [STATUS] | 打印或设置随机播放状态。要么“开”,要么“关”。 |
在不指定任何要控制的玩家的情况下,Playerctl 将对其找到的第一个玩家进行操作。
Playerctl 附带了一个名为playerctld
的服务,该服务监视后台媒体播放器的活动。如果playerctld
正在运行,Playerctl将按照玩家上次活动的顺序对他们进行操作。要启动playerctld
,请将以下命令添加到系统启动脚本中:
playerctld daemon
您可以使用playerctl --list-all
列出可控制在系统上运行的播放器的名称。
如果您只想控制某些玩家,则可以使用--player
标志传递以逗号分隔的这些玩家的名称。 Playerctl 将选择该列表中支持该命令的第一个播放器实例。要控制列表中的所有玩家,您可以使用--all-players
标志。
同样,您可以通过使用--ignore-player
标志传递玩家的名字来忽略玩家。
特殊玩家名称%any
可以在选定玩家列表中使用一次,以匹配列表中没有的任何玩家。这可用于确定玩家的优先级或降低其优先级。
示例:
# Command the first instance of VLC to play
playerctl --player=vlc play
# Command all players to stop
playerctl --all-players stop
# Command VLC to go to the next track if it's running. If it's not, send the
# command to Spotify.
playerctl --player=vlc,spotify next
# Get the status of the first player that is not Gwenview.
playerctl --ignore-player=Gwenview status
# Command any player to play, but select Chromium last
playerctl --player=%any,chromium play
# Command any player to play, but select VLC first
playerctl --player=vlc,%any play
您可以使用--format
参数传递格式字符串,以特定格式打印属性。在双大括号之间的格式字符串中传递要打印的变量,例如{{ VARIABLE }}
。可用的变量可以是查询命令的名称,也可以是元数据映射中可以使用playerctl metadata
查看的任何内容。您可以使用它将playerctl 集成到状态行生成器中。
对于一个简单的“正在播放”横幅:
playerctl metadata --format " Now playing: {{ artist }} - {{ album }} - {{ title }} "
# prints 'Now playing: Lana Del Rey - Born To Die - Video Games'
模板语言中包含一些内置变量和用于常见格式设置的辅助函数,您可以在模板变量上调用它们。它还可以对数字进行基本的数学运算。
# Prints 'Total length: 3:23'
playerctl metadata --format " Total length: {{ duration(mpris:length) }} "
# Prints 'At position: 1:16'
playerctl position --format " At position: {{ duration(position) }} "
# Prints 'Artist in lowercase: lana del rey'
playerctl metadata --format " Artist in lowercase: {{ lc(artist) }} "
# Prints 'STATUS: PLAYING'
playerctl status --format " STATUS: {{ uc(status) }} "
# Prints the time remaining in the track (e.g, 'Time remaining: 2:07')
playerctl metadata --format " Time remaining: {{ duration(mpris:length - position) }} "
# Prints volume from 0 - 100
playerctl metadata --format " Volume: {{ volume * 100 }} "
功能 | 争论 | 描述 |
---|---|---|
lc | 细绳 | 将字符串转换为小写。 |
uc | 细绳 | 将字符串转换为大写。 |
duration | 整数 | 将持续时间转换为 hh:mm:ss 格式。 |
markup_escape | 细绳 | 对字符串中的 XML 标记字符进行转义。 |
default | 任何,任何 | 如果存在则打印第一个值,否则打印第二个值。 |
emoji | 状态或音量 | 尝试将变量转换为表情符号表示形式。 |
trunc | 字符串、整数 | 将字符串截断至最大长度。 |
多变的 | 描述 |
---|---|
playerName | 当前玩家的名字。 |
position | 当前曲目的位置(以微秒为单位) |
status | 当前播放器的播放状态 |
volume | 音量从 0.0 到 1.0 |
album | 当前曲目的专辑。 |
artist | 当前曲目的艺术家。 |
title | 当前曲目的标题。 |
您可以传递--follow
标志来阻止查询命令,等待玩家连接,并在查询发生变化时打印查询。如果通过--player
传递玩家,则列表中较早的玩家将按照出现的顺序优先,除非通过--all-players
。当没有玩家支持查询时,比如所有玩家退出时,就会打印换行符。例如,要获得有关媒体播放器当前播放的最新曲目的信息,请使用:
playerctl metadata --format ' {{ playerName }}: {{ artist }} - {{ title }} {{ duration(position) }}|{{ duration(mpris:length) }} ' --follow
您可以寻找轨道中的某个位置或向前和向后跳跃。
# Go back 30 seconds
playerctl position 30-
# Go forward 30 seconds
playerctl position 30+
# Seek to the position at 30 seconds
playerctl position 30
要启用调试日志记录,请设置环境变量G_MESSAGES_DEBUG=playerctl
。报告问题时包含调试日志会很有帮助。
某些播放器(例如 Spotify)需要设置某些 DBus 环境变量,这些变量通常在会话管理器中设置。如果您不使用会话管理器或者它不会自动设置这些变量(如xinit
),请启动包含在dbus-launch
命令中的桌面环境。例如,在您的.xinitrc
文件中,使用它来启动您的 WM:
exec dbus-launch --autolaunch=$(cat /var/lib/dbus/machine-id) i3
有些玩家可能需要安装插件或其他配置。
在 Quod Libet 中打开窗口 File -> Plugins 并选择名为MPRIS D-Bus Support 的插件。
如果playerctld
没有自动启动并且您使用xinit
和systemd,您可能需要此修复才能使DBus激活正常工作:
systemctl --user import-environment DISPLAY XAUTHORITY
if which dbus-update-activation-environment >/dev/null 2>&1; then
dbus-update-activation-environment DISPLAY XAUTHORITY
fi
首先,检查并查看您的包管理器是否可以使用 Playerctl(如果不是,请找人为您托管一个包),并检查 github 上的发布页面。
playerctl
适用于 Fedora 28 或更高版本:
sudo dnf install playerctl
通过此 COPR 存储库, playerctl
可用于 Mageia 和 openSUSE。首先,从 COPR 安装您的发行版的存储库文件。然后,使用您选择的包管理器安装playerctl
。
playerctl
作为 Guix 软件包提供,安装 Guix 后可以安装在任何 Linux 发行版上:
guix install playerctl
使用 cli 和库需要 GLib(这也是几乎所有这些播放器的依赖项,因此您可能已经拥有它)。您可以在几乎任何编程语言中使用该库以及关联的内省绑定库。
此外,您还需要以下构建依赖项:
gobject-introspection 用于构建内省数据(可使用introspection
介子选项进行配置)
gtk-doc 用于构建文档(可使用gtk-doc
介子选项进行配置)
Fedora用户还需要安装redhat-rpm-config
生成并构建项目以促进开发并将playerctl安装到/
:
meson mesonbuild
sudo ninja -C mesonbuild install
请注意,您需要安装meson
。如果您的发行版在其存储库中只有旧版本的介子,您可以通过 pip 安装最新版本:
pip3 install meson
另请记住,默认情况下启用 gtk-doc 和 gobject-introspection,您可以使用-Dintrospection=false
和-Dgtk-doc=false
禁用它们。
如果您不想将playerctl安装到/
您可以在调用ninja之前通过导出DESTDIR
将其安装在其他地方,例如:
export PREFIX="/usr/local"
meson --prefix="${PREFIX}" --libdir="${PREFIX}/lib" mesonbuild
export DESTDIR="$(pwd)/install"
ninja -C mesonbuild install
您可以稍后通过导出以下变量来使用它:
export LD_LIBRARY_PATH="$DESTDIR/${PREFIX}/lib/:$LD_LIBRARY_PATH"
export GI_TYPELIB_PATH="$DESTDIR/${PREFIX}/lib/:$GI_TYPELIB_PATH"
export PATH="$DESTDIR/${PREFIX}/bin:$PATH"
要使用脚本库,请从此列表中找到您最喜欢的语言并安装绑定库。该库的文档托管在此处。有关如何使用该库的示例,请参阅示例文件夹。
对于更高级的用户,Playerctl 提供了一个可使用您最喜欢的脚本语言提供的内省库,该库允许更详细的控制,例如订阅媒体播放器事件或获取元数据(例如播放曲目的艺术家和标题)的能力。此示例使用 Python 绑定。
#!/usr/bin/env python3
from gi . repository import Playerctl , GLib
player = Playerctl . Player ( 'vlc' )
def on_metadata ( player , metadata ):
if 'xesam:artist' in metadata . keys () and 'xesam:title' in metadata . keys ():
print ( 'Now playing:' )
print ( '{artist} - {title}' . format (
artist = metadata [ 'xesam:artist' ][ 0 ], title = metadata [ 'xesam:title' ]))
def on_play ( player , status ):
print ( 'Playing at volume {}' . format ( player . props . volume ))
def on_pause ( player , status ):
print ( 'Paused the song: {}' . format ( player . get_title ()))
player . connect ( 'playback-status::playing' , on_play )
player . connect ( 'playback-status::paused' , on_pause )
player . connect ( 'metadata' , on_metadata )
# start playing some music
player . play ()
if player . get_artist () == 'Lana Del Rey' :
# I meant some good music!
player . next ()
# wait for events
main = GLib . MainLoop ()
main . run ()
有关能够监听玩家何时开始和退出的更完整的示例,请参阅官方示例中的player-manager.py。
查看以下有关 Playerctl 的文章:
Playerctl 制造商的相关项目:
这项工作可在 GNU Lesser General Public License 下使用(请参阅复制)。
版权所有 © 2014,托尼·克里西