diff --git a/beetsplug/web/__init__.py b/beetsplug/web/__init__.py index efbc3a99d..3cf43ed56 100644 --- a/beetsplug/web/__init__.py +++ b/beetsplug/web/__init__.py @@ -24,6 +24,7 @@ import flask from flask import g from werkzeug.routing import BaseConverter, PathConverter import os +from unidecode import unidecode import json import base64 @@ -225,10 +226,24 @@ def item_file(item_id): else: item_path = util.py3_path(item.path) + try: + unicode_item_path = util.text_string(item.path) + except (UnicodeDecodeError, UnicodeEncodeError): + unicode_item_path = util.displayable_path(item.path) + + base_filename = os.path.basename(unicode_item_path) + try: + # Imitate http.server behaviour + base_filename.encode("latin-1", "strict") + except UnicodeEncodeError: + safe_filename = unidecode(base_filename) + else: + safe_filename = base_filename + response = flask.send_file( item_path, as_attachment=True, - attachment_filename=os.path.basename(util.py3_path(item.path)), + attachment_filename=safe_filename ) response.headers['Content-Length'] = os.path.getsize(item_path) return response diff --git a/docs/changelog.rst b/docs/changelog.rst index 26de4dfaa..2ae9ef074 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -75,6 +75,10 @@ Fixes: album art would not work and throw an exception. It now works as expected. Additionally, the server will now return a 404 response when the album id is unknown, instead of a 500 response and a thrown exception. :bug:`2823` +* :doc:`/plugins/web`: In a python 3 enviroment, the server would throw an + exception if non latin-1 characters where in the File name. + It now checks if non latin-1 characters are in the filename and changes + them to ascii-characters in that case :bug:`2815` For developers: