aboutsummaryrefslogtreecommitdiffstats
path: root/beetsplug/extras.py
diff options
context:
space:
mode:
Diffstat (limited to 'beetsplug/extras.py')
-rw-r--r--beetsplug/extras.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/beetsplug/extras.py b/beetsplug/extras.py
new file mode 100644
index 0000000..32fe3f6
--- /dev/null
+++ b/beetsplug/extras.py
@@ -0,0 +1,44 @@
+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