Вопрос

Я пишу простую интерфейс в Python для воспроизведения и записи интернет-радиоканалов (например, от 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: не удалось подключиться к сокете MPlayer: такого файла или каталога не удалось открыть поддержку LICC. Вы не сможете использовать ваш пульт дистанционного управления. Играет http://77.111.88.131:8010. Resolving 77.111.88.131 для AF_INET6 ... Не удалось разрешить имя для AF_INET6: 77.111.88.131 Подключение к серверу 77.111.88.131 [77.111.88.131]: 8010 ... Имя: JustMusic.fm Жанр: Дом Веб-сайт: http: // www.justmusic.fm publical: да Битрейт: 192kbit / s кэш Размер набора к кэше кэш-памяти на 320 кбайт в кэш-памяти на 320 кбайт. -09 '; Streamurl =' http: //www.justmusic.fm '; Cache Fill: 17.50% (57344 байт) Обнаружен только формат файла.

Затем он проходит, пока он не остановится. Так что вопрос в том, как я могу получить »(Justmusic.fm) подвал - Zajac, Migren живут в RustMusic 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