diff --git a/beets/mediafile.py b/beets/mediafile.py index 387af80b5..ee6d0a414 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -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): diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 9fd6539b1..13ecd62e8 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -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.