summaryrefslogtreecommitdiffstats
path: root/pyload/threads/DecrypterThread.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyload/threads/DecrypterThread.py')
-rw-r--r--pyload/threads/DecrypterThread.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/pyload/threads/DecrypterThread.py b/pyload/threads/DecrypterThread.py
new file mode 100644
index 000000000..22a2d0037
--- /dev/null
+++ b/pyload/threads/DecrypterThread.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from time import sleep
+
+from pyload.Api import LinkStatus, DownloadStatus as DS
+from pyload.utils import uniqify, accumulate
+from pyload.plugins.Base import Abort, Retry
+from pyload.plugins.Crypter import Package
+
+from BaseThread import BaseThread
+
+class DecrypterThread(BaseThread):
+ """thread for decrypting"""
+
+ def __init__(self, manager, data, pid):
+ # TODO: owner
+ BaseThread.__init__(self, manager)
+ # [... (plugin, url) ...]
+ self.data = data
+ self.pid = pid
+
+ self.start()
+
+ def run(self):
+ pack = self.m.core.files.getPackage(self.pid)
+ links, packages = self.decrypt(accumulate(self.data), pack.password)
+
+ if links:
+ self.log.info(_("Decrypted %(count)d links into package %(name)s") % {"count": len(links), "name": pack.name})
+ self.m.core.api.addFiles(self.pid, [l.url for l in links])
+
+ # TODO: add single package into this one and rename it?
+ # TODO: nested packages
+ for p in packages:
+ self.m.core.api.addPackage(p.name, p.getURLs(), pack.password)
+
+ def decrypt(self, plugin_map, password=None, err=None):
+ result = []
+
+ # TODO QUEUE_DECRYPT
+
+ for name, urls in plugin_map.iteritems():
+ klass = self.m.core.pluginManager.loadClass("crypter", name)
+ plugin = klass(self.m.core, password)
+ plugin_result = []
+
+ try:
+ try:
+ plugin_result = plugin._decrypt(urls)
+ except Retry:
+ sleep(1)
+ plugin_result = plugin._decrypt(urls)
+ except Abort:
+ plugin.logInfo(_("Decrypting aborted"))
+ except Exception, e:
+ plugin.logError(_("Decrypting failed"), e)
+
+ # generate error linkStatus
+ if err:
+ plugin_result.extend(LinkStatus(url, url, -1, DS.Failed, name) for url in urls)
+
+ if self.core.debug:
+ self.core.print_exc()
+ self.writeDebugReport(plugin.__name__, plugin=plugin)
+ finally:
+ plugin.clean()
+
+ plugin.logDebug("Decrypted", plugin_result)
+ result.extend(plugin_result)
+
+ # generated packages
+ pack_names = {}
+ # urls without package
+ urls = []
+
+ # merge urls and packages
+ for p in result:
+ if isinstance(p, Package):
+ if p.name in pack_names:
+ pack_names[p.name].urls.extend(p.urls)
+ else:
+ if not p.name:
+ urls.extend(p.links)
+ else:
+ pack_names[p.name] = p
+ else:
+ urls.append(p)
+
+ urls = uniqify(urls)
+
+ return urls, pack_names.values() \ No newline at end of file