diff --git a/server/djrandom/frontend/views.py b/server/djrandom/frontend/views.py index ca83889bb1055d5657700decf075d98c4db4a416..8c187370db1cec97e7105cdf8753cda37f84a234 100644 --- a/server/djrandom/frontend/views.py +++ b/server/djrandom/frontend/views.py @@ -11,6 +11,7 @@ from djrandom.frontend import app, require_auth from sqlalchemy import distinct, func log = logging.getLogger(__name__) +use_xsendfile = 1 @app.route('/autocomplete') @@ -75,13 +76,7 @@ def fileiter(path, pos, end): pos += len(chunk) -@app.route('/dl/<sha1>') -@require_auth -def download_song(sha1): - mp3 = MP3.query.get(sha1) - if not mp3: - abort(404) - +def download_song_python(mp3): # Parse 'Range' HTTP header. start = 0 end = os.path.getsize(mp3.path) @@ -100,6 +95,7 @@ def download_song(sha1): else: end = int(hrange) + # Create response with content iterator. response = Response(fileiter(mp3.path, start, end), status=(partial and 206 or 200), direct_passthrough=True) @@ -110,3 +106,22 @@ def download_song(sha1): response.content_type = 'audio/mpeg' response.content_length = (end - start) return response + + +def download_song_xsendfile(mp3): + return Response('', status=200, + content_type = 'audio/mpeg', + headers={'X-SENDFILE': mp3.path}) + + +@app.route('/dl/<sha1>') +@require_auth +def download_song(sha1): + mp3 = MP3.query.get(sha1) + if not mp3: + abort(404) + if use_xsendfile: + return download_song_xsendfile(mp3) + else: + return download_song_python(mp3) +