Skip to content

Commit 46e7dd8

Browse files
authored
Merge pull request #9 from bct/stream-maxBitrate
Transcode the stream if ffmpeg-python is available
2 parents 6ba0157 + 8146708 commit 46e7dd8

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

beetsplug/beetstream/songs.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from beetsplug.beetstream.utils import *
2-
from beetsplug.beetstream import app
2+
from beetsplug.beetstream import app, stream
33
from flask import g, request, Response
44
from beets.random import random_objs
55
import xml.etree.cElementTree as ET
@@ -47,26 +47,26 @@ def songs_by_genre():
4747
@app.route('/rest/stream', methods=["GET", "POST"])
4848
@app.route('/rest/stream.view', methods=["GET", "POST"])
4949
def stream_song():
50-
maxBitrate = int(request.values.get('maxBitRate') or 0) # TODO
51-
format = request.values.get('format') #TODO
52-
return stream(maxBitrate)
50+
maxBitrate = int(request.values.get('maxBitRate') or 0)
51+
format = request.values.get('format')
52+
53+
id = int(song_subid_to_beetid(request.values.get('id')))
54+
item = g.lib.get_item(id)
55+
56+
itemPath = item.path.decode('utf-8')
57+
58+
if format == 'raw' or maxBitrate <= 0 or item.bitrate <= maxBitrate * 1000:
59+
return stream.send_raw_file(itemPath)
60+
else:
61+
return stream.try_to_transcode(itemPath, maxBitrate)
5362

5463
@app.route('/rest/download', methods=["GET", "POST"])
5564
@app.route('/rest/download.view', methods=["GET", "POST"])
5665
def download_song():
57-
return stream(0)
58-
59-
def stream(maxBitrate):
6066
id = int(song_subid_to_beetid(request.values.get('id')))
6167
item = g.lib.get_item(id)
6268

63-
def generate():
64-
with open(item.path, "rb") as songFile:
65-
data = songFile.read(1024)
66-
while data:
67-
yield data
68-
data = songFile.read(1024)
69-
return Response(generate(), mimetype=path_to_content_type(item.path.decode('utf-8')))
69+
return stream.send_raw_file(item.path.decode('utf-8'))
7070

7171
@app.route('/rest/getRandomSongs', methods=["GET", "POST"])
7272
@app.route('/rest/getRandomSongs.view', methods=["GET", "POST"])

beetsplug/beetstream/stream.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from beetsplug.beetstream.utils import path_to_content_type
2+
from flask import send_file, Response
3+
4+
import importlib
5+
have_ffmpeg = importlib.util.find_spec("ffmpeg") is not None
6+
7+
if have_ffmpeg:
8+
import ffmpeg
9+
10+
def send_raw_file(filePath):
11+
return send_file(filePath, mimetype=path_to_content_type(filePath))
12+
13+
def transcode_and_stream(filePath, maxBitrate):
14+
if not have_ffmpeg:
15+
raise RuntimeError("Can't transcode, ffmpeg-python is not available")
16+
17+
outputStream = (
18+
ffmpeg
19+
.input(filePath)
20+
.output('pipe:', format="mp3", audio_bitrate=maxBitrate * 1000)
21+
.run_async(pipe_stdout=True, quiet=True)
22+
)
23+
24+
return Response(outputStream.stdout, mimetype='audio/mpeg')
25+
26+
def try_to_transcode(filePath, maxBitrate):
27+
if have_ffmpeg:
28+
return transcode_and_stream(filePath, maxBitrate)
29+
else:
30+
return send_raw_file(filePath)

0 commit comments

Comments
 (0)