iTunes范围请求;播客被拒绝

时间:2012-08-15 22:37:00

标签: http http-headers itunes podcast

有一个播客正在尝试添加到处理字节范围请求的itunes。我可以通过curl音频文件确认这一点:

curl -H "Range: bytes=50-100" --head http://media.site.org/podcasts/upload/2012/08/15/audio-081512.mp3

HTTP/1.1 200 OK
Server: nginx/1.2.0
Date: Wed, 15 Aug 2012 22:28:40 GMT
Content-Type: audio/mpeg
Content-Length: 51
Connection: keep-alive
X-Powered-By: Express
Status: 206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 50-100/1441605
Access-Control-Allow-Origin: *

但是,当我尝试将Feed页面的URL输入iTunes时,出现以下错误:

  

“您的Feed存在问题。您的剧集托管在不支持字节范围请求的服务器上。启用字节范围请求并再次尝试提交。”

音频文件托管在与源文件不同的服务器上,并由节点服务器提供服务......但我不明白为什么只要响应标头正确就行。

我有一些其他播客是从同一台服务器提供的,在 iTunes开始要求字节范围支持之前添加了,它们仍能正常工作(在任何平台上,包括iPhone,表明字节范围的请求确实有效。)

1 个答案:

答案 0 :(得分:2)

如果响应标头的HTTP状态为200,则即使服务器正在接受字节范围请求,iTunes也会拒绝播客。我所要做的就是强制206 Partial Response标题。在Node中,它看起来像这样(CoffeeScript):

res.writeHead 206, headers

headers是包含字节范围请求的所有正确标头的哈希,例如:

headers:
  "Accept-Ranges": "bytes"
  "Content-Range": "bytes #{start}-#{end}/#{length}

通过解析start请求标头获取endRange变量,length是音频文件的实际大小。我还投入了"Cache-Control": "no-cache"以获得良好的衡量标准。