Skip to content

Commit 9f240bc

Browse files
authored
Merge pull request #7 from bct/fix-content-type
Improve content type detection
2 parents b0c9373 + 48d51f2 commit 9f240bc

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

beetsplug/beetstream/songs.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from beetsplug.beetstream.utils import *
22
from beetsplug.beetstream import app
33
from flask import g, request, Response
4-
import mimetypes
54
from beets.random import random_objs
65
import xml.etree.cElementTree as ET
76

@@ -67,7 +66,7 @@ def generate():
6766
while data:
6867
yield data
6968
data = songFile.read(1024)
70-
return Response(generate(), mimetype=mimetypes.guess_type(item.path.decode('utf-8'))[0])
69+
return Response(generate(), mimetype=path_to_content_type(item.path.decode('utf-8')))
7170

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

beetsplug/beetstream/utils.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,18 @@
66
import base64
77
import mimetypes
88
import os
9+
import posixpath
910
import xml.etree.cElementTree as ET
1011
from math import ceil
1112
from xml.dom import minidom
1213

14+
EXTENSION_TO_MIME_TYPE_FALLBACK = {
15+
'.aac' : 'audio/aac',
16+
'.flac' : 'audio/flac',
17+
'.mp3' : 'audio/mpeg',
18+
'.ogg' : 'audio/ogg',
19+
}
20+
1321
def strip_accents(s):
1422
return ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
1523

@@ -140,7 +148,7 @@ def map_song(song):
140148
"genre": song["genre"],
141149
"coverArt": album_beetid_to_subid(str(song["album_id"])) or "",
142150
"size": os.path.getsize(path),
143-
"contentType": mimetypes.guess_type(path)[0],
151+
"contentType": path_to_content_type(path),
144152
"suffix": song["format"].lower(),
145153
"duration": ceil(song["length"]),
146154
"bitRate": ceil(song["bitrate"]/1000),
@@ -168,7 +176,7 @@ def map_song_xml(xml, song):
168176
xml.set("genre", song["genre"])
169177
xml.set("coverArt", album_beetid_to_subid(str(song["album_id"])) or "")
170178
xml.set("size", str(os.path.getsize(path)))
171-
xml.set("contentType", mimetypes.guess_type(path)[0])
179+
xml.set("contentType", path_to_content_type(path))
172180
xml.set("suffix", song["format"].lower())
173181
xml.set("duration", str(ceil(song["length"])))
174182
xml.set("bitRate", str(ceil(song["bitrate"]/1000)))
@@ -217,6 +225,21 @@ def song_beetid_to_subid(id):
217225
def song_subid_to_beetid(id):
218226
return id[len(SONG_ID_PREFIX):]
219227

228+
def path_to_content_type(path):
229+
result = mimetypes.guess_type(path)[0]
230+
231+
if result:
232+
return result
233+
234+
# our mimetype database didn't have information about this file extension.
235+
base, ext = posixpath.splitext(path)
236+
result = EXTENSION_TO_MIME_TYPE_FALLBACK.get(ext)
237+
238+
if result:
239+
return result
240+
241+
raise RuntimeError(f"Unable to determine content type for {path}")
242+
220243
def handleSizeAndOffset(collection, size, offset):
221244
if size is not None:
222245
if offset is not None:

0 commit comments

Comments
 (0)