Python: Parse Stream Titel mit mplayer
-
30-09-2019 - |
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:)
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
).