diff --git a/beets/util/confit.py b/beets/util/confit.py index e5e48ec4a..c9051de53 100644 --- a/beets/util/confit.py +++ b/beets/util/confit.py @@ -1077,16 +1077,21 @@ class StrSeq(Template): return value.split() else: return [value] - else: - try: - value = list(value) - except TypeError: - self.fail('must be a whitespace-separated string or a list', - view, True) - if all(isinstance(x, BASESTRING) for x in value): - return value + + try: + value = list(value) + except TypeError: + self.fail('must be a whitespace-separated string or a list', + view, True) + + def convert(x): + if isinstance(x, unicode): + return x + elif isinstance(x, BASESTRING): + return x.decode('utf8', 'ignore') else: self.fail('must be a list of strings', view, True) + return map(convert, value) class Filename(Template): diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index 632982edc..1474a7b09 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -234,6 +234,7 @@ def art_for_album(album, paths, maxwidth=None, local_only=False): # Local art. cover_names = config['fetchart']['cover_names'].as_str_seq() + cover_names = map(util.bytestring_path, cover_names) cautious = config['fetchart']['cautious'].get(bool) if paths: for path in paths: diff --git a/test/helper.py b/test/helper.py index cf2a67ad0..0688708fd 100644 --- a/test/helper.py +++ b/test/helper.py @@ -241,17 +241,27 @@ class TestHelper(object): includes a counter to make sure we do not create items with the same attributes. """ + item_count = self._get_item_count() values = { - 'title': u't\u00eftle {0}'.format(self._get_item_count()), + 'title': u't\u00eftle {0}', 'artist': u'the \u00e4rtist', 'album': u'the \u00e4lbum', + 'track': item_count, + 'path': 'audio.mp3', } values.update(values_) + values['title'] = values['title'].format(item_count) item = Item(**values) - if hasattr(self, 'lib'): - item.add(self.lib) + item.add(self.lib) + if 'path' not in values_: + item['path'] = item.destination() + item.store() return item + def add_album(self, **values): + item = self.add_item(**values) + return self.lib.add_album([item]) + def add_item_fixtures(self, ext='mp3', count=1): """Add a number of items with files to the database. """ diff --git a/test/test_fetchart.py b/test/test_fetchart.py new file mode 100644 index 000000000..5e36f9145 --- /dev/null +++ b/test/test_fetchart.py @@ -0,0 +1,49 @@ +# This file is part of beets. +# Copyright 2014, Thomas Scholtes. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. + +import os.path +from _common import unittest +from helper import TestHelper + + +class FetchartCliTest(unittest.TestCase, TestHelper): + + def setUp(self): + self.setup_beets() + self.load_plugins('fetchart') + + def tearDown(self): + self.unload_plugins() + self.teardown_beets() + + def test_set_art_from_folder(self): + self.config['fetchart']['cover_names'] = 'c\xc3\xb6ver.jpg' + self.config['art_filename'] = 'mycover' + album = self.add_album() + self.touch('c\xc3\xb6ver.jpg', dir=album.path, content='IMAGE') + + self.run_command('fetchart') + cover_path = os.path.join(album.path, 'mycover.jpg') + + album.load() + self.assertEqual(album['artpath'], cover_path) + with open(cover_path, 'r') as f: + self.assertEqual(f.read(), 'IMAGE') + + +def suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + +if __name__ == '__main__': + unittest.main(defaultTest='suite')