Frage

Ich bin ein einfaches Frontend in Python zu schreiben wiedergeben und aufzeichnen Internet-Radiokanäle (beispielsweise von Shoutcast) unter Verwendung von MPlayer (in einem Teilprozess). Wenn ein Benutzer eine Station der folgende Code klickt ausgeführt wird:


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)

Das funktioniert perfekt, beginnt der Strom zu spielen, wie es sollte. Obwohl würde Ich mag irgendwie den Titel des Stroms zu analysieren. Es scheint, dass ich den Titel aus der MPlayer Ausgabe holen muß. Dies ist der Ausgang, wenn ich den Strom in einem Terminal spielen:

$ 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.

Es läuft dann, bis er gestoppt wird. Die Frage ist also, wie kann ich abrufen „ (JustMusic.FM) Keller - Zajac, lebt migren bei Just 2010-10-09 “ und immer noch den Prozess laufen lassen? Ich glaube nicht, subprocess () tatsächlich die Ausgabe speichert, aber ich könnte falsch sein. Jede Hilfe ist sehr geschätzt:)

War es hilfreich?

Lösung

Stellen Sie das stdout Argument PIPE und Sie werden in der Lage auf die Ausgabe des Befehls zu hören:

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)')

Andere Tipps

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())

Edit: Ich hatte eine andere (einfachere) Lösung hier, die aufgehört zu arbeiten, damit ich meine Lösung aktualisiert. Die Idee: mplayer stoppt nach 1 sec. (-endpos 1).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top