fetchart: defer file removal config option evaluation (#5244)

Defer the evaluation of the source file removal options (`import.delete`
and `import.move`) to the point where the fetchart plugin is actually
called instead of only evaluating those configuration options on plugin
initialization.
This is to allow other plugins (such as the
[ytimport](https://github.com/mgoltzsche/beets-ytimport/blob/v1.8.1/beetsplug/ytimport/__init__.py#L194)
plugin) to invoke the import directly (within the same python process;
implicitly invoking the fetchart plugin) with temporarily overwritten
configuration options.

Addresses
https://github.com/beetbox/beets/issues/5167#issuecomment-2106465172
This commit is contained in:
Šarūnas Nejus 2024-09-16 11:44:46 +01:00 committed by GitHub
commit 5785522170
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 16 additions and 9 deletions

View file

@ -1252,10 +1252,6 @@ class FetchArtPlugin(plugins.BeetsPlugin, RequestMixin):
self.cautious = self.config["cautious"].get(bool)
self.store_source = self.config["store_source"].get(bool)
self.src_removed = config["import"]["delete"].get(bool) or config[
"import"
]["move"].get(bool)
self.cover_format = self.config["cover_format"].get(
confuse.Optional(str)
)
@ -1297,6 +1293,10 @@ class FetchArtPlugin(plugins.BeetsPlugin, RequestMixin):
for s, c in sources
]
@staticmethod
def _is_source_file_removal_enabled():
return config["import"]["delete"] or config["import"]["move"]
# Asynchronous; after music is added to the library.
def fetch_art(self, session, task):
"""Find art for the album being imported."""
@ -1339,10 +1339,11 @@ class FetchArtPlugin(plugins.BeetsPlugin, RequestMixin):
"""Place the discovered art in the filesystem."""
if task in self.art_candidates:
candidate = self.art_candidates.pop(task)
removal_enabled = FetchArtPlugin._is_source_file_removal_enabled()
self._set_art(task.album, candidate, not self.src_removed)
self._set_art(task.album, candidate, not removal_enabled)
if self.src_removed:
if removal_enabled:
task.prune(candidate.path)
# Manual album art fetching.

View file

@ -235,6 +235,8 @@ New features:
* Add support for `barcode` field.
:bug:`3172`
* :doc:`/plugins/smartplaylist`: Add new config option `smartplaylist.fields`.
* :doc:`/plugins/fetchart`: Defer source removal config option evaluation to
the point where they are used really, supporting temporary config changes.
Bug fixes:

View file

@ -804,9 +804,13 @@ class ArtImporterTest(UseThePlugin):
self.assertExists(self.art_file)
def test_delete_original_file(self):
self.plugin.src_removed = True
self._fetch_art(True)
self.assertNotExists(self.art_file)
prev_move = config["import"]["move"].get()
try:
config["import"]["move"] = True
self._fetch_art(True)
self.assertNotExists(self.art_file)
finally:
config["import"]["move"] = prev_move
def test_do_not_delete_original_if_already_in_place(self):
artdest = os.path.join(os.path.dirname(self.i.path), b"cover.jpg")