我的目的是当一首未评级的歌曲即将结束时发送通知消息。我正在使用带有 MPRIS 插件的 Rhythmbox,并找到了以下脚本:
#Get position
gdbus call \
--session \
--dest org.mpris.MediaPlayer2.rhythmbox \
--object-path /org/mpris/MediaPlayer2 \
--method org.freedesktop.DBus.Properties.Get \
org.mpris.MediaPlayer2.Player Position
#Get metadata such as song length and user song rating
gdbus call \
--session \
--dest org.mpris.MediaPlayer2.rhythmbox \
--object-path /org/mpris/MediaPlayer2 \
--method org.freedesktop.DBus.Properties.Get \
org.mpris.MediaPlayer2.Player Metadata
输出:((<int64 77000000>,)
以微秒为单位)第一个,第二个:((<{'mpris:trackid': <'/org/mpris/MediaPlayer2/Track/4782'>, 'xesam:url': <'file:///path-to-the-mp4-file'>, 'xesam:title': <'Song title'>, 'xesam:artist': <['Artist name']>, 'xesam:album': <'Album name'>, 'xesam:genre': <['Genre name']>, 'xesam:audioBitrate': <214016>, 'xesam:contentCreated': <'2017-01-01T00:00:00Z'>, 'xesam:lastUsed': <'2017-09-12T13:41:52Z'>, 'mpris:length': <int64 189000000>, 'xesam:trackNumber': <15>, 'xesam:useCount': <6>, 'xesam:userRating': <0.80000000000000004>, 'mpris:artUrl': <'file:///path-to-an-image-i-guess'>}>,)
'mpris:length' 很重要)
但我不知道如何使用结果,尤其是如何解析它们来检查是否还剩下不到 10 秒的时间(我需要剩余时间作为 int 值,但不知道如何在脚本中实现它......)。
好了,我不确定如何实现。我考虑使用一个 .sh 文件,我将从终端运行它,它会每隔几秒钟检查一次播放状态。
您能给出一些建议和/或脚本的开头吗(至少有一个无限循环或递归 - 什么是最好的? - 并且在变量中刷新剩余时间)?
提前非常感谢!
答案1
我在这里发布我最终制作的内容,以便如果有人感兴趣,他可以使用它。感谢@steeldriver。
# first : have python-dbus installed
# sudo apt-get install python-dbus
# run like this : python filename.py --notiftwenty --loop
import json
import sys
import os
import subprocess
from argparse import ArgumentParser
import dbus
session_bus = dbus.SessionBus()
bus_data = ("org.mpris.MediaPlayer2.rhythmbox", "/org/mpris/MediaPlayer2")
rhythmbox_bus = session_bus.get_object(*bus_data)
interface = dbus.Interface(rhythmbox_bus, "org.freedesktop.DBus.Properties")
metadata = interface.Get("org.mpris.MediaPlayer2.Player", "Metadata")
position = interface.Get("org.mpris.MediaPlayer2.Player", "Position")
parser = ArgumentParser()
parser.add_argument('--artist', action='store_true')
parser.add_argument('--song', action='store_true')
parser.add_argument('--album', action='store_true')
parser.add_argument('--position', action='store_true')
parser.add_argument('--duration', action='store_true')
parser.add_argument('--remaining', action='store_true')
parser.add_argument('--loop', action='store_true')
parser.add_argument('--notiftwenty', action='store_true')
parser.add_argument('--rating', action='store_true')
parser.add_argument('--format', default='json')
def main():
args = parser.parse_args()
data = dict()
if args.position:
data['position'] = str(position)
if args.duration:
data['duration'] = str(metadata['mpris:length'])
if args.remaining:
data['remaining'] = str(metadata['mpris:length'] - position)
if args.rating:
data['rating'] = str(metadata['xesam:userRating'] * 5)
if args.notiftwenty:
if metadata['xesam:userRating'] * 5 < 0.5:
if metadata['mpris:length'] - position == 20000000:
data['notiftwenty'] = str('true')
subprocess.check_output(["notify-send",
"Rhythmbox : notez cette piste !",
"Ce morceau n'a actuellement pas de note...",
"--icon=rhythmbox"])
if args.loop:
data['loop'] = str('true')
subprocess.check_output("sleep 1 && python "+ os.path.realpath(__file__) +" --notiftwenty --loop", shell=True)
if args.artist:
data['artist'] = str(next(iter(metadata['xesam:albumArtist'])))
if args.song:
data['song'] = str(metadata['xesam:title'])
if args.album:
data['album'] = str(metadata['xesam:album'])
sys.stdout.write(json.dumps(data))
if __name__ == '__main__':
main()