如何使用 CLI 获取 VLC 或其他媒体播放器中播放的媒体的标题?

如何使用 CLI 获取 VLC 或其他媒体播放器中播放的媒体的标题?

我想使用命令行获取 VLC 中播放的媒体的标题。我目前拥有的最接近的是这个命令。

ps aux | grep vlc

输出是

pc       27636  2.1  2.3 1261964 90028 ?       Sl   21:46   0:23 /usr/bin/vlc --started-from-file /media/pc/Everything/TV shows/Discovery Channel - The History Of Hacking.avi
pc       28317  0.0  0.0  11748  2196 pts/0    S+   22:05   0:00 grep --colour=auto vlc

答案1

我确信有一种很好、干净的方法可以做到这一点。可能是通过D-bus。可悲的是,我不知道那是什么,所以这里有一个更hacky的方法。您可以用来lsof打印正在运行的进程打开的文件。这里的相关选项是(来自man lsof):

-c c    selects  the  listing  of  files  for  processes  executing the
        command that begins with the characters of c.  Multiple commands
        may be specified, using multiple -c options.  They are joined in
        a single ORed set before participating in AND option selection.

因此,lsof -c vlc将列出名称以vlc.然而,这将列出各种各样的东西,包括各种库和其他我们不关心的东西。输出的第四个字段lsof(至少在我的 Arch 上)是文件的文件描述符(对于常规文件),后跟一个字母,描述文件打开的模式(r在本例中为读取) 。第 5 个字段是文件类型,在这里,我们希望它是REG常规的。将所有这些放在一起,我们得到(-w抑制警告):

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"'
vlc     16532 terdon   16r      REG    8,19    131338  69731703 /path/to/foo.avi

要仅获取文件名,您可以使用 GNU grep

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '/.*'
/path/to/foo.avi

并仅获取文件名:

$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '[^/]*$'
foo.avi

答案2

我不确定您是在标题(位于文件元数据中)还是文件名(位于命令行中)之后。任何 ps 或 pgrep 都不会直接获取标题,但可以获取文件。您可以运行所有 vlc 及其命令行。

pgrep -a vlc

这将找到名称中包含 vlc 但不包含标志的任何进程,因此它与运行名为的二进制文件匹配一个带有 vlc 的程序但不是某个其他程序--flags--do-vlc

现在如何从命令行中提取文件名有点繁琐,您可能想通过 sed 运行它,但我想它会有点脆弱。

pgrep -a vlc | sed -r 's%^.*\/([^/.]+)%\1%g'

您将获得一个二进制名称中包含 vlc 的程序列表,输出是最后一个斜杠到点的所有内容。

你开始玩类似的东西/主页/电影/博士。英里数那你就不走运了。

答案3

您可以通过查看 mpris 接口规范来使用 d-bus这里

通过使用 qdbus 和 mpris 接口:

qdbus org.mpris.MediaPlayer2.vlc \

(VLC 可以被取代也与其他媒体播放器一起使用。)然后从中提取元数据:

/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata \

最后通过使用 grep 并删除不需要的数据,您可以看到标题:

| grep "xesam:title:" | cut -c 14-

相关内容