我正在寻找一个 python 片段来读取互联网广播流(.asx、.pls 等)并将其保存到文件中。
最后一个项目是 cron'ed 脚本,它将录制一两个小时的互联网广播,然后将其传输到我的手机上,以便在我上下班途中播放。(3g 在我的通勤路上有点参差不齐)
欢迎任何snippits或指针。
我正在寻找一个 python 片段来读取互联网广播流(.asx、.pls 等)并将其保存到文件中。
最后一个项目是 cron'ed 脚本,它将录制一两个小时的互联网广播,然后将其传输到我的手机上,以便在我上下班途中播放。(3g 在我的通勤路上有点参差不齐)
欢迎任何snippits或指针。
以下对我使用 requests 库来处理 http 请求有用。
import requests
stream_url = 'http://your-stream-source.com/stream'
r = requests.get(stream_url, stream=True)
with open('stream.mp3', 'wb') as f:
try:
for block in r.iter_content(1024):
f.write(block)
except KeyboardInterrupt:
pass
这会将流保存到stream.mp3
文件中,直到您使用ctrl+C
.
因此,在修补和使用它之后,我发现Streamripper效果最好。这是我使用的命令
streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME
如果您发现 Python 3 中的请求或 urllib.request 调用无法保存流,因为您收到“ICY 200 OK”而不是“HTTP/1.0 200 OK”标头,您需要告诉底层函数 ICY 200好的是好的!
您可以有效地做的是在处理标头之前,在打开流之后拦截处理读取状态的例程。
只需将这样的例程放在您的流打开代码上方即可。
def NiceToICY(self):
class InterceptedHTTPResponse():
pass
import io
line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n")
InterceptedSelf = InterceptedHTTPResponse()
InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line))
InterceptedSelf.debuglevel = self.debuglevel
InterceptedSelf._close_conn = self._close_conn
return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf)
然后在打开 URL 之前将这些行放在主程序的开头。
ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY
他们将覆盖标准例程(仅此一次)并在打开流时运行 NiceToICY 函数来代替正常状态检查。NiceToICY 替换无法识别的状态响应,然后复制“真实”_read_status 函数所需的原始响应的相关位。最后调用原始文件并将其中的值传递回调用者,其他一切都照常进行。
我发现这是解决导致错误的状态消息问题的最简单方法。希望它对你也有用。
我知道这是一岁了,但这仍然是一个可行的问题,我最近一直在摆弄。
大多数互联网广播电台都会为您提供下载类型的选项,我选择 MP3 版本,然后从原始套接字读取信息并将其写入文件。诀窍是计算出下载速度与播放歌曲相比的速度,以便您可以在读/写大小上取得平衡。这将在您的缓冲区定义中。
现在您有了文件,只需将其留在驱动器(记录)上就可以了,但是大多数播放器将从文件中删除已播放的块,并在流停止时将文件从驱动器和内存中清除。
我使用了来自文件存档的一些代码片段,没有压缩应用程序来处理大量文件文件处理、播放、缓冲魔术。流程的流程非常相似。如果您编写一些 sudo 代码(我强烈推荐),您可以看到相似之处。
我只熟悉广播流的工作原理(这将是您提到的 .pls 文件):
您下载 pls 文件,它只是一个播放列表。它的格式相当简单,因为它只是一个指向真实流所在位置的文本文件。
您可以连接到该流,因为它只是 HTTP,流 MP3 或 AAC。为了您的使用,只需将您获得的每个字节保存到一个文件中,您将获得一个 MP3 或 AAC 文件,您可以将其传输到您的 mp3 播放器。
Shoutcast 有一个可选的附加功能:元数据。你可以在这里找到它是如何工作的,但并不是真正需要的。
如果您想要一个执行此操作的示例应用程序,请告诉我,我稍后会补上一些东西。