mirror of
https://github.com/beetbox/beets.git
synced 2026-01-05 23:43:31 +01:00
added zero subcommand
This commit is contained in:
parent
faf2b9feb3
commit
a5b37d01c9
2 changed files with 125 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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__)
|
||||
|
|
|
|||
Loading…
Reference in a new issue