web-dev-qa-db-fra.com

Comment exécuter un script chaque fois qu'une chanson est sur le point d'être terminée?

Mon intention est de notifier/envoyer un message si une chanson non classée est sur le point de se terminer. J'utilise Rhythmbox avec le plugin MPRIS et j'ai trouvé les scripts suivants:

#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

Sortie: (<int64 77000000>,) (en microsecondes) pour le premier et pour le second: (<{'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: longueur' est ce qui compte)

Mais je ne sais pas comment utiliser les résultats, surtout comment les analyser pour vérifier s’il reste moins de 10 secondes (j’ai besoin du temps restant en valeur int et je ne sais pas comment le réaliser script ...).

Là-bas, je ne sais pas comment mettre cela en œuvre. Je pensais à un fichier .sh que je lirais depuis un terminal et qui vérifierait toutes les quelques secondes l’état de lecture.

Pouvez-vous donner quelques conseils et/ou le début d'un script (qui a au moins une boucle infinie ou une récursion - quel est le meilleur? - et le temps restant actualisé dans une variable)?

Merci beaucoup d'avance !

2
Johannes Lemonde

J'écris ici ce que j'ai finalement fait pour que, si cela intéresse quelqu'un, il puisse l'utiliser. Merci à @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
Johannes Lemonde