mirror of
https://github.com/beetbox/beets.git
synced 2026-07-22 04:26:50 -04:00
Introduce Source class to encapsulate metadata extraction logic, replacing scattered `get_most_common_tags` calls throughout codebase. - Add Source class in importer.tasks with artist, name, and metadata - Simplify `distance()` to accept Source.data instead of items list - Update display functions to use Source objects - Cache Source creation with @cached_property on ImportTask This centralizes metadata handling and reduces coupling between autotag and library modules.
50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
"""Warns you about things you hate (or even blocks import)."""
|
|
|
|
from beets.importer import Action
|
|
from beets.library import Album, Item, parse_query_string
|
|
from beets.plugins import BeetsPlugin
|
|
|
|
__author__ = "baobab@heresiarch.info"
|
|
__version__ = "2.0"
|
|
|
|
|
|
class IHatePlugin(BeetsPlugin):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.register_listener(
|
|
"import_task_choice", self.import_task_choice_event
|
|
)
|
|
self.config.add({"warn": [], "skip": []})
|
|
|
|
@classmethod
|
|
def do_i_hate_this(cls, task, action_patterns):
|
|
"""Process group of patterns (warn or skip) and returns True if
|
|
task is hated and not whitelisted.
|
|
"""
|
|
if action_patterns:
|
|
for query_string in action_patterns:
|
|
query, _ = parse_query_string(
|
|
query_string, Album if task.is_album else Item
|
|
)
|
|
if any(query.match(item) for item in task.imported_items()):
|
|
return True
|
|
return False
|
|
|
|
def import_task_choice_event(self, session, task):
|
|
skip_queries = self.config["skip"].as_str_seq()
|
|
warn_queries = self.config["warn"].as_str_seq()
|
|
|
|
if task.choice_flag == Action.APPLY:
|
|
if skip_queries or warn_queries:
|
|
self._log.debug("processing your hate")
|
|
if self.do_i_hate_this(task, skip_queries):
|
|
task.choice_flag = Action.SKIP
|
|
self._log.info("skipped: {}", task.source.desc)
|
|
return
|
|
if self.do_i_hate_this(task, warn_queries):
|
|
self._log.info("you may hate this: {}", task.source.desc)
|
|
else:
|
|
self._log.debug("nothing to do")
|
|
else:
|
|
self._log.debug("user made a decision, nothing to do")
|