Question

J'écris simple frontend en Python pour jouer et enregistrer les chaînes de radio Internet (par exemple à partir shoutcast) en utilisant mplayer (dans un sous-processus). Lorsqu'un utilisateur clique sur une station le code suivant est exécuté:


url = http://77.111.88.131:8010 # only an example
cmd = "mplayer %s" % url
p = subprocess.Popen(cmd.split(), shell=False)
wait = os.waitpid(p.pid, 1)
return int(p.pid)

Cela fonctionne parfaitement, le courant commence à jouer comme il se doit. Bien que je voudrais analyser en quelque sorte le titre du cours d'eau. Il semble que je dois aller chercher le titre de la sortie de MPlayer. Ceci est la sortie quand je joue le flux dans un terminal:

$ mplayer http://77.111.88.131:8010
MPlayer 1.0rc4-4.4.5 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing http://77.111.88.131:8010.
Resolving 77.111.88.131 for AF_INET6...
Couldn't resolve name for AF_INET6: 77.111.88.131
Connecting to server 77.111.88.131[77.111.88.131]: 8010...
Name   : Justmusic.Fm
Genre  : House
Website: http://www.justmusic.fm
Public : yes
Bitrate: 192kbit/s
Cache size set to 320 KBytes
Cache fill:  0.00% (0 bytes)   
ICY Info: StreamTitle='(JustMusic.FM) Basement - Zajac, Migren live at Justmusic 2010-10-09';StreamUrl='http://www.justmusic.fm';
Cache fill: 17.50% (57344 bytes)   
Audio only file format detected.

Il fonctionne alors jusqu'à ce qu'il soit arrêté. La question est, comment puis-je récupérer " (JustMusic.FM) Sous-sol - Zajac, Migren vivent à Justmusic 2010-10-09 " et laissez toujours le terme de processus? Je ne pense pas que le sous-processus () stocke en fait la sortie, mais je peux me tromper. Toute aide est très apprécié:)

Était-ce utile?

La solution

Définissez l'argument stdout à PIPE et vous serez en mesure d'écouter la sortie de la commande:

p= subprocess.Popen(['mplayer', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout:
    if line.startswith('ICY Info:'):
        info = line.split(':', 1)[1].strip()
        attrs = dict(re.findall("(\w+)='([^']*)'", info))
        print 'Stream title: '+attrs.get('StreamTitle', '(none)')

Autres conseils

import re
import shlex
from subprocess import PIPE, Popen

URL = 'http://relay2.slayradio.org:8000/'

def get_exitcode_stdout_stderr(cmd):
    """
    Execute the external command and get its exitcode, stdout and stderr.
    """
    args = shlex.split(cmd)

    proc = Popen(args, stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode
    #
    return exitcode, out, err

def get_title():
    cmd = "mplayer -endpos 1 -ao null {url}".format(url=URL)
    out = get_exitcode_stdout_stderr(cmd)[1]

    for line in out.split("\n"):
#        print(line)
        if line.startswith('ICY Info:'):
            match = re.search(r"StreamTitle='(.*)';StreamUrl=", line)
            title = match.group(1)
            return title

def main():
    print(get_title())

Modifier J'ai eu une autre solution (simple) qui a cessé de travailler ici donc je mis à jour ma solution. L'idée: mplayer arrête après 1 sec. (-endpos 1).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top