使用Python从无线电流中读取SHOUTcast / Icecast元数据

时间:2011-07-07 16:04:10

标签: python stream mp3 metadata internet-radio

有没有人在从远程无线电流中读取SHOUTcast / Icecast元数据方面取得了成功?

several libraries可以从本地MP3文件读取元数据,但似乎没有设计用于无线电流(在远程服务器上本质上是一个永无止境的MP3文件)。

其他建议建议从mp3流的开头下载有限数量的位,但这通常会导致一堆十六进制输出,没有类似文本元数据。

有人知道更成功的解决方案吗?感谢。

3 个答案:

答案 0 :(得分:5)

#!/usr/bin/env python
import urllib2
stream_url = 'http://pub1.di.fm/di_classictrance'
request = urllib2.Request(stream_url)
try:
    request.add_header('Icy-MetaData', 1)
    response = urllib2.urlopen(request)
    icy_metaint_header = response.headers.get('icy-metaint')
    if icy_metaint_header is not None:
        metaint = int(icy_metaint_header)
        read_buffer = metaint+255
        content = response.read(read_buffer)
        title = content[metaint:].split("'")[1]
        print title
except:
    print 'Error'

有关详细信息,请查看this link

答案 1 :(得分:0)

我使用了一些@ dbogdan的代码并创建了一个我每天用于超过4千个流的库。 它运行良好且稳定,并支持歌曲标题,艺术家姓名,比特率和内容类型等元数据。

你可以找到它 https://github.com/Dirble/streamscrobbler-python

答案 2 :(得分:-1)

由于mp3是专有格式,因此规范并不容易。我认为This website提供了一个很好的概述。

在普通的mp3文件中,ID3v1元数据标签位于文件的最后,它构成最后128个字节。这实际上是一个糟糕的设计。 ID3系统是作为mp3的后续添加而添加的,所以我想没有其他方法可以做到这一点而不会破坏向后兼容性。这意味着如果提供的无线电流就像一个永无止境的mp3文件,那么正常意义上就没有ID3标签。

我会和经营广播电台的人核实一下;也许他们把ID3标签放在一个非标准的地方?