僅適用於真正的玩家: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,東尼克里西