Python 检查网络广播流是否为 avaliable/live 的方法

Python Way to check whether internet radio stream is avaliable/live

我致力于收集互联网广播流文件,例如 m3u,并在 中进行流式传输 (例如 http://aska.ru-hoster.com:8053/autodj.

我没有找到关于如何 检查 link 是否为 avaliable/live 的示例。

感谢任何帮助

更新:

也许主要问题应该听起来像:

流会断吗?如果是,该流的 link 是否仍然可用,或者浏览器中只会出现 404 错误?如果 link 即使流已经死了仍然可以打开,还有什么其他方法可以检查流?

您是否正在尝试检查流媒体 URL 是否存在?
如果是,就像检查任何其他 url 是否存在一样。

一种方法是尝试使用 urllib 获取 url 并检查返回的状态代码。

200 - Exists
Anything else (e.g. 404) -Doesn't exist or you can't access it.

例如:

import urllib
url = 'http://aska.ru-hoster.com:8053/autodj'

code = urllib.urlopen(url).getcode()
#if code == 200:  #Edited per @Brad's comment
 if str(code).startswith('2') or str(code).startswith('3') :
    print 'Stream is working'
else:
    print 'Stream is dead'

EDIT-1

虽然上面会捕获 URL 是否存在。如果 URL 存在且媒体 link 已损坏,它将不会捕获。

使用 vlc 的一种可能解决方案是从 url 获取媒体,尝试播放它并在播放时获取其状态。如果媒体不存在,我们将收到错误消息,可用于确定 link 状态。

通过工作 URL 我们得到

url = 'http://aska.ru-hoster.com:8053/autodj'
>>> 
Stream is working. Current state = State.Playing   

随着破碎 URL 我们得到,

url = 'http://aska.ru-hoster.com:8053/autodj12345'
>>> 
Stream is dead. Current state = State.Error

下面是实现上面的基本逻辑。您可能需要检查 VLC site 以捕获其他错误类型和更好的方法。

import vlc
import time

url = 'http://aska.ru-hoster.com:8053/autodj'
#define VLC instance
instance = vlc.Instance('--input-repeat=-1', '--fullscreen')

#Define VLC player
player=instance.media_player_new()

#Define VLC media
media=instance.media_new(url)

#Set player media
player.set_media(media)

#Play the media
player.play()


#Sleep for 5 sec for VLC to complete retries.
time.sleep(5)
#Get current state.
state = str(player.get_state())

#Find out if stream is working.
if state == "vlc.State.Error" or state == "State.Error":
    print 'Stream is dead. Current state = {}'.format(state)
    player.stop()
else:
    print 'Stream is working. Current state = {}'.format(state)
    player.stop()