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になってるのにも注意。