سؤال

أنا أكتب واجهة بسيطة في بيثون للعب وتسجيل قنوات راديو الإنترنت (على سبيل المثال من 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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top