Merge pull request #1183 from marcaddeo/refactor-ftintitle

Refactor ftintitle

Conflicts:
	beetsplug/ftintitle.py
This commit is contained in:
Adrian Sampson 2015-01-31 12:51:15 -08:00
commit 14ce6a557e
2 changed files with 88 additions and 19 deletions

View file

@ -46,6 +46,35 @@ def contains_feat(title):
return bool(re.search(plugins.feat_tokens(), title, flags=re.IGNORECASE))
def find_feat_part(artist, albumartist):
"""Attempt to find featured artists in the item's artist fields and
return the results. Returns None if no featured artist found.
"""
feat_part = None
# Look for the album artist in the artist field. If it's not
# present, give up.
albumartist_split = artist.split(albumartist, 1)
if len(albumartist_split) <= 1:
return feat_part
# If the last element of the split (the right-hand side of the
# album artist) is nonempty, then it probably contains the
# featured artist.
elif albumartist_split[-1] != '':
# Extract the featured artist from the right-hand side.
_, feat_part = split_on_feat(albumartist_split[-1])
# Otherwise, if there's nothing on the right-hand side, look for a
# featuring artist on the left-hand side.
else:
lhs, rhs = split_on_feat(albumartist_split[0])
if lhs:
feat_part = lhs
return feat_part
class FtInTitlePlugin(plugins.BeetsPlugin):
def __init__(self):
super(FtInTitlePlugin, self).__init__()
@ -125,27 +154,11 @@ class FtInTitlePlugin(plugins.BeetsPlugin):
_, featured = split_on_feat(artist)
if featured and albumartist != artist and albumartist:
self._log.info(displayable_path(item.path))
feat_part = None
# Look for the album artist in the artist field. If it's not
# present, give up.
albumartist_split = artist.split(albumartist, 1)
if len(albumartist_split) <= 1:
self._log.info('album artist not present in artist')
# If the last element of the split (the right-hand side of the
# album artist) is nonempty, then it probably contains the
# featured artist.
elif albumartist_split[-1] != '':
# Extract the featured artist from the right-hand side.
_, feat_part = split_on_feat(albumartist_split[-1])
# Otherwise, if there's nothing on the right-hand side, look for a
# featuring artist on the left-hand side.
else:
lhs, rhs = split_on_feat(albumartist_split[0])
if rhs:
feat_part = lhs
# Attempt to find the featured artist.
feat_part = find_feat_part(artist, albumartist)
# If we have a featuring artist, move it to the title.
if feat_part:

View file

@ -26,6 +26,62 @@ class FtInTitlePluginTest(unittest.TestCase):
"""Set up configuration"""
ftintitle.FtInTitlePlugin()
def test_find_feat_part(self):
test_cases = [
{
'artist': 'Alice ft. Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice feat Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice featuring Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice & Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice and Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice With Bob',
'album_artist': 'Alice',
'feat_part': 'Bob'
},
{
'artist': 'Alice defeat Bob',
'album_artist': 'Alice',
'feat_part': None
},
{
'artist': 'Alice & Bob',
'album_artist': 'Bob',
'feat_part': 'Alice'
},
{
'artist': 'Alice ft. Bob',
'album_artist': 'Bob',
'feat_part': 'Alice'
},
]
for test_case in test_cases:
feat_part = ftintitle.find_feat_part(
test_case['artist'],
test_case['album_artist']
)
self.assertEqual(feat_part, test_case['feat_part'])
def test_split_on_feat(self):
parts = ftintitle.split_on_feat('Alice ft. Bob')
self.assertEqual(parts, ('Alice', 'Bob'))