import os import shutil import beets.plugins class ExtrasPlugin(beets.plugins.BeetsPlugin): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.register_listener('item_moved', self.on_item_moved) self.register_listener('item_copied', self.on_item_copied) def on_item_moved(self, _, source, destination): for (sourcepath, destpath) in self.gather(source, destination): os.rename(sourcepath, destpath) def on_item_copied(self, _, source, destination): for (sourcepath, destpath) in self.gather(source, destination): if os.path.isdir(sourcepath): shutil.copytree(sourcepath, destpath) else: shutil.copy(sourcepath, destpath) def gather(self, source, destination): candidates = [] sourcedir = os.path.dirname(source) destdir = os.path.dirname(destination) if sourcedir == destdir: return [] paths = [beets.util.bytestring_path(p) for p in self.config['paths'].get()] for path in paths: sourcepath = os.path.join(sourcedir, path) if not os.path.exists(sourcepath): continue destpath = os.path.join(destdir, path) if os.path.exists(destpath): continue candidates.append((sourcepath, destpath)) return candidates