Merge pull request #894 from geigerzaehler/asciify

add asciify_paths configuration option
This commit is contained in:
geigerzaehler 2014-08-06 21:20:23 +02:00
commit e6fdf4c0e5
6 changed files with 47 additions and 1 deletions

View file

@ -32,6 +32,7 @@ replace:
'\s+$': ''
'^\s+': ''
path_sep_replace: _
asciify_paths: false
art_filename: cover
max_filename_length: 0

View file

@ -571,8 +571,13 @@ class Item(LibModel):
subpath = unicodedata.normalize('NFD', subpath)
else:
subpath = unicodedata.normalize('NFC', subpath)
if beets.config['asciify_paths']:
subpath = unidecode(subpath)
# Truncate components and remove forbidden characters.
subpath = util.sanitize_path(subpath, self._db.replacements)
# Encode for the filesystem.
if not fragment:
subpath = bytestring_path(subpath)
@ -830,6 +835,8 @@ class Album(LibModel):
filename_tmpl = Template(beets.config['art_filename'].get(unicode))
subpath = self.evaluate_template(filename_tmpl, True)
if beets.config['asciify_paths']:
subpath = unidecode(subpath)
subpath = util.sanitize_path(subpath,
replacements=self._db.replacements)
subpath = bytestring_path(subpath)

View file

@ -69,6 +69,9 @@ Little improvements and fixes:
fingerprinting on import. Thanks to ddettrittus.
* :doc:`/plugins/convert`: Add ``--format`` option to select the
transoding command from the command-line.
* Add :ref:`asciify-paths` configuration option to replace non-ASCII
characters in paths.
1.3.6 (May 10, 2014)

View file

@ -119,6 +119,28 @@ compatibility with Windows-influenced network filesystems like Samba).
Trailing dots and trailing whitespace, which can cause problems on Windows
clients, are also removed.
Note that paths might contain special characters such as typographical
quotes (``“”``). With the configuration above, those will not be
replaced as they dont match the typewriter quote (``"``). You either
have to add them to the replacement list or use the
:ref:`asciify-paths` configuration option below.
.. _asciify-paths:
asciify_paths
~~~~~~~~~~~~~
Works like a specialized ``replace`` configuration. If set to ``yes``,
all non-ASCII characters in paths created by beets are converted to
their ASCII equivalents. For example, if your path template for
singletons is ``singletons/$title`` and the title of a track is "Café",
then the track will be saved as ``singletons/Cafe.mp3``. The changes
take place before applying the ``replace`` configuration. Uses the
mapping provided by the `unidecode module`_. Defaults to ``no``.
.. _unidecode module: http://pypi.python.org/pypi/Unidecode
.. _art-filename:
art_filename

View file

@ -69,7 +69,8 @@ These functions are built in to beets:
nothing if ``falsetext`` is left off).
* ``%asciify{text}``: Convert non-ASCII characters to their ASCII equivalents.
For example, "café" becomes "cafe". Uses the mapping provided by the
`unidecode module`_.
`unidecode module`_. See the :ref:`asciify-paths` configuration
option.
* ``%aunique{identifiers,disambiguators}``: Provides a unique string to
disambiguate similar albums in the database. See :ref:`aunique`, below.
* ``%time{date_time,format}``: Return the date and time in any format accepted

View file

@ -136,6 +136,10 @@ class DestinationTest(_common.TestCase):
super(DestinationTest, self).tearDown()
self.lib._connection().close()
# Reset config if it was changed in test cases
config.clear()
config.read(user=False, defaults=True)
def test_directory_works_with_trailing_slash(self):
self.lib.directory = 'one/'
self.lib.path_formats = [('default', 'two')]
@ -447,6 +451,14 @@ class DestinationTest(_common.TestCase):
dest = self.i.destination(platform='linux2', fragment=True)
self.assertEqual(dest, u'foo.caf\xe9')
def test_asciify_and_replace(self):
config['asciify_paths'] = True
self.lib.replacements = [(re.compile(u'"'), u'q')]
self.lib.directory = 'lib'
self.lib.path_formats = [('default', '$title')]
self.i.title = u'\u201c\u00f6\u2014\u00cf\u201d'
self.assertEqual(self.i.destination(), np('lib/qo--Iq'))
class ItemFormattedMappingTest(_common.LibTestCase):
def test_formatted_item_value(self):