Repository: beetbox/beets
Issue: Artist Aliases being used instead of Artist Name

I just did an `mbsync` and found some weird behavior: A few of my albums have had their Album Artist set to an alias. 

Specifically, Bombay Bicycle Club is now "The Canals", which is an old name that artist used almost 10 years ago.

Looking at [the XML](http://musicbrainz.org/ws/2/release/fdb5dce3-e135-4d3e-ac52-b6cb0abb2e7c?inc=artists+artist-credits+recordings+aliases), it looks like beets is picking up the value from the artist `alias-list`. I assume this isn't by design?

I've seen this happen with a few other artists, such as Moby, which ends up being written out as "DJ Moby" (an alias present in [the XML](http://musicbrainz.org/ws/2/release/679841df-599d-402f-9f89-0d0bb6e94368?inc=artists+artist-credits+recordings+aliases)), so it's not new behavior as far as I can tell.

Looking at [the code](https://github.com/sampsyo/beets/blob/master/beets/autotag/mb.py#L90), the issue seems to be in the `_preferred_alias` function:

``` python
    # Search configured locales in order.
    for locale in config['import']['languages'].as_str_seq():
        # Find matching aliases for this locale.
        matches = [a for a in aliases if a['locale'] == locale]
        # Skip to the next locale if we have no matches
        if not matches:
            continue

        # Find the aliases that have the primary flag set.
        primaries = [a for a in matches if 'primary' in a]
        # Take the primary if we have it, otherwise take the first
        # match with the correct locale.
        if primaries:
            return primaries[0]
        else:
            return matches[0]
```

Perhaps MusicBrainz used to set `primary` on the alias entries, but it doesn't seem to be present in the albums I've checked. 


Changed files:
test/test_mb.py, beets/autotag/mb.py

diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py
index c63d8fdc5..779ec4b3c 100644
--- a/beets/autotag/mb.py
+++ b/beets/autotag/mb.py
@@ -80,20 +80,13 @@ def _preferred_alias(aliases):
 
     # Search configured locales in order.
     for locale in config['import']['languages'].as_str_seq():
-        # Find matching aliases for this locale.
-        matches = [a for a in aliases if a['locale'] == locale]
+        # Find matching primary aliases for this locale.
+        matches = [a for a in aliases if a['locale'] == locale and 'primary' in a]
         # Skip to the next locale if we have no matches
         if not matches:
             continue
 
-        # Find the aliases that have the primary flag set.
-        primaries = [a for a in matches if 'primary' in a]
-        # Take the primary if we have it, otherwise take the first
-        # match with the correct locale.
-        if primaries:
-            return primaries[0]
-        else:
-            return matches[0]
+        return matches[0]
 
 def _flatten_artist_credit(credit):
     """Given a list representing an ``artist-credit`` block, flatten the
diff --git a/test/test_mb.py b/test/test_mb.py
index 590578ddb..645769225 100644
--- a/test/test_mb.py
+++ b/test/test_mb.py
@@ -366,27 +366,28 @@ class ArtistFlatteningTest(_common.TestCase):
 
     def test_alias(self):
         credit_dict = self._credit_dict()
-        self._add_alias(credit_dict, suffix='en', locale='en')
-        self._add_alias(credit_dict, suffix='en_GB', locale='en_GB')
+        self._add_alias(credit_dict, suffix='en', locale='en', primary=True)
+        self._add_alias(credit_dict, suffix='en_GB', locale='en_GB', primary=True)
         self._add_alias(credit_dict, suffix='fr', locale='fr')
         self._add_alias(credit_dict, suffix='fr_P', locale='fr', primary=True)
+        self._add_alias(credit_dict, suffix='pt_BR', locale='pt_BR')
 
         # test no alias
         config['import']['languages'] = ['']
         flat = mb._flatten_artist_credit([credit_dict])
         self.assertEqual(flat, ('NAME', 'SORT', 'CREDIT'))
 
-        # test en
+        # test en primary
         config['import']['languages'] = ['en']
         flat = mb._flatten_artist_credit([credit_dict])
         self.assertEqual(flat, ('ALIASen', 'ALIASSORTen', 'CREDIT'))
 
-        # test en_GB en
+        # test en_GB en primary
         config['import']['languages'] = ['en_GB', 'en']
         flat = mb._flatten_artist_credit([credit_dict])
         self.assertEqual(flat, ('ALIASen_GB', 'ALIASSORTen_GB', 'CREDIT'))
 
-        # test en en_GB
+        # test en en_GB primary
         config['import']['languages'] = ['en', 'en_GB']
         flat = mb._flatten_artist_credit([credit_dict])
         self.assertEqual(flat, ('ALIASen', 'ALIASSORTen', 'CREDIT'))
@@ -396,6 +397,11 @@ class ArtistFlatteningTest(_common.TestCase):
         flat = mb._flatten_artist_credit([credit_dict])
         self.assertEqual(flat, ('ALIASfr_P', 'ALIASSORTfr_P', 'CREDIT'))
 
+        # test for not matching non-primary
+        config['import']['languages'] = ['pt_BR', 'fr']
+        flat = mb._flatten_artist_credit([credit_dict])
+        self.assertEqual(flat, ('ALIASfr_P', 'ALIASSORTfr_P', 'CREDIT'))
+
 def suite():
     return unittest.TestLoader().loadTestsFromName(__name__)