diff --git a/beets/autotag/__init__.py b/beets/autotag/__init__.py index 4c5f09eb4..24f2ebfc0 100644 --- a/beets/autotag/__init__.py +++ b/beets/autotag/__init__.py @@ -40,6 +40,7 @@ def apply_item_metadata(item, track_info): item.artist_credit = track_info.artist_credit item.title = track_info.title item.mb_trackid = track_info.track_id + item.mb_releasetrackid = track_info.release_track_id if track_info.artist_id: item.mb_artistid = track_info.artist_id if track_info.data_source: @@ -122,6 +123,7 @@ def apply_metadata(album_info, mapping): # MusicBrainz IDs. item.mb_trackid = track_info.track_id + item.mb_releasetrackid = track_info.release_track_id item.mb_albumid = album_info.album_id if track_info.artist_id: item.mb_artistid = track_info.artist_id diff --git a/beets/autotag/hooks.py b/beets/autotag/hooks.py index 053d050c6..cc5f37003 100644 --- a/beets/autotag/hooks.py +++ b/beets/autotag/hooks.py @@ -129,6 +129,8 @@ class TrackInfo(object): - ``title``: name of the track - ``track_id``: MusicBrainz ID; UUID fragment only + - ``release_track_id``: MusicBrainz ID respective to a track on a + particular release; UUID fragment only - ``artist``: individual track artist name - ``artist_id`` - ``length``: float: duration of the track in seconds @@ -152,7 +154,7 @@ class TrackInfo(object): may be None. The indices ``index``, ``medium``, and ``medium_index`` are all 1-based. """ - def __init__(self, title, track_id, artist=None, artist_id=None, + def __init__(self, title, track_id, release_track_id=None, artist=None, artist_id=None, 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, @@ -160,6 +162,7 @@ class TrackInfo(object): arranger=None, track_alt=None): self.title = title self.track_id = track_id + self.release_track_id = release_track_id self.artist = artist self.artist_id = artist_id self.length = length diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 9ce449a8b..049b70909 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -304,6 +304,7 @@ def album_info(release): int(track['position']), len(medium['track-list']), ) + ti.release_track_id = track['id'] ti.disctitle = disctitle ti.media = format ti.track_alt = track['number'] diff --git a/beets/library.py b/beets/library.py index 64035e642..ba57407d0 100644 --- a/beets/library.py +++ b/beets/library.py @@ -455,6 +455,7 @@ class Item(LibModel): 'mb_albumid': types.STRING, 'mb_artistid': types.STRING, 'mb_albumartistid': types.STRING, + 'mb_releasetrackid': types.STRING, 'albumtype': types.STRING, 'label': types.STRING, 'acoustid_fingerprint': types.STRING, diff --git a/beets/mediafile.py b/beets/mediafile.py index 34ad49af7..32a32fe1d 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -1865,6 +1865,12 @@ class MediaFile(object): StorageStyle('MUSICBRAINZ_TRACKID'), ASFStorageStyle('MusicBrainz/Track Id'), ) + mb_releasetrackid = MediaField( + MP3DescStorageStyle(u'MusicBrainz Release Track Id'), + MP4StorageStyle('----:com.apple.iTunes:MusicBrainz Release Track Id'), + StorageStyle('MUSICBRAINZ_RELEASETRACKID'), + ASFStorageStyle('MusicBrainz/Release Track Id'), + ) mb_albumid = MediaField( MP3DescStorageStyle(u'MusicBrainz Album Id'), MP4StorageStyle('----:com.apple.iTunes:MusicBrainz Album Id'), diff --git a/docs/reference/pathformat.rst b/docs/reference/pathformat.rst index 667be3150..72907b6df 100644 --- a/docs/reference/pathformat.rst +++ b/docs/reference/pathformat.rst @@ -239,6 +239,7 @@ Audio information: MusicBrainz and fingerprint information: * mb_trackid +* mb_releasetrackid * mb_albumid * mb_artistid * mb_albumartistid diff --git a/test/_common.py b/test/_common.py index fc7b650b3..f5e65ca76 100644 --- a/test/_common.py +++ b/test/_common.py @@ -89,6 +89,7 @@ def item(lib=None): mb_albumid='someID-2', mb_artistid='someID-3', mb_albumartistid='someID-4', + mb_releasetrackid='someID-5', album_id=None, mtime=12345, )