web-dev-qa-db-ja.com

曲が終わる直前にスクリプトを実行する方法は?

私の意図は、未評価の曲が終わりに近づいたら、メッセージを通知して送信することです。私は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>,)(マイクロ秒単位)最初の場合、および2番目の場合:(<{'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

私が最後に作ったものをここに投稿するので、誰かが興味を持っているなら、彼はそれを使うことができます。 @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 __== '__main__':
    main()
1