From a5b37d01c94eb53bffaf14997205840f60692b71 Mon Sep 17 00:00:00 2001 From: Josh Brown Date: Sat, 17 Dec 2016 16:46:00 -0600 Subject: [PATCH] added zero subcommand --- beetsplug/zero.py | 54 ++++++++++++++++++++++++++++++++++- test/test_zero.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/beetsplug/zero.py b/beetsplug/zero.py index 1401b11de..403def807 100644 --- a/beetsplug/zero.py +++ b/beetsplug/zero.py @@ -21,7 +21,8 @@ import re from beets.plugins import BeetsPlugin from beets.mediafile import MediaFile from beets.importer import action -from beets.util import confit +from beets.util import confit, syspath +from beets.ui import Subcommand, decargs import six __author__ = 'baobab@heresiarch.info' @@ -41,6 +42,7 @@ class ZeroPlugin(BeetsPlugin): self.import_task_choice_event) self.config.add({ + 'auto': True, 'fields': [], 'keep_fields': [], 'update_database': False, @@ -75,6 +77,16 @@ class ZeroPlugin(BeetsPlugin): if key in self.patterns: del self.patterns[key] + def commands(self): + zero_command = Subcommand('zero', help='set fields to null') + + def zero_fields(lib, opts, args): + for item in lib.items(decargs(args)): + self.process_item(item) + + zero_command.func = zero_fields + return [zero_command] + def validate_config(self, mode): """Check whether fields in the configuration are valid. @@ -120,10 +132,39 @@ class ZeroPlugin(BeetsPlugin): return True return False + def process_item(self, item): + if not self.patterns: + self._log.warning(u'no fields, nothing to do') + return + + for field, patterns in self.patterns.items(): + if field in item.keys(): + if not self.should_update(item, field): + continue + + value = item[field] + match = self.match_patterns(item[field], patterns) + + else: + value = '' + match = patterns is True + + if match: + self._log.warning(u'{0}: {1} -> None', field, value) + item[field] = None + if self.config['update_database']: + item.update({field: None}) + item.store() + + item.write() + def write_event(self, item, path, tags): """Set values in tags to `None` if the key and value are matched by `self.patterns`. """ + if not self.config['auto']: + return + if not self.patterns: self._log.warning(u'no fields, nothing to do') return @@ -141,3 +182,14 @@ class ZeroPlugin(BeetsPlugin): tags[field] = None if self.config['update_database']: item[field] = None + + def should_update(self, item, field): + media = MediaFile(syspath(item.path)) + attributes = media.fields() + if field in attributes: + return True + + if self.config['update_database'] and item[field]: + return True + + return False diff --git a/test/test_zero.py b/test/test_zero.py index fb28330ee..ca4a2dd67 100644 --- a/test/test_zero.py +++ b/test/test_zero.py @@ -121,6 +121,78 @@ class ZeroPluginTest(unittest.TestCase, TestHelper): mediafile = MediaFile(syspath(item.path)) self.assertEqual(0, len(mediafile.images)) + def test_auto_false(self): + item = self.add_item_fixture(year=2000) + item.write() + mediafile = MediaFile(syspath(item.path)) + self.assertEqual(2000, mediafile.year) + + config['zero'] = { + 'fields': [u'year'], + 'update_database': True, + 'auto': False + } + self.load_plugins('zero') + + item.write() + mediafile = MediaFile(syspath(item.path)) + self.assertEqual(item['year'], 2000) + self.assertEqual(mediafile.year, 2000) + + def test_subcommand(self): + item = self.add_item_fixture( + year=2016, + day=13, + month=3, + comments=u'test comment' + ) + item.write() + item_id = item.id + config['zero'] = { + 'fields': [u'comments'], + 'update_database': True, + 'auto': False + } + self.load_plugins('zero') + self.run_command('zero') + + mediafile = MediaFile(syspath(item.path)) + item = self.lib.get_item(item_id) + + self.assertEqual(item['year'], 2016) + self.assertEqual(mediafile.year, 2016) + self.assertEqual(mediafile.comments, None) + self.assertEqual(item['comments'], u'') + + def test_subcommand_update_database_False(self): + item = self.add_item_fixture( + year=2016, + day=13, + month=3, + comments=u'test comment' + ) + item.write() + item_id = item.id + config['zero'] = { + 'fields': [u'comments'], + 'update_database': False, + 'auto': False + } + self.load_plugins('zero') + + z = ZeroPlugin() + z.debug = False + self.run_command('zero') + + mediafile = MediaFile(syspath(item.path)) + item = self.lib.get_item(item_id) + + self.assertEqual(item['year'], 2016) + self.assertEqual(mediafile.year, 2016) + self.assertEqual(item['comments'], u'test comment') + self.assertEqual(mediafile.comments, None) + + def suite(): return unittest.TestLoader().loadTestsFromName(__name__)