summaryrefslogtreecommitdiffstats
path: root/pyload/plugin/addon/ExternalScripts.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyload/plugin/addon/ExternalScripts.py')
-rw-r--r--pyload/plugin/addon/ExternalScripts.py215
1 files changed, 215 insertions, 0 deletions
diff --git a/pyload/plugin/addon/ExternalScripts.py b/pyload/plugin/addon/ExternalScripts.py
new file mode 100644
index 000000000..341dd6dcd
--- /dev/null
+++ b/pyload/plugin/addon/ExternalScripts.py
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+
+import os
+import subprocess
+
+from pyload.plugin.Addon import Addon
+from pyload.utils import fs_encode, fs_join
+
+
+class ExternalScripts(Addon):
+ __name = "ExternalScripts"
+ __type = "addon"
+ __version = "0.39"
+
+ __config = [("activated", "bool", "Activated" , True),
+ ("waitend" , "bool", "Wait script ending", False)]
+
+ __description = """Run external scripts"""
+ __license = "GPLv3"
+ __authors = [("mkaay" , "mkaay@mkaay.de"),
+ ("RaNaN" , "ranan@pyload.org"),
+ ("spoob" , "spoob@pyload.org"),
+ ("Walter Purcaro", "vuolter@gmail.com")]
+
+ event_list = ["archive_extract_failed", "archive_extracted" ,
+ "package_extract_failed", "package_extracted" ,
+ "all_archives_extracted", "all_archives_processed",
+ "allDownloadsFinished" , "allDownloadsProcessed" ,
+ "packageDeleted"]
+
+
+ def setup(self):
+ self.info['oldip'] = None
+ self.scripts = {}
+
+ folders = ["pyload_start", "pyload_restart", "pyload_stop",
+ "before_reconnect", "after_reconnect",
+ "download_preparing", "download_failed", "download_finished",
+ "archive_extract_failed", "archive_extracted",
+ "package_finished", "package_deleted", "package_extract_failed", "package_extracted",
+ "all_downloads_processed", "all_downloads_finished", #@TODO: Invert `all_downloads_processed`, `all_downloads_finished` order in 0.4.10
+ "all_archives_extracted", "all_archives_processed"]
+
+ for folder in folders:
+ self.scripts[folder] = []
+ for dir in (pypath, ''):
+ self.initPluginType(folder, os.path.join(dir, 'scripts', folder))
+
+ for script_type, names in self.scripts.iteritems():
+ if names:
+ self.logInfo(_("Installed scripts for: ") + script_type, ", ".join(map(os.path.basename, names)))
+
+ self.pyload_start()
+
+
+ def initPluginType(self, name, dir):
+ if not os.path.isdir(dir):
+ try:
+ os.makedirs(dir)
+
+ except OSError, e:
+ self.logDebug(e)
+ return
+
+ for filename in os.listdir(dir):
+ file = fs_join(dir, filename)
+
+ if not os.path.isfile(file):
+ continue
+
+ if filename[0] in ("#", "_") or filename.endswith("~") or filename.endswith(".swp"):
+ continue
+
+ if not os.access(file, os.X_OK):
+ self.logWarning(_("Script not executable:") + " %s/%s" % (name, filename))
+
+ self.scripts[name].append(file)
+
+
+ def callScript(self, script, *args):
+ try:
+ cmd_args = [fs_encode(str(x) if not isinstance(x, basestring) else x) for x in args]
+ cmd = [script] + cmd_args
+
+ self.logDebug("Executing: %s" % os.path.abspath(script), "Args: " + ' '.join(cmd_args))
+
+ p = subprocess.Popen(cmd, bufsize=-1) #@NOTE: output goes to pyload
+ if self.getConfig('waitend'):
+ p.communicate()
+
+ except Exception, e:
+ try:
+ self.logError(_("Runtime error: %s") % os.path.abspath(script), e)
+ except Exception:
+ self.logError(_("Runtime error: %s") % os.path.abspath(script), _("Unknown error"))
+
+
+ def pyload_start(self):
+ for script in self.scripts['pyload_start']:
+ self.callScript(script)
+
+
+ def exit(self):
+ for script in self.scripts['pyload_restart' if self.core.do_restart else 'pyload_stop']:
+ self.callScript(script)
+
+
+ def beforeReconnecting(self, ip):
+ for script in self.scripts['before_reconnect']:
+ self.callScript(script, ip)
+ self.info['oldip'] = ip
+
+
+ def afterReconnecting(self, ip):
+ for script in self.scripts['after_reconnect']:
+ self.callScript(script, ip, self.info['oldip']) #@TODO: Use built-in oldip in 0.4.10
+
+
+ def downloadPreparing(self, pyfile):
+ for script in self.scripts['download_preparing']:
+ self.callScript(script, pyfile.id, pyfile.name, None, pyfile.pluginname, pyfile.url)
+
+
+ def downloadFailed(self, pyfile):
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pyfile.package().folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['download_failed']:
+ file = fs_join(download_folder, pyfile.name)
+ self.callScript(script, pyfile.id, pyfile.name, file, pyfile.pluginname, pyfile.url)
+
+
+ def downloadFinished(self, pyfile):
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pyfile.package().folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['download_finished']:
+ file = fs_join(download_folder, pyfile.name)
+ self.callScript(script, pyfile.id, pyfile.name, file, pyfile.pluginname, pyfile.url)
+
+
+ def archive_extract_failed(self, pyfile, archive):
+ for script in self.scripts['archive_extract_failed']:
+ self.callScript(script, pyfile.id, pyfile.name, archive.filename, archive.out, archive.files)
+
+
+ def archive_extracted(self, pyfile, archive):
+ for script in self.scripts['archive_extracted']:
+ self.callScript(script, pyfile.id, pyfile.name, archive.filename, archive.out, archive.files)
+
+
+ def packageFinished(self, pypack):
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['package_finished']:
+ self.callScript(script, pypack.id, pypack.name, download_folder, pypack.password)
+
+
+ def packageDeleted(self, pid):
+ pack = self.core.api.getPackageInfo(pid)
+
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pack.folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['package_deleted']:
+ self.callScript(script, pack.id, pack.name, download_folder, pack.password)
+
+
+ def package_extract_failed(self, pypack):
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['package_extract_failed']:
+ self.callScript(script, pypack.id, pypack.name, download_folder, pypack.password)
+
+
+ def package_extracted(self, pypack):
+ if self.core.config.get("general", "folder_per_package"):
+ download_folder = fs_join(self.core.config.get("general", "download_folder"), pypack.folder)
+ else:
+ download_folder = self.core.config.get("general", "download_folder")
+
+ for script in self.scripts['package_extracted']:
+ self.callScript(script, pypack.id, pypack.name, download_folder)
+
+
+ def allDownloadsFinished(self):
+ for script in self.scripts['all_downloads_finished']:
+ self.callScript(script)
+
+
+ def allDownloadsProcessed(self):
+ for script in self.scripts['all_downloads_processed']:
+ self.callScript(script)
+
+
+ def all_archives_extracted(self):
+ for script in self.scripts['all_archives_extracted']:
+ self.callScript(script)
+
+
+ def all_archives_processed(self):
+ for script in self.scripts['all_archives_processed']:
+ self.callScript(script)