mirror of
https://github.com/spl0k/supysonic.git
synced 2024-12-23 01:16:18 +00:00
Implemented stream.view
This commit is contained in:
parent
a6301111c2
commit
79c219a7d5
@ -16,12 +16,8 @@ def set_formatter():
|
|||||||
"""Return a function to create the response."""
|
"""Return a function to create the response."""
|
||||||
(f, callback) = map(request.args.get, ['f', 'callback'])
|
(f, callback) = map(request.args.get, ['f', 'callback'])
|
||||||
if f == 'jsonp':
|
if f == 'jsonp':
|
||||||
if not callback:
|
# Some clients (MiniSub, Perisonic) set f to jsonp without callback for streamed data
|
||||||
# TODO
|
if not callback and request.endpoint not in [ 'stream_media' ]:
|
||||||
# MiniSub has a bug, trying to retrieve jsonp without
|
|
||||||
# callback in case of getCoverArt.view
|
|
||||||
# it's not a problem because the getCoverArt should
|
|
||||||
# return a byte stream
|
|
||||||
return ResponseHelper.responsize_json({
|
return ResponseHelper.responsize_json({
|
||||||
'error': {
|
'error': {
|
||||||
'code': 0,
|
'code': 0,
|
||||||
@ -66,8 +62,10 @@ def set_content_type(response):
|
|||||||
if not request.path.startswith('/rest/'):
|
if not request.path.startswith('/rest/'):
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
if response.mimetype.startswith('text'):
|
||||||
f = request.args.get('f')
|
f = request.args.get('f')
|
||||||
response.headers['content-type'] = 'application/json' if f in [ 'jsonp', 'json' ] else 'text/xml'
|
response.headers['content-type'] = 'application/json' if f in [ 'jsonp', 'json' ] else 'text/xml'
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@app.errorhandler(404)
|
@app.errorhandler(404)
|
||||||
|
61
api/media.py
Executable file
61
api/media.py
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
from flask import request, send_file
|
||||||
|
from web import app
|
||||||
|
from db import Track
|
||||||
|
import os.path, uuid
|
||||||
|
|
||||||
|
@app.route('/rest/stream.view')
|
||||||
|
def stream_media():
|
||||||
|
id, maxBitRate, format, timeOffset, size, estimateContentLength = map(request.args.get, [ 'id', 'maxBitRate', 'format', 'timeOffset', 'size', 'estimateContentLength' ])
|
||||||
|
if not id:
|
||||||
|
return request.formatter({
|
||||||
|
'error': {
|
||||||
|
'code': 10,
|
||||||
|
'message': 'Missing media id'
|
||||||
|
}
|
||||||
|
}, error = True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
tid = uuid.UUID(id)
|
||||||
|
except:
|
||||||
|
return request.formatter({
|
||||||
|
'error': {
|
||||||
|
'code': 0,
|
||||||
|
'Message': 'Invalid media id'
|
||||||
|
}
|
||||||
|
}, error = True)
|
||||||
|
|
||||||
|
track = Track.query.get(tid)
|
||||||
|
if not track:
|
||||||
|
return request.formatter({
|
||||||
|
'error': {
|
||||||
|
'code': 70,
|
||||||
|
'message': 'Media not found'
|
||||||
|
}
|
||||||
|
}, error = True), 404
|
||||||
|
|
||||||
|
if maxBitRate:
|
||||||
|
try:
|
||||||
|
maxBitRate = int(maxBitRate)
|
||||||
|
except:
|
||||||
|
return request.formatter({
|
||||||
|
'error': {
|
||||||
|
'code': 0,
|
||||||
|
'message': 'Invalid bitrate value'
|
||||||
|
}
|
||||||
|
}, error = True)
|
||||||
|
|
||||||
|
if track.bitrate > maxBitRate:
|
||||||
|
# TODO transcode
|
||||||
|
pass
|
||||||
|
|
||||||
|
if format != 'mp3':
|
||||||
|
# TODO transcode
|
||||||
|
pass
|
||||||
|
|
||||||
|
if estimateContentLength == 'true':
|
||||||
|
return send_file(track.path), 200, { 'Content-Length': os.path.getsize(track.path) }
|
||||||
|
|
||||||
|
return send_file(track.path)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user