diff options
author | mkaay <mkaay@mkaay.de> | 2010-08-25 16:48:55 +0200 |
---|---|---|
committer | mkaay <mkaay@mkaay.de> | 2010-08-25 16:48:55 +0200 |
commit | 3c9f55270a83b0e88ec0dc516f9d9921e4d7b6ea (patch) | |
tree | c5b2b1bfeb7eb8df2b97be118f6cbcec4e29cb3b /module/plugins/Plugin.py | |
parent | ul.to fetching, so.biz expire (diff) | |
download | pyload-3c9f55270a83b0e88ec0dc516f9d9921e4d7b6ea.tar.xz |
merged gui
Diffstat (limited to 'module/plugins/Plugin.py')
-rw-r--r-- | module/plugins/Plugin.py | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/module/plugins/Plugin.py b/module/plugins/Plugin.py deleted file mode 100644 index 1f680032a..000000000 --- a/module/plugins/Plugin.py +++ /dev/null @@ -1,268 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. - - 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: RaNaN, spoob, mkaay -""" - -import logging -from os.path import exists -from os.path import join - -from time import time -from time import sleep - -from random import randint - -import sys -from os.path import exists - -from os import remove -from os import makedirs - -from tempfile import NamedTemporaryFile -from mimetypes import guess_type - -from itertools import islice - -def chunks(iterable, size): - it = iter(iterable) - item = list(islice(it, size)) - while item: - yield item - item = list(islice(it, size)) - -def dec(func): - def new(*args): - if args[0].pyfile.abort: - raise Abort - return func(*args) - return new - -class Abort(Exception): - """ raised when aborted """ - -class Fail(Exception): - """ raised when failed """ - -class Reconnect(Exception): - """ raised when reconnected """ - -class Retry(Exception): - """ raised when start again from beginning """ - -class Plugin(object): - __name__ = "Plugin" - __version__ = "0.4" - __pattern__ = None - __type__ = "hoster" - __config__ = [ ("name", "type", "desc" , "default") ] - __description__ = """Base Plugin""" - __author_name__ = ("RaNaN", "spoob", "mkaay") - __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org", "mkaay@mkaay.de") - - - def __init__(self, pyfile): - self.config = pyfile.m.core.config - self.core = pyfile.m.core - - self.wantReconnect = False - self.multiDL = True - - self.waitUntil = 0 # time() + wait in seconds - self.waiting = False - - self.premium = False - - self.ocr = None # captcha reader instance - self.account = pyfile.m.core.accountManager.getAccountPlugin(self.__name__) # account handler instance - if self.account and not self.account.canUse(): self.account = None - if self.account: - self.req = self.account.getAccountRequest(self) - else: - self.req = pyfile.m.core.requestFactory.getRequest(self.__name__) - - self.log = logging.getLogger("log") - - self.pyfile = pyfile - self.thread = None # holds thread in future - - self.setup() - - def __call__(self): - return self.__name__ - - def setup(self): - """ more init stuff if needed """ - pass - - def preprocessing(self, thread): - """ handles important things to do before starting """ - self.thread = thread - - if not self.account: - self.req.clearCookies() - - self.pyfile.setStatus("starting") - - return self.process(self.pyfile) - - #---------------------------------------------------------------------- - def process(self, pyfile): - """the 'main' method of every plugin""" - raise NotImplementedError - - def resetAccount(self): - self.account = None - self.req = self.core.requestFactory.getRequest(self.__name__) - - def checksum(self, local_file=None): - """ - return codes: - 0 - checksum ok - 1 - checksum wrong - 5 - can't get checksum - 10 - not implemented - 20 - unknown error - """ - #@TODO checksum check hook - - return (True, 10) - - - def setConf(self, option, value): - """ sets a config value """ - self.config.setPlugin(self.__name__, option, value) - - def removeConf(self, option): - """ removes a config value """ - raise NotImplementedError - - def getConf(self, option): - """ gets a config value """ - return self.config.getPlugin(self.__name__, option) - - def setConfig(self, option, value): - """ sets a config value """ - self.setConf(option, value) - - def getConfig(self, option): - """ gets a config value """ - return self.getConf(option) - - - def setWait(self, seconds, reconnect=False): - """ set the wait time to specified seconds """ - if reconnect: - self.wantReconnect = True - self.pyfile.waitUntil = time() + int(seconds) - - def wait(self): - """ waits the time previously set """ - self.waiting = True - self.pyfile.setStatus("waiting") - - while self.pyfile.waitUntil > time(): - self.thread.m.reconnecting.wait(2) - - if self.pyfile.abort: raise Abort - if self.thread.m.reconnecting.isSet(): - self.waiting = False - self.wantReconnect = False - raise Reconnect - - self.waiting = False - self.pyfile.setStatus("starting") - - def fail(self, reason): - """ fail and give reason """ - raise Fail(reason) - - def offline(self): - """ fail and indicate file is offline """ - raise Fail("offline") - - def retry(self): - """ begin again from the beginning """ - raise Retry - - def decryptCaptcha(self, url, get={}, post={}, cookies=False, forceUser=False): - """ loads the catpcha and decrypt it or ask the user for input """ - - content = self.load(url, get=get, post=post, cookies=cookies) - - temp = NamedTemporaryFile() - temp = open(join("tmp","tmpCaptcha_%s" % self.__name__ ), "wb") - - temp.write(content) - temp.close() - - - Ocr = self.core.pluginManager.getCaptchaPlugin(self.__name__) - if Ocr and not forceUser: - sleep(randint(3000, 5000) / 1000.0) - if self.pyfile.abort: raise Abort - - ocr = Ocr() - result = ocr.get_captcha(temp.name) - else: - captchaManager = self.core.captchaManager - mime = guess_type(temp.name) - task = captchaManager.newTask(self) - task.setCaptcha(content, mime[0]) - task.setWaiting() - while not task.getStatus() == "done": - if not self.core.isClientConnected(): - task.removeTask() - #temp.unlink(temp.name) - self.fail(_("No Client connected for captcha decrypting.")) - if self.pyfile.abort: raise Abort - sleep(1) - result = task.getResult() - task.removeTask() - - if not self.core.debug: - try: - remove(temp.name) - except: - pass - - return result - - - def load(self, url, get={}, post={}, ref=True, cookies=True, just_header=False): - """ returns the content loaded """ - if self.pyfile.abort: raise Abort - - return self.req.load(url, get, post, ref, cookies, just_header) - - def download(self, url, get={}, post={}, ref=True, cookies=True): - """ downloads the url content to disk """ - - self.pyfile.setStatus("downloading") - - download_folder = self.config['general']['download_folder'] - - location = join(download_folder, self.pyfile.package().folder.decode(sys.getfilesystemencoding().replace(":", ""))) # remove : for win compability - - if not exists(location): - makedirs(location) - - newname = self.req.download(url, self.pyfile.name, location, get, post, ref, cookies) - - self.pyfile.size = self.req.dl_size - - if newname: - self.pyfile.name = newname |