From c51ecd46e3b7b97ea87d88ed6c041683cbc14eda Mon Sep 17 00:00:00 2001 From: dosoe Date: Fri, 28 Apr 2017 12:10:02 +0200 Subject: [PATCH] add composer_sort tag# --- beets/autotag/__init__.py | 6 +++++ beets/autotag/hooks.py | 6 +++-- beets/autotag/mb.py | 4 ++++ beets/library.py | 1 + beets/mediafile.py | 16 +++++++++++++ test/_common.py | 1 + test/test_mediafile.py | 48 ++++++++++++++++++++------------------- 7 files changed, 57 insertions(+), 25 deletions(-) diff --git a/beets/autotag/__init__.py b/beets/autotag/__init__.py index 822bb60ef..a820535cb 100644 --- a/beets/autotag/__init__.py +++ b/beets/autotag/__init__.py @@ -49,8 +49,12 @@ def apply_item_metadata(item, track_info): item.lyricist = track_info.lyricist if track_info.composer is not None: item.composer = track_info.composer + if track_info.composer_sort is not None: + item.composer_sort = track_info.composer_sort if track_info.arranger is not None: item.arranger = track_info.arranger + + # At the moment, the other metadata is left intact (including album # and track number). Perhaps these should be emptied? @@ -155,6 +159,8 @@ def apply_metadata(album_info, mapping): item.lyricist = track_info.lyricist if track_info.composer is not None: item.composer = track_info.composer + if track_info.composer_sort is not None: + item.composer_sort = track_info.composer_sort if track_info.arranger is not None: item.arranger = track_info.arranger diff --git a/beets/autotag/hooks.py b/beets/autotag/hooks.py index 3c403fcf4..0c3f78ad3 100644 --- a/beets/autotag/hooks.py +++ b/beets/autotag/hooks.py @@ -144,6 +144,7 @@ class TrackInfo(object): - ``data_url``: The data source release URL. - ``lyricist``: individual track lyricist name - ``composer``: individual track composer name + - ``composer_sort``: individual track composer sort name - ``arranger`: individual track arranger name - ``track_alt``: alternative track number (tape, vinyl, etc.) @@ -155,8 +156,8 @@ class TrackInfo(object): length=None, index=None, medium=None, medium_index=None, medium_total=None, artist_sort=None, disctitle=None, artist_credit=None, data_source=None, data_url=None, - media=None, lyricist=None, composer=None, arranger=None, - track_alt=None): + media=None, lyricist=None, composer=None, composer_sort=None, + arranger=None, track_alt=None): self.title = title self.track_id = track_id self.artist = artist @@ -174,6 +175,7 @@ class TrackInfo(object): self.data_url = data_url self.lyricist = lyricist self.composer = composer + self.composer_sort = composer_sort self.arranger = arranger self.track_alt = track_alt diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 21dd8a715..e0c217513 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -207,6 +207,7 @@ def track_info(recording, index=None, medium=None, medium_index=None, lyricist = [] composer = [] + composer_sort = [] for work_relation in recording.get('work-relation-list', ()): if work_relation['type'] != 'performance': continue @@ -218,12 +219,15 @@ def track_info(recording, index=None, medium=None, medium_index=None, lyricist.append(artist_relation['artist']['name']) elif type == 'composer': composer.append(artist_relation['artist']['name']) + composer_sort.append(artist_relation['artist']['sort-name']) if lyricist: info.lyricist = u', '.join(lyricist) if composer: info.composer = u', '.join(composer) + info.composer_sort = u', '.join(composer_sort) arranger = [] + arranger_sort = [] for artist_relation in recording.get('artist-relation-list', ()): if 'type' in artist_relation: type = artist_relation['type'] diff --git a/beets/library.py b/beets/library.py index b263ecd64..094a85d6b 100644 --- a/beets/library.py +++ b/beets/library.py @@ -417,6 +417,7 @@ class Item(LibModel): 'genre': types.STRING, 'lyricist': types.STRING, 'composer': types.STRING, + 'composer_sort': types.STRING, 'arranger': types.STRING, 'grouping': types.STRING, 'year': types.PaddedInt(4), diff --git a/beets/mediafile.py b/beets/mediafile.py index 13f1b2dfb..fd94587a8 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -1632,12 +1632,28 @@ class MediaFile(object): StorageStyle('LYRICIST'), ASFStorageStyle('WM/Writer'), ) + composer = MediaField( MP3StorageStyle('TCOM'), MP4StorageStyle('\xa9wrt'), StorageStyle('COMPOSER'), ASFStorageStyle('WM/Composer'), ) + + composer_sort = MediaField( + MP3StorageStyle('TSOC'), + MP4StorageStyle('soco'), + StorageStyle('COMPOSERSORT'), + ASFStorageStyle('WM/Composersort'), + ) + + arranger = MediaField( + MP3PeopleStorageStyle('TIPL', involvement='arranger'), + MP4StorageStyle('----:com.apple.iTunes:Arranger'), + StorageStyle('ARRANGER'), + ASFStorageStyle('beets/Arranger'), + ) + arranger = MediaField( MP3PeopleStorageStyle('TIPL', involvement='arranger'), MP4StorageStyle('----:com.apple.iTunes:Arranger'), diff --git a/test/_common.py b/test/_common.py index f3213ec31..221903f68 100644 --- a/test/_common.py +++ b/test/_common.py @@ -68,6 +68,7 @@ def item(lib=None): genre=u'the genre', lyricist=u'the lyricist', composer=u'the composer', + composer_sort=u'the sortname of the composer', arranger=u'the arranger', grouping=u'the grouping', year=1, diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 63df38b8e..f11e060df 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -318,29 +318,30 @@ class ReadWriteTestBase(ArtTestMixin, GenreListTestMixin, """ full_initial_tags = { - 'title': u'full', - 'artist': u'the artist', - 'album': u'the album', - 'genre': u'the genre', - 'composer': u'the composer', - 'grouping': u'the grouping', - 'year': 2001, - 'month': None, - 'day': None, - 'date': datetime.date(2001, 1, 1), - 'track': 2, - 'tracktotal': 3, - 'disc': 4, - 'disctotal': 5, - 'lyrics': u'the lyrics', - 'comments': u'the comments', - 'bpm': 6, - 'comp': True, - 'mb_trackid': '8b882575-08a5-4452-a7a7-cbb8a1531f9e', - 'mb_albumid': '9e873859-8aa4-4790-b985-5a953e8ef628', - 'mb_artistid': '7cf0ea9d-86b9-4dad-ba9e-2355a64899ea', - 'art': None, - 'label': u'the label', + 'title': u'full', + 'artist': u'the artist', + 'album': u'the album', + 'genre': u'the genre', + 'composer': u'the composer', + 'composer_sort' :u'the sortname of the composer', + 'grouping': u'the grouping', + 'year': 2001, + 'month': None, + 'day': None, + 'date': datetime.date(2001, 1, 1), + 'track': 2, + 'tracktotal': 3, + 'disc': 4, + 'disctotal': 5, + 'lyrics': u'the lyrics', + 'comments': u'the comments', + 'bpm': 6, + 'comp': True, + 'mb_trackid': '8b882575-08a5-4452-a7a7-cbb8a1531f9e', + 'mb_albumid': '9e873859-8aa4-4790-b985-5a953e8ef628', + 'mb_artistid': '7cf0ea9d-86b9-4dad-ba9e-2355a64899ea', + 'art': None, + 'label': u'the label', } tag_fields = [ @@ -350,6 +351,7 @@ class ReadWriteTestBase(ArtTestMixin, GenreListTestMixin, 'genre', 'lyricist', 'composer', + 'composer_sort', 'arranger', 'grouping', 'year',