diff --git a/beets/importer.py b/beets/importer.py index b7bfdb156..f28e6822d 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -572,18 +572,22 @@ class ImportTask(BaseImportTask): util.prune_dirs(os.path.dirname(item.path), lib.directory) - def set_fields(self): + def set_fields(self, lib): """Sets the fields given at CLI or configuration to the specified - values. + values, for both the album and all its items. """ - for field, view in config['import']['set_fields'].items(): - value = view.get() - log.debug(u'Set field {1}={2} for {0}', - displayable_path(self.paths), - field, - value) - self.album[field] = value - self.album.store() + with lib.transaction(): + for field, view in config['import']['set_fields'].items(): + value = view.get() + log.debug(u'Set field {1}={2} for {0}', + displayable_path(self.paths), + field, + value) + self.album[field] = value + for item in self.imported_items(): + item[field] = value + item.store() + self.album.store() def finalize(self, session): """Save progress, clean up files, and emit plugin event. @@ -946,18 +950,19 @@ class SingletonImportTask(ImportTask): def reload(self): self.item.load() - def set_fields(self): + def set_fields(self, lib): """Sets the fields given at CLI or configuration to the specified - values. + values, for the singleton item. """ - for field, view in config['import']['set_fields'].items(): - value = view.get() - log.debug(u'Set field {1}={2} for {0}', - displayable_path(self.paths), - field, - value) - self.item[field] = value - self.item.store() + with lib.transaction(): + for field, view in config['import']['set_fields'].items(): + value = view.get() + log.debug(u'Set field {1}={2} for {0}', + displayable_path(self.paths), + field, + value) + self.item[field] = value + self.item.store() # FIXME The inheritance relationships are inverted. This is why there @@ -1510,7 +1515,7 @@ def apply_choice(session, task): # because then the ``ImportTask`` won't have an `album` for which # it can set the fields. if config['import']['set_fields']: - task.set_fields() + task.set_fields(session.lib) @pipeline.mutator_stage diff --git a/docs/changelog.rst b/docs/changelog.rst index 72a4b56d5..6c76b95c4 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -216,6 +216,8 @@ Other new things: ``check_on_import`` config option. * :doc:`/plugins/export`: big speedups when `--include-keys` option is used Thanks to :user:`ssssam`. +* The `importer` persists all fields set using :ref:`set_fields` to the + mediafiles of all imported tracks. Fixes: diff --git a/docs/reference/config.rst b/docs/reference/config.rst index 455639be0..aabe732c2 100644 --- a/docs/reference/config.rst +++ b/docs/reference/config.rst @@ -683,6 +683,9 @@ Here's an example:: Other field/value pairs supplied via the ``--set`` option on the command-line override any settings here for fields with the same name. +Fields are set on both the album and each individual track of the album. +Fields are persisted to the media files of each track. + Default: ``{}`` (empty). .. _musicbrainz-config: diff --git a/test/test_importer.py b/test/test_importer.py index 3418d4628..fcdd00125 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -734,10 +734,12 @@ class ImportTest(_common.TestCase, ImportHelper): def test_set_fields(self): genre = u"\U0001F3B7 Jazz" collection = u"To Listen" + comments = u"managed by beets" config['import']['set_fields'] = { u'collection': collection, - u'genre': genre + u'genre': genre, + u'comments': comments } # As-is album import. @@ -749,6 +751,10 @@ class ImportTest(_common.TestCase, ImportHelper): album.load() # TODO: Not sure this is necessary. self.assertEqual(album.genre, genre) self.assertEqual(album.collection, collection) + for item in album.items(): + self.assertEqual(item.genre, genre) + self.assertEqual(item.collection, collection) + self.assertEqual(item.comments, comments) # Remove album from library to test again with APPLY choice. album.remove() @@ -762,6 +768,10 @@ class ImportTest(_common.TestCase, ImportHelper): album.load() self.assertEqual(album.genre, genre) self.assertEqual(album.collection, collection) + for item in album.items(): + self.assertEqual(item.genre, genre) + self.assertEqual(item.collection, collection) + self.assertEqual(item.comments, comments) class ImportTracksTest(_common.TestCase, ImportHelper):