-- based on https://github.com/rohieb/mpv-notify
-- https://unix.stackexchange.com/a/455198/119298
lastcommand = nil
function string.shellescape(str)
return "'"..string.gsub(str, "'", "'\"'\"'").."'"
end
function do_notify(a,b)
local command = ("notify-send -a mpv -- %s %s"):format(a:shellescape(),
b:shellescape())
if command ~= lastcommand then
os.execute(command)
lastcommand = command
end
end
function notify_current_track()
data = mp.get_property_native("metadata")
if data then
local artist = (data["ARTIST"] or data["artist"] or " ")
local title = (data["TITLE"] or data["title"] or " ")
if artist..title~=" " then
do_notify(artist, title)
return
end
end
local data = mp.get_property("path")
if data then
local file = data:gsub("^.-([^/]+)$","%1")
file = file:gsub("%....$","") -- delete 3 char suffix
local dir = data:gsub("^.-([^/]+)/[^/]*$","%1")
do_notify(dir, file)
end
end
mp.register_event("file-loaded", notify_current_track)
mpv
可以运行lua用户脚本,其中一些在此处列出。其中之一,notify将生成一个复杂的notify-send
. 它有一些依赖项,我无法让它在我的设置中工作,但随后大大简化的代码对我有用。将此文件放入~/.config/mpv/scripts/mynotify.lua
(如果需要,创建目录),然后mpv
照常运行。当艺术家或标题更改时,您应该会看到通知。此更新版本等待新文件准备好播放时发送的事件。它试图找到元数据并从中提取艺术家和标题。如果它是空的,它会获取当前文件名 (
"path"
) 并拆分出最后一部分/
以获取文件名,从中删除任何尾随的 3 个字符后缀。它尝试查找文件名的最后一个目录部分,并在通知中使用这两项。如果您的目录结构是艺术家/专辑名称/tracktitle.aac,您可能希望使用更合适的模式匹配和提取来更改它。请参阅有关模式的 lua 部分。mpv
有一个事件挂钩库,libmpv
. 这里有一个问题要求基本相同的东西,标题为:libmpv event hooking in C# #3810。有一个截图评论这个问题:
从这个线程来看,它看起来
mpv
至少在某种程度上能够做你想做的事。我相信你必须编写一些代码来实现你想要的。探索 D-Bus
mpv
在已经通过 D-Bus 发送消息的情况下,解决此问题的另一种方法是使用 cli 工具dbus-monitor
。使用此工具,您将能够捕获所有正在记录的事件,也许您将能够捕获来自mpv
.注意:
mpv
是一个分支,mplayer2
我知道mplayer2
确实使用了 D-Bus,所以我希望mpv
这样做。参考