diff --git a/beets/mediafile.py b/beets/mediafile.py index 99615203cb..c0cf22d695 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -1195,6 +1195,8 @@ def __init__(self, path): if self.mgfile.tags is None: self.mgfile.add_tags() + self._dirty = False + def save(self, id3v23=False): """Write the object's tags back to the file. @@ -1208,12 +1210,13 @@ def save(self, id3v23=False): id3 = id3.tags id3.update_to_v23() self.mgfile.save(v2_version=3) - else: + elif self._dirty: self.mgfile.save() def delete(self): """Remove the current metadata tag from the file. """ + self._dirty = True try: self.mgfile.delete() except NotImplementedError: @@ -1222,6 +1225,24 @@ def delete(self): for tag in self.mgfile.keys(): del self.mgfile[tag] + def __setattr__(self, name, value): + """Set the ``_dirty`` property to true if a property changed. + """ + if name == '_dirty': + super(MediaFile, self).__setattr__(name, value) + elif hasattr(self, name): + old_value = getattr(self, name) + super(MediaFile, self).__setattr__(name, value) + new_value = getattr(self, name) + print 'check' + print new_value, old_value + if new_value != old_value: + print 'dirty' + super(MediaFile, self).__setattr__('_dirty', True) + else: + super(MediaFile, self).__setattr__(name, value) + super(MediaFile, self).__setattr__('_dirty', True) + # Field definitions. diff --git a/test/test_mediafile.py b/test/test_mediafile.py index e8ec31ed20..17ed357829 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -165,7 +165,6 @@ def test_add_tiff_image(self): desc='the composer', type=Image.TYPES.composer) -# TODO include this in ReadWriteTestBase if implemented class LazySaveTestMixin(object): """Mediafile should only write changes when tags have changed """ @@ -197,6 +196,20 @@ def test_tag_value_change(self): mediafile.save() self.assertNotEqual(os.stat(mediafile.path).st_mtime, mtime) + def test_delete_tags(self): + mediafile = self._mediafile_fixture('full') + mtime = self._set_past_mtime(mediafile.path) + self.assertEqual(mediafile.title, 'full') + self.assertEqual(os.stat(mediafile.path).st_mtime, mtime) + + mediafile.delete() + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertNotEqual(os.stat(mediafile.path).st_mtime, mtime) + self.assertEqual(mediafile.title, '') + + def _set_past_mtime(self, path): mtime = round(time.time()-10000) os.utime(path, (mtime, mtime)) @@ -237,7 +250,7 @@ def test_append_genre_list(self): self.assertItemsEqual(mediafile.genres, [u'the genre', u'another']) -class ReadWriteTestBase(ArtTestMixin, GenreListTestMixin): +class ReadWriteTestBase(ArtTestMixin, LazySaveTestMixin, GenreListTestMixin): """Test writing and reading tags. Subclasses must set ``extension`` and ``audio_properties``. """