diff options
| -rw-r--r-- | module/HookManager.py | 31 | ||||
| -rw-r--r-- | module/database/FileDatabase.py | 30 | ||||
| -rw-r--r-- | module/interaction/EventManager.py | 22 | ||||
| -rw-r--r-- | module/plugins/Account.py | 4 | ||||
| -rw-r--r-- | module/plugins/AccountManager.py | 2 | ||||
| -rw-r--r-- | module/plugins/Base.py | 12 | ||||
| -rw-r--r-- | module/plugins/Hook.py | 48 | ||||
| -rw-r--r-- | pavement.py | 2 | ||||
| -rwxr-xr-x | pyLoadCli.py | 4 | ||||
| -rwxr-xr-x | pyLoadCore.py | 6 | 
10 files changed, 86 insertions, 75 deletions
| diff --git a/module/HookManager.py b/module/HookManager.py index 386be0f5c..4b24f590a 100644 --- a/module/HookManager.py +++ b/module/HookManager.py @@ -15,7 +15,6 @@      along with this program; if not, see <http://www.gnu.org/licenses/>.      @author: RaNaN, mkaay -    @interface-version: 0.1  """  import __builtin__ @@ -30,35 +29,7 @@ from module.plugins.PluginManager import literal_eval  from utils import lock  class HookManager: -    """Manages hooks, delegates and handles Events. - -        Every plugin can define events, \ -        but some very usefull events are called by the Core. -        Contrary to overwriting hook methods you can use event listener, -        which provides additional entry point in the control flow. -        Only do very short tasks or use threads. - -        **Known Events:** -        Most hook methods exists as events. These are some additional known events. - -        ===================== ============== ================================== -        Name                     Arguments      Description -        ===================== ============== ================================== -        downloadPreparing     fid            A download was just queued and will be prepared now. -        downloadStarts        fid            A plugin will immediately starts the download afterwards. -        linksAdded            links, pid     Someone just added links, you are able to modify the links. -        allDownloadsProcessed                Every link was handled, pyload would idle afterwards. -        allDownloadsFinished                 Every download in queue is finished. -        unrarFinished         folder, fname  An Unrar job finished -        configChanged         sec,opt,value  The config was changed. -        ===================== ============== ================================== - -        | Notes: -        |    allDownloadsProcessed is *always* called before allDownloadsFinished. -        |    configChanged is *always* called before pluginConfigChanged. - - -    """ +    """ Manages hooks, loading, unloading.  """      def __init__(self, core):          self.core = core diff --git a/module/database/FileDatabase.py b/module/database/FileDatabase.py index 116f2b02b..23e657ee4 100644 --- a/module/database/FileDatabase.py +++ b/module/database/FileDatabase.py @@ -39,7 +39,7 @@ class FileHandler:      def __init__(self, core):          """Constructor"""          self.core = core -        self.ev = None #event manager, set later +        self.evm = core.eventManager          # translations          self.statusMsg = [_("finished"), _("offline"), _("online"), _("queued"), _("skipped"), _("waiting"), _("temp. offline"), _("starting"), _("failed"), _("aborted"), _("decrypting"), _("custom"), _("downloading"), _("processing"), _("unknown")] @@ -119,7 +119,7 @@ class FileHandler:      def addLinks(self, data, package):          """Add links, data = (plugin, url) tuple. Internal method you should use API."""          self.db.addLinks(data, package) -        self.ev.dispatchEvent("packageUpdated", package) +        self.evm.dispatchEvent("packageUpdated", package)      @lock @@ -129,7 +129,7 @@ class FileHandler:          pid = self.db.addPackage(name, folder, queue, password)          p = self.db.getPackage(pid) -        self.ev.dispatchEvent("packageInserted", pid, p.queue, p.order) +        self.evm.dispatchEvent("packageInserted", pid, p.queue, p.order)          return pid @@ -155,7 +155,7 @@ class FileHandler:                  pyfile.release()          self.db.deletePackage(p) -        self.ev.dispatchEvent("packageDeleted", id) +        self.evm.dispatchEvent("packageDeleted", id)          if id in self.packageCache:              del self.packageCache[id] @@ -187,7 +187,7 @@ class FileHandler:          self.db.deleteLink(f) -        self.ev.dispatchEvent("linkDeleted", id, pid) +        self.evm.dispatchEvent("linkDeleted", id, pid)          p = self.getPackage(pid)          p.deleteIfEmpty() @@ -211,12 +211,12 @@ class FileHandler:      def updateLink(self, pyfile):          """updates link"""          self.db.updateLink(pyfile) -        self.ev.dispatchEvent("linkUpdated", pyfile.id, pyfile.packageid) +        self.evm.dispatchEvent("linkUpdated", pyfile.id, pyfile.packageid)      def updatePackage(self, pypack):          """updates a package"""          self.db.updatePackage(pypack) -        self.ev.dispatchEvent("packageUpdated", pypack.id) +        self.evm.dispatchEvent("packageUpdated", pypack.id)      def getPackage(self, id):          """return package instance""" @@ -365,7 +365,7 @@ class FileHandler:          if id in self.packageCache:              self.packageCache[id].setFinished = False -        self.ev.dispatchEvent("packageUpdated", id) +        self.evm.dispatchEvent("packageUpdated", id)      @lock      @change @@ -379,7 +379,7 @@ class FileHandler:          self.db.restartFile(id) -        self.ev.dispatchEvent("linkUpdated", id) +        self.evm.dispatchEvent("linkUpdated", id)      @lock @@ -404,8 +404,8 @@ class FileHandler:          self.db.commit()          self.releasePackage(id) -        self.ev.dispatchEvent("packageDeleted", id) -        self.ev.dispatchEvent("packageInserted", id, p.queue, p.order) +        self.evm.dispatchEvent("packageDeleted", id) +        self.evm.dispatchEvent("packageInserted", id, p.queue, p.order)      @lock      @change @@ -429,8 +429,8 @@ class FileHandler:          p.order = position          self.db.commit() -        self.ev.dispatchEvent("packageDeleted", id) -        self.ev.dispatchEvent("packageInserted", id, p.queue, p.order) +        self.evm.dispatchEvent("packageDeleted", id) +        self.evm.dispatchEvent("packageInserted", id, p.queue, p.order)      @lock      @change @@ -457,14 +457,14 @@ class FileHandler:          self.db.commit() -        self.ev.dispatchEvent("packageUpdated", f["package"]) +        self.evm.dispatchEvent("packageUpdated", f["package"])      @change      def updateFileInfo(self, data, pid):          """ updates file info (name, size, status, url)"""          ids = self.db.updateLinkInfo(data) -        self.ev.dispatchEvent("packageUpdated", pid) +        self.evm.dispatchEvent("packageUpdated", pid)      def checkPackageFinished(self, pyfile):          """ checks if package is finished and calls hookmanager """ diff --git a/module/interaction/EventManager.py b/module/interaction/EventManager.py index 8a80553cf..931f50446 100644 --- a/module/interaction/EventManager.py +++ b/module/interaction/EventManager.py @@ -4,6 +4,28 @@ from time import time  from module.utils import uniqify  class EventManager: +    """ +    Handles all Event related task, also stores an Event queue for clients, so they can retrieve them later. + +    **Known Events:** +    Most hook methods exists as events. These are some additional known events. + +    ===================== ============== ================================== +    Name                     Arguments      Description +    ===================== ============== ================================== +    downloadPreparing     fid            A download was just queued and will be prepared now. +    downloadStarts        fid            A plugin will immediately starts the download afterwards. +    linksAdded            links, pid     Someone just added links, you are able to modify the links. +    allDownloadsProcessed                Every link was handled, pyload would idle afterwards. +    allDownloadsFinished                 Every download in queue is finished. +    unrarFinished         folder, fname  An Unrar job finished +    configChanged         sec,opt,value  The config was changed. +    ===================== ============== ================================== + +    | Notes: +    |    allDownloadsProcessed is *always* called before allDownloadsFinished. +    |    configChanged is *always* called before pluginConfigChanged. +    """      def __init__(self, core):          self.core = core          self.clients = [] diff --git a/module/plugins/Account.py b/module/plugins/Account.py index dcf36f8a0..59ce87ed2 100644 --- a/module/plugins/Account.py +++ b/module/plugins/Account.py @@ -48,6 +48,10 @@ class Account(Base, AccountInfo):          else:              activated = Account.activated +        for opt in self.known_opt: +            if opt not in options: +                options[opt] = "" +          for opt in options.keys():              if opt not in self.known_opt:                  del options[opt] diff --git a/module/plugins/AccountManager.py b/module/plugins/AccountManager.py index 77139206c..00dd2ccc6 100644 --- a/module/plugins/AccountManager.py +++ b/module/plugins/AccountManager.py @@ -23,7 +23,7 @@ from random import choice  from module.common.json_layer import json  from module.utils import lock -class AccountManager(): +class AccountManager:      """manages all accounts"""      def __init__(self, core): diff --git a/module/plugins/Base.py b/module/plugins/Base.py index 0ad0d5caa..1477356ea 100644 --- a/module/plugins/Base.py +++ b/module/plugins/Base.py @@ -40,7 +40,7 @@ class Base(object):      __pattern__ = r""      #: Config definition: list of  (name, type, verbose_name, default_value) or      #: (name, type, verbose_name, short_description, default_value) -    __config__ = tuple() +    __config__ = list()      #: Short description, one liner      __description__ = ""      #: More detailed text @@ -68,9 +68,17 @@ class Base(object):          self.log = core.log          #: core config          self.config = core.config +        #: :class:`EventManager` +        self.evm = core.eventManager +        #: :class:`InteractionManager` +        self.im = core.interActionManager -    #log functions      def logInfo(self, *args, **kwargs): +        """ Print args to log at specific level + +        :param args: Arbitary object which should be logged +        :param kwargs: sep=(how to seperate arguments), default = " | " +        """          self._log("info", *args, **kwargs)      def logWarning(self, *args, **kwargs): diff --git a/module/plugins/Hook.py b/module/plugins/Hook.py index a3b86a794..fe464bdaa 100644 --- a/module/plugins/Hook.py +++ b/module/plugins/Hook.py @@ -14,8 +14,7 @@      You should have received a copy of the GNU General Public License      along with this program; if not, see <http://www.gnu.org/licenses/>. -    @author: mkaay -    @interface-version: 0.2 +    @author: RaNaN  """  from traceback import print_exc @@ -24,11 +23,24 @@ from Base import Base  class Expose(object):      """ used for decoration to declare rpc services """ -      def __new__(cls, f, *args, **kwargs):          hookManager.addRPC(f.__module__, f.func_name, f.func_doc)          return f +def AddEventListener(event): +    """ used to register method for events """ +    class _klass(object): +        def __new__(cls, f, *args, **kwargs): +            hookManager.addEventListener(f.__module__, f.func_name, event) +            return f +    return _klass + +class ConfigHandler(object): +    """ register method as config handler """ +    def __new__(cls, f, *args, **kwargs): +        hookManager.addConfigHandler(f.__module__, f.func_name) +        return f +  def threaded(f):      def run(*args,**kwargs):          hookManager.startThread(f, *args, **kwargs) @@ -38,14 +50,6 @@ class Hook(Base):      """      Base class for hook plugins.      """ -    __name__ = "Hook" -    __version__ = "0.2" -    __type__ = "hook" -    __threaded__ = [] -    __config__ = [ ("name", "type", "desc" , "default") ] -    __description__ = """interface for hook""" -    __author_name__ = ("mkaay", "RaNaN") -    __author_mail__ = ("mkaay@mkaay.de", "RaNaN@pyload.org")      #: automatically register event listeners for functions, attribute will be deleted dont use it yourself      event_map = None @@ -108,7 +112,11 @@ class Hook(Base):      def __repr__(self):          return "<Hook %s>" % self.__name__ -                + +    def isActivated(self): +        """ checks if hook is activated""" +        return self.getConfig("activated") +      def setup(self):          """ more init stuff if needed """          pass @@ -116,11 +124,12 @@ class Hook(Base):      def unload(self):          """ called when hook was deactivated """          pass -     -    def isActivated(self): -        """ checks if hook is activated""" -        return self.config.get(self.__name__, "activated") -     + +    def deactivate(self): +        pass + +    def activate(self): +        pass      #event methods - overwrite these if needed          def coreReady(self): @@ -134,10 +143,7 @@ class Hook(Base):      def downloadFinished(self, pyfile):          pass -     -    def downloadFailed(self, pyfile): -        pass -     +      def packageFinished(self, pypack):          pass diff --git a/pavement.py b/pavement.py index ac9a6fa1a..8ebd5bfc5 100644 --- a/pavement.py +++ b/pavement.py @@ -23,7 +23,7 @@ if sys.version_info <= (2, 5):  setup(      name="pyload", -    version="0.4.9", +    version="0.5.0",      description='Fast, lightweight and full featured download manager.',      long_description=open(PROJECT_DIR / "README").read(),      keywords = ('pyload', 'download-manager', 'one-click-hoster', 'download'), diff --git a/pyLoadCli.py b/pyLoadCli.py index 97e64dfee..d68b5faec 100755 --- a/pyLoadCli.py +++ b/pyLoadCli.py @@ -289,14 +289,14 @@ class Cli:                  print _("Please use this syntax: add <Package name> <link> <link2> ...")                  return -            self.client.addPackage(args[0], args[1:], Destination.Queue) +            self.client.addPackage(args[0], args[1:], Destination.Queue, "")          elif command == "add_coll":              if len(args) < 2:                  print _("Please use this syntax: add <Package name> <link> <link2> ...")                  return -            self.client.addPackage(args[0], args[1:], Destination.Collector) +            self.client.addPackage(args[0], args[1:], Destination.Collector, "")          elif command == "del_file":              self.client.deleteFiles([int(x) for x in args]) diff --git a/pyLoadCore.py b/pyLoadCore.py index d1a557c43..f8b1ad6e8 100755 --- a/pyLoadCore.py +++ b/pyLoadCore.py @@ -362,6 +362,8 @@ class Core(object):          if self.config['ssl']['activated']:              self.check_install("OpenSSL", _("OpenSSL for secure connection")) + +        self.eventManager = EventManager(self)          self.setupDB()          if self.deleteLinks: @@ -387,15 +389,13 @@ class Core(object):          #hell yeah, so many important managers :D          self.pluginManager = PluginManager(self) -        self.eventManager = EventManager(self) +        self.interActionManager = None #stub          self.accountManager = AccountManager(self)          self.threadManager = ThreadManager(self)          self.captchaManager = CaptchaManager(self)          self.hookManager = HookManager(self)          self.remoteManager = RemoteManager(self) -        self.files.ev = self.eventManager -          self.js = JsEngine()          self.log.info(_("Downloadtime: %s") % self.api.isTimeDownload()) | 
