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, item, source, destination):
for sourcepath, destpath in self.gather(source, destination):
# need to decode to str here as shutil.move (still) breaks on bytes
# arguments because of _destinsrc using str.endswith
shutil.move(sourcepath.decode(), destpath.decode())
def on_item_copied(self, item, 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