Как запустить скрипт каждый раз, когда песня заканчивается?
Мое намерение состоит в том, чтобы уведомить-отправить сообщение, если скоро закончится песня без звезд. Я использую Rhythmbox с плагином MPRIS и нашел следующие скрипты:
#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: длина" - вот что имеет значение)
Но я не знаю, как использовать результаты, особенно как их анализировать, чтобы проверить, осталось ли менее 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()