mirror of
https://github.com/beetbox/beets.git
synced 2025-12-24 17:43:52 +01:00
Add unpack method for storage style
This commit is contained in:
parent
45ddafd6cb
commit
65e4a0f505
2 changed files with 61 additions and 8 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue