flaskでContent-Rangeを返す
flaskっていうpython用のwebマイクロフレームワークを最近触ってたりして。
いやー、楽でいい。 Djangoよりもpythonicな気がします。
というのはともかく。
audioタグを使って音楽プレイヤー的なものを作って遊んでいたのですが、シークが出来ず。
色々調べていたら、どうやらhttpのRangeリクエストというのに答えなきゃいけないらしい。 という訳で、実装してみました。
def GetFile(fname):
mimeType, enc = mimetypes.guess_type(fname)
data = open(fname, 'rb').read()
if 'Range' in flask.request.headers:
start, end = flask.request.headers['Range'][len('bytes='):].split('-')
try:
start = int(start)
except ValueError:
start = 0
try:
end = int(end)
except ValueError:
end = len(data)
response = flask.Response(data[start:end], mimetype=mimeType, statut=206)
response.headers.add_header('Content-Range', 'bytes {0}-{1}/{2}'.format(start, end-1, len(data)))
return response
return flask.Response(data, mimetype=mimeType)
だいたいこんな感じ。
ヘッダーに
Content-Range: bytes 開始位置-終了位置/本来のサイズ
を入れればいいみたい。
あとは、HTTPステータスコードが206になってるのにも注意。