mirror of
https://github.com/beetbox/beets.git
synced 2025-12-23 00:54:03 +01:00
Merge pull request #1183 from marcaddeo/refactor-ftintitle
Refactor ftintitle Conflicts: beetsplug/ftintitle.py
This commit is contained in:
commit
14ce6a557e
2 changed files with 88 additions and 19 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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'))
|
||||
|
|
|
|||
Loading…
Reference in a new issue