diff options
Diffstat (limited to 'module/plugins/Plugin.py')
-rw-r--r-- | module/plugins/Plugin.py | 229 |
1 files changed, 120 insertions, 109 deletions
diff --git a/module/plugins/Plugin.py b/module/plugins/Plugin.py index 0e04a86e6..51cd78f2d 100644 --- a/module/plugins/Plugin.py +++ b/module/plugins/Plugin.py @@ -22,15 +22,35 @@ import re from os.path import exists from os.path import join +from time import time from time import sleep + import sys from os.path import exists from os import makedirs -from module.DownloadThread import CaptchaError -class Plugin(): +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 @@ -39,107 +59,55 @@ class Plugin(): __author_name__ = ("RaNaN", "spoob", "mkaay") __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org", "mkaay@mkaay.de") - def __init__(self, parent): - self.configparser = parent.core.parser_plugins - self.config = {} - self.parent = parent - self.req = parent.core.requestFactory.getRequest(self.__name__) - self.html = 0 - self.time_plus_wait = 0 #time() + wait in seconds - self.want_reconnect = False - self.multi_dl = True - self.ocr = None #captcha reader instance - self.logger = logging.getLogger("log") - self.decryptNow = True - self.pyfile = self.parent - - def prepare(self, thread): - self.want_reconnect = False - self.pyfile.status.exists = self.file_exists() - - if not self.pyfile.status.exists: - return False - - self.pyfile.status.filename = self.get_file_name() - self.pyfile.status.waituntil = self.time_plus_wait - self.pyfile.status.url = self.get_file_url() - self.pyfile.status.want_reconnect = self.want_reconnect - thread.wait(self.parent) - - return True - - def set_parent_status(self): - """ sets all available Statusinfos about a File in self.parent.status - """ - pass - - def download_html(self): - """ gets the url from self.parent.url saves html in self.html and parses - """ - self.html = "" - - def file_exists(self): - """ returns True or False - """ - if re.search(r"(?!http://).*\.(dlc|ccf|rsdf|txt)", self.parent.url): - return exists(self.parent.url) - header = self.load(self.parent.url, just_header=True) - try: - if re.search(r"HTTP/1.1 404 Not Found", header): - return False - except: - pass - return True - - def get_file_url(self): - """ returns the absolute downloadable filepath - """ - return self.parent.url - - def get_file_name(self): - try: - return re.findall("([^\/=]+)", self.parent.url)[-1] - except: - return self.parent.url[:20] - - def wait_until(self): - if self.html != None: - self.download_html() - return self.time_plus_wait - - def proceed(self, url, location): - self.download(url, location) - - def set_config(self): - for k, v in self.config.items(): - self.configparser.set(self.__name__, {"option": k}, v) - - def remove_config(self, option): - self.configparser.remove(self.__name__, option) - - def get_config(self, value, default=None): - self.configparser.loadData() - return self.configparser.get(self.__name__, value, default=default) - - def read_config(self): - self.configparser.loadData() - try: - self.verify_config() - self.config = self.configparser.getConfig()[self.__name__] - except: - pass - - def verify_config(self): - pass - - def init_ocr(self): - captchaClass = self.parent.core.pluginManager.getCaptchaPlugin(self.__name__) - self.ocr = captchaClass() + def __new__(cls, *args, **kws): + for f in dir(cls): + if not f.startswith("_") and f not in ("checksum"): + setattr(cls, f, dec(getattr(cls, f)) ) + + o = super(cls.__class__, cls).__new__(cls) + #wrap decorator around every method + return o + + def __init__(self, pyfile): + self.config = pyfile.m.core.config + + self.req = pyfile.m.core.requestFactory.getRequest(self.__name__) + + self.wantReconnect = False + self.multiDL = True + + self.waitUntil = 0 # time() + wait in seconds + self.premium = False + + self.ocr = None # captcha reader instance + self.account = pyfile.m.core.accountManager.getAccount(self.__name__) # account handler instance + self.req = pyfile.m.core.requestFactory.getRequest(self.__name__, self.account) + + self.log = logging.getLogger("log") + + self.pyfile = pyfile + self.thread = None # holds thread in future + def __call__(self): + return self.__name__ + + def preprocessing(self, thread): + """ handles important things to do before starting """ + self.thread = thread + + if not self.account: + self.req.clearCookies() + + return self.process(self.pyfile) + + #---------------------------------------------------------------------- + def process(self, pyfile): + """the 'main' method of every plugin""" raise NotImplementedError - def check_file(self, local_file): + + def checksum(self, local_file=None): """ return codes: 0 - checksum ok @@ -148,8 +116,48 @@ class Plugin(): 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 setWait(self, seconds): + """ set the wait time to specified seconds """ + self.waitUntil = time() + int(seconds) + + def wait(): + """ waits the time previously set """ + pass + + 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 askCaptcha(self, url): + """ loads the catpcha and decrypt it or ask the user for input """ + pass + def waitForCaptcha(self, captchaData, imgType): captchaManager = self.parent.core.captchaManager task = captchaManager.newTask(self) @@ -165,16 +173,19 @@ class Plugin(): return result def load(self, url, get={}, post={}, ref=True, cookies=True, just_header=False): + """ returns the content loaded """ return self.req.load(url, get, post, ref, cookies, just_header) - def download(self, url, file_name, get={}, post={}, ref=True, cookies=True): - download_folder = self.parent.core.config['general']['download_folder'] - if self.pyfile.package.data["package_name"] != (self.parent.core.config['general']['link_file']) and self.parent.core.xmlconfig.get("general", "folder_per_package", False): - self.pyfile.folder = self.pyfile.package.data["package_name"] - location = join(download_folder, self.pyfile.folder.decode(sys.getfilesystemencoding())) - if not exists(location): makedirs(location) - file_path = join(location.decode(sys.getfilesystemencoding()), self.pyfile.status.filename.decode(sys.getfilesystemencoding())) - else: - file_path = join(download_folder, self.pyfile.status.filename.decode(sys.getfilesystemencoding())) + def download(self, url, get={}, post={}, ref=True, cookies=True): + """ downloads the url content to disk """ + download_folder = self.config['general']['download_folder'] + + location = join(download_folder, self.pyfile.package().folder.decode(sys.getfilesystemencoding())) + + if not exists(location): + makedirs(location) + + newname = self.req.download(url, self.pyfile.name, location, get, post, ref, cookies) - self.pyfile.status.filename = self.req.download(url, file_path, get, post, ref, cookies) + if newname: + self.pyfile.name = newname |