forked from pyload/pyload
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExternalScripts.py
More file actions
215 lines (148 loc) · 8.06 KB
/
Copy pathExternalScripts.py
File metadata and controls
215 lines (148 loc) · 8.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
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"
("RaNaN" , "[email protected]"),
("spoob" , "[email protected]"),
("Walter Purcaro", "[email protected]")]
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)