Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion beets/mediafile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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:
Expand All @@ -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.

Expand Down
17 changes: 15 additions & 2 deletions test/test_mediafile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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``.
"""
Expand Down