Add MP3 StorageStyle class

This commit is contained in:
Thomas Scholtes 2014-01-30 20:25:34 +01:00
parent da13cb1825
commit 508be8e2c6
2 changed files with 181 additions and 151 deletions

View file

@ -305,42 +305,18 @@ class StorageStyle(object):
self.suffix = self.as_type(self.suffix)
def fetch(self, mediafile):
if mediafile.type == 'mp3':
if self.id3_desc is not None: # also match on 'desc' field
frames = mediafile.mgfile.tags.getall(self.key)
entry = None
for frame in frames:
if frame.desc.lower() == self.id3_desc.lower():
entry = getattr(frame, self.id3_frame_field)
break
if entry is None: # no desc match
return None
else:
# Get the metadata frame mediafileect.
try:
frame = mediafile.mgfile[self.key]
except KeyError:
return None
entry = getattr(frame, self.id3_frame_field)
else: # Not MP3.
try:
entry = mediafile.mgfile[self.key]
except KeyError:
return None
try:
entry = mediafile.mgfile[self.key]
except KeyError:
return None
# Possibly index the list.
if self.list_elem:
if entry: # List must have at least one value.
# Handle Mutagen bugs when reading values (#356).
try:
return entry[0]
except:
log.error('Mutagen exception when reading field: %s' %
traceback.format_exc)
return None
else:
if entry and self.list_elem:
try:
return entry[0]
except:
log.error('Mutagen exception when reading field: %s' %
traceback.format_exc)
return None
else:
return entry
@ -369,56 +345,7 @@ class StorageStyle(object):
else:
out = val
if mediafile.type == 'mp3':
# Try to match on "desc" field.
if self.id3_desc is not None:
frames = mediafile.mgfile.tags.getall(self.key)
# try modifying in place
found = False
for frame in frames:
if frame.desc.lower() == self.id3_desc.lower():
setattr(frame, self.id3_frame_field, out)
found = True
break
# need to make a new frame?
if not found:
assert isinstance(self.id3_frame_field, str) # Keyword.
args = {
'encoding': 3,
'desc': self.id3_desc,
self.id3_frame_field: val,
}
if self.id3_lang:
args['lang'] = self.id3_lang
mediafile.mgfile.tags.add(mutagen.id3.Frames[self.key](**args))
# Try to match on "owner" field.
elif self.key.startswith('UFID:'):
owner = self.key.split(':', 1)[1]
frames = mediafile.mgfile.tags.getall(self.key)
for frame in frames:
# Replace existing frame data.
if frame.owner == owner:
setattr(frame, self.id3_frame_field, val)
else:
# New frame.
assert isinstance(self.id3_frame_field, str) # Keyword.
frame = mutagen.id3.UFID(owner=owner,
**{self.id3_frame_field: val})
mediafile.mgfile.tags.setall('UFID', [frame])
# Just replace based on key.
else:
assert isinstance(self.id3_frame_field, str) # Keyword.
frame = mutagen.id3.Frames[self.key](encoding=3,
**{self.id3_frame_field: val})
mediafile.mgfile.tags.setall(self.key, [frame])
else: # Not MP3.
mediafile.mgfile[self.key] = out
mediafile.mgfile[self.key] = out
def set(self, mediafile, val):
if self.packing:
@ -481,8 +408,101 @@ class StorageStyle(object):
self.store(mediafile, out)
# Dealing with packings.
class MP3StorageStyle(StorageStyle):
def fetch(self, mediafile):
if self.id3_desc is not None: # also match on 'desc' field
frames = mediafile.mgfile.tags.getall(self.key)
entry = None
for frame in frames:
if frame.desc.lower() == self.id3_desc.lower():
entry = getattr(frame, self.id3_frame_field)
break
if entry is None: # no desc match
return None
else:
# Get the metadata frame mediafileect.
try:
frame = mediafile.mgfile[self.key]
except KeyError:
return None
entry = getattr(frame, self.id3_frame_field)
# Possibly index the list.
if self.list_elem:
if entry: # List must have at least one value.
# Handle Mutagen bugs when reading values (#356).
try:
return entry[0]
except:
log.error('Mutagen exception when reading field: %s' %
traceback.format_exc)
return None
else:
return None
else:
return entry
def store(self, mediafile, val):
"""Store val for this descriptor's field in the tag dictionary
according to the provided StorageStyle. Store it as a
single-item list if necessary.
"""
# Wrap as a list if necessary.
if self.list_elem:
out = [val]
else:
out = val
# Try to match on "desc" field.
if self.id3_desc is not None:
frames = mediafile.mgfile.tags.getall(self.key)
# try modifying in place
found = False
for frame in frames:
if frame.desc.lower() == self.id3_desc.lower():
setattr(frame, self.id3_frame_field, out)
found = True
break
# need to make a new frame?
if not found:
assert isinstance(self.id3_frame_field, str) # Keyword.
args = {
'encoding': 3,
'desc': self.id3_desc,
self.id3_frame_field: val,
}
if self.id3_lang:
args['lang'] = self.id3_lang
mediafile.mgfile.tags.add(mutagen.id3.Frames[self.key](**args))
# Try to match on "owner" field.
elif self.key.startswith('UFID:'):
owner = self.key.split(':', 1)[1]
frames = mediafile.mgfile.tags.getall(self.key)
for frame in frames:
# Replace existing frame data.
if frame.owner == owner:
setattr(frame, self.id3_frame_field, val)
else:
# New frame.
assert isinstance(self.id3_frame_field, str) # Keyword.
frame = mutagen.id3.UFID(owner=owner,
**{self.id3_frame_field: val})
mediafile.mgfile.tags.setall('UFID', [frame])
# Just replace based on key.
else:
assert isinstance(self.id3_frame_field, str) # Keyword.
frame = mutagen.id3.Frames[self.key](encoding=3,
**{self.id3_frame_field: val})
mediafile.mgfile.tags.setall(self.key, [frame])
# Dealing with packings.
class Packed(object):
"""Makes a packed list of values subscriptable. To access the packed
output after making changes, use packed_thing.items.
@ -944,50 +964,50 @@ class MediaFile(object):
# Field definitions.
title = MediaField(
mp3=StorageStyle('TIT2'),
mp3=MP3StorageStyle('TIT2'),
mp4=StorageStyle("\xa9nam"),
etc=StorageStyle('TITLE'),
asf=StorageStyle('Title'),
)
artist = MediaField(
mp3=StorageStyle('TPE1'),
mp3=MP3StorageStyle('TPE1'),
mp4=StorageStyle("\xa9ART"),
etc=StorageStyle('ARTIST'),
asf=StorageStyle('Author'),
)
album = MediaField(
mp3=StorageStyle('TALB'),
mp3=MP3StorageStyle('TALB'),
mp4=StorageStyle("\xa9alb"),
etc=StorageStyle('ALBUM'),
asf=StorageStyle('WM/AlbumTitle'),
)
genre = MediaField(
mp3=StorageStyle('TCON'),
mp3=MP3StorageStyle('TCON'),
mp4=StorageStyle("\xa9gen"),
etc=StorageStyle('GENRE'),
asf=StorageStyle('WM/Genre'),
)
composer = MediaField(
mp3=StorageStyle('TCOM'),
mp3=MP3StorageStyle('TCOM'),
mp4=StorageStyle("\xa9wrt"),
etc=StorageStyle('COMPOSER'),
asf=StorageStyle('WM/Composer'),
)
grouping = MediaField(
mp3=StorageStyle('TIT1'),
mp3=MP3StorageStyle('TIT1'),
mp4=StorageStyle("\xa9grp"),
etc=StorageStyle('GROUPING'),
asf=StorageStyle('WM/ContentGroupDescription'),
)
track = MediaField(out_type=int,
mp3=StorageStyle('TRCK', packing=packing.SLASHED, pack_pos=0),
mp3=MP3StorageStyle('TRCK', packing=packing.SLASHED, pack_pos=0),
mp4=StorageStyle('trkn', packing=packing.TUPLE, pack_pos=0),
etc=[StorageStyle('TRACK'),
StorageStyle('TRACKNUMBER')],
asf=StorageStyle('WM/TrackNumber'),
)
tracktotal = MediaField(out_type=int,
mp3=StorageStyle('TRCK', packing=packing.SLASHED, pack_pos=1),
mp3=MP3StorageStyle('TRCK', packing=packing.SLASHED, pack_pos=1),
mp4=StorageStyle('trkn', packing=packing.TUPLE, pack_pos=1),
etc=[StorageStyle('TRACKTOTAL'),
StorageStyle('TRACKC'),
@ -995,14 +1015,14 @@ class MediaFile(object):
asf=StorageStyle('TotalTracks'),
)
disc = MediaField(out_type=int,
mp3=StorageStyle('TPOS', packing=packing.SLASHED, pack_pos=0),
mp3=MP3StorageStyle('TPOS', packing=packing.SLASHED, pack_pos=0),
mp4=StorageStyle('disk', packing=packing.TUPLE, pack_pos=0),
etc=[StorageStyle('DISC'),
StorageStyle('DISCNUMBER')],
asf=StorageStyle('WM/PartOfSet'),
)
disctotal = MediaField(out_type=int,
mp3=StorageStyle('TPOS', packing=packing.SLASHED, pack_pos=1),
mp3=MP3StorageStyle('TPOS', packing=packing.SLASHED, pack_pos=1),
mp4=StorageStyle('disk', packing=packing.TUPLE, pack_pos=1),
etc=[StorageStyle('DISCTOTAL'),
StorageStyle('DISCC'),
@ -1010,13 +1030,13 @@ class MediaFile(object):
asf=StorageStyle('TotalDiscs'),
)
lyrics = MediaField(
mp3=StorageStyle('USLT', list_elem=False, id3_desc=u''),
mp3=MP3StorageStyle('USLT', list_elem=False, id3_desc=u''),
mp4=StorageStyle("\xa9lyr"),
etc=StorageStyle('LYRICS'),
asf=StorageStyle('WM/Lyrics'),
)
comments = MediaField(
mp3=StorageStyle('COMM', id3_desc=u''),
mp3=MP3StorageStyle('COMM', id3_desc=u''),
mp4=StorageStyle("\xa9cmt"),
etc=[StorageStyle('DESCRIPTION'),
StorageStyle('COMMENT')],
@ -1024,33 +1044,33 @@ class MediaFile(object):
)
bpm = MediaField(
out_type=int,
mp3=StorageStyle('TBPM'),
mp3=MP3StorageStyle('TBPM'),
mp4=StorageStyle('tmpo', as_type=int),
etc=StorageStyle('BPM'),
asf=StorageStyle('WM/BeatsPerMinute'),
)
comp = MediaField(
out_type=bool,
mp3=StorageStyle('TCMP'),
mp3=MP3StorageStyle('TCMP'),
mp4=StorageStyle('cpil', list_elem=False, as_type=bool),
etc=StorageStyle('COMPILATION'),
asf=StorageStyle('WM/IsCompilation', as_type=bool),
)
albumartist = MediaField(
mp3=StorageStyle('TPE2'),
mp3=MP3StorageStyle('TPE2'),
mp4=StorageStyle('aART'),
etc=[StorageStyle('ALBUM ARTIST'),
StorageStyle('ALBUMARTIST')],
asf=StorageStyle('WM/AlbumArtist'),
)
albumtype = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Type'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Type'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Album Type'),
etc=StorageStyle('MUSICBRAINZ_ALBUMTYPE'),
asf=StorageStyle('MusicBrainz/Album Type'),
)
label = MediaField(
mp3=StorageStyle('TPUB'),
mp3=MP3StorageStyle('TPUB'),
mp4=[StorageStyle('----:com.apple.iTunes:Label'),
StorageStyle('----:com.apple.iTunes:publisher')],
etc=[StorageStyle('LABEL'),
@ -1058,76 +1078,76 @@ class MediaFile(object):
asf=StorageStyle('WM/Publisher'),
)
artist_sort = MediaField(
mp3=StorageStyle('TSOP'),
mp3=MP3StorageStyle('TSOP'),
mp4=StorageStyle("soar"),
etc=StorageStyle('ARTISTSORT'),
asf=StorageStyle('WM/ArtistSortOrder'),
)
albumartist_sort = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'ALBUMARTISTSORT'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'ALBUMARTISTSORT'),
mp4=StorageStyle("soaa"),
etc=StorageStyle('ALBUMARTISTSORT'),
asf=StorageStyle('WM/AlbumArtistSortOrder'),
)
asin = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'ASIN'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'ASIN'),
mp4=StorageStyle("----:com.apple.iTunes:ASIN"),
etc=StorageStyle('ASIN'),
asf=StorageStyle('MusicBrainz/ASIN'),
)
catalognum = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'CATALOGNUMBER'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'CATALOGNUMBER'),
mp4=StorageStyle("----:com.apple.iTunes:CATALOGNUMBER"),
etc=StorageStyle('CATALOGNUMBER'),
asf=StorageStyle('WM/CatalogNo'),
)
disctitle = MediaField(
mp3=StorageStyle('TSST'),
mp3=MP3StorageStyle('TSST'),
mp4=StorageStyle("----:com.apple.iTunes:DISCSUBTITLE"),
etc=StorageStyle('DISCSUBTITLE'),
asf=StorageStyle('WM/SetSubTitle'),
)
encoder = MediaField(
mp3=StorageStyle('TENC'),
mp3=MP3StorageStyle('TENC'),
mp4=StorageStyle("\xa9too"),
etc=[StorageStyle('ENCODEDBY'),
StorageStyle('ENCODER')],
asf=StorageStyle('WM/EncodedBy'),
)
script = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'Script'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'Script'),
mp4=StorageStyle("----:com.apple.iTunes:SCRIPT"),
etc=StorageStyle('SCRIPT'),
asf=StorageStyle('WM/Script'),
)
language = MediaField(
mp3=StorageStyle('TLAN'),
mp3=MP3StorageStyle('TLAN'),
mp4=StorageStyle("----:com.apple.iTunes:LANGUAGE"),
etc=StorageStyle('LANGUAGE'),
asf=StorageStyle('WM/Language'),
)
country = MediaField(
mp3=StorageStyle('TXXX', id3_desc='MusicBrainz Album Release Country'),
mp3=MP3StorageStyle('TXXX', id3_desc='MusicBrainz Album Release Country'),
mp4=StorageStyle("----:com.apple.iTunes:MusicBrainz Album "
"Release Country"),
etc=StorageStyle('RELEASECOUNTRY'),
asf=StorageStyle('MusicBrainz/Album Release Country'),
)
albumstatus = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Status'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Status'),
mp4=StorageStyle("----:com.apple.iTunes:MusicBrainz Album Status"),
etc=StorageStyle('MUSICBRAINZ_ALBUMSTATUS'),
asf=StorageStyle('MusicBrainz/Album Status'),
)
media = MediaField(
mp3=StorageStyle('TMED'),
mp3=MP3StorageStyle('TMED'),
mp4=StorageStyle("----:com.apple.iTunes:MEDIA"),
etc=StorageStyle('MEDIA'),
asf=StorageStyle('WM/Media'),
)
albumdisambig = MediaField(
# This tag mapping was invented for beets (not used by Picard, etc).
mp3=StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Comment'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Comment'),
mp4=StorageStyle("----:com.apple.iTunes:MusicBrainz Album Comment"),
etc=StorageStyle('MUSICBRAINZ_ALBUMCOMMENT'),
asf=StorageStyle('MusicBrainz/Album Comment'),
@ -1136,7 +1156,7 @@ class MediaFile(object):
# Release date.
year = MediaField(
out_type=int,
mp3=StorageStyle('TDRC', packing=packing.DATE, pack_pos=0),
mp3=MP3StorageStyle('TDRC', packing=packing.DATE, pack_pos=0),
mp4=StorageStyle("\xa9day", packing=packing.DATE, pack_pos=0),
etc=[StorageStyle('DATE', packing=packing.DATE, pack_pos=0),
StorageStyle('YEAR')],
@ -1144,14 +1164,14 @@ class MediaFile(object):
)
month = MediaField(
out_type=int,
mp3=StorageStyle('TDRC', packing=packing.DATE, pack_pos=1),
mp3=MP3StorageStyle('TDRC', packing=packing.DATE, pack_pos=1),
mp4=StorageStyle("\xa9day", packing=packing.DATE, pack_pos=1),
etc=StorageStyle('DATE', packing=packing.DATE, pack_pos=1),
asf=StorageStyle('WM/Year', packing=packing.DATE, pack_pos=1),
)
day = MediaField(
out_type=int,
mp3=StorageStyle('TDRC', packing=packing.DATE, pack_pos=2),
mp3=MP3StorageStyle('TDRC', packing=packing.DATE, pack_pos=2),
mp4=StorageStyle("\xa9day", packing=packing.DATE, pack_pos=2),
etc=StorageStyle('DATE', packing=packing.DATE, pack_pos=2),
asf=StorageStyle('WM/Year', packing=packing.DATE, pack_pos=2),
@ -1160,7 +1180,7 @@ class MediaFile(object):
# *Original* release date.
original_year = MediaField(out_type=int,
mp3=StorageStyle('TDOR', packing=packing.DATE, pack_pos=0),
mp3=MP3StorageStyle('TDOR', packing=packing.DATE, pack_pos=0),
mp4=StorageStyle('----:com.apple.iTunes:ORIGINAL YEAR',
packing=packing.DATE, pack_pos=0),
etc=StorageStyle('ORIGINALDATE', packing=packing.DATE, pack_pos=0),
@ -1168,7 +1188,7 @@ class MediaFile(object):
pack_pos=0),
)
original_month = MediaField(out_type=int,
mp3=StorageStyle('TDOR', packing=packing.DATE, pack_pos=1),
mp3=MP3StorageStyle('TDOR', packing=packing.DATE, pack_pos=1),
mp4=StorageStyle('----:com.apple.iTunes:ORIGINAL YEAR',
packing=packing.DATE, pack_pos=1),
etc=StorageStyle('ORIGINALDATE', packing=packing.DATE, pack_pos=1),
@ -1176,7 +1196,7 @@ class MediaFile(object):
pack_pos=1),
)
original_day = MediaField(out_type=int,
mp3=StorageStyle('TDOR', packing=packing.DATE, pack_pos=2),
mp3=MP3StorageStyle('TDOR', packing=packing.DATE, pack_pos=2),
mp4=StorageStyle('----:com.apple.iTunes:ORIGINAL YEAR',
packing=packing.DATE, pack_pos=2),
etc=StorageStyle('ORIGINALDATE', packing=packing.DATE, pack_pos=2),
@ -1188,13 +1208,13 @@ class MediaFile(object):
# Nonstandard metadata.
artist_credit = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'Artist Credit'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'Artist Credit'),
mp4=StorageStyle("----:com.apple.iTunes:Artist Credit"),
etc=StorageStyle('ARTIST_CREDIT'),
asf=StorageStyle('beets/Artist Credit'),
)
albumartist_credit = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'Album Artist Credit'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'Album Artist Credit'),
mp4=StorageStyle("----:com.apple.iTunes:Album Artist Credit"),
etc=StorageStyle('ALBUMARTIST_CREDIT'),
asf=StorageStyle('beets/Album Artist Credit'),
@ -1205,7 +1225,7 @@ class MediaFile(object):
# MusicBrainz IDs.
mb_trackid = MediaField(
mp3=StorageStyle('UFID:http://musicbrainz.org',
mp3=MP3StorageStyle('UFID:http://musicbrainz.org',
list_elem=False,
id3_frame_field='data'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Track Id',
@ -1214,21 +1234,21 @@ class MediaFile(object):
asf=StorageStyle('MusicBrainz/Track Id'),
)
mb_albumid = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Id'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Id'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Album Id',
as_type=str),
etc=StorageStyle('MUSICBRAINZ_ALBUMID'),
asf=StorageStyle('MusicBrainz/Album Id'),
)
mb_artistid = MediaField(
mp3=StorageStyle('TXXX', id3_desc=u'MusicBrainz Artist Id'),
mp3=MP3StorageStyle('TXXX', id3_desc=u'MusicBrainz Artist Id'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Artist Id',
as_type=str),
etc=StorageStyle('MUSICBRAINZ_ARTISTID'),
asf=StorageStyle('MusicBrainz/Artist Id'),
)
mb_albumartistid = MediaField(
mp3=StorageStyle('TXXX',
mp3=MP3StorageStyle('TXXX',
id3_desc=u'MusicBrainz Album Artist Id'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Album Artist Id',
as_type=str),
@ -1236,7 +1256,7 @@ class MediaFile(object):
asf=StorageStyle('MusicBrainz/Album Artist Id'),
)
mb_releasegroupid = MediaField(
mp3=StorageStyle('TXXX',
mp3=MP3StorageStyle('TXXX',
id3_desc=u'MusicBrainz Release Group Id'),
mp4=StorageStyle('----:com.apple.iTunes:MusicBrainz Release Group Id',
as_type=str),
@ -1246,7 +1266,7 @@ class MediaFile(object):
# Acoustid fields.
acoustid_fingerprint = MediaField(
mp3=StorageStyle('TXXX',
mp3=MP3StorageStyle('TXXX',
id3_desc=u'Acoustid Fingerprint'),
mp4=StorageStyle('----:com.apple.iTunes:Acoustid Fingerprint',
as_type=str),
@ -1254,7 +1274,7 @@ class MediaFile(object):
asf=StorageStyle('Acoustid/Fingerprint'),
)
acoustid_id = MediaField(
mp3=StorageStyle('TXXX',
mp3=MP3StorageStyle('TXXX',
id3_desc=u'Acoustid Id'),
mp4=StorageStyle('----:com.apple.iTunes:Acoustid Id',
as_type=str),
@ -1265,11 +1285,11 @@ class MediaFile(object):
# ReplayGain fields.
rg_track_gain = MediaField(out_type=float,
mp3=[
StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_TRACK_GAIN',
MP3StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_TRACK_GAIN',
float_places=2, suffix=u' dB'),
StorageStyle('TXXX', id3_desc=u'replaygain_track_gain',
MP3StorageStyle('TXXX', id3_desc=u'replaygain_track_gain',
float_places=2, suffix=u' dB'),
StorageStyle('COMM', id3_desc=u'iTunNORM', id3_lang='eng',
MP3StorageStyle('COMM', id3_desc=u'iTunNORM', id3_lang='eng',
packing=packing.SC, pack_pos=0, pack_type=float),
],
mp4=[
@ -1285,9 +1305,9 @@ class MediaFile(object):
)
rg_album_gain = MediaField(out_type=float,
mp3=[
StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_ALBUM_GAIN',
MP3StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_ALBUM_GAIN',
float_places=2, suffix=u' dB'),
StorageStyle('TXXX', id3_desc=u'replaygain_album_gain',
MP3StorageStyle('TXXX', id3_desc=u'replaygain_album_gain',
float_places=2, suffix=u' dB'),
],
mp4=StorageStyle('----:com.apple.iTunes:replaygain_album_gain',
@ -1299,17 +1319,17 @@ class MediaFile(object):
)
rg_track_peak = MediaField(out_type=float,
mp3=[
StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_TRACK_PEAK',
MP3StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_TRACK_PEAK',
float_places=6),
StorageStyle('TXXX', id3_desc=u'replaygain_track_peak',
MP3StorageStyle('TXXX', id3_desc=u'replaygain_track_peak',
float_places=6),
StorageStyle('COMM', id3_desc=u'iTunNORM', id3_lang='eng',
MP3StorageStyle('COMM', id3_desc=u'iTunNORM', id3_lang='eng',
packing=packing.SC, pack_pos=1, pack_type=float),
],
mp4=[
StorageStyle('----:com.apple.iTunes:replaygain_track_peak',
MP3StorageStyle('----:com.apple.iTunes:replaygain_track_peak',
as_type=str, float_places=6),
StorageStyle('----:com.apple.iTunes:iTunNORM',
MP3StorageStyle('----:com.apple.iTunes:iTunNORM',
packing=packing.SC, pack_pos=1, pack_type=float),
],
etc=StorageStyle(u'REPLAYGAIN_TRACK_PEAK',
@ -1319,9 +1339,9 @@ class MediaFile(object):
)
rg_album_peak = MediaField(out_type=float,
mp3=[
StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_ALBUM_PEAK',
MP3StorageStyle('TXXX', id3_desc=u'REPLAYGAIN_ALBUM_PEAK',
float_places=6),
StorageStyle('TXXX', id3_desc=u'replaygain_album_peak',
MP3StorageStyle('TXXX', id3_desc=u'replaygain_album_peak',
float_places=6),
],
mp4=StorageStyle('----:com.apple.iTunes:replaygain_album_peak',

View file

@ -16,6 +16,7 @@
"""
import os
import shutil
from datetime import date
import _common
from _common import unittest
@ -309,15 +310,8 @@ class ReadWriteTest(unittest.TestCase):
self.assertEqual(mediafile.artist, 'the artist')
self.assertEqual(mediafile.year, 2001)
self.assertEqual(mediafile.track, 2)
def test_read_write_original_year(self):
for ext in self.extensions:
mediafile = full_mediafile_fixture()
mediafile.original_year = 1999
mediafile.save()
mediafile = beets.mediafile.MediaFile(mediafile.path)
self.assertEqual(mediafile.original_year, 1999)
self.assertEqual(mediafile.comp, True)
self.assertEqual(mediafile.lyrics, 'the lyrics')
def test_write_common(self):
for ext in self.extensions:
@ -326,7 +320,8 @@ class ReadWriteTest(unittest.TestCase):
mediafile.album = 'another album'
mediafile.artist = 'another artist'
mediafile.year = 2002
mediafile.track = 3
mediafile.track = 3
mediafile.comp = False
mediafile.save()
mediafile = beets.mediafile.MediaFile(mediafile.path)
@ -335,6 +330,21 @@ class ReadWriteTest(unittest.TestCase):
self.assertEqual(mediafile.artist, 'another artist')
self.assertEqual(mediafile.year, 2002)
self.assertEqual(mediafile.track, 3)
self.assertEqual(mediafile.comp, False)
def test_write_original_date(self):
for ext in self.extensions:
mediafile = full_mediafile_fixture()
mediafile.original_year = 1999
mediafile.original_month = 12
mediafile.original_day = 30
mediafile.save()
mediafile = beets.mediafile.MediaFile(mediafile.path)
self.assertEqual(mediafile.original_year, 1999)
self.assertEqual(mediafile.original_month, 12)
self.assertEqual(mediafile.original_day, 30)
self.assertEqual(mediafile.original_date, date(1999,12,30))
def full_mediafile_fixture(ext='mp3'):