diff options
| author | 2013-12-01 00:08:11 +0100 | |
|---|---|---|
| committer | 2013-12-01 00:08:11 +0100 | |
| commit | 95270599f2a0d0042c75f63f30a3e013849439f7 (patch) | |
| tree | ced2dc611ed51e43251b980e2a1578fe90674858 /pyload | |
| parent | Updated translations (diff) | |
| download | pyload-95270599f2a0d0042c75f63f30a3e013849439f7.tar.xz | |
fixed are few addons and improved crypter workarounds
Diffstat (limited to 'pyload')
| -rw-r--r-- | pyload/Core.py | 3 | ||||
| -rw-r--r-- | pyload/FileManager.py | 2 | ||||
| -rw-r--r-- | pyload/PluginManager.py | 2 | ||||
| -rw-r--r-- | pyload/plugins/Addon.py | 15 | ||||
| -rw-r--r-- | pyload/plugins/Base.py | 3 | ||||
| -rw-r--r-- | pyload/plugins/Crypter.py | 27 | ||||
| -rw-r--r-- | pyload/plugins/Hoster.py | 2 | ||||
| -rw-r--r-- | pyload/plugins/addons/ClickAndLoad.py | 18 | ||||
| -rw-r--r-- | pyload/plugins/addons/ExternalScripts.py | 27 | ||||
| -rw-r--r-- | pyload/plugins/addons/ExtractArchive.py | 2 | ||||
| -rw-r--r-- | pyload/threads/DecrypterThread.py | 64 | ||||
| -rw-r--r-- | pyload/threads/InfoThread.py | 1 | ||||
| -rw-r--r-- | pyload/utils/__init__.py | 2 | 
13 files changed, 87 insertions, 81 deletions
| diff --git a/pyload/Core.py b/pyload/Core.py index 3c56e2afe..328a25c94 100644 --- a/pyload/Core.py +++ b/pyload/Core.py @@ -384,6 +384,7 @@ class Core(object):          self.api = Api(self)          self.scheduler = Scheduler(self) +        self.js = JsEngine()          #hell yeah, so many important managers :D          self.pluginManager = PluginManager(self) @@ -393,8 +394,6 @@ class Core(object):          self.addonManager = AddonManager(self)          self.remoteManager = RemoteManager(self) -        self.js = JsEngine() -          # enough initialization for test cases          if tests: return diff --git a/pyload/FileManager.py b/pyload/FileManager.py index 61c164316..05f665135 100644 --- a/pyload/FileManager.py +++ b/pyload/FileManager.py @@ -489,7 +489,7 @@ class FileManager:          files = [self.getFileInfo(fid) for fid in fids]          orders = [f.fileorder for f in files]          if min(orders) + len(files) != max(orders) + 1: -            raise Exception("Tried to reorder non continous block of files") +            raise Exception("Tried to reorder non continuous block of files")          # minimum fileorder          f = reduce(lambda x,y: x if x.fileorder < y.fileorder else y, files) diff --git a/pyload/PluginManager.py b/pyload/PluginManager.py index b6e4ed977..ea0515999 100644 --- a/pyload/PluginManager.py +++ b/pyload/PluginManager.py @@ -208,6 +208,8 @@ class PluginManager:          if name not in sys.modules:  #could be already in modules              # TODO: only temporary +            # TODO: strange side effects are caused by this workaround +            # e.g a class instance is not associated correctly with its on instance because of wrong module names              if name.endswith("module"):                  # name = "pyload."                  name = name.replace(".module", "") diff --git a/pyload/plugins/Addon.py b/pyload/plugins/Addon.py index 5c27fa983..da5bbc1d7 100644 --- a/pyload/plugins/Addon.py +++ b/pyload/plugins/Addon.py @@ -97,9 +97,6 @@ class Addon(Base):      """ -    #: automatically register event listeners for functions, attribute will be deleted don't use it yourself -    event_map = None -      #: periodic call interval in seconds      interval = 0 @@ -112,18 +109,6 @@ class Addon(Base):          #: `AddonManager`          self.manager = manager -        #register events -        if self.event_map: -            for event, funcs in self.event_map.iteritems(): -                if type(funcs) in (list, tuple): -                    for f in funcs: -                        self.evm.listenTo(event, getattr(self, f)) -                else: -                    self.evm.listenTo(event, getattr(self, funcs)) - -            #delete for various reasons -            self.event_map = None -          self.init()          # start periodically if set diff --git a/pyload/plugins/Base.py b/pyload/plugins/Base.py index ae8614b0d..b6668ea90 100644 --- a/pyload/plugins/Base.py +++ b/pyload/plugins/Base.py @@ -105,6 +105,9 @@ class Base(object):          #: last interaction task          self.task = None +        #: js engine, see `JsEngine` +        self.js = self.core.js +      def __getitem__(self, item):          """ Retrieves meta data attribute """          return getattr(self, "__%s__" % item) diff --git a/pyload/plugins/Crypter.py b/pyload/plugins/Crypter.py index af3d5aba7..fcea1263a 100644 --- a/pyload/plugins/Crypter.py +++ b/pyload/plugins/Crypter.py @@ -48,8 +48,8 @@ class Package:          return self.name == other.name and self.links == other.links      def __repr__(self): -        return u"<CrypterPackage name=%s, links=[%s], packs=%s" % (self.name, ",".join(str(l) for l in self.links), -                                                                   self.packs) +        return u"<CrypterPackage name=%s, links=[%s], packs=%s>" % (self.name, ", ".join(str(l) for l in self.links), +                                                                    self.packs)      def __hash__(self):          return hash(self.name) ^ hash(frozenset(self.links)) ^ hash(self.name) @@ -58,14 +58,20 @@ class Package:  class PyFileMockup:      """ Legacy class needed by old crypter plugins """ -    def __init__(self, url, pack): +    def __init__(self, url, pack_name):          self.url = url          self.name = url -        self._package = None -        self.packageid = pack.id if pack else -1 +        self.packageid = -1 +        self.pack_name = pack_name + " Package"      def package(self): -        return self._package +        # mockes the pyfile package +        class PyPackage: +            def __init__(self, f): +                self.name = f.pack_name +                self.folder = self.name + +        return PyPackage(self)  class Crypter(Base): @@ -145,6 +151,7 @@ class Crypter(Base):          #: Password supplied by user          self.password = password +        # TODO: removed in future          # For old style decrypter, do not use these!          self.packages = []          self.urls = [] @@ -201,7 +208,7 @@ class Crypter(Base):              self.logDebug("Deprecated .decrypt() method in Crypter plugin")              result = []              for url in urls: -                self.pyfile = PyFileMockup(url) +                self.pyfile = PyFileMockup(url, cls.__name__)                  self.setup()                  self.decrypt(self.pyfile)                  result.extend(self.convertPackages()) @@ -276,7 +283,11 @@ class Crypter(Base):      def convertPackages(self):          """ Deprecated """          self.logDebug("Deprecated method .convertPackages()") -        res = [Package(name, urls) for name, urls in self.packages] +        res = [] +        for pack in self.packages: +            # only use name and urls +            res.append(Package(pack[0], pack[1])) +          res.extend(self.urls)          return res diff --git a/pyload/plugins/Hoster.py b/pyload/plugins/Hoster.py index 6bfe47e1f..68eb32baa 100644 --- a/pyload/plugins/Hoster.py +++ b/pyload/plugins/Hoster.py @@ -89,8 +89,6 @@ class Hoster(Base):          self.lastDownload = ""          #: re match of the last call to `checkDownload`          self.lastCheck = None -        #: js engine, see `JsEngine` -        self.js = self.core.js          self.retries = 0 # amount of retries already made          self.html = None # some plugins store html code here diff --git a/pyload/plugins/addons/ClickAndLoad.py b/pyload/plugins/addons/ClickAndLoad.py index 0fc78abfe..0d9538543 100644 --- a/pyload/plugins/addons/ClickAndLoad.py +++ b/pyload/plugins/addons/ClickAndLoad.py @@ -21,10 +21,9 @@  import socket  import thread -from module.plugins.Hook import Hook +from pyload.plugins.Addon import Addon - -class ClickAndLoad(Hook): +class ClickAndLoad(Addon):      __name__ = "ClickAndLoad"      __version__ = "0.22"      __description__ = """Gives abillity to use jd's click and load. depends on webinterface""" @@ -36,15 +35,12 @@ class ClickAndLoad(Hook):      def coreReady(self):          self.port = int(self.config['webinterface']['port'])          if self.config['webinterface']['activated']: -            try: -                if self.getConfig("extern"): -                    ip = "0.0.0.0" -                else: -                    ip = "127.0.0.1" +            if self.getConfig("extern"): +                ip = "0.0.0.0" +            else: +                ip = "127.0.0.1" -                thread.start_new_thread(proxy, (self, ip, self.port, 9666)) -            except: -                self.logError("ClickAndLoad port already in use.") +            thread.start_new_thread(proxy, (self, ip, self.port, 9666))  def proxy(self, *settings): diff --git a/pyload/plugins/addons/ExternalScripts.py b/pyload/plugins/addons/ExternalScripts.py index b1a9420bb..2a95a7af0 100644 --- a/pyload/plugins/addons/ExternalScripts.py +++ b/pyload/plugins/addons/ExternalScripts.py @@ -20,13 +20,14 @@  import subprocess  from os import listdir, access, X_OK, makedirs -from os.path import join, exists, basename +from os.path import join, exists, basename, abspath -from module.plugins.Hook import Hook -from module.utils import save_join +from pyload.plugins.Addon import Addon, AddEventListener +from pyload.utils.fs import safe_join -class ExternalScripts(Hook): + +class ExternalScripts(Addon):      __name__ = "ExternalScripts"      __version__ = "0.23"      __description__ = """Run external scripts""" @@ -34,13 +35,12 @@ class ExternalScripts(Hook):      __author_name__ = ("mkaay", "RaNaN", "spoob")      __author_mail__ = ("mkaay@mkaay.de", "ranan@pyload.org", "spoob@pyload.org") -    event_list = ["unrarFinished", "allDownloadsFinished", "allDownloadsProcessed"] -    def setup(self): +    def activate(self):          self.scripts = {}          folders = ['download_preparing', 'download_finished', 'package_finished', -                   'before_reconnect', 'after_reconnect', 'unrar_finished', +                   'before_reconnect', 'after_reconnect', 'extracting_finished',                     'all_dls_finished', 'all_dls_processed']          for folder in folders: @@ -73,7 +73,7 @@ class ExternalScripts(Hook):      def callScript(self, script, *args):          try:              cmd = [script] + [str(x) if not isinstance(x, basestring) else x for x in args] -            self.logDebug("Executing %(script)s: %(cmd)s" % {"script": os.path.abspath(script), "cmd": " ".join(cmd)}) +            self.logDebug("Executing %(script)s: %(cmd)s" % {"script": abspath(script), "cmd": " ".join(cmd)})              #output goes to pyload              subprocess.Popen(cmd, bufsize=-1)          except Exception, e: @@ -86,13 +86,13 @@ class ExternalScripts(Hook):      def downloadFinished(self, pyfile):          for script in self.scripts['download_finished']:              self.callScript(script, pyfile.pluginname, pyfile.url, pyfile.name, -                            save_join(self.config['general']['download_folder'], +                            safe_join(self.config['general']['download_folder'],                                        pyfile.package().folder, pyfile.name), pyfile.id)      def packageFinished(self, pypack):          for script in self.scripts['package_finished']:              folder = self.config['general']['download_folder'] -            folder = save_join(folder, pypack.folder) +            folder = safe_join(folder, pypack.folder)              self.callScript(script, pypack.name, folder, pypack.password, pypack.id) @@ -104,14 +104,17 @@ class ExternalScripts(Hook):          for script in self.scripts['after_reconnect']:              self.callScript(script, ip) -    def unrarFinished(self, folder, fname): -        for script in self.scripts["unrar_finished"]: +    @AddEventListener("extracting:finished") +    def extractingFinished(self, folder, fname): +        for script in self.scripts["extracting_finished"]:              self.callScript(script, folder, fname) +    @AddEventListener("download:allFinished")      def allDownloadsFinished(self):          for script in self.scripts["all_dls_finished"]:              self.callScript(script) +    @AddEventListener("download:allProcessed")      def allDownloadsProcessed(self):          for script in self.scripts["all_dls_processed"]:              self.callScript(script) diff --git a/pyload/plugins/addons/ExtractArchive.py b/pyload/plugins/addons/ExtractArchive.py index 62c947f88..9a66f13c7 100644 --- a/pyload/plugins/addons/ExtractArchive.py +++ b/pyload/plugins/addons/ExtractArchive.py @@ -254,7 +254,7 @@ class ExtractArchive(Addon):                          self.logDebug("%s does not exists" % f)              self.logInfo(basename(plugin.file), _("Extracting finished")) -            self.manager.dispatchEvent("unrarFinished", plugin.out, plugin.file) +            self.manager.dispatchEvent("extracting:finished", plugin.out, plugin.file)              return plugin.getExtractedFiles() diff --git a/pyload/threads/DecrypterThread.py b/pyload/threads/DecrypterThread.py index 22a2d0037..10d47fcc2 100644 --- a/pyload/threads/DecrypterThread.py +++ b/pyload/threads/DecrypterThread.py @@ -42,51 +42,61 @@ class DecrypterThread(BaseThread):          for name, urls in plugin_map.iteritems():              klass = self.m.core.pluginManager.loadClass("crypter", name) -            plugin = klass(self.m.core, password) +            plugin = None              plugin_result = [] -            try: +            #TODO: dependency check, there is a new error code for this +            if not klass: +                plugin_result.extend(LinkStatus(url, url, -1, DS.NotPossible, name) for url in urls) +                self.log.debug("Plugin for decrypting was not loaded") +            else:                  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) +                    plugin = klass(self.m.core, password) + +                    try: +                        plugin_result = plugin._decrypt(urls) +                    except Retry: +                        sleep(1) +                        plugin_result = plugin._decrypt(urls) + +                    plugin.logDebug("Decrypted", plugin_result) + +                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: +                    if plugin: +                        plugin.clean() +              result.extend(plugin_result)          # generated packages -        pack_names = {} +        packs = {}          # 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) +                if p.name in packs: +                    packs[p.name].urls.extend(p.urls)                  else:                      if not p.name:                          urls.extend(p.links)                      else: -                        pack_names[p.name] = p +                        packs[p.name] = p              else:                  urls.append(p)          urls = uniqify(urls) -        return urls, pack_names.values()
\ No newline at end of file +        return urls, packs.values()
\ No newline at end of file diff --git a/pyload/threads/InfoThread.py b/pyload/threads/InfoThread.py index 62e309020..8d33df705 100644 --- a/pyload/threads/InfoThread.py +++ b/pyload/threads/InfoThread.py @@ -2,7 +2,6 @@  # -*- coding: utf-8 -*-  from time import time -from traceback import print_exc  from pyload.Api import LinkStatus, DownloadStatus  from pyload.utils.packagetools import parseNames diff --git a/pyload/utils/__init__.py b/pyload/utils/__init__.py index 577213dd1..09fb76229 100644 --- a/pyload/utils/__init__.py +++ b/pyload/utils/__init__.py @@ -64,7 +64,7 @@ def compare_time(start, end):      else: return False  def to_list(value): -    return value if type(value) == list else ([value] if value is not None else []) +    return value if type(value) == list else list(value) if type(value) == set else ([value] if value is not None else [])  def formatSize(size):      print "Deprecated formatSize, use format_size" | 
