mirror of
https://github.com/beetbox/beets.git
synced 2026-07-22 02:06:50 -04:00
- Move query and sort construction into `ModelQuery` classmethods and parse tokenized input once. - Switch call sites to consume `parse_query(...).query` and `parse_query(...).sort` instead of tuple unpacking. - Remove legacy `dbcore` re-exports and obsolete helper functions in `queryparse`. - Update query/sort tests to match the new parsing behavior and simplified query object shapes.
58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""Warns you about things you hate (or even blocks import)."""
|
|
|
|
from beets.importer import Action
|
|
from beets.library import Album, Item
|
|
from beets.plugins import BeetsPlugin
|
|
|
|
__author__ = "baobab@heresiarch.info"
|
|
__version__ = "2.0"
|
|
|
|
|
|
def summary(task):
|
|
"""Given an ImportTask, produce a short string identifying the
|
|
object.
|
|
"""
|
|
if task.is_album:
|
|
return f"{task.cur_artist} - {task.cur_album}"
|
|
return f"{task.item.artist} - {task.item.title}"
|
|
|
|
|
|
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:
|
|
model_cls = Album if task.is_album else Item
|
|
query = model_cls.parse_query(query_string).query
|
|
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: {}", summary(task))
|
|
return
|
|
if self.do_i_hate_this(task, warn_queries):
|
|
self._log.info("you may hate this: {}", summary(task))
|
|
else:
|
|
self._log.debug("nothing to do")
|
|
else:
|
|
self._log.debug("user made a decision, nothing to do")
|