diff --git a/picard/ui/options/plugins.py b/picard/ui/options/plugins.py index 0be20fe9c..7efc9a117 100644 --- a/picard/ui/options/plugins.py +++ b/picard/ui/options/plugins.py @@ -614,9 +614,10 @@ class PluginsOptionsPage(OptionsPage): @staticmethod def link_authors(authors): formatted_authors = [] - re_author = re.compile(r"(?P.*?)\s*<(?P.*?)>") + re_author = re.compile(r"(?P.*?)\s*<(?P.*?@.*?)>") for author in authors.split(','): - match = re_author.match(author.strip()) + author = author.strip() + match = re_author.fullmatch(author) if match: author_str = '{author}'.format( email=escape(match['email']), diff --git a/test/test_ui_options_plugins.py b/test/test_ui_options_plugins.py new file mode 100644 index 000000000..42d5e3a2a --- /dev/null +++ b/test/test_ui_options_plugins.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# Picard, the next-generation MusicBrainz tagger +# +# Copyright (C) 2022 Philipp Wolfer +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from test.picardtestcase import PicardTestCase + +from picard.ui.options.plugins import PluginsOptionsPage + + +class PluginsOptionsPageTest(PicardTestCase): + + def test_link_authors(self): + self.assertEqual( + 'Wile E. Coyote, Road <Runner>', + PluginsOptionsPage.link_authors('Wile E. Coyote , Road '), + )