From 1b694e569ea899ac5b970ae9c296ea9977322eef Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sat, 8 Nov 2014 23:20:44 +0100 Subject: [PATCH 01/11] fetchart: add 'sources' option Fasten cover search by enabling engines selection and prioritisation. --- beetsplug/fetchart.py | 95 ++++++++++++++++++++++----------------- docs/plugins/fetchart.rst | 2 + test/test_fetchart.py | 13 ++++++ 3 files changed, 70 insertions(+), 40 deletions(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index aa752274f..3b7a17e64 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -79,17 +79,14 @@ CAA_URL = 'http://coverartarchive.org/release/{mbid}/front-500.jpg' CAA_GROUP_URL = 'http://coverartarchive.org/release-group/{mbid}/front-500.jpg' -def caa_art(release_id): - """Return the Cover Art Archive URL given a MusicBrainz release ID. +def caa_art(album): + """Return the Cover Art Archive and Cover Art Archive release group URLs + using album MusicBrainz release ID and release group ID. """ - return CAA_URL.format(mbid=release_id) - - -def caa_group_art(release_group_id): - """Return the Cover Art Archive release group URL given a MusicBrainz - release group ID. - """ - return CAA_GROUP_URL.format(mbid=release_group_id) + if album.mb_albumid: + yield CAA_URL.format(mbid=album.mb_albumid) + if album.release_group_id: + yield CAA_GROUP_URL.format(mbid=album.release_group_id) # Art from Amazon. @@ -98,10 +95,12 @@ AMAZON_URL = 'http://images.amazon.com/images/P/%s.%02i.LZZZZZZZ.jpg' AMAZON_INDICES = (1, 2) -def art_for_asin(asin): - """Generate URLs for an Amazon ID (ASIN) string.""" - for index in AMAZON_INDICES: - yield AMAZON_URL % (asin, index) +def art_for_asin(album): + """Generate URLs using Amazon ID (ASIN) string. + """ + if album.asin: + for index in AMAZON_INDICES: + yield AMAZON_URL % (album.asin, index) # AlbumArt.org scraper. @@ -110,11 +109,14 @@ AAO_URL = 'http://www.albumart.org/index_detail.php' AAO_PAT = r'href\s*=\s*"([^>"]*)"[^>]*title\s*=\s*"View larger image"' -def aao_art(asin): - """Return art URL from AlbumArt.org given an ASIN.""" +def aao_art(album): + """Return art URL from AlbumArt.org using album ASIN. + """ + if not album.asin: + return # Get the page from albumart.org. try: - resp = requests_session.get(AAO_URL, params={'asin': asin}) + resp = requests_session.get(AAO_URL, params={'asin': album.asin}) log.debug(u'fetchart: scraped art URL: {0}'.format(resp.url)) except requests.RequestException: log.debug(u'fetchart: error scraping art page') @@ -188,7 +190,8 @@ def filename_priority(filename, cover_names): def art_in_path(path, cover_names, cautious): - """Look for album art files in a specified directory.""" + """Look for album art files in a specified directory. + """ if not os.path.isdir(path): return @@ -219,6 +222,14 @@ def art_in_path(path, cover_names, cautious): # Try each source in turn. +ART_FUNCS = { + 'coverart': caa_art, + 'itunes': itunes_art, + 'albumart': aao_art, + 'amazon': art_for_asin, + 'google': google_art, +} + def _source_urls(album): """Generate possible source URLs for an album's art. The URLs are @@ -227,28 +238,11 @@ def _source_urls(album): through this sequence early to avoid the cost of scraping when not necessary. """ - # Cover Art Archive. - if album.mb_albumid: - yield caa_art(album.mb_albumid) - if album.mb_releasegroupid: - yield caa_group_art(album.mb_releasegroupid) - - # iTunes Store. - if HAVE_ITUNES: - yield itunes_art(album) - - # Amazon and AlbumArt.org. - if album.asin: - for url in art_for_asin(album.asin): - yield url - url = aao_art(album.asin) - if url: - yield url - - if config['fetchart']['google_search']: - url = google_art(album) - if url: - yield url + for s in config['fetchart']['sources']: + fun = ART_FUNCS[s] + for url in fun(album): + if url: + yield url def art_for_album(album, paths, maxwidth=None, local_only=False): @@ -285,6 +279,22 @@ def art_for_album(album, paths, maxwidth=None, local_only=False): out = ArtResizer.shared.resize(maxwidth, out) return out +SOURCES_ALL = ['coverart', 'itunes', 'albumart', 'amazon', 'google'] + + +def sanitize_sources(sources): + """Remove unknown or duplicate sources while keeping original order. + """ + seen = set() + others_sources = set(SOURCES_ALL) - set(sources) + res = [] + for s in sources: + if s in SOURCES_ALL + ['*']: + if not (s in seen or seen.add(s)): + res.extend(list(others_sources) if s == '*' else [s]) + if not HAVE_ITUNES and 'itunes' in res: + res.remove('itunes') + return res # PLUGIN LOGIC ############################################################### @@ -325,6 +335,7 @@ class FetchArtPlugin(BeetsPlugin): 'cautious': False, 'google_search': False, 'cover_names': ['cover', 'front', 'art', 'album', 'folder'], + 'sources': SOURCES_ALL, }) # Holds paths to downloaded images between fetching them and @@ -337,6 +348,10 @@ class FetchArtPlugin(BeetsPlugin): self.import_stages = [self.fetch_art] self.register_listener('import_task_files', self.assign_art) + # Remove unknown and duplicate sources + self.config['sources'] = sanitize_sources( + self.config['sources'].as_str_seq()) + # Asynchronous; after music is added to the library. def fetch_art(self, session, task): """Find art for the album being imported.""" diff --git a/docs/plugins/fetchart.rst b/docs/plugins/fetchart.rst index e1acde64f..1f608d4be 100644 --- a/docs/plugins/fetchart.rst +++ b/docs/plugins/fetchart.rst @@ -45,6 +45,8 @@ file. The available options are: as fallback. Default: ``no``; remote (Web) art sources are only queried if no local art is found in the filesystem. +- **sources**: List of websites sources to query when searching arts. +Default : ['coverart', 'itunes', 'albumart', 'amazon', 'google'] ie all sources Here's an example that makes plugin select only images that contain *front* or *back* keywords in their filenames:: diff --git a/test/test_fetchart.py b/test/test_fetchart.py index 5e36f9145..399f43df5 100644 --- a/test/test_fetchart.py +++ b/test/test_fetchart.py @@ -12,6 +12,8 @@ # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. +from beetsplug import fetchart + import os.path from _common import unittest from helper import TestHelper @@ -41,6 +43,17 @@ class FetchartCliTest(unittest.TestCase, TestHelper): with open(cover_path, 'r') as f: self.assertEqual(f.read(), 'IMAGE') + def test_sanitize_sources(self): + self.assertEqual(fetchart.sanitize_sources(['google', 'unknown']), + ['google']) + self.assertEqual(fetchart.sanitize_sources(['google', 'google']), + ['google']) + res = fetchart.sanitize_sources(['google', '*', 'amazon']) + # don't check strict egality on lengths as itunes source may be removed + # by plugin + self.assertTrue(len(res) >= len(fetchart.SOURCES_ALL)-1 and + res[0] == 'google' and res[-1] == 'amazon') + def suite(): return unittest.TestLoader().loadTestsFromName(__name__) From 41d0f4d6740759d8e24495f0578575c795ac15a4 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sat, 8 Nov 2014 23:28:10 +0100 Subject: [PATCH 02/11] remove comment --- beetsplug/fetchart.py | 1 - 1 file changed, 1 deletion(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index 3b7a17e64..b001c7b9b 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -348,7 +348,6 @@ class FetchArtPlugin(BeetsPlugin): self.import_stages = [self.fetch_art] self.register_listener('import_task_files', self.assign_art) - # Remove unknown and duplicate sources self.config['sources'] = sanitize_sources( self.config['sources'].as_str_seq()) From 4d9ce9442618e7feb7e4610ad9f3463a8e9aca65 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sun, 9 Nov 2014 20:40:45 +0100 Subject: [PATCH 03/11] fetchart: import itunes only if necessary --- beetsplug/fetchart.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index b001c7b9b..0f883f858 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -29,11 +29,6 @@ from beets import ui from beets import util from beets import config -try: - import itunes - HAVE_ITUNES = True -except ImportError: - HAVE_ITUNES = False IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg'] CONTENT_TYPES = ('image/jpeg',) @@ -292,8 +287,11 @@ def sanitize_sources(sources): if s in SOURCES_ALL + ['*']: if not (s in seen or seen.add(s)): res.extend(list(others_sources) if s == '*' else [s]) - if not HAVE_ITUNES and 'itunes' in res: - res.remove('itunes') + if 'itunes' in res: + try: + import itunes + except ImportError: + res.remove('itunes') return res # PLUGIN LOGIC ############################################################### From 6170c3a179c8395a0caab431c1fabb2f6e70cdaa Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sun, 9 Nov 2014 20:41:21 +0100 Subject: [PATCH 04/11] fetchart: make test_art.py tests pass --- beetsplug/fetchart.py | 29 ++++++++++++++++------------- test/test_art.py | 11 +++++++---- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index 0f883f858..311af4031 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -135,6 +135,8 @@ def google_art(album): """Return art URL from google.org given an album title and interpreter. """ + if not (album.albumartist and album.album): + return search_string = (album.albumartist + ',' + album.album).encode('utf-8') response = requests_session.get(GOOGLE_URL, params={ 'v': '1.0', @@ -217,26 +219,28 @@ def art_in_path(path, cover_names, cautious): # Try each source in turn. +SOURCES_ALL = [u'coverart', u'itunes', u'amazon', u'albumart', u'google'] + ART_FUNCS = { - 'coverart': caa_art, - 'itunes': itunes_art, - 'albumart': aao_art, - 'amazon': art_for_asin, - 'google': google_art, + u'coverart': caa_art, + u'itunes': itunes_art, + u'albumart': aao_art, + u'amazon': art_for_asin, + u'google': google_art, } -def _source_urls(album): +def _source_urls(album, sources=SOURCES_ALL): """Generate possible source URLs for an album's art. The URLs are not guaranteed to work so they each need to be attempted in turn. This allows the main `art_for_album` function to abort iteration through this sequence early to avoid the cost of scraping when not necessary. """ - for s in config['fetchart']['sources']: - fun = ART_FUNCS[s] - for url in fun(album): - if url: + for s in sources: + urls = ART_FUNCS[s](album) + if urls: + for url in urls: yield url @@ -262,7 +266,8 @@ def art_for_album(album, paths, maxwidth=None, local_only=False): # Web art sources. remote_priority = config['fetchart']['remote_priority'].get(bool) if not local_only and (remote_priority or not out): - for url in _source_urls(album): + for url in _source_urls(album, + config['fetchart']['sources'].as_str_seq()): if maxwidth: url = ArtResizer.shared.proxy_url(maxwidth, url) candidate = _fetch_image(url) @@ -274,8 +279,6 @@ def art_for_album(album, paths, maxwidth=None, local_only=False): out = ArtResizer.shared.resize(maxwidth, out) return out -SOURCES_ALL = ['coverart', 'itunes', 'albumart', 'amazon', 'google'] - def sanitize_sources(sources): """Remove unknown or duplicate sources while keeping original order. diff --git a/test/test_art.py b/test/test_art.py index 30ebb6086..62226de8d 100644 --- a/test/test_art.py +++ b/test/test_art.py @@ -104,7 +104,7 @@ class CombinedTest(_common.TestCase): os.mkdir(self.dpath) # Set up configuration. - fetchart.FetchArtPlugin() + self.plugin = fetchart.FetchArtPlugin() @responses.activate def run(self, *args, **kwargs): @@ -161,7 +161,8 @@ class CombinedTest(_common.TestCase): def test_local_only_does_not_access_network(self): album = _common.Bag(mb_albumid=self.MBID, asin=self.ASIN) - artpath = fetchart.art_for_album(album, [self.dpath], local_only=True) + artpath = fetchart.art_for_album(album, [self.dpath], + local_only=True) self.assertEqual(artpath, None) self.assertEqual(len(responses.calls), 0) @@ -195,12 +196,14 @@ class AAOTest(_common.TestCase): alt="View larger image" width="17" height="15" border="0"/> """ self.mock_response(self.AAO_URL, body) - res = fetchart.aao_art(self.ASIN) + album = _common.Bag(asin=self.ASIN) + res = fetchart.aao_art(album) self.assertEqual(res, 'TARGET_URL') def test_aao_scraper_returns_none_when_no_image_present(self): self.mock_response(self.AAO_URL, 'blah blah') - res = fetchart.aao_art(self.ASIN) + album = _common.Bag(asin=self.ASIN) + res = fetchart.aao_art(album) self.assertEqual(res, None) From 3443e30bc9b9ee23feca8ef280c13e64c7ba00c6 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sun, 9 Nov 2014 20:42:28 +0100 Subject: [PATCH 05/11] fetchart: better document 'sources' option --- docs/plugins/fetchart.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/plugins/fetchart.rst b/docs/plugins/fetchart.rst index 1f608d4be..6726a0f2c 100644 --- a/docs/plugins/fetchart.rst +++ b/docs/plugins/fetchart.rst @@ -45,15 +45,18 @@ file. The available options are: as fallback. Default: ``no``; remote (Web) art sources are only queried if no local art is found in the filesystem. -- **sources**: List of websites sources to query when searching arts. +- **sources**: List of websites sources to query when searching arts. Star char + `*` expands to all available sources. Default : ['coverart', 'itunes', 'albumart', 'amazon', 'google'] ie all sources Here's an example that makes plugin select only images that contain *front* or -*back* keywords in their filenames:: +*back* keywords in their filenames and prioritize 'itunes' over others +sources:: fetchart: cautious: true cover_names: front back + sources: ['itunes', '*'] Manually Fetching Album Art @@ -94,7 +97,7 @@ Album Art Sources Currently, this plugin searches for art in the local filesystem as well as on the Cover Art Archive, the iTunes Store (optionally), Amazon, AlbumArt.org, -and Google Image Search (optionally), in that order. +and Google Image Search, in that order. When looking for local album art, beets checks for image files located in the same folder as the music files you're importing. Beets prefers to use an image From d1115ce1ec5c207d21127f7fb71976801af9001f Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sun, 9 Nov 2014 20:47:26 +0100 Subject: [PATCH 06/11] fetchart docs: fix indent --- docs/plugins/fetchart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/fetchart.rst b/docs/plugins/fetchart.rst index 6726a0f2c..919dbb5bc 100644 --- a/docs/plugins/fetchart.rst +++ b/docs/plugins/fetchart.rst @@ -47,7 +47,7 @@ file. The available options are: found in the filesystem. - **sources**: List of websites sources to query when searching arts. Star char `*` expands to all available sources. -Default : ['coverart', 'itunes', 'albumart', 'amazon', 'google'] ie all sources + Default : ['coverart', 'itunes', 'albumart', 'amazon', 'google'] ie all sources Here's an example that makes plugin select only images that contain *front* or *back* keywords in their filenames and prioritize 'itunes' over others From 09bea52a4161ce79438e70bb1f66c1268d324d7d Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Sun, 9 Nov 2014 20:55:53 +0100 Subject: [PATCH 07/11] fetchart: fix flake8 --- beetsplug/fetchart.py | 12 +++++++----- test/test_fetchart.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index 311af4031..fb4eac5de 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -29,6 +29,11 @@ from beets import ui from beets import util from beets import config +try: + import itunes + HAVE_ITUNES = True +except ImportError: + HAVE_ITUNES = False IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg'] CONTENT_TYPES = ('image/jpeg',) @@ -290,11 +295,8 @@ def sanitize_sources(sources): if s in SOURCES_ALL + ['*']: if not (s in seen or seen.add(s)): res.extend(list(others_sources) if s == '*' else [s]) - if 'itunes' in res: - try: - import itunes - except ImportError: - res.remove('itunes') + if not HAVE_ITUNES and 'itunes' in res: + res.remove('itunes') return res # PLUGIN LOGIC ############################################################### diff --git a/test/test_fetchart.py b/test/test_fetchart.py index 399f43df5..8b77914d6 100644 --- a/test/test_fetchart.py +++ b/test/test_fetchart.py @@ -51,7 +51,7 @@ class FetchartCliTest(unittest.TestCase, TestHelper): res = fetchart.sanitize_sources(['google', '*', 'amazon']) # don't check strict egality on lengths as itunes source may be removed # by plugin - self.assertTrue(len(res) >= len(fetchart.SOURCES_ALL)-1 and + self.assertTrue(len(res) >= len(fetchart.SOURCES_ALL) - 1 and res[0] == 'google' and res[-1] == 'amazon') From 5713df3d5ab7b3f1c4570ab97141a53c2748d7f8 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Mon, 10 Nov 2014 21:53:49 +0100 Subject: [PATCH 08/11] docs fetch art: json-like syntax is not mandatory --- docs/plugins/fetchart.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/plugins/fetchart.rst b/docs/plugins/fetchart.rst index 919dbb5bc..9260b13fb 100644 --- a/docs/plugins/fetchart.rst +++ b/docs/plugins/fetchart.rst @@ -35,7 +35,7 @@ file. The available options are: contain one of the keywords in ``cover_names``. Default: ``no``. - **cover_names**: Prioritize images containing words in this list. - Default: ``['cover', 'front', 'art', 'album', 'folder']``. + Default: ``cover front art album folder``. - **google_search**: Gather images from Google Image Search. Default: ``no``. - **maxwidth**: A maximum image width to downscale fetched images if they are @@ -47,7 +47,7 @@ file. The available options are: found in the filesystem. - **sources**: List of websites sources to query when searching arts. Star char `*` expands to all available sources. - Default : ['coverart', 'itunes', 'albumart', 'amazon', 'google'] ie all sources + Default : ``coverart itunes albumart amazon google`` ie all sources Here's an example that makes plugin select only images that contain *front* or *back* keywords in their filenames and prioritize 'itunes' over others @@ -56,7 +56,7 @@ sources:: fetchart: cautious: true cover_names: front back - sources: ['itunes', '*'] + sources: itunes * Manually Fetching Album Art @@ -95,9 +95,10 @@ environment variable so that ImageMagick comes first or use PIL instead. Album Art Sources ----------------- -Currently, this plugin searches for art in the local filesystem as well as on -the Cover Art Archive, the iTunes Store (optionally), Amazon, AlbumArt.org, -and Google Image Search, in that order. +By default, this plugin searches for art in the local filesystem as well as on +the Cover Art Archive, the iTunes Store, Amazon, AlbumArt.org, +and Google Image Search, in that order. You can remove sources to speed up the +process, or reorder them using the ``sources``configuration option. When looking for local album art, beets checks for image files located in the same folder as the music files you're importing. Beets prefers to use an image From ef6d3efe6d6adf4595b1b673dba37af48f1359e6 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Mon, 10 Nov 2014 22:17:34 +0100 Subject: [PATCH 09/11] fetchart: cover engines yield their results --- beetsplug/fetchart.py | 12 ++++++------ test/test_art.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/beetsplug/fetchart.py b/beetsplug/fetchart.py index fb4eac5de..18ffe7790 100644 --- a/beetsplug/fetchart.py +++ b/beetsplug/fetchart.py @@ -126,7 +126,7 @@ def aao_art(album): m = re.search(AAO_PAT, resp.text) if m: image_url = m.group(1) - return image_url + yield image_url else: log.debug(u'fetchart: no image found on page') @@ -155,7 +155,7 @@ def google_art(album): data = results['responseData'] dataInfo = data['results'] for myUrl in dataInfo: - return myUrl['unescapedUrl'] + yield myUrl['unescapedUrl'] except: log.debug(u'fetchart: error scraping art page') return @@ -172,7 +172,7 @@ def itunes_art(album): if itunes_album.get_artwork()['100']: small_url = itunes_album.get_artwork()['100'] big_url = small_url.replace('100x100', '1200x1200') - return big_url + yield big_url else: log.debug(u'fetchart: album has no artwork in iTunes Store') except IndexError: @@ -181,6 +181,7 @@ def itunes_art(album): # Art from the filesystem. + def filename_priority(filename, cover_names): """Sort order for image names. @@ -244,9 +245,8 @@ def _source_urls(album, sources=SOURCES_ALL): """ for s in sources: urls = ART_FUNCS[s](album) - if urls: - for url in urls: - yield url + for url in urls: + yield url def art_for_album(album, paths, maxwidth=None, local_only=False): diff --git a/test/test_art.py b/test/test_art.py index 62226de8d..33a7826bf 100644 --- a/test/test_art.py +++ b/test/test_art.py @@ -198,13 +198,13 @@ class AAOTest(_common.TestCase): self.mock_response(self.AAO_URL, body) album = _common.Bag(asin=self.ASIN) res = fetchart.aao_art(album) - self.assertEqual(res, 'TARGET_URL') + self.assertEqual(list(res)[0], 'TARGET_URL') - def test_aao_scraper_returns_none_when_no_image_present(self): + def test_aao_scraper_returns_no_result_when_no_image_present(self): self.mock_response(self.AAO_URL, 'blah blah') album = _common.Bag(asin=self.ASIN) res = fetchart.aao_art(album) - self.assertEqual(res, None) + self.assertEqual(list(res), []) class GoogleImageTest(_common.TestCase): From 1b0933daa99f44fadca554aa67f55ffa6d179663 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Mon, 10 Nov 2014 22:37:19 +0100 Subject: [PATCH 10/11] fetchart: fix tests to handle generators --- test/test_art.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_art.py b/test/test_art.py index 33a7826bf..22ead0c04 100644 --- a/test/test_art.py +++ b/test/test_art.py @@ -225,14 +225,14 @@ class GoogleImageTest(_common.TestCase): [{"unescapedUrl": "url_to_the_image"}]}}""" self.mock_response(self._google_url, json) result_url = fetchart.google_art(album) - self.assertEqual(result_url, 'url_to_the_image') + self.assertEqual(list(result_url)[0], 'url_to_the_image') def test_google_art_dont_finds_image(self): album = _common.Bag(albumartist="some artist", album="some album") json = """bla blup""" self.mock_response(self._google_url, json) result_url = fetchart.google_art(album) - self.assertEqual(result_url, None) + self.assertEqual(list(result_url), []) class ArtImporterTest(_common.TestCase): From a36b5ef42ec549c79ece3cdf108f39511d4b4795 Mon Sep 17 00:00:00 2001 From: Fabrice Laporte Date: Mon, 10 Nov 2014 22:47:56 +0100 Subject: [PATCH 11/11] fetchart: fix docs typo --- docs/plugins/fetchart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/fetchart.rst b/docs/plugins/fetchart.rst index 9260b13fb..936765cc1 100644 --- a/docs/plugins/fetchart.rst +++ b/docs/plugins/fetchart.rst @@ -98,7 +98,7 @@ Album Art Sources By default, this plugin searches for art in the local filesystem as well as on the Cover Art Archive, the iTunes Store, Amazon, AlbumArt.org, and Google Image Search, in that order. You can remove sources to speed up the -process, or reorder them using the ``sources``configuration option. +process, or reorder them using the ``sources`` configuration option. When looking for local album art, beets checks for image files located in the same folder as the music files you're importing. Beets prefers to use an image