added zero subcommand

This commit is contained in:
Josh Brown 2016-12-17 16:46:00 -06:00
parent faf2b9feb3
commit a5b37d01c9
2 changed files with 125 additions and 1 deletions

View file

@ -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

View file

@ -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__)