Как запустить скрипт каждый раз, когда песня заканчивается?

Мое намерение состоит в том, чтобы уведомить-отправить сообщение, если скоро закончится песня без звезд. Я использую 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()
Другие вопросы по тегам