بيثون: عنوان دفق الحاجز مع Mplayer
-
30-09-2019 - |
سؤال
أنا أكتب واجهة بسيطة في بيثون للعب وتسجيل قنوات راديو الإنترنت (على سبيل المثال من Shoutcast) باستخدام Mplayer (في عملية فرعية). عندما ينقر المستخدم على محطة ، يتم تشغيل الرمز التالي:
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)
هذا يعمل بشكل مثالي ، يبدأ الدفق في اللعب كما ينبغي. على الرغم من أنني أرغب في تحليل عنوان الدفق بطريقة ما. يبدو أنني بحاجة إلى جلب العنوان من إخراج Mplayer. هذا هو الإخراج عندما ألعب الدفق في محطة:
$ 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.
ثم يعمل حتى يتم إيقافه. لذا فإن السؤال هو ، كيف يمكنني الاسترداد "(JustMusic.FM) الطابق السفلي-Zajac ، Migren Live في Justmusic 2010-10-09"وما زلت أترك العملية تعمل؟ لا أعتقد أن العمليات الفرعية () تخزن الناتج فعليًا ، لكنني قد أكون مخطئًا. أي مساعدة موضع تقدير عميق :)
المحلول
تعيين stdout
حجة ل PIPE
وستتمكن من الاستماع إلى إخراج الأمر:
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)')
نصائح أخرى
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())
يحرر: كان لدي حل مختلف (أبسط) هنا توقف عن العمل ، لذا قمت بتحديث الحل. الفكرة: يتوقف Mplayer بعد 1 ثانية. ((-endpos 1
).