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

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

Но я не знаю, как использовать результаты, во всяком случае, как их анализировать, чтобы проверить, что осталось меньше 10 секунд (мне нужно оставшееся время как значение int и не знаю, как это сделать в скрипте ...).

Там, я не уверен, как это реализовать. Я думал о файле .sh, который я бы запускал с терминала, и который каждые несколько секунд проверял, что это за игровое состояние.

Можете ли вы дать некоторые советы и / или начало скрипт (который имеет как минимум бесконечный цикл или рекурсию - что лучше?), а оставшееся время обновляется в переменной)

Большое спасибо заранее!

2
задан 7 October 2017 в 16:23

3 ответа

Я размещаю здесь то, что я наконец сделал, чтобы, если он кого-то интересовал, он мог его использовать. Спасибо @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()
1
ответ дан 22 May 2018 в 17:46

Я размещаю здесь то, что я наконец сделал, чтобы, если он кого-то интересовал, он мог его использовать. Спасибо @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()
1
ответ дан 18 July 2018 в 05:38

Я размещаю здесь то, что я наконец сделал, чтобы, если он кого-то интересовал, он мог его использовать. Спасибо @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()
1
ответ дан 24 July 2018 в 18:23

Другие вопросы по тегам:

Похожие вопросы: