Add unpack method for storage style

This commit is contained in:
Thomas Scholtes 2014-01-30 21:30:44 +01:00
parent 45ddafd6cb
commit 65e4a0f505
2 changed files with 61 additions and 8 deletions

View file

@ -322,16 +322,44 @@ class StorageStyle(object):
return entry
def get(self, mediafile):
out = self.fetch(mediafile)
data = self.fetch(mediafile)
self.out_type = self.pack_type
if self.packing:
p = Packed(out, self.packing, out_type=self.pack_type)
out = p[self.pack_pos]
if self.suffix and isinstance(out, (str, unicode)):
if out.endswith(self.suffix):
out = out[:-len(self.suffix)]
data = self.unpack(data, self.pack_pos, self.packing)
if self.suffix and isinstance(data, (str, unicode)):
if data.endswith(self.suffix):
data = data[:-len(self.suffix)]
if mediafile.type in MP4_TYPES and self.key.startswith('----:') and \
isinstance(out, str):
out = out.decode('utf8')
isinstance(data, str):
data = data.decode('utf8')
return data
def unpack(self, items, index, packstyle):
if not isinstance(index, int):
raise TypeError('index must be an integer')
if items is None:
return None
if packstyle == packing.DATE:
# Remove time information from dates. Usually delimited by
# a "T" or a space.
items = re.sub(r'[Tt ].*$', '', unicode(items))
# transform from a string packing into a list we can index into
if packstyle == packing.SLASHED:
seq = unicode(items).split('/')
elif packstyle == packing.DATE:
seq = unicode(items).split('-')
elif packstyle == packing.TUPLE:
seq = items # tuple: items is already indexable
elif packstyle == packing.SC:
seq = _sc_decode(items)
try:
out = seq[index]
except:
out = None
return out
def store(self, mediafile, val):

View file

@ -310,8 +310,11 @@ class ReadWriteTest(unittest.TestCase):
self.assertEqual(mediafile.artist, 'the artist')
self.assertEqual(mediafile.year, 2001)
self.assertEqual(mediafile.track, 2)
self.assertEqual(mediafile.tracktotal, 3)
self.assertEqual(mediafile.comp, True)
self.assertEqual(mediafile.lyrics, 'the lyrics')
self.assertEqual(mediafile.rg_track_gain, 0.0)
self.assertEqual(mediafile.rg_track_peak, 0.000244)
def test_write_common(self):
for ext in self.extensions:
@ -321,7 +324,10 @@ class ReadWriteTest(unittest.TestCase):
mediafile.artist = 'another artist'
mediafile.year = 2002
mediafile.track = 3
mediafile.tracktotal = 4
mediafile.comp = False
mediafile.rg_track_gain = 1.0
mediafile.rg_track_peak = -1.0
mediafile.save()
mediafile = beets.mediafile.MediaFile(mediafile.path)
@ -330,7 +336,10 @@ class ReadWriteTest(unittest.TestCase):
self.assertEqual(mediafile.artist, 'another artist')
self.assertEqual(mediafile.year, 2002)
self.assertEqual(mediafile.track, 3)
self.assertEqual(mediafile.tracktotal, 4)
self.assertEqual(mediafile.comp, False)
self.assertEqual(mediafile.rg_track_gain, 1.0)
self.assertEqual(mediafile.rg_track_peak, -1.0)
def test_write_original_date(self):
for ext in self.extensions:
@ -346,6 +355,22 @@ class ReadWriteTest(unittest.TestCase):
self.assertEqual(mediafile.original_day, 30)
self.assertEqual(mediafile.original_date, date(1999,12,30))
def test_read_write_float_none(self):
for ext in self.extensions:
mediafile = full_mediafile_fixture()
mediafile.rg_track_gain = None
mediafile.rg_track_peak = None
# mediafile.original_year = None
# mediafile.original_month = None
# # mediafile.original_day = None
mediafile.save()
self.assertEqual(mediafile.rg_track_gain, 0)
self.assertEqual(mediafile.rg_track_peak, 0)
# self.assertEqual(mediafile.original_year, 0)
# self.assertEqual(mediafile.original_month, 0)
# self.assertEqual(mediafile.original_day, 0)
def full_mediafile_fixture(ext='mp3'):
"""Returns a Mediafile with a lot of tags already set.