From 1fe795e8bfb9d9ed7181bfe075469a960f7bb0e4 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Wed, 10 Dec 2014 18:42:46 +0100 Subject: Revert plugin directory structure --- pyload/plugins/Account.py | 305 +++++++++++++++++++++++ pyload/plugins/Addon.py | 169 +++++++++++++ pyload/plugins/Captcha.py | 51 ++++ pyload/plugins/Container.py | 66 +++++ pyload/plugins/Crypter.py | 107 ++++++++ pyload/plugins/Hoster.py | 21 ++ pyload/plugins/OCR.py | 315 ++++++++++++++++++++++++ pyload/plugins/account/AlldebridCom.py | 2 +- pyload/plugins/account/BayfilesCom.py | 2 +- pyload/plugins/account/BitshareCom.py | 2 +- pyload/plugins/account/CatShareNet.py | 2 +- pyload/plugins/account/CzshareCom.py | 2 +- pyload/plugins/account/DebridItaliaCom.py | 2 +- pyload/plugins/account/DepositfilesCom.py | 2 +- pyload/plugins/account/EuroshareEu.py | 2 +- pyload/plugins/account/FastixRu.py | 2 +- pyload/plugins/account/FastshareCz.py | 2 +- pyload/plugins/account/FilecloudIo.py | 2 +- pyload/plugins/account/FilefactoryCom.py | 2 +- pyload/plugins/account/FilejungleCom.py | 2 +- pyload/plugins/account/FilerNet.py | 2 +- pyload/plugins/account/FilesMailRu.py | 2 +- pyload/plugins/account/FileserveCom.py | 2 +- pyload/plugins/account/FourSharedCom.py | 2 +- pyload/plugins/account/FreakshareCom.py | 2 +- pyload/plugins/account/FreeWayMe.py | 2 +- pyload/plugins/account/FshareVn.py | 2 +- pyload/plugins/account/Ftp.py | 2 +- pyload/plugins/account/HellshareCz.py | 2 +- pyload/plugins/account/Http.py | 2 +- pyload/plugins/account/Keep2shareCc.py | 2 +- pyload/plugins/account/LetitbitNet.py | 2 +- pyload/plugins/account/LinksnappyCom.py | 2 +- pyload/plugins/account/MegaDebridEu.py | 2 +- pyload/plugins/account/MegaRapidCz.py | 2 +- pyload/plugins/account/MegasharesCom.py | 2 +- pyload/plugins/account/MultishareCz.py | 2 +- pyload/plugins/account/MyfastfileCom.py | 2 +- pyload/plugins/account/NetloadIn.py | 2 +- pyload/plugins/account/NowVideoAt.py | 2 +- pyload/plugins/account/OboomCom.py | 2 +- pyload/plugins/account/OneFichierCom.py | 2 +- pyload/plugins/account/OverLoadMe.py | 2 +- pyload/plugins/account/PremiumTo.py | 2 +- pyload/plugins/account/PremiumizeMe.py | 2 +- pyload/plugins/account/QuickshareCz.py | 2 +- pyload/plugins/account/RPNetBiz.py | 2 +- pyload/plugins/account/RapidgatorNet.py | 2 +- pyload/plugins/account/RapiduNet.py | 2 +- pyload/plugins/account/RealdebridCom.py | 2 +- pyload/plugins/account/RehostTo.py | 2 +- pyload/plugins/account/ShareonlineBiz.py | 2 +- pyload/plugins/account/SimplyPremiumCom.py | 2 +- pyload/plugins/account/SimplydebridCom.py | 2 +- pyload/plugins/account/StahnuTo.py | 2 +- pyload/plugins/account/TurbobitNet.py | 2 +- pyload/plugins/account/UlozTo.py | 2 +- pyload/plugins/account/UnrestrictLi.py | 2 +- pyload/plugins/account/UploadedTo.py | 2 +- pyload/plugins/account/UploadheroCom.py | 2 +- pyload/plugins/account/UploadingCom.py | 2 +- pyload/plugins/account/YibaishiwuCom.py | 2 +- pyload/plugins/account/ZeveraCom.py | 2 +- pyload/plugins/addon/Checksum.py | 2 +- pyload/plugins/addon/ClickAndLoad.py | 2 +- pyload/plugins/addon/DeleteFinished.py | 2 +- pyload/plugins/addon/DownloadScheduler.py | 2 +- pyload/plugins/addon/ExternalScripts.py | 2 +- pyload/plugins/addon/ExtractArchive.py | 2 +- pyload/plugins/addon/HotFolder.py | 2 +- pyload/plugins/addon/IRCInterface.py | 2 +- pyload/plugins/addon/MergeFiles.py | 4 +- pyload/plugins/addon/MultiHome.py | 2 +- pyload/plugins/addon/RestartFailed.py | 2 +- pyload/plugins/addon/RestartSlow.py | 2 +- pyload/plugins/addon/SkipRev.py | 2 +- pyload/plugins/addon/UnSkipOnFail.py | 2 +- pyload/plugins/addon/UpdateManager.py | 2 +- pyload/plugins/addon/WindowsPhoneToastNotify.py | 2 +- pyload/plugins/captcha/AdYouLike.py | 2 +- pyload/plugins/captcha/AdsCaptcha.py | 2 +- pyload/plugins/captcha/ReCaptcha.py | 2 +- pyload/plugins/captcha/SolveMedia.py | 2 +- pyload/plugins/container/CCF.py | 2 +- pyload/plugins/container/LinkList.py | 2 +- pyload/plugins/container/RSDF.py | 2 +- pyload/plugins/crypter/ChipDe.py | 2 +- pyload/plugins/crypter/CzshareCom.py | 2 +- pyload/plugins/crypter/DDLMusicOrg.py | 2 +- pyload/plugins/crypter/DailymotionBatch.py | 2 +- pyload/plugins/crypter/Dereferer.py | 2 +- pyload/plugins/crypter/DontKnowMe.py | 2 +- pyload/plugins/crypter/DuckCryptInfo.py | 2 +- pyload/plugins/crypter/EmbeduploadCom.py | 2 +- pyload/plugins/crypter/FilecryptCc.py | 2 +- pyload/plugins/crypter/FileserveCom.py | 2 +- pyload/plugins/crypter/FourChanOrg.py | 2 +- pyload/plugins/crypter/GooGl.py | 2 +- pyload/plugins/crypter/HoerbuchIn.py | 2 +- pyload/plugins/crypter/LetitbitNet.py | 2 +- pyload/plugins/crypter/LinkCryptWs.py | 2 +- pyload/plugins/crypter/LinkdecrypterCom.py | 2 +- pyload/plugins/crypter/LixIn.py | 2 +- pyload/plugins/crypter/MediafireCom.py | 2 +- pyload/plugins/crypter/MultiloadCz.py | 2 +- pyload/plugins/crypter/NCryptIn.py | 2 +- pyload/plugins/crypter/OneKhDe.py | 2 +- pyload/plugins/crypter/QuickshareCz.py | 2 +- pyload/plugins/crypter/RelinkUs.py | 2 +- pyload/plugins/crypter/SafelinkingNet.py | 2 +- pyload/plugins/crypter/SexuriaCom.py | 2 +- pyload/plugins/crypter/ShareLinksBiz.py | 2 +- pyload/plugins/crypter/UlozTo.py | 2 +- pyload/plugins/crypter/XupPl.py | 2 +- pyload/plugins/crypter/YoutubeBatch.py | 2 +- pyload/plugins/hook/BypassCaptcha.py | 4 +- pyload/plugins/hook/Captcha9kw.py | 4 +- pyload/plugins/hook/CaptchaBrotherhood.py | 4 +- pyload/plugins/hook/DeathByCaptcha.py | 4 +- pyload/plugins/hook/ExpertDecoders.py | 4 +- pyload/plugins/hook/ImageTyperz.py | 4 +- pyload/plugins/hook/LinkdecrypterCom.py | 4 +- pyload/plugins/hook/XFileSharingPro.py | 4 +- pyload/plugins/hoster/AlldebridCom.py | 2 +- pyload/plugins/hoster/DailymotionCom.py | 2 +- pyload/plugins/hoster/DebridItaliaCom.py | 2 +- pyload/plugins/hoster/FastixRu.py | 2 +- pyload/plugins/hoster/FilesMailRu.py | 2 +- pyload/plugins/hoster/FileserveCom.py | 2 +- pyload/plugins/hoster/FreakshareCom.py | 2 +- pyload/plugins/hoster/FreeWayMe.py | 2 +- pyload/plugins/hoster/Ftp.py | 2 +- pyload/plugins/hoster/GamefrontCom.py | 2 +- pyload/plugins/hoster/LinksnappyCom.py | 2 +- pyload/plugins/hoster/MegaCoNz.py | 2 +- pyload/plugins/hoster/MegaDebridEu.py | 2 +- pyload/plugins/hoster/MyfastfileCom.py | 2 +- pyload/plugins/hoster/MyvideoDe.py | 2 +- pyload/plugins/hoster/NetloadIn.py | 2 +- pyload/plugins/hoster/OboomCom.py | 2 +- pyload/plugins/hoster/OverLoadMe.py | 2 +- pyload/plugins/hoster/PornhostCom.py | 2 +- pyload/plugins/hoster/PornhubCom.py | 2 +- pyload/plugins/hoster/PremiumTo.py | 2 +- pyload/plugins/hoster/PremiumizeMe.py | 2 +- pyload/plugins/hoster/RPNetBiz.py | 2 +- pyload/plugins/hoster/RealdebridCom.py | 2 +- pyload/plugins/hoster/RedtubeCom.py | 2 +- pyload/plugins/hoster/RehostTo.py | 2 +- pyload/plugins/hoster/ShareplaceCom.py | 2 +- pyload/plugins/hoster/SimplyPremiumCom.py | 2 +- pyload/plugins/hoster/SimplydebridCom.py | 2 +- pyload/plugins/hoster/SoundcloudCom.py | 2 +- pyload/plugins/hoster/StreamCz.py | 2 +- pyload/plugins/hoster/UnrestrictLi.py | 2 +- pyload/plugins/hoster/UploadedTo.py | 2 +- pyload/plugins/hoster/VeehdCom.py | 2 +- pyload/plugins/hoster/XHamsterCom.py | 2 +- pyload/plugins/hoster/XVideosCom.py | 2 +- pyload/plugins/hoster/Xdcc.py | 2 +- pyload/plugins/hoster/YoupornCom.py | 2 +- pyload/plugins/hoster/YourfilesTo.py | 2 +- pyload/plugins/hoster/YoutubeCom.py | 2 +- pyload/plugins/hoster/ZDF.py | 2 +- pyload/plugins/hoster/ZeveraCom.py | 2 +- pyload/plugins/internal/Account.py | 305 ----------------------- pyload/plugins/internal/Addon.py | 169 ------------- pyload/plugins/internal/BasePlugin.py | 4 +- pyload/plugins/internal/Captcha.py | 51 ---- pyload/plugins/internal/Container.py | 66 ----- pyload/plugins/internal/Crypter.py | 107 -------- pyload/plugins/internal/DeadCrypter.py | 2 +- pyload/plugins/internal/DeadHoster.py | 2 +- pyload/plugins/internal/Hoster.py | 21 -- pyload/plugins/internal/MultiHoster.py | 2 +- pyload/plugins/internal/OCR.py | 315 ------------------------ pyload/plugins/internal/SimpleCrypter.py | 2 +- pyload/plugins/internal/SimpleHoster.py | 2 +- pyload/plugins/internal/UpdateManager.py | 2 +- pyload/plugins/internal/XFSAccount.py | 2 +- pyload/plugins/ocr/GigasizeCom.py | 2 +- pyload/plugins/ocr/LinksaveIn.py | 2 +- pyload/plugins/ocr/NetloadIn.py | 2 +- pyload/plugins/ocr/ShareonlineBiz.py | 2 +- 184 files changed, 1214 insertions(+), 1214 deletions(-) create mode 100644 pyload/plugins/Account.py create mode 100644 pyload/plugins/Addon.py create mode 100644 pyload/plugins/Captcha.py create mode 100644 pyload/plugins/Container.py create mode 100644 pyload/plugins/Crypter.py create mode 100644 pyload/plugins/Hoster.py create mode 100644 pyload/plugins/OCR.py delete mode 100644 pyload/plugins/internal/Account.py delete mode 100644 pyload/plugins/internal/Addon.py delete mode 100644 pyload/plugins/internal/Captcha.py delete mode 100644 pyload/plugins/internal/Container.py delete mode 100644 pyload/plugins/internal/Crypter.py delete mode 100644 pyload/plugins/internal/Hoster.py delete mode 100644 pyload/plugins/internal/OCR.py (limited to 'pyload/plugins') diff --git a/pyload/plugins/Account.py b/pyload/plugins/Account.py new file mode 100644 index 000000000..b5125d61c --- /dev/null +++ b/pyload/plugins/Account.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +from random import choice +from time import time +from traceback import print_exc +from threading import RLock + +from pyload.plugins.Plugin import Base +from pyload.utils import compare_time, parseFileSize, lock + + +class WrongPassword(Exception): + pass + + +class Account(Base): + """ + Base class for every Account plugin. + Just overwrite `login` and cookies will be stored and account becomes accessible in\ + associated hoster plugin. Plugin should also provide `loadAccountInfo` + """ + __name__ = "Account" + __type__ = "account" + __version__ = "0.03" + + __description__ = """Base account plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + + #: after that time (in minutes) pyload will relogin the account + login_timeout = 10 * 60 + #: after that time (in minutes) account data will be reloaded + info_threshold = 10 * 60 + + + def __init__(self, manager, accounts): + Base.__init__(self, manager.core) + + self.manager = manager + self.accounts = {} + self.infos = {} #: cache for account information + self.lock = RLock() + self.timestamps = {} + + self.init() + + self.setAccounts(accounts) + + + def init(self): + pass + + + def login(self, user, data, req): + """login into account, the cookies will be saved so user can be recognized + + :param user: loginname + :param data: data dictionary + :param req: `Request` instance + """ + pass + + + @lock + def _login(self, user, data): + # set timestamp for login + self.timestamps[user] = time() + + req = self.getAccountRequest(user) + try: + self.login(user, data, req) + except WrongPassword: + self.logWarning( + _("Could not login with account %(user)s | %(msg)s") % {"user": user, + "msg": _("Wrong Password")}) + success = data['valid'] = False + except Exception, e: + self.logWarning( + _("Could not login with account %(user)s | %(msg)s") % {"user": user, + "msg": e}) + success = data['valid'] = False + if self.core.debug: + print_exc() + else: + success = True + finally: + if req: + req.close() + return success + + + def relogin(self, user): + req = self.getAccountRequest(user) + if req: + req.cj.clear() + req.close() + if user in self.infos: + del self.infos[user] #delete old information + + return self._login(user, self.accounts[user]) + + + def setAccounts(self, accounts): + self.accounts = accounts + for user, data in self.accounts.iteritems(): + self._login(user, data) + self.infos[user] = {} + + + def updateAccounts(self, user, password=None, options={}): + """ updates account and return true if anything changed """ + + if user in self.accounts: + self.accounts[user]['valid'] = True #do not remove or accounts will not login + if password: + self.accounts[user]['password'] = password + self.relogin(user) + return True + if options: + before = self.accounts[user]['options'] + self.accounts[user]['options'].update(options) + return self.accounts[user]['options'] != before + else: + self.accounts[user] = {"password": password, "options": options, "valid": True} + self._login(user, self.accounts[user]) + return True + + + def removeAccount(self, user): + if user in self.accounts: + del self.accounts[user] + if user in self.infos: + del self.infos[user] + if user in self.timestamps: + del self.timestamps[user] + + + @lock + def getAccountInfo(self, name, force=False): + """retrieve account infos for an user, do **not** overwrite this method!\\ + just use it to retrieve infos in hoster plugins. see `loadAccountInfo` + + :param name: username + :param force: reloads cached account information + :return: dictionary with information + """ + data = Account.loadAccountInfo(self, name) + + if force or name not in self.infos: + self.logDebug("Get Account Info for %s" % name) + req = self.getAccountRequest(name) + + try: + infos = self.loadAccountInfo(name, req) + if not type(infos) == dict: + raise Exception("Wrong return format") + except Exception, e: + infos = {"error": str(e)} + print_exc() + + if req: + req.close() + + self.logDebug("Account Info: %s" % infos) + + infos['timestamp'] = time() + self.infos[name] = infos + elif "timestamp" in self.infos[name] and self.infos[name][ + "timestamp"] + self.info_threshold * 60 < time(): + self.logDebug("Reached timeout for account data") + self.scheduleRefresh(name) + + data.update(self.infos[name]) + return data + + + def isPremium(self, user): + info = self.getAccountInfo(user) + return info['premium'] + + + def loadAccountInfo(self, name, req=None): + """this should be overwritten in account plugin,\ + and retrieving account information for user + + :param name: + :param req: `Request` instance + :return: + """ + return {"validuntil": None, #: -1 for unlimited + "login": name, + # "password": self.accounts[name]['password'], #: commented due security reason + "options": self.accounts[name]['options'], + "valid": self.accounts[name]['valid'], + "trafficleft": None, #: in kb, -1 for unlimited + "maxtraffic": None, + "premium": None, + "timestamp": 0, #: time this info was retrieved + "type": self.__name__} + + + def getAllAccounts(self, force=False): + return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()] + + + def getAccountRequest(self, user=None): + if not user: + user, data = self.selectAccount() + if not user: + return None + + req = self.core.requestFactory.getRequest(self.__name__, user) + return req + + + def getAccountCookies(self, user=None): + if not user: + user, data = self.selectAccount() + if not user: + return None + + cj = self.core.requestFactory.getCookieJar(self.__name__, user) + return cj + + + def getAccountData(self, user): + return self.accounts[user] + + + def selectAccount(self): + """ returns an valid account name and data""" + usable = [] + for user, data in self.accounts.iteritems(): + if not data['valid']: continue + + if "time" in data['options'] and data['options']['time']: + time_data = "" + try: + time_data = data['options']['time'][0] + start, end = time_data.split("-") + if not compare_time(start.split(":"), end.split(":")): + continue + except Exception: + self.logWarning(_("Your Time %s has wrong format, use: 1:22-3:44") % time_data) + + if user in self.infos: + if "validuntil" in self.infos[user]: + if self.infos[user]['validuntil'] > 0 and time() > self.infos[user]['validuntil']: + continue + if "trafficleft" in self.infos[user]: + if self.infos[user]['trafficleft'] == 0: + continue + + usable.append((user, data)) + + if not usable: return None, None + return choice(usable) + + + def canUse(self): + return False if self.selectAccount() == (None, None) else True + + + def parseTraffic(self, string): #returns kbyte + return parseFileSize(string) + + + def wrongPassword(self): + raise WrongPassword + + + def empty(self, user): + if user in self.infos: + self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % user) + + self.infos[user].update({"trafficleft": 0}) + self.scheduleRefresh(user, 30 * 60) + + + def expired(self, user): + if user in self.infos: + self.logWarning(_("Account %s is expired, checking again in 1h") % user) + + self.infos[user].update({"validuntil": time() - 1}) + self.scheduleRefresh(user, 60 * 60) + + + def scheduleRefresh(self, user, time=0, force=True): + """ add task to refresh account info to sheduler """ + self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time)) + self.core.scheduler.addJob(time, self.getAccountInfo, [user, force]) + + + @lock + def checkLogin(self, user): + """ checks if user is still logged in """ + if user in self.timestamps: + if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time(): + self.logDebug("Reached login timeout for %s" % user) + return self.relogin(user) + else: + return True + else: + return False diff --git a/pyload/plugins/Addon.py b/pyload/plugins/Addon.py new file mode 100644 index 000000000..ed5a72af8 --- /dev/null +++ b/pyload/plugins/Addon.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- + +from traceback import print_exc + +from pyload.plugins.Plugin import Base + + +class Expose(object): + """ used for decoration to declare rpc services """ + + def __new__(cls, f, *args, **kwargs): + addonManager.addRPC(f.__module__, f.func_name, f.func_doc) + return f + + +def threaded(f): + + def run(*args,**kwargs): + addonManager.startThread(f, *args, **kwargs) + return run + + +class Addon(Base): + """ + Base class for addon plugins. + """ + __name__ = "Addon" + __type__ = "addon" + __version__ = "0.03" + + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Base addon/hook plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de"), + ("RaNaN", "RaNaN@pyload.org")] + + + #: automatically register event listeners for functions, attribute will be deleted dont use it yourself + event_map = {} + + # Alternative to event_map + #: List of events the plugin can handle, name the functions exactly like eventname. + event_list = [] #@NOTE: dont make duplicate entries in event_map + + + def __init__(self, core, manager): + Base.__init__(self, core) + + #: Provide information in dict here, usable by API `getInfo` + self.info = {} + + #: Callback of periodical job task, used by AddonManager + self.cb = None + self.interval = 60 + + #: `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.manager.addEvent(event, getattr(self,f)) + else: + self.manager.addEvent(event, getattr(self,funcs)) + + #delete for various reasons + self.event_map = None + + if self.event_list: + for f in self.event_list: + self.manager.addEvent(f, getattr(self,f)) + + self.event_list = None + + self.setup() + + # self.initPeriodical() + + + def initPeriodical(self, delay=0, threaded=False): + self.cb = self.core.scheduler.addJob(delay, self._periodical, args=[threaded], threaded=threaded) + + + def _periodical(self, threaded): + if self.interval < 0: + self.cb = None + return + + try: + self.periodical() + + except Exception, e: + self.logError(_("Error executing addon: %s") % e) + if self.core.debug: + print_exc() + + self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=threaded) + + + def __repr__(self): + return "" % self.__name__ + + + def setup(self): + """ more init stuff if needed """ + pass + + + def unload(self): + """ called when addon was deactivated """ + pass + + + def isActivated(self): + """ checks if addon is activated""" + return self.core.config.getPlugin(self.__name__, "activated") + + + #event methods - overwrite these if needed + def coreReady(self): + pass + + + def coreExiting(self): + pass + + + def downloadPreparing(self, pyfile): + pass + + + def downloadFinished(self, pyfile): + pass + + + def downloadFailed(self, pyfile): + pass + + + def packageFinished(self, pypack): + pass + + + def beforeReconnecting(self, ip): + pass + + + def afterReconnecting(self, ip): + pass + + + def periodical(self): + pass + + + def newCaptchaTask(self, task): + """ new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """ + pass + + + def captchaCorrect(self, task): + pass + + + def captchaInvalid(self, task): + pass diff --git a/pyload/plugins/Captcha.py b/pyload/plugins/Captcha.py new file mode 100644 index 000000000..7197c390e --- /dev/null +++ b/pyload/plugins/Captcha.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Plugin import Plugin + + +class Captcha(Plugin): + __name__ = "Captcha" + __type__ = "captcha" + __version__ = "0.14" + + __description__ = """Base captcha service plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + KEY_PATTERN = None + + key = None #: last key detected + + + def __init__(self, plugin): + self.plugin = plugin + + + def detect_key(self, html=None): + if not html: + if hasattr(self.plugin, "html") and self.plugin.html: + html = self.plugin.html + else: + errmsg = _("%s html not found") % self.__name__ + self.plugin.error(errmsg) + raise TypeError(errmsg) + + m = re.search(self.KEY_PATTERN, html) + if m: + self.key = m.group("KEY") + self.plugin.logDebug("%s key: %s" % (self.__name__, self.key)) + return self.key + else: + self.plugin.logDebug("%s key not found" % self.__name__) + return None + + + def challenge(self, key=None): + raise NotImplementedError + + + def result(self, server, challenge): + raise NotImplementedError diff --git a/pyload/plugins/Container.py b/pyload/plugins/Container.py new file mode 100644 index 000000000..3320217ae --- /dev/null +++ b/pyload/plugins/Container.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import re + +from os import remove +from os.path import basename, exists + +from pyload.plugins.internal.Crypter import Crypter +from pyload.utils import safe_join + + +class Container(Crypter): + __name__ = "Container" + __type__ = "container" + __version__ = "0.01" + + __pattern__ = r'^unmatchable$' + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Base container decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + + def preprocessing(self, thread): + """prepare""" + + self.setup() + self.thread = thread + + self.loadToDisk() + + self.decrypt(self.pyfile) + self.deleteTmp() + + self.createPackages() + + + def loadToDisk(self): + """loads container to disk if its stored remotely and overwrite url, + or check existent on several places at disk""" + + if self.pyfile.url.startswith("http"): + self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1] + content = self.load(self.pyfile.url) + self.pyfile.url = safe_join(self.core.config['general']['download_folder'], self.pyfile.name) + try: + with open(self.pyfile.url, "wb") as f: + f.write(content) + except IOError, e: + self.fail(str(e)) + + else: + self.pyfile.name = basename(self.pyfile.url) + if not exists(self.pyfile.url): + if exists(safe_join(pypath, self.pyfile.url)): + self.pyfile.url = safe_join(pypath, self.pyfile.url) + else: + self.fail(_("File not exists")) + + + def deleteTmp(self): + if self.pyfile.name.startswith("tmp_"): + remove(self.pyfile.url) diff --git a/pyload/plugins/Crypter.py b/pyload/plugins/Crypter.py new file mode 100644 index 000000000..8580def61 --- /dev/null +++ b/pyload/plugins/Crypter.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +from urlparse import urlparse + +from pyload.plugins.Plugin import Plugin +from pyload.utils import decode, html_unescape, safe_filename + + +class Crypter(Plugin): + __name__ = "Crypter" + __type__ = "crypter" + __version__ = "0.05" + + __pattern__ = r'^unmatchable$' + __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), #: Overrides core.config['general']['folder_per_package'] + ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] + + __description__ = """Base decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + html = None #: last html loaded + + + def __init__(self, pyfile): + #: Put all packages here. It's a list of tuples like: ( name, [list of links], folder ) + self.packages = [] + + #: List of urls, pyLoad will generate packagenames + self.urls = [] + + Plugin.__init__(self, pyfile) + + + def process(self, pyfile): + """ main method """ + + self.decrypt(pyfile) + + if self.urls: + self.generatePackages() + + elif not self.packages: + self.error(_("No link extracted"), "decrypt") + + self.createPackages() + + + def decrypt(self, pyfile): + raise NotImplementedError + + + def generatePackages(self): + """ generate new packages from self.urls """ + + packages = map(lambda name, links: (name, links, None), self.core.api.generatePackages(self.urls).iteritems()) + self.packages.extend(packages) + + + def createPackages(self): + """ create new packages from self.packages """ + + package_folder = self.pyfile.package().folder + package_password = self.pyfile.package().password + package_queue = self.pyfile.package().queue + + folder_per_package = self.core.config['general']['folder_per_package'] + try: + use_subfolder = self.getConfig('use_subfolder') + except Exception: + use_subfolder = folder_per_package + try: + subfolder_per_package = self.getConfig('subfolder_per_package') + except Exception: + subfolder_per_package = True + + for pack in self.packages: + name, links, folder = pack + + self.logDebug("Parsed package: %s" % name, + "%d links" % len(links), + "Saved to folder: %s" % folder if folder else "Saved to download folder") + + links = map(decode, links) + + pid = self.core.api.addPackage(name, links, package_queue) + + if package_password: + self.core.api.setPackageData(pid, {"password": package_password}) + + setFolder = lambda x: self.core.api.setPackageData(pid, {"folder": x or ""}) #: Workaround to do not break API addPackage method + + if use_subfolder: + if not subfolder_per_package: + setFolder(package_folder) + self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) + + elif not folder_per_package or name != folder: + if not folder: + folder = urlparse(html_unescape(name)).path.split("/")[-1] + + setFolder(folder) + self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) + + elif folder_per_package: + setFolder(None) diff --git a/pyload/plugins/Hoster.py b/pyload/plugins/Hoster.py new file mode 100644 index 000000000..ea225262e --- /dev/null +++ b/pyload/plugins/Hoster.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.Plugin import Plugin + + +def getInfo(self): + #result = [ .. (name, size, status, url) .. ] + return + + +class Hoster(Plugin): + __name__ = "Hoster" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'^unmatchable$' + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Base hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] diff --git a/pyload/plugins/OCR.py b/pyload/plugins/OCR.py new file mode 100644 index 000000000..8e60737b6 --- /dev/null +++ b/pyload/plugins/OCR.py @@ -0,0 +1,315 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +try: + from PIL import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin +except ImportError: + import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin + +import logging +import subprocess + +from os.path import abspath, join + + +class OCR(object): + __name__ = "OCR" + __type__ = "ocr" + __version__ = "0.10" + + __description__ = """Base OCR plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + def __init__(self): + self.logger = logging.getLogger("log") + + + def load_image(self, image): + self.image = Image.open(image) + self.pixels = self.image.load() + self.result_captcha = '' + + + def unload(self): + """delete all tmp images""" + pass + + + def threshold(self, value): + self.image = self.image.point(lambda a: a * value + 10) + + + def run(self, command): + """Run a command""" + + popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + popen.wait() + output = popen.stdout.read() + " | " + popen.stderr.read() + popen.stdout.close() + popen.stderr.close() + self.logger.debug("Tesseract ReturnCode %s Output: %s" % (popen.returncode, output)) + + + def run_tesser(self, subset=False, digits=True, lowercase=True, uppercase=True): + #tmpTif = tempfile.NamedTemporaryFile(suffix=".tif") + try: + tmpTif = open(join("tmp", "tmpTif_%s.tif" % self.__name__), "wb") + tmpTif.close() + + #tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt") + tmpTxt = open(join("tmp", "tmpTxt_%s.txt" % self.__name__), "wb") + tmpTxt.close() + + except IOError, e: + self.logError(e) + return + + self.logger.debug("save tiff") + self.image.save(tmpTif.name, 'TIFF') + + if os.name == "nt": + tessparams = [join(pypath, "tesseract", "tesseract.exe")] + else: + tessparams = ['tesseract'] + + tessparams.extend([abspath(tmpTif.name), abspath(tmpTxt.name).replace(".txt", "")] ) + + if subset and (digits or lowercase or uppercase): + #tmpSub = tempfile.NamedTemporaryFile(suffix=".subset") + with open(join("tmp", "tmpSub_%s.subset" % self.__name__), "wb") as tmpSub: + tmpSub.write("tessedit_char_whitelist ") + + if digits: + tmpSub.write("0123456789") + if lowercase: + tmpSub.write("abcdefghijklmnopqrstuvwxyz") + if uppercase: + tmpSub.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + + tmpSub.write("\n") + tessparams.append("nobatch") + tessparams.append(abspath(tmpSub.name)) + + self.logger.debug("run tesseract") + self.run(tessparams) + self.logger.debug("read txt") + + try: + with open(tmpTxt.name, 'r') as f: + self.result_captcha = f.read().replace("\n", "") + except Exception: + self.result_captcha = "" + + self.logger.debug(self.result_captcha) + try: + os.remove(tmpTif.name) + os.remove(tmpTxt.name) + if subset and (digits or lowercase or uppercase): + os.remove(tmpSub.name) + except Exception: + pass + + + def get_captcha(self, name): + raise NotImplementedError + + + def to_greyscale(self): + if self.image.mode != 'L': + self.image = self.image.convert('L') + + self.pixels = self.image.load() + + + def eval_black_white(self, limit): + self.pixels = self.image.load() + w, h = self.image.size + for x in xrange(w): + for y in xrange(h): + if self.pixels[x, y] > limit: + self.pixels[x, y] = 255 + else: + self.pixels[x, y] = 0 + + + def clean(self, allowed): + pixels = self.pixels + + w, h = self.image.size + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 255: + continue + # No point in processing white pixels since we only want to remove black pixel + count = 0 + + try: + if pixels[x - 1, y - 1] != 255: + count += 1 + if pixels[x - 1, y] != 255: + count += 1 + if pixels[x - 1, y + 1] != 255: + count += 1 + if pixels[x, y + 1] != 255: + count += 1 + if pixels[x + 1, y + 1] != 255: + count += 1 + if pixels[x + 1, y] != 255: + count += 1 + if pixels[x + 1, y - 1] != 255: + count += 1 + if pixels[x, y - 1] != 255: + count += 1 + except Exception: + pass + + # not enough neighbors are dark pixels so mark this pixel + # to be changed to white + if count < allowed: + pixels[x, y] = 1 + + # second pass: this time set all 1's to 255 (white) + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 1: + pixels[x, y] = 255 + + self.pixels = pixels + + + def derotate_by_average(self): + """rotate by checking each angle and guess most suitable""" + + w, h = self.image.size + pixels = self.pixels + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 155 + + highest = {} + counts = {} + + for angle in xrange(-45, 45): + + tmpimage = self.image.rotate(angle) + + pixels = tmpimage.load() + + w, h = self.image.size + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + + count = {} + + for x in xrange(w): + count[x] = 0 + for y in xrange(h): + if pixels[x, y] == 155: + count[x] += 1 + + sum = 0 + cnt = 0 + + for x in count.values(): + if x != 0: + sum += x + cnt += 1 + + avg = sum / cnt + counts[angle] = cnt + highest[angle] = 0 + for x in count.values(): + if x > highest[angle]: + highest[angle] = x + + highest[angle] = highest[angle] - avg + + hkey = 0 + hvalue = 0 + + for key, value in highest.iteritems(): + if value > hvalue: + hkey = key + hvalue = value + + self.image = self.image.rotate(hkey) + pixels = self.image.load() + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + + if pixels[x, y] == 155: + pixels[x, y] = 0 + + self.pixels = pixels + + + def split_captcha_letters(self): + captcha = self.image + started = False + letters = [] + width, height = captcha.size + bottomY, topY = 0, height + pixels = captcha.load() + + for x in xrange(width): + black_pixel_in_col = False + for y in xrange(height): + if pixels[x, y] != 255: + if not started: + started = True + firstX = x + lastX = x + + if y > bottomY: + bottomY = y + if y < topY: + topY = y + if x > lastX: + lastX = x + + black_pixel_in_col = True + + if black_pixel_in_col is False and started is True: + rect = (firstX, topY, lastX, bottomY) + new_captcha = captcha.crop(rect) + + w, h = new_captcha.size + if w > 5 and h > 5: + letters.append(new_captcha) + + started = False + bottomY, topY = 0, height + + return letters + + + def correct(self, values, var=None): + if var: + result = var + else: + result = self.result_captcha + + for key, item in values.iteritems(): + + if key.__class__ == str: + result = result.replace(key, item) + else: + for expr in key: + result = result.replace(expr, item) + + if var: + return result + else: + self.result_captcha = result diff --git a/pyload/plugins/account/AlldebridCom.py b/pyload/plugins/account/AlldebridCom.py index a3e8ad659..701e81fe1 100644 --- a/pyload/plugins/account/AlldebridCom.py +++ b/pyload/plugins/account/AlldebridCom.py @@ -8,7 +8,7 @@ from urllib import urlencode from BeautifulSoup import BeautifulSoup -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class AlldebridCom(Account): diff --git a/pyload/plugins/account/BayfilesCom.py b/pyload/plugins/account/BayfilesCom.py index 34163d0cc..30e8e66b3 100644 --- a/pyload/plugins/account/BayfilesCom.py +++ b/pyload/plugins/account/BayfilesCom.py @@ -2,7 +2,7 @@ from time import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/BitshareCom.py b/pyload/plugins/account/BitshareCom.py index 44b2818cf..cd28ec677 100644 --- a/pyload/plugins/account/BitshareCom.py +++ b/pyload/plugins/account/BitshareCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class BitshareCom(Account): diff --git a/pyload/plugins/account/CatShareNet.py b/pyload/plugins/account/CatShareNet.py index e172d6aee..bb0cc9771 100644 --- a/pyload/plugins/account/CatShareNet.py +++ b/pyload/plugins/account/CatShareNet.py @@ -4,7 +4,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class CatShareNet(Account): diff --git a/pyload/plugins/account/CzshareCom.py b/pyload/plugins/account/CzshareCom.py index 786832e8d..ad9644150 100644 --- a/pyload/plugins/account/CzshareCom.py +++ b/pyload/plugins/account/CzshareCom.py @@ -3,7 +3,7 @@ from time import mktime, strptime import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class CzshareCom(Account): diff --git a/pyload/plugins/account/DebridItaliaCom.py b/pyload/plugins/account/DebridItaliaCom.py index 41f796327..faef46c6b 100644 --- a/pyload/plugins/account/DebridItaliaCom.py +++ b/pyload/plugins/account/DebridItaliaCom.py @@ -4,7 +4,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class DebridItaliaCom(Account): diff --git a/pyload/plugins/account/DepositfilesCom.py b/pyload/plugins/account/DepositfilesCom.py index 688fcc505..264e55c5a 100644 --- a/pyload/plugins/account/DepositfilesCom.py +++ b/pyload/plugins/account/DepositfilesCom.py @@ -4,7 +4,7 @@ import re from time import strptime, mktime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class DepositfilesCom(Account): diff --git a/pyload/plugins/account/EuroshareEu.py b/pyload/plugins/account/EuroshareEu.py index 5ec543433..ccb213997 100644 --- a/pyload/plugins/account/EuroshareEu.py +++ b/pyload/plugins/account/EuroshareEu.py @@ -3,7 +3,7 @@ from time import mktime, strptime import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class EuroshareEu(Account): diff --git a/pyload/plugins/account/FastixRu.py b/pyload/plugins/account/FastixRu.py index 829316ce3..a2d21d5fd 100644 --- a/pyload/plugins/account/FastixRu.py +++ b/pyload/plugins/account/FastixRu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FastshareCz.py b/pyload/plugins/account/FastshareCz.py index 32c897317..1c8f6fd48 100644 --- a/pyload/plugins/account/FastshareCz.py +++ b/pyload/plugins/account/FastshareCz.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import parseFileSize diff --git a/pyload/plugins/account/FilecloudIo.py b/pyload/plugins/account/FilecloudIo.py index babef59a2..83faee226 100644 --- a/pyload/plugins/account/FilecloudIo.py +++ b/pyload/plugins/account/FilecloudIo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FilefactoryCom.py b/pyload/plugins/account/FilefactoryCom.py index 0d7c1ff0e..b157dc058 100644 --- a/pyload/plugins/account/FilefactoryCom.py +++ b/pyload/plugins/account/FilefactoryCom.py @@ -5,7 +5,7 @@ from time import mktime, strptime from pycurl import REFERER -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FilefactoryCom(Account): diff --git a/pyload/plugins/account/FilejungleCom.py b/pyload/plugins/account/FilejungleCom.py index 8abb89788..8a7f843cd 100644 --- a/pyload/plugins/account/FilejungleCom.py +++ b/pyload/plugins/account/FilejungleCom.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FilejungleCom(Account): diff --git a/pyload/plugins/account/FilerNet.py b/pyload/plugins/account/FilerNet.py index f9b5efdd3..9c70ff56a 100644 --- a/pyload/plugins/account/FilerNet.py +++ b/pyload/plugins/account/FilerNet.py @@ -3,7 +3,7 @@ import re import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FilerNet(Account): diff --git a/pyload/plugins/account/FilesMailRu.py b/pyload/plugins/account/FilesMailRu.py index b42a7c559..0635e185e 100644 --- a/pyload/plugins/account/FilesMailRu.py +++ b/pyload/plugins/account/FilesMailRu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FilesMailRu(Account): diff --git a/pyload/plugins/account/FileserveCom.py b/pyload/plugins/account/FileserveCom.py index 8c570b575..0b234513d 100644 --- a/pyload/plugins/account/FileserveCom.py +++ b/pyload/plugins/account/FileserveCom.py @@ -2,7 +2,7 @@ from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FourSharedCom.py b/pyload/plugins/account/FourSharedCom.py index 20293fa5d..338e5ca4c 100644 --- a/pyload/plugins/account/FourSharedCom.py +++ b/pyload/plugins/account/FourSharedCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FreakshareCom.py b/pyload/plugins/account/FreakshareCom.py index 12c5277a6..165d7a5cc 100644 --- a/pyload/plugins/account/FreakshareCom.py +++ b/pyload/plugins/account/FreakshareCom.py @@ -4,7 +4,7 @@ import re from time import strptime, mktime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FreakshareCom(Account): diff --git a/pyload/plugins/account/FreeWayMe.py b/pyload/plugins/account/FreeWayMe.py index db879c052..4d1e68348 100644 --- a/pyload/plugins/account/FreeWayMe.py +++ b/pyload/plugins/account/FreeWayMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FshareVn.py b/pyload/plugins/account/FshareVn.py index ee8aacaf9..547c2b500 100644 --- a/pyload/plugins/account/FshareVn.py +++ b/pyload/plugins/account/FshareVn.py @@ -4,7 +4,7 @@ from time import mktime, strptime from pycurl import REFERER import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class FshareVn(Account): diff --git a/pyload/plugins/account/Ftp.py b/pyload/plugins/account/Ftp.py index d439512ce..bdad58d2b 100644 --- a/pyload/plugins/account/Ftp.py +++ b/pyload/plugins/account/Ftp.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class Ftp(Account): diff --git a/pyload/plugins/account/HellshareCz.py b/pyload/plugins/account/HellshareCz.py index 1b93cf77d..ede621b1d 100644 --- a/pyload/plugins/account/HellshareCz.py +++ b/pyload/plugins/account/HellshareCz.py @@ -3,7 +3,7 @@ import re import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class HellshareCz(Account): diff --git a/pyload/plugins/account/Http.py b/pyload/plugins/account/Http.py index 8c0aeb2e4..97e8e9e7b 100644 --- a/pyload/plugins/account/Http.py +++ b/pyload/plugins/account/Http.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class Http(Account): diff --git a/pyload/plugins/account/Keep2shareCc.py b/pyload/plugins/account/Keep2shareCc.py index 172cedfc2..9636c456f 100644 --- a/pyload/plugins/account/Keep2shareCc.py +++ b/pyload/plugins/account/Keep2shareCc.py @@ -4,7 +4,7 @@ import re from time import gmtime, mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class Keep2shareCc(Account): diff --git a/pyload/plugins/account/LetitbitNet.py b/pyload/plugins/account/LetitbitNet.py index 5bf6de00c..75b0a8264 100644 --- a/pyload/plugins/account/LetitbitNet.py +++ b/pyload/plugins/account/LetitbitNet.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account # from pyload.utils import json_loads, json_dumps diff --git a/pyload/plugins/account/LinksnappyCom.py b/pyload/plugins/account/LinksnappyCom.py index 028465522..f1eba5646 100644 --- a/pyload/plugins/account/LinksnappyCom.py +++ b/pyload/plugins/account/LinksnappyCom.py @@ -2,7 +2,7 @@ from hashlib import md5 -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/MegaDebridEu.py b/pyload/plugins/account/MegaDebridEu.py index 390cc232e..555481c74 100644 --- a/pyload/plugins/account/MegaDebridEu.py +++ b/pyload/plugins/account/MegaDebridEu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/MegaRapidCz.py b/pyload/plugins/account/MegaRapidCz.py index a75e313ff..3fa687a6e 100644 --- a/pyload/plugins/account/MegaRapidCz.py +++ b/pyload/plugins/account/MegaRapidCz.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class MegaRapidCz(Account): diff --git a/pyload/plugins/account/MegasharesCom.py b/pyload/plugins/account/MegasharesCom.py index b2f439b45..ca90e0354 100644 --- a/pyload/plugins/account/MegasharesCom.py +++ b/pyload/plugins/account/MegasharesCom.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class MegasharesCom(Account): diff --git a/pyload/plugins/account/MultishareCz.py b/pyload/plugins/account/MultishareCz.py index 9dc5b1ff0..69deef8f4 100644 --- a/pyload/plugins/account/MultishareCz.py +++ b/pyload/plugins/account/MultishareCz.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class MultishareCz(Account): diff --git a/pyload/plugins/account/MyfastfileCom.py b/pyload/plugins/account/MyfastfileCom.py index acc09ad8b..a99522fa7 100644 --- a/pyload/plugins/account/MyfastfileCom.py +++ b/pyload/plugins/account/MyfastfileCom.py @@ -2,7 +2,7 @@ from time import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/NetloadIn.py b/pyload/plugins/account/NetloadIn.py index 341803670..3b5a65f92 100644 --- a/pyload/plugins/account/NetloadIn.py +++ b/pyload/plugins/account/NetloadIn.py @@ -3,7 +3,7 @@ import re from time import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class NetloadIn(Account): diff --git a/pyload/plugins/account/NowVideoAt.py b/pyload/plugins/account/NowVideoAt.py index 7af8bc4bc..b18c28b62 100644 --- a/pyload/plugins/account/NowVideoAt.py +++ b/pyload/plugins/account/NowVideoAt.py @@ -4,7 +4,7 @@ import re from time import gmtime, mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class NowVideoAt(Account): diff --git a/pyload/plugins/account/OboomCom.py b/pyload/plugins/account/OboomCom.py index 5ee35f973..265424602 100644 --- a/pyload/plugins/account/OboomCom.py +++ b/pyload/plugins/account/OboomCom.py @@ -5,7 +5,7 @@ import time from beaker.crypto.pbkdf2 import PBKDF2 from pyload.utils import json_loads -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class OboomCom(Account): diff --git a/pyload/plugins/account/OneFichierCom.py b/pyload/plugins/account/OneFichierCom.py index 7f1140e67..55583f3ad 100644 --- a/pyload/plugins/account/OneFichierCom.py +++ b/pyload/plugins/account/OneFichierCom.py @@ -6,7 +6,7 @@ from time import strptime, mktime from pycurl import REFERER -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class OneFichierCom(Account): diff --git a/pyload/plugins/account/OverLoadMe.py b/pyload/plugins/account/OverLoadMe.py index cda4bc82f..201598b26 100644 --- a/pyload/plugins/account/OverLoadMe.py +++ b/pyload/plugins/account/OverLoadMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/PremiumTo.py b/pyload/plugins/account/PremiumTo.py index e94eed6fb..96fdf859b 100644 --- a/pyload/plugins/account/PremiumTo.py +++ b/pyload/plugins/account/PremiumTo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class PremiumTo(Account): diff --git a/pyload/plugins/account/PremiumizeMe.py b/pyload/plugins/account/PremiumizeMe.py index c06baf21d..68c9a599b 100644 --- a/pyload/plugins/account/PremiumizeMe.py +++ b/pyload/plugins/account/PremiumizeMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/QuickshareCz.py b/pyload/plugins/account/QuickshareCz.py index 40bf9d06d..21af09589 100644 --- a/pyload/plugins/account/QuickshareCz.py +++ b/pyload/plugins/account/QuickshareCz.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class QuickshareCz(Account): diff --git a/pyload/plugins/account/RPNetBiz.py b/pyload/plugins/account/RPNetBiz.py index 70622ff45..2073452df 100644 --- a/pyload/plugins/account/RPNetBiz.py +++ b/pyload/plugins/account/RPNetBiz.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/RapidgatorNet.py b/pyload/plugins/account/RapidgatorNet.py index 72a46a928..fc0c50ca1 100644 --- a/pyload/plugins/account/RapidgatorNet.py +++ b/pyload/plugins/account/RapidgatorNet.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/RapiduNet.py b/pyload/plugins/account/RapiduNet.py index 6837f5c91..4bc418069 100644 --- a/pyload/plugins/account/RapiduNet.py +++ b/pyload/plugins/account/RapiduNet.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/RealdebridCom.py b/pyload/plugins/account/RealdebridCom.py index b7773d9a0..bee51de31 100644 --- a/pyload/plugins/account/RealdebridCom.py +++ b/pyload/plugins/account/RealdebridCom.py @@ -2,7 +2,7 @@ import xml.dom.minidom as dom -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class RealdebridCom(Account): diff --git a/pyload/plugins/account/RehostTo.py b/pyload/plugins/account/RehostTo.py index 23c1eeda1..e613dec06 100644 --- a/pyload/plugins/account/RehostTo.py +++ b/pyload/plugins/account/RehostTo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class RehostTo(Account): diff --git a/pyload/plugins/account/ShareonlineBiz.py b/pyload/plugins/account/ShareonlineBiz.py index dbbe93869..42bced626 100644 --- a/pyload/plugins/account/ShareonlineBiz.py +++ b/pyload/plugins/account/ShareonlineBiz.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class ShareonlineBiz(Account): diff --git a/pyload/plugins/account/SimplyPremiumCom.py b/pyload/plugins/account/SimplyPremiumCom.py index b3dad84d3..2dafb12d0 100644 --- a/pyload/plugins/account/SimplyPremiumCom.py +++ b/pyload/plugins/account/SimplyPremiumCom.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from pyload.utils import json_loads -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class SimplyPremiumCom(Account): diff --git a/pyload/plugins/account/SimplydebridCom.py b/pyload/plugins/account/SimplydebridCom.py index 1942e178c..5cf148d4d 100644 --- a/pyload/plugins/account/SimplydebridCom.py +++ b/pyload/plugins/account/SimplydebridCom.py @@ -2,7 +2,7 @@ from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class SimplydebridCom(Account): diff --git a/pyload/plugins/account/StahnuTo.py b/pyload/plugins/account/StahnuTo.py index 70ef292e7..c08b26b49 100644 --- a/pyload/plugins/account/StahnuTo.py +++ b/pyload/plugins/account/StahnuTo.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class StahnuTo(Account): diff --git a/pyload/plugins/account/TurbobitNet.py b/pyload/plugins/account/TurbobitNet.py index e2f56905c..7370f4f33 100644 --- a/pyload/plugins/account/TurbobitNet.py +++ b/pyload/plugins/account/TurbobitNet.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class TurbobitNet(Account): diff --git a/pyload/plugins/account/UlozTo.py b/pyload/plugins/account/UlozTo.py index 2cdab0167..1c27182b6 100644 --- a/pyload/plugins/account/UlozTo.py +++ b/pyload/plugins/account/UlozTo.py @@ -4,7 +4,7 @@ import re from urlparse import urljoin -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class UlozTo(Account): diff --git a/pyload/plugins/account/UnrestrictLi.py b/pyload/plugins/account/UnrestrictLi.py index 30144ca65..dae1b0779 100644 --- a/pyload/plugins/account/UnrestrictLi.py +++ b/pyload/plugins/account/UnrestrictLi.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/UploadedTo.py b/pyload/plugins/account/UploadedTo.py index f5c5d22b2..82b95694e 100644 --- a/pyload/plugins/account/UploadedTo.py +++ b/pyload/plugins/account/UploadedTo.py @@ -3,7 +3,7 @@ import re from time import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class UploadedTo(Account): diff --git a/pyload/plugins/account/UploadheroCom.py b/pyload/plugins/account/UploadheroCom.py index 9406de38f..02863b736 100644 --- a/pyload/plugins/account/UploadheroCom.py +++ b/pyload/plugins/account/UploadheroCom.py @@ -4,7 +4,7 @@ import re import datetime import time -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class UploadheroCom(Account): diff --git a/pyload/plugins/account/UploadingCom.py b/pyload/plugins/account/UploadingCom.py index 8f308b0b6..979f73d21 100644 --- a/pyload/plugins/account/UploadingCom.py +++ b/pyload/plugins/account/UploadingCom.py @@ -4,7 +4,7 @@ import re from time import time, strptime, mktime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.plugins.internal.SimpleHoster import set_cookies diff --git a/pyload/plugins/account/YibaishiwuCom.py b/pyload/plugins/account/YibaishiwuCom.py index 06a606bc4..1bdb12886 100644 --- a/pyload/plugins/account/YibaishiwuCom.py +++ b/pyload/plugins/account/YibaishiwuCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class YibaishiwuCom(Account): diff --git a/pyload/plugins/account/ZeveraCom.py b/pyload/plugins/account/ZeveraCom.py index dfd4f29f5..198434643 100644 --- a/pyload/plugins/account/ZeveraCom.py +++ b/pyload/plugins/account/ZeveraCom.py @@ -2,7 +2,7 @@ from time import mktime, strptime -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account class ZeveraCom(Account): diff --git a/pyload/plugins/addon/Checksum.py b/pyload/plugins/addon/Checksum.py index ce50d1b28..d6b10d7e2 100644 --- a/pyload/plugins/addon/Checksum.py +++ b/pyload/plugins/addon/Checksum.py @@ -9,7 +9,7 @@ import zlib from os import remove from os.path import getsize, isfile, splitext -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import safe_join, fs_encode diff --git a/pyload/plugins/addon/ClickAndLoad.py b/pyload/plugins/addon/ClickAndLoad.py index 1f55b15dd..f4a6314be 100644 --- a/pyload/plugins/addon/ClickAndLoad.py +++ b/pyload/plugins/addon/ClickAndLoad.py @@ -3,7 +3,7 @@ from socket import socket, error from threading import Thread -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon def forward(source, destination): diff --git a/pyload/plugins/addon/DeleteFinished.py b/pyload/plugins/addon/DeleteFinished.py index 43908b9a3..3a966dcd6 100644 --- a/pyload/plugins/addon/DeleteFinished.py +++ b/pyload/plugins/addon/DeleteFinished.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from pyload.database import style -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon class DeleteFinished(Addon): diff --git a/pyload/plugins/addon/DownloadScheduler.py b/pyload/plugins/addon/DownloadScheduler.py index c1f1fca11..ea58b3d01 100644 --- a/pyload/plugins/addon/DownloadScheduler.py +++ b/pyload/plugins/addon/DownloadScheduler.py @@ -4,7 +4,7 @@ import re from time import localtime -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon class DownloadScheduler(Addon): diff --git a/pyload/plugins/addon/ExternalScripts.py b/pyload/plugins/addon/ExternalScripts.py index af863abb0..531e2f275 100644 --- a/pyload/plugins/addon/ExternalScripts.py +++ b/pyload/plugins/addon/ExternalScripts.py @@ -6,7 +6,7 @@ from itertools import chain from os import listdir, access, X_OK, makedirs from os.path import join, exists, basename, abspath -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import safe_join diff --git a/pyload/plugins/addon/ExtractArchive.py b/pyload/plugins/addon/ExtractArchive.py index 60b66740c..1a416f901 100644 --- a/pyload/plugins/addon/ExtractArchive.py +++ b/pyload/plugins/addon/ExtractArchive.py @@ -51,7 +51,7 @@ if os.name != "nt": from os import chown from pwd import getpwnam -from pyload.plugins.internal.Addon import Addon, threaded, Expose +from pyload.plugins.Addon import Addon, threaded, Expose from pyload.plugins.internal.AbstractExtractor import ArchiveError, CRCError, WrongPassword from pyload.utils import safe_join, fs_encode diff --git a/pyload/plugins/addon/HotFolder.py b/pyload/plugins/addon/HotFolder.py index ff714d69e..801ed7bef 100644 --- a/pyload/plugins/addon/HotFolder.py +++ b/pyload/plugins/addon/HotFolder.py @@ -8,7 +8,7 @@ from os import listdir, makedirs from os.path import exists, isfile, join from shutil import move -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import fs_encode, safe_join diff --git a/pyload/plugins/addon/IRCInterface.py b/pyload/plugins/addon/IRCInterface.py index bba8f86d8..2e0919caa 100644 --- a/pyload/plugins/addon/IRCInterface.py +++ b/pyload/plugins/addon/IRCInterface.py @@ -13,7 +13,7 @@ from traceback import print_exc from pyload.api import PackageDoesNotExists, FileDoesNotExists from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import formatSize diff --git a/pyload/plugins/addon/MergeFiles.py b/pyload/plugins/addon/MergeFiles.py index 0c9b05283..8a2573409 100644 --- a/pyload/plugins/addon/MergeFiles.py +++ b/pyload/plugins/addon/MergeFiles.py @@ -7,7 +7,7 @@ import re from traceback import print_exc -from pyload.plugins.internal.Addon import Addon, threaded +from pyload.plugins.Addon import Addon, threaded from pyload.utils import safe_join, fs_encode @@ -50,7 +50,7 @@ class MergeFiles(Addon): for name, file_list in files.iteritems(): self.logInfo(_("Starting merging of"), name) - final_file = open(save_join(download_folder, name), "wb") + final_file = open(safe_join(download_folder, name), "wb") for splitted_file in file_list: self.logDebug("Merging part", splitted_file) diff --git a/pyload/plugins/addon/MultiHome.py b/pyload/plugins/addon/MultiHome.py index 3450cab27..0db1df1bf 100644 --- a/pyload/plugins/addon/MultiHome.py +++ b/pyload/plugins/addon/MultiHome.py @@ -2,7 +2,7 @@ from time import time -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon class MultiHome(Addon): diff --git a/pyload/plugins/addon/RestartFailed.py b/pyload/plugins/addon/RestartFailed.py index f8d9da9cc..0fe0b4af6 100644 --- a/pyload/plugins/addon/RestartFailed.py +++ b/pyload/plugins/addon/RestartFailed.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon class RestartFailed(Addon): diff --git a/pyload/plugins/addon/RestartSlow.py b/pyload/plugins/addon/RestartSlow.py index f3c98c461..acf2852cd 100644 --- a/pyload/plugins/addon/RestartSlow.py +++ b/pyload/plugins/addon/RestartSlow.py @@ -2,7 +2,7 @@ import pycurl -from module.plugins.Addon import Addon +from pyload.plugins.Addon import Addon class RestartSlow(Addon): diff --git a/pyload/plugins/addon/SkipRev.py b/pyload/plugins/addon/SkipRev.py index cf716c509..4a69d8e09 100644 --- a/pyload/plugins/addon/SkipRev.py +++ b/pyload/plugins/addon/SkipRev.py @@ -3,7 +3,7 @@ from urllib import unquote from urlparse import urlparse -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.plugins.Plugin import SkipDownload diff --git a/pyload/plugins/addon/UnSkipOnFail.py b/pyload/plugins/addon/UnSkipOnFail.py index aade5a91e..a148f8f13 100644 --- a/pyload/plugins/addon/UnSkipOnFail.py +++ b/pyload/plugins/addon/UnSkipOnFail.py @@ -3,7 +3,7 @@ from os.path import basename from pyload.datatype.PyFile import PyFile -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import fs_encode diff --git a/pyload/plugins/addon/UpdateManager.py b/pyload/plugins/addon/UpdateManager.py index 577345d69..b4818c943 100644 --- a/pyload/plugins/addon/UpdateManager.py +++ b/pyload/plugins/addon/UpdateManager.py @@ -9,7 +9,7 @@ from operator import itemgetter from os import path, remove, stat from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Addon import Expose, Addon, threaded +from pyload.plugins.Addon import Expose, Addon, threaded from pyload.utils import safe_join diff --git a/pyload/plugins/addon/WindowsPhoneToastNotify.py b/pyload/plugins/addon/WindowsPhoneToastNotify.py index dc618d2d4..a6da7cd20 100644 --- a/pyload/plugins/addon/WindowsPhoneToastNotify.py +++ b/pyload/plugins/addon/WindowsPhoneToastNotify.py @@ -3,7 +3,7 @@ import httplib import time -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon class WindowsPhoneToastNotify(Addon): diff --git a/pyload/plugins/captcha/AdYouLike.py b/pyload/plugins/captcha/AdYouLike.py index c129693da..fdfb18479 100644 --- a/pyload/plugins/captcha/AdYouLike.py +++ b/pyload/plugins/captcha/AdYouLike.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Captcha import Captcha +from pyload.plugins.Captcha import Captcha from pyload.utils import json_loads diff --git a/pyload/plugins/captcha/AdsCaptcha.py b/pyload/plugins/captcha/AdsCaptcha.py index 3f14ebdc0..cc9e54350 100644 --- a/pyload/plugins/captcha/AdsCaptcha.py +++ b/pyload/plugins/captcha/AdsCaptcha.py @@ -4,7 +4,7 @@ import re from random import random -from pyload.plugins.internal.Captcha import Captcha +from pyload.plugins.Captcha import Captcha class AdsCaptcha(Captcha): diff --git a/pyload/plugins/captcha/ReCaptcha.py b/pyload/plugins/captcha/ReCaptcha.py index cce8bbb84..d954ceeb0 100644 --- a/pyload/plugins/captcha/ReCaptcha.py +++ b/pyload/plugins/captcha/ReCaptcha.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Captcha import Captcha +from pyload.plugins.Captcha import Captcha class ReCaptcha(Captcha): diff --git a/pyload/plugins/captcha/SolveMedia.py b/pyload/plugins/captcha/SolveMedia.py index 843aa35e0..130b374b5 100644 --- a/pyload/plugins/captcha/SolveMedia.py +++ b/pyload/plugins/captcha/SolveMedia.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Captcha import Captcha +from pyload.plugins.Captcha import Captcha class SolveMedia(Captcha): diff --git a/pyload/plugins/container/CCF.py b/pyload/plugins/container/CCF.py index a558baa03..1c3991c44 100644 --- a/pyload/plugins/container/CCF.py +++ b/pyload/plugins/container/CCF.py @@ -10,7 +10,7 @@ from urllib2 import build_opener from MultipartPostHandler import MultipartPostHandler -from pyload.plugins.internal.Container import Container +from pyload.plugins.Container import Container from pyload.utils import safe_join diff --git a/pyload/plugins/container/LinkList.py b/pyload/plugins/container/LinkList.py index 9e6396cab..292920630 100644 --- a/pyload/plugins/container/LinkList.py +++ b/pyload/plugins/container/LinkList.py @@ -2,7 +2,7 @@ import codecs -from pyload.plugins.internal.Container import Container +from pyload.plugins.Container import Container from pyload.utils import fs_encode diff --git a/pyload/plugins/container/RSDF.py b/pyload/plugins/container/RSDF.py index 41811469f..a9d0b72c9 100644 --- a/pyload/plugins/container/RSDF.py +++ b/pyload/plugins/container/RSDF.py @@ -6,7 +6,7 @@ import base64 import binascii import re -from pyload.plugins.internal.Container import Container +from pyload.plugins.Container import Container from pyload.utils import fs_encode diff --git a/pyload/plugins/crypter/ChipDe.py b/pyload/plugins/crypter/ChipDe.py index 842fff292..41653bbe3 100644 --- a/pyload/plugins/crypter/ChipDe.py +++ b/pyload/plugins/crypter/ChipDe.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class ChipDe(Crypter): diff --git a/pyload/plugins/crypter/CzshareCom.py b/pyload/plugins/crypter/CzshareCom.py index 61d943222..cd77f118d 100644 --- a/pyload/plugins/crypter/CzshareCom.py +++ b/pyload/plugins/crypter/CzshareCom.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class CzshareCom(Crypter): diff --git a/pyload/plugins/crypter/DDLMusicOrg.py b/pyload/plugins/crypter/DDLMusicOrg.py index ec50a3265..0a07b5427 100644 --- a/pyload/plugins/crypter/DDLMusicOrg.py +++ b/pyload/plugins/crypter/DDLMusicOrg.py @@ -4,7 +4,7 @@ import re from time import sleep -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class DDLMusicOrg(Crypter): diff --git a/pyload/plugins/crypter/DailymotionBatch.py b/pyload/plugins/crypter/DailymotionBatch.py index 4ea26a830..d1233f58c 100644 --- a/pyload/plugins/crypter/DailymotionBatch.py +++ b/pyload/plugins/crypter/DailymotionBatch.py @@ -5,7 +5,7 @@ import re from urlparse import urljoin from pyload.utils import json_loads -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.utils import safe_join diff --git a/pyload/plugins/crypter/Dereferer.py b/pyload/plugins/crypter/Dereferer.py index 94a3aa1e4..b4217217f 100644 --- a/pyload/plugins/crypter/Dereferer.py +++ b/pyload/plugins/crypter/Dereferer.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class Dereferer(Crypter): diff --git a/pyload/plugins/crypter/DontKnowMe.py b/pyload/plugins/crypter/DontKnowMe.py index e48f56561..6ef47dcee 100644 --- a/pyload/plugins/crypter/DontKnowMe.py +++ b/pyload/plugins/crypter/DontKnowMe.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class DontKnowMe(Crypter): diff --git a/pyload/plugins/crypter/DuckCryptInfo.py b/pyload/plugins/crypter/DuckCryptInfo.py index 054783f3c..fc6f95589 100644 --- a/pyload/plugins/crypter/DuckCryptInfo.py +++ b/pyload/plugins/crypter/DuckCryptInfo.py @@ -4,7 +4,7 @@ import re from BeautifulSoup import BeautifulSoup -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class DuckCryptInfo(Crypter): diff --git a/pyload/plugins/crypter/EmbeduploadCom.py b/pyload/plugins/crypter/EmbeduploadCom.py index c6649890f..6e298f8bb 100644 --- a/pyload/plugins/crypter/EmbeduploadCom.py +++ b/pyload/plugins/crypter/EmbeduploadCom.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.network.HTTPRequest import BadHeader diff --git a/pyload/plugins/crypter/FilecryptCc.py b/pyload/plugins/crypter/FilecryptCc.py index ee8b3a99f..6db43bb36 100644 --- a/pyload/plugins/crypter/FilecryptCc.py +++ b/pyload/plugins/crypter/FilecryptCc.py @@ -6,7 +6,7 @@ import re from Crypto.Cipher import AES -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class FilecryptCc(Crypter): diff --git a/pyload/plugins/crypter/FileserveCom.py b/pyload/plugins/crypter/FileserveCom.py index 5ccccfc16..822362c56 100644 --- a/pyload/plugins/crypter/FileserveCom.py +++ b/pyload/plugins/crypter/FileserveCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class FileserveCom(Crypter): diff --git a/pyload/plugins/crypter/FourChanOrg.py b/pyload/plugins/crypter/FourChanOrg.py index 6ce037f22..8d24188cb 100644 --- a/pyload/plugins/crypter/FourChanOrg.py +++ b/pyload/plugins/crypter/FourChanOrg.py @@ -4,7 +4,7 @@ import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class FourChanOrg(Crypter): diff --git a/pyload/plugins/crypter/GooGl.py b/pyload/plugins/crypter/GooGl.py index b5fb40f34..aa9793e2e 100644 --- a/pyload/plugins/crypter/GooGl.py +++ b/pyload/plugins/crypter/GooGl.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.utils import json_loads diff --git a/pyload/plugins/crypter/HoerbuchIn.py b/pyload/plugins/crypter/HoerbuchIn.py index 0bc374e7a..a9d11575e 100644 --- a/pyload/plugins/crypter/HoerbuchIn.py +++ b/pyload/plugins/crypter/HoerbuchIn.py @@ -4,7 +4,7 @@ import re from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class HoerbuchIn(Crypter): diff --git a/pyload/plugins/crypter/LetitbitNet.py b/pyload/plugins/crypter/LetitbitNet.py index 5706465bf..58e9ff31c 100644 --- a/pyload/plugins/crypter/LetitbitNet.py +++ b/pyload/plugins/crypter/LetitbitNet.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class LetitbitNet(Crypter): diff --git a/pyload/plugins/crypter/LinkCryptWs.py b/pyload/plugins/crypter/LinkCryptWs.py index 219d836dd..287e2d6a9 100644 --- a/pyload/plugins/crypter/LinkCryptWs.py +++ b/pyload/plugins/crypter/LinkCryptWs.py @@ -8,7 +8,7 @@ import pycurl from Crypto.Cipher import AES -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.utils import html_unescape diff --git a/pyload/plugins/crypter/LinkdecrypterCom.py b/pyload/plugins/crypter/LinkdecrypterCom.py index 57045c9d0..61e02e9da 100644 --- a/pyload/plugins/crypter/LinkdecrypterCom.py +++ b/pyload/plugins/crypter/LinkdecrypterCom.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class LinkdecrypterCom(Crypter): diff --git a/pyload/plugins/crypter/LixIn.py b/pyload/plugins/crypter/LixIn.py index 2394a17b8..82c23a558 100644 --- a/pyload/plugins/crypter/LixIn.py +++ b/pyload/plugins/crypter/LixIn.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class LixIn(Crypter): diff --git a/pyload/plugins/crypter/MediafireCom.py b/pyload/plugins/crypter/MediafireCom.py index 28c4fa984..4cf3bb88e 100644 --- a/pyload/plugins/crypter/MediafireCom.py +++ b/pyload/plugins/crypter/MediafireCom.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.plugins.hoster.MediafireCom import checkHTMLHeader from pyload.utils import json_loads diff --git a/pyload/plugins/crypter/MultiloadCz.py b/pyload/plugins/crypter/MultiloadCz.py index 75f232929..df94a80f6 100644 --- a/pyload/plugins/crypter/MultiloadCz.py +++ b/pyload/plugins/crypter/MultiloadCz.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class MultiloadCz(Crypter): diff --git a/pyload/plugins/crypter/NCryptIn.py b/pyload/plugins/crypter/NCryptIn.py index 852c75b54..6e4af461c 100644 --- a/pyload/plugins/crypter/NCryptIn.py +++ b/pyload/plugins/crypter/NCryptIn.py @@ -6,7 +6,7 @@ import re from Crypto.Cipher import AES -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.plugins.internal.captcha import ReCaptcha diff --git a/pyload/plugins/crypter/OneKhDe.py b/pyload/plugins/crypter/OneKhDe.py index 14b48549e..48df7481b 100644 --- a/pyload/plugins/crypter/OneKhDe.py +++ b/pyload/plugins/crypter/OneKhDe.py @@ -3,7 +3,7 @@ import re from pyload.utils import html_unescape -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class OneKhDe(Crypter): diff --git a/pyload/plugins/crypter/QuickshareCz.py b/pyload/plugins/crypter/QuickshareCz.py index c1064bd20..ac86daec7 100644 --- a/pyload/plugins/crypter/QuickshareCz.py +++ b/pyload/plugins/crypter/QuickshareCz.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class QuickshareCz(Crypter): diff --git a/pyload/plugins/crypter/RelinkUs.py b/pyload/plugins/crypter/RelinkUs.py index 2eb72dd17..2cc7874ee 100644 --- a/pyload/plugins/crypter/RelinkUs.py +++ b/pyload/plugins/crypter/RelinkUs.py @@ -8,7 +8,7 @@ import re import os from Crypto.Cipher import AES -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class RelinkUs(Crypter): diff --git a/pyload/plugins/crypter/SafelinkingNet.py b/pyload/plugins/crypter/SafelinkingNet.py index 06243d069..324fd42a2 100644 --- a/pyload/plugins/crypter/SafelinkingNet.py +++ b/pyload/plugins/crypter/SafelinkingNet.py @@ -7,7 +7,7 @@ from pycurl import FOLLOWLOCATION from BeautifulSoup import BeautifulSoup from pyload.utils import json_loads -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.plugins.internal.captcha import SolveMedia diff --git a/pyload/plugins/crypter/SexuriaCom.py b/pyload/plugins/crypter/SexuriaCom.py index dd9b01bcd..92428352d 100644 --- a/pyload/plugins/crypter/SexuriaCom.py +++ b/pyload/plugins/crypter/SexuriaCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class SexuriaCom(Crypter): diff --git a/pyload/plugins/crypter/ShareLinksBiz.py b/pyload/plugins/crypter/ShareLinksBiz.py index 64b198100..7572cdadd 100644 --- a/pyload/plugins/crypter/ShareLinksBiz.py +++ b/pyload/plugins/crypter/ShareLinksBiz.py @@ -5,7 +5,7 @@ import binascii import re from Crypto.Cipher import AES -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class ShareLinksBiz(Crypter): diff --git a/pyload/plugins/crypter/UlozTo.py b/pyload/plugins/crypter/UlozTo.py index 53380b5da..e369f338a 100644 --- a/pyload/plugins/crypter/UlozTo.py +++ b/pyload/plugins/crypter/UlozTo.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class UlozTo(Crypter): diff --git a/pyload/plugins/crypter/XupPl.py b/pyload/plugins/crypter/XupPl.py index bf285f96c..7742dc816 100644 --- a/pyload/plugins/crypter/XupPl.py +++ b/pyload/plugins/crypter/XupPl.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter class XupPl(Crypter): diff --git a/pyload/plugins/crypter/YoutubeBatch.py b/pyload/plugins/crypter/YoutubeBatch.py index d25f991e8..365517e29 100644 --- a/pyload/plugins/crypter/YoutubeBatch.py +++ b/pyload/plugins/crypter/YoutubeBatch.py @@ -5,7 +5,7 @@ import re from urlparse import urljoin from pyload.utils import json_loads -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.utils import safe_join diff --git a/pyload/plugins/hook/BypassCaptcha.py b/pyload/plugins/hook/BypassCaptcha.py index 728abf6ed..610cfac64 100644 --- a/pyload/plugins/hook/BypassCaptcha.py +++ b/pyload/plugins/hook/BypassCaptcha.py @@ -4,7 +4,7 @@ from pycurl import FORM_FILE, LOW_SPEED_TIME from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon class BypassCaptchaException(Exception): @@ -25,7 +25,7 @@ class BypassCaptchaException(Exception): return "" % self.err -class BypassCaptcha(Hook): +class BypassCaptcha(Addon): __name__ = "BypassCaptcha" __type__ = "hook" __version__ = "0.05" diff --git a/pyload/plugins/hook/Captcha9kw.py b/pyload/plugins/hook/Captcha9kw.py index 9f0f80c2d..f3f086adf 100644 --- a/pyload/plugins/hook/Captcha9kw.py +++ b/pyload/plugins/hook/Captcha9kw.py @@ -10,10 +10,10 @@ from time import sleep from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon -class Captcha9kw(Hook): +class Captcha9kw(Addon): __name__ = "Captcha9kw" __type__ = "hook" __version__ = "0.26" diff --git a/pyload/plugins/hook/CaptchaBrotherhood.py b/pyload/plugins/hook/CaptchaBrotherhood.py index 355081630..333c0be85 100644 --- a/pyload/plugins/hook/CaptchaBrotherhood.py +++ b/pyload/plugins/hook/CaptchaBrotherhood.py @@ -14,7 +14,7 @@ from time import sleep from urllib import urlencode from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon class CaptchaBrotherhoodException(Exception): @@ -35,7 +35,7 @@ class CaptchaBrotherhoodException(Exception): return "" % self.err -class CaptchaBrotherhood(Hook): +class CaptchaBrotherhood(Addon): __name__ = "CaptchaBrotherhood" __type__ = "hook" __version__ = "0.06" diff --git a/pyload/plugins/hook/DeathByCaptcha.py b/pyload/plugins/hook/DeathByCaptcha.py index c076bdcee..f2ccb383b 100644 --- a/pyload/plugins/hook/DeathByCaptcha.py +++ b/pyload/plugins/hook/DeathByCaptcha.py @@ -11,7 +11,7 @@ from time import sleep from pyload.utils import json_loads from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getRequest -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon class DeathByCaptchaException(Exception): @@ -48,7 +48,7 @@ class DeathByCaptchaException(Exception): return "" % self.err -class DeathByCaptcha(Hook): +class DeathByCaptcha(Addon): __name__ = "DeathByCaptcha" __type__ = "hook" __version__ = "0.04" diff --git a/pyload/plugins/hook/ExpertDecoders.py b/pyload/plugins/hook/ExpertDecoders.py index c9da38fe9..a9b9bdf2c 100644 --- a/pyload/plugins/hook/ExpertDecoders.py +++ b/pyload/plugins/hook/ExpertDecoders.py @@ -8,10 +8,10 @@ from uuid import uuid4 from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon -class ExpertDecoders(Hook): +class ExpertDecoders(Addon): __name__ = "ExpertDecoders" __type__ = "hook" __version__ = "0.02" diff --git a/pyload/plugins/hook/ImageTyperz.py b/pyload/plugins/hook/ImageTyperz.py index 5e35a61e4..2432dce7d 100644 --- a/pyload/plugins/hook/ImageTyperz.py +++ b/pyload/plugins/hook/ImageTyperz.py @@ -8,7 +8,7 @@ from base64 import b64encode from pycurl import FORM_FILE, LOW_SPEED_TIME from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon class ImageTyperzException(Exception): @@ -29,7 +29,7 @@ class ImageTyperzException(Exception): return "" % self.err -class ImageTyperz(Hook): +class ImageTyperz(Addon): __name__ = "ImageTyperz" __type__ = "hook" __version__ = "0.05" diff --git a/pyload/plugins/hook/LinkdecrypterCom.py b/pyload/plugins/hook/LinkdecrypterCom.py index e99d79b7f..0e8ec7554 100644 --- a/pyload/plugins/hook/LinkdecrypterCom.py +++ b/pyload/plugins/hook/LinkdecrypterCom.py @@ -3,11 +3,11 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon from pyload.utils import remove_chars -class LinkdecrypterCom(Hook): +class LinkdecrypterCom(Addon): __name__ = "LinkdecrypterCom" __type__ = "hook" __version__ = "0.21" diff --git a/pyload/plugins/hook/XFileSharingPro.py b/pyload/plugins/hook/XFileSharingPro.py index 17baed8b2..cc4fc760d 100644 --- a/pyload/plugins/hook/XFileSharingPro.py +++ b/pyload/plugins/hook/XFileSharingPro.py @@ -2,10 +2,10 @@ import re -from pyload.plugins.internal.Addon import Hook +from pyload.plugins.Addon import Addon -class XFileSharingPro(Hook): +class XFileSharingPro(Addon): __name__ = "XFileSharingPro" __type__ = "hook" __version__ = "0.26" diff --git a/pyload/plugins/hoster/AlldebridCom.py b/pyload/plugins/hoster/AlldebridCom.py index d575c305e..d2ce331d3 100644 --- a/pyload/plugins/hoster/AlldebridCom.py +++ b/pyload/plugins/hoster/AlldebridCom.py @@ -6,7 +6,7 @@ from random import randrange from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/DailymotionCom.py b/pyload/plugins/hoster/DailymotionCom.py index 201897719..f8489552f 100644 --- a/pyload/plugins/hoster/DailymotionCom.py +++ b/pyload/plugins/hoster/DailymotionCom.py @@ -5,7 +5,7 @@ import re from pyload.datatype.PyFile import statusMap from pyload.utils import json_loads from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster def getInfo(urls): diff --git a/pyload/plugins/hoster/DebridItaliaCom.py b/pyload/plugins/hoster/DebridItaliaCom.py index a629b06a9..cc33b9f46 100644 --- a/pyload/plugins/hoster/DebridItaliaCom.py +++ b/pyload/plugins/hoster/DebridItaliaCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.internal.SimpleHoster import replace_patterns diff --git a/pyload/plugins/hoster/FastixRu.py b/pyload/plugins/hoster/FastixRu.py index 42be856ed..eead00f28 100644 --- a/pyload/plugins/hoster/FastixRu.py +++ b/pyload/plugins/hoster/FastixRu.py @@ -6,7 +6,7 @@ from random import randrange from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class FastixRu(Hoster): diff --git a/pyload/plugins/hoster/FilesMailRu.py b/pyload/plugins/hoster/FilesMailRu.py index 4a5118fda..23f03f5c9 100644 --- a/pyload/plugins/hoster/FilesMailRu.py +++ b/pyload/plugins/hoster/FilesMailRu.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.Plugin import chunks diff --git a/pyload/plugins/hoster/FileserveCom.py b/pyload/plugins/hoster/FileserveCom.py index d98de9e6b..5c94d42fa 100644 --- a/pyload/plugins/hoster/FileserveCom.py +++ b/pyload/plugins/hoster/FileserveCom.py @@ -4,7 +4,7 @@ import re from pyload.utils import json_loads from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight from pyload.plugins.internal.captcha import ReCaptcha diff --git a/pyload/plugins/hoster/FreakshareCom.py b/pyload/plugins/hoster/FreakshareCom.py index ba4b7ddb0..c2e45e857 100644 --- a/pyload/plugins/hoster/FreakshareCom.py +++ b/pyload/plugins/hoster/FreakshareCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight from pyload.plugins.internal.captcha import ReCaptcha diff --git a/pyload/plugins/hoster/FreeWayMe.py b/pyload/plugins/hoster/FreeWayMe.py index 153b41b32..c940fe094 100644 --- a/pyload/plugins/hoster/FreeWayMe.py +++ b/pyload/plugins/hoster/FreeWayMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class FreeWayMe(Hoster): diff --git a/pyload/plugins/hoster/Ftp.py b/pyload/plugins/hoster/Ftp.py index c130cc395..c7fb856eb 100644 --- a/pyload/plugins/hoster/Ftp.py +++ b/pyload/plugins/hoster/Ftp.py @@ -6,7 +6,7 @@ import re from urllib import quote, unquote from urlparse import urlparse -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class Ftp(Hoster): diff --git a/pyload/plugins/hoster/GamefrontCom.py b/pyload/plugins/hoster/GamefrontCom.py index 50a5be554..91c63fc62 100644 --- a/pyload/plugins/hoster/GamefrontCom.py +++ b/pyload/plugins/hoster/GamefrontCom.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/LinksnappyCom.py b/pyload/plugins/hoster/LinksnappyCom.py index d7991ff3c..392aa78ca 100644 --- a/pyload/plugins/hoster/LinksnappyCom.py +++ b/pyload/plugins/hoster/LinksnappyCom.py @@ -5,7 +5,7 @@ import re from urlparse import urlsplit from pyload.utils import json_loads, json_dumps -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class LinksnappyCom(Hoster): diff --git a/pyload/plugins/hoster/MegaCoNz.py b/pyload/plugins/hoster/MegaCoNz.py index 182c0c9b9..f17760abb 100644 --- a/pyload/plugins/hoster/MegaCoNz.py +++ b/pyload/plugins/hoster/MegaCoNz.py @@ -12,7 +12,7 @@ from Crypto.Util import Counter from pycurl import SSL_CIPHER_LIST from pyload.utils import json_loads, json_dumps -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster ############################ General errors ################################### # EINTERNAL (-1): An internal error has occurred. Please submit a bug report, detailing the exact circumstances in which this error occurred diff --git a/pyload/plugins/hoster/MegaDebridEu.py b/pyload/plugins/hoster/MegaDebridEu.py index 66b12b164..848651d1f 100644 --- a/pyload/plugins/hoster/MegaDebridEu.py +++ b/pyload/plugins/hoster/MegaDebridEu.py @@ -5,7 +5,7 @@ import re from urllib import unquote_plus from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class MegaDebridEu(Hoster): diff --git a/pyload/plugins/hoster/MyfastfileCom.py b/pyload/plugins/hoster/MyfastfileCom.py index cb1148389..6bdc9a108 100644 --- a/pyload/plugins/hoster/MyfastfileCom.py +++ b/pyload/plugins/hoster/MyfastfileCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import json_loads diff --git a/pyload/plugins/hoster/MyvideoDe.py b/pyload/plugins/hoster/MyvideoDe.py index e23856f0b..84841b1a4 100644 --- a/pyload/plugins/hoster/MyvideoDe.py +++ b/pyload/plugins/hoster/MyvideoDe.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/NetloadIn.py b/pyload/plugins/hoster/NetloadIn.py index 0aabc8f57..785d2f465 100644 --- a/pyload/plugins/hoster/NetloadIn.py +++ b/pyload/plugins/hoster/NetloadIn.py @@ -6,7 +6,7 @@ from urlparse import urljoin from time import sleep, time from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.captcha import ReCaptcha diff --git a/pyload/plugins/hoster/OboomCom.py b/pyload/plugins/hoster/OboomCom.py index 2f50f5f87..f78e98b91 100644 --- a/pyload/plugins/hoster/OboomCom.py +++ b/pyload/plugins/hoster/OboomCom.py @@ -6,7 +6,7 @@ import re from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.internal.captcha import ReCaptcha diff --git a/pyload/plugins/hoster/OverLoadMe.py b/pyload/plugins/hoster/OverLoadMe.py index 3d07db489..eda3e1848 100644 --- a/pyload/plugins/hoster/OverLoadMe.py +++ b/pyload/plugins/hoster/OverLoadMe.py @@ -6,7 +6,7 @@ from random import randrange from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/PornhostCom.py b/pyload/plugins/hoster/PornhostCom.py index 3f1650bf0..00d316ef1 100644 --- a/pyload/plugins/hoster/PornhostCom.py +++ b/pyload/plugins/hoster/PornhostCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class PornhostCom(Hoster): diff --git a/pyload/plugins/hoster/PornhubCom.py b/pyload/plugins/hoster/PornhubCom.py index 7cbcabf16..df070b618 100644 --- a/pyload/plugins/hoster/PornhubCom.py +++ b/pyload/plugins/hoster/PornhubCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class PornhubCom(Hoster): diff --git a/pyload/plugins/hoster/PremiumTo.py b/pyload/plugins/hoster/PremiumTo.py index 04e00849a..b4b05126b 100644 --- a/pyload/plugins/hoster/PremiumTo.py +++ b/pyload/plugins/hoster/PremiumTo.py @@ -6,7 +6,7 @@ from os import remove from os.path import exists from urllib import quote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import fs_encode diff --git a/pyload/plugins/hoster/PremiumizeMe.py b/pyload/plugins/hoster/PremiumizeMe.py index ff56adf79..641f587f1 100644 --- a/pyload/plugins/hoster/PremiumizeMe.py +++ b/pyload/plugins/hoster/PremiumizeMe.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class PremiumizeMe(Hoster): diff --git a/pyload/plugins/hoster/RPNetBiz.py b/pyload/plugins/hoster/RPNetBiz.py index 9b2ff8d8c..6ab7b7066 100644 --- a/pyload/plugins/hoster/RPNetBiz.py +++ b/pyload/plugins/hoster/RPNetBiz.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import json_loads diff --git a/pyload/plugins/hoster/RealdebridCom.py b/pyload/plugins/hoster/RealdebridCom.py index cc4731e3f..b5ce0e44f 100644 --- a/pyload/plugins/hoster/RealdebridCom.py +++ b/pyload/plugins/hoster/RealdebridCom.py @@ -7,7 +7,7 @@ from urllib import quote, unquote from time import time from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/RedtubeCom.py b/pyload/plugins/hoster/RedtubeCom.py index ed143d987..86264d9de 100644 --- a/pyload/plugins/hoster/RedtubeCom.py +++ b/pyload/plugins/hoster/RedtubeCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/RehostTo.py b/pyload/plugins/hoster/RehostTo.py index 99d44b1aa..88da33c23 100644 --- a/pyload/plugins/hoster/RehostTo.py +++ b/pyload/plugins/hoster/RehostTo.py @@ -2,7 +2,7 @@ from urllib import quote, unquote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class RehostTo(Hoster): diff --git a/pyload/plugins/hoster/ShareplaceCom.py b/pyload/plugins/hoster/ShareplaceCom.py index 6e11de05c..ae3f60a0b 100644 --- a/pyload/plugins/hoster/ShareplaceCom.py +++ b/pyload/plugins/hoster/ShareplaceCom.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class ShareplaceCom(Hoster): diff --git a/pyload/plugins/hoster/SimplyPremiumCom.py b/pyload/plugins/hoster/SimplyPremiumCom.py index b0ea9f90f..271d05849 100644 --- a/pyload/plugins/hoster/SimplyPremiumCom.py +++ b/pyload/plugins/hoster/SimplyPremiumCom.py @@ -4,7 +4,7 @@ import re from datetime import datetime, timedelta -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight diff --git a/pyload/plugins/hoster/SimplydebridCom.py b/pyload/plugins/hoster/SimplydebridCom.py index f9063d737..4e187ee0d 100644 --- a/pyload/plugins/hoster/SimplydebridCom.py +++ b/pyload/plugins/hoster/SimplydebridCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class SimplydebridCom(Hoster): diff --git a/pyload/plugins/hoster/SoundcloudCom.py b/pyload/plugins/hoster/SoundcloudCom.py index cc6ef83f3..faed23439 100644 --- a/pyload/plugins/hoster/SoundcloudCom.py +++ b/pyload/plugins/hoster/SoundcloudCom.py @@ -3,7 +3,7 @@ import pycurl import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class SoundcloudCom(Hoster): diff --git a/pyload/plugins/hoster/StreamCz.py b/pyload/plugins/hoster/StreamCz.py index e999e4c25..d8b5d9efd 100644 --- a/pyload/plugins/hoster/StreamCz.py +++ b/pyload/plugins/hoster/StreamCz.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster def getInfo(urls): diff --git a/pyload/plugins/hoster/UnrestrictLi.py b/pyload/plugins/hoster/UnrestrictLi.py index 998c097fd..b6cead4bb 100644 --- a/pyload/plugins/hoster/UnrestrictLi.py +++ b/pyload/plugins/hoster/UnrestrictLi.py @@ -5,7 +5,7 @@ import re from datetime import datetime, timedelta from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster def secondsToMidnight(gmt=0): diff --git a/pyload/plugins/hoster/UploadedTo.py b/pyload/plugins/hoster/UploadedTo.py index e8dea32c2..1bf4dc899 100644 --- a/pyload/plugins/hoster/UploadedTo.py +++ b/pyload/plugins/hoster/UploadedTo.py @@ -9,7 +9,7 @@ import re from time import sleep from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.internal.captcha import ReCaptcha from pyload.utils import html_unescape, parseFileSize diff --git a/pyload/plugins/hoster/VeehdCom.py b/pyload/plugins/hoster/VeehdCom.py index 326d0a18e..03ad789de 100644 --- a/pyload/plugins/hoster/VeehdCom.py +++ b/pyload/plugins/hoster/VeehdCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class VeehdCom(Hoster): diff --git a/pyload/plugins/hoster/XHamsterCom.py b/pyload/plugins/hoster/XHamsterCom.py index 503022ec9..9d2bc59ef 100644 --- a/pyload/plugins/hoster/XHamsterCom.py +++ b/pyload/plugins/hoster/XHamsterCom.py @@ -5,7 +5,7 @@ import re from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster def clean_json(json_expr): diff --git a/pyload/plugins/hoster/XVideosCom.py b/pyload/plugins/hoster/XVideosCom.py index 530858bbf..c072d7edb 100644 --- a/pyload/plugins/hoster/XVideosCom.py +++ b/pyload/plugins/hoster/XVideosCom.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class XVideosCom(Hoster): diff --git a/pyload/plugins/hoster/Xdcc.py b/pyload/plugins/hoster/Xdcc.py index de750ee58..15131bf60 100644 --- a/pyload/plugins/hoster/Xdcc.py +++ b/pyload/plugins/hoster/Xdcc.py @@ -10,7 +10,7 @@ from os import makedirs from os.path import exists, join from select import select -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import safe_join diff --git a/pyload/plugins/hoster/YoupornCom.py b/pyload/plugins/hoster/YoupornCom.py index b214d820c..1c14fce00 100644 --- a/pyload/plugins/hoster/YoupornCom.py +++ b/pyload/plugins/hoster/YoupornCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class YoupornCom(Hoster): diff --git a/pyload/plugins/hoster/YourfilesTo.py b/pyload/plugins/hoster/YourfilesTo.py index 7cb94a2df..95c4e27f5 100644 --- a/pyload/plugins/hoster/YourfilesTo.py +++ b/pyload/plugins/hoster/YourfilesTo.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class YourfilesTo(Hoster): diff --git a/pyload/plugins/hoster/YoutubeCom.py b/pyload/plugins/hoster/YoutubeCom.py index 7570ddc1d..37370c6be 100644 --- a/pyload/plugins/hoster/YoutubeCom.py +++ b/pyload/plugins/hoster/YoutubeCom.py @@ -6,7 +6,7 @@ import subprocess from urllib import unquote -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.plugins.internal.SimpleHoster import replace_patterns from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/ZDF.py b/pyload/plugins/hoster/ZDF.py index 9917955ec..2e63036b3 100644 --- a/pyload/plugins/hoster/ZDF.py +++ b/pyload/plugins/hoster/ZDF.py @@ -4,7 +4,7 @@ import re from xml.etree.ElementTree import fromstring -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster # Based on zdfm by Roland Beermann (http://github.com/enkore/zdfm/) diff --git a/pyload/plugins/hoster/ZeveraCom.py b/pyload/plugins/hoster/ZeveraCom.py index d298d42f0..aa574b405 100644 --- a/pyload/plugins/hoster/ZeveraCom.py +++ b/pyload/plugins/hoster/ZeveraCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class ZeveraCom(Hoster): diff --git a/pyload/plugins/internal/Account.py b/pyload/plugins/internal/Account.py deleted file mode 100644 index b5125d61c..000000000 --- a/pyload/plugins/internal/Account.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- coding: utf-8 -*- - -from random import choice -from time import time -from traceback import print_exc -from threading import RLock - -from pyload.plugins.Plugin import Base -from pyload.utils import compare_time, parseFileSize, lock - - -class WrongPassword(Exception): - pass - - -class Account(Base): - """ - Base class for every Account plugin. - Just overwrite `login` and cookies will be stored and account becomes accessible in\ - associated hoster plugin. Plugin should also provide `loadAccountInfo` - """ - __name__ = "Account" - __type__ = "account" - __version__ = "0.03" - - __description__ = """Base account plugin""" - __license__ = "GPLv3" - __authors__ = [("mkaay", "mkaay@mkaay.de")] - - - #: after that time (in minutes) pyload will relogin the account - login_timeout = 10 * 60 - #: after that time (in minutes) account data will be reloaded - info_threshold = 10 * 60 - - - def __init__(self, manager, accounts): - Base.__init__(self, manager.core) - - self.manager = manager - self.accounts = {} - self.infos = {} #: cache for account information - self.lock = RLock() - self.timestamps = {} - - self.init() - - self.setAccounts(accounts) - - - def init(self): - pass - - - def login(self, user, data, req): - """login into account, the cookies will be saved so user can be recognized - - :param user: loginname - :param data: data dictionary - :param req: `Request` instance - """ - pass - - - @lock - def _login(self, user, data): - # set timestamp for login - self.timestamps[user] = time() - - req = self.getAccountRequest(user) - try: - self.login(user, data, req) - except WrongPassword: - self.logWarning( - _("Could not login with account %(user)s | %(msg)s") % {"user": user, - "msg": _("Wrong Password")}) - success = data['valid'] = False - except Exception, e: - self.logWarning( - _("Could not login with account %(user)s | %(msg)s") % {"user": user, - "msg": e}) - success = data['valid'] = False - if self.core.debug: - print_exc() - else: - success = True - finally: - if req: - req.close() - return success - - - def relogin(self, user): - req = self.getAccountRequest(user) - if req: - req.cj.clear() - req.close() - if user in self.infos: - del self.infos[user] #delete old information - - return self._login(user, self.accounts[user]) - - - def setAccounts(self, accounts): - self.accounts = accounts - for user, data in self.accounts.iteritems(): - self._login(user, data) - self.infos[user] = {} - - - def updateAccounts(self, user, password=None, options={}): - """ updates account and return true if anything changed """ - - if user in self.accounts: - self.accounts[user]['valid'] = True #do not remove or accounts will not login - if password: - self.accounts[user]['password'] = password - self.relogin(user) - return True - if options: - before = self.accounts[user]['options'] - self.accounts[user]['options'].update(options) - return self.accounts[user]['options'] != before - else: - self.accounts[user] = {"password": password, "options": options, "valid": True} - self._login(user, self.accounts[user]) - return True - - - def removeAccount(self, user): - if user in self.accounts: - del self.accounts[user] - if user in self.infos: - del self.infos[user] - if user in self.timestamps: - del self.timestamps[user] - - - @lock - def getAccountInfo(self, name, force=False): - """retrieve account infos for an user, do **not** overwrite this method!\\ - just use it to retrieve infos in hoster plugins. see `loadAccountInfo` - - :param name: username - :param force: reloads cached account information - :return: dictionary with information - """ - data = Account.loadAccountInfo(self, name) - - if force or name not in self.infos: - self.logDebug("Get Account Info for %s" % name) - req = self.getAccountRequest(name) - - try: - infos = self.loadAccountInfo(name, req) - if not type(infos) == dict: - raise Exception("Wrong return format") - except Exception, e: - infos = {"error": str(e)} - print_exc() - - if req: - req.close() - - self.logDebug("Account Info: %s" % infos) - - infos['timestamp'] = time() - self.infos[name] = infos - elif "timestamp" in self.infos[name] and self.infos[name][ - "timestamp"] + self.info_threshold * 60 < time(): - self.logDebug("Reached timeout for account data") - self.scheduleRefresh(name) - - data.update(self.infos[name]) - return data - - - def isPremium(self, user): - info = self.getAccountInfo(user) - return info['premium'] - - - def loadAccountInfo(self, name, req=None): - """this should be overwritten in account plugin,\ - and retrieving account information for user - - :param name: - :param req: `Request` instance - :return: - """ - return {"validuntil": None, #: -1 for unlimited - "login": name, - # "password": self.accounts[name]['password'], #: commented due security reason - "options": self.accounts[name]['options'], - "valid": self.accounts[name]['valid'], - "trafficleft": None, #: in kb, -1 for unlimited - "maxtraffic": None, - "premium": None, - "timestamp": 0, #: time this info was retrieved - "type": self.__name__} - - - def getAllAccounts(self, force=False): - return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()] - - - def getAccountRequest(self, user=None): - if not user: - user, data = self.selectAccount() - if not user: - return None - - req = self.core.requestFactory.getRequest(self.__name__, user) - return req - - - def getAccountCookies(self, user=None): - if not user: - user, data = self.selectAccount() - if not user: - return None - - cj = self.core.requestFactory.getCookieJar(self.__name__, user) - return cj - - - def getAccountData(self, user): - return self.accounts[user] - - - def selectAccount(self): - """ returns an valid account name and data""" - usable = [] - for user, data in self.accounts.iteritems(): - if not data['valid']: continue - - if "time" in data['options'] and data['options']['time']: - time_data = "" - try: - time_data = data['options']['time'][0] - start, end = time_data.split("-") - if not compare_time(start.split(":"), end.split(":")): - continue - except Exception: - self.logWarning(_("Your Time %s has wrong format, use: 1:22-3:44") % time_data) - - if user in self.infos: - if "validuntil" in self.infos[user]: - if self.infos[user]['validuntil'] > 0 and time() > self.infos[user]['validuntil']: - continue - if "trafficleft" in self.infos[user]: - if self.infos[user]['trafficleft'] == 0: - continue - - usable.append((user, data)) - - if not usable: return None, None - return choice(usable) - - - def canUse(self): - return False if self.selectAccount() == (None, None) else True - - - def parseTraffic(self, string): #returns kbyte - return parseFileSize(string) - - - def wrongPassword(self): - raise WrongPassword - - - def empty(self, user): - if user in self.infos: - self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % user) - - self.infos[user].update({"trafficleft": 0}) - self.scheduleRefresh(user, 30 * 60) - - - def expired(self, user): - if user in self.infos: - self.logWarning(_("Account %s is expired, checking again in 1h") % user) - - self.infos[user].update({"validuntil": time() - 1}) - self.scheduleRefresh(user, 60 * 60) - - - def scheduleRefresh(self, user, time=0, force=True): - """ add task to refresh account info to sheduler """ - self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time)) - self.core.scheduler.addJob(time, self.getAccountInfo, [user, force]) - - - @lock - def checkLogin(self, user): - """ checks if user is still logged in """ - if user in self.timestamps: - if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time(): - self.logDebug("Reached login timeout for %s" % user) - return self.relogin(user) - else: - return True - else: - return False diff --git a/pyload/plugins/internal/Addon.py b/pyload/plugins/internal/Addon.py deleted file mode 100644 index ed5a72af8..000000000 --- a/pyload/plugins/internal/Addon.py +++ /dev/null @@ -1,169 +0,0 @@ -# -*- coding: utf-8 -*- - -from traceback import print_exc - -from pyload.plugins.Plugin import Base - - -class Expose(object): - """ used for decoration to declare rpc services """ - - def __new__(cls, f, *args, **kwargs): - addonManager.addRPC(f.__module__, f.func_name, f.func_doc) - return f - - -def threaded(f): - - def run(*args,**kwargs): - addonManager.startThread(f, *args, **kwargs) - return run - - -class Addon(Base): - """ - Base class for addon plugins. - """ - __name__ = "Addon" - __type__ = "addon" - __version__ = "0.03" - - __config__ = [] #: [("name", "type", "desc", "default")] - - __description__ = """Base addon/hook plugin""" - __license__ = "GPLv3" - __authors__ = [("mkaay", "mkaay@mkaay.de"), - ("RaNaN", "RaNaN@pyload.org")] - - - #: automatically register event listeners for functions, attribute will be deleted dont use it yourself - event_map = {} - - # Alternative to event_map - #: List of events the plugin can handle, name the functions exactly like eventname. - event_list = [] #@NOTE: dont make duplicate entries in event_map - - - def __init__(self, core, manager): - Base.__init__(self, core) - - #: Provide information in dict here, usable by API `getInfo` - self.info = {} - - #: Callback of periodical job task, used by AddonManager - self.cb = None - self.interval = 60 - - #: `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.manager.addEvent(event, getattr(self,f)) - else: - self.manager.addEvent(event, getattr(self,funcs)) - - #delete for various reasons - self.event_map = None - - if self.event_list: - for f in self.event_list: - self.manager.addEvent(f, getattr(self,f)) - - self.event_list = None - - self.setup() - - # self.initPeriodical() - - - def initPeriodical(self, delay=0, threaded=False): - self.cb = self.core.scheduler.addJob(delay, self._periodical, args=[threaded], threaded=threaded) - - - def _periodical(self, threaded): - if self.interval < 0: - self.cb = None - return - - try: - self.periodical() - - except Exception, e: - self.logError(_("Error executing addon: %s") % e) - if self.core.debug: - print_exc() - - self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=threaded) - - - def __repr__(self): - return "" % self.__name__ - - - def setup(self): - """ more init stuff if needed """ - pass - - - def unload(self): - """ called when addon was deactivated """ - pass - - - def isActivated(self): - """ checks if addon is activated""" - return self.core.config.getPlugin(self.__name__, "activated") - - - #event methods - overwrite these if needed - def coreReady(self): - pass - - - def coreExiting(self): - pass - - - def downloadPreparing(self, pyfile): - pass - - - def downloadFinished(self, pyfile): - pass - - - def downloadFailed(self, pyfile): - pass - - - def packageFinished(self, pypack): - pass - - - def beforeReconnecting(self, ip): - pass - - - def afterReconnecting(self, ip): - pass - - - def periodical(self): - pass - - - def newCaptchaTask(self, task): - """ new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """ - pass - - - def captchaCorrect(self, task): - pass - - - def captchaInvalid(self, task): - pass diff --git a/pyload/plugins/internal/BasePlugin.py b/pyload/plugins/internal/BasePlugin.py index a9d81d079..a3f22b344 100644 --- a/pyload/plugins/internal/BasePlugin.py +++ b/pyload/plugins/internal/BasePlugin.py @@ -7,7 +7,7 @@ from urlparse import urljoin, urlparse from pyload.network.HTTPRequest import BadHeader from pyload.plugins.internal.SimpleHoster import create_getInfo -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster class BasePlugin(Hoster): @@ -17,7 +17,7 @@ class BasePlugin(Hoster): __pattern__ = r'^unmatchable$' - __description__ = """Base Plugin when any other didnt fit""" + __description__ = """Base plugin when any other didnt fit""" __license__ = "GPLv3" __authors__ = [("RaNaN", "RaNaN@pyload.org"), ("Walter Purcaro", "vuolter@gmail.com")] diff --git a/pyload/plugins/internal/Captcha.py b/pyload/plugins/internal/Captcha.py deleted file mode 100644 index 7197c390e..000000000 --- a/pyload/plugins/internal/Captcha.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from pyload.plugins.Plugin import Plugin - - -class Captcha(Plugin): - __name__ = "Captcha" - __type__ = "captcha" - __version__ = "0.14" - - __description__ = """Base captcha service plugin""" - __license__ = "GPLv3" - __authors__ = [("pyLoad Team", "admin@pyload.org")] - - - KEY_PATTERN = None - - key = None #: last key detected - - - def __init__(self, plugin): - self.plugin = plugin - - - def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - errmsg = _("%s html not found") % self.__name__ - self.plugin.error(errmsg) - raise TypeError(errmsg) - - m = re.search(self.KEY_PATTERN, html) - if m: - self.key = m.group("KEY") - self.plugin.logDebug("%s key: %s" % (self.__name__, self.key)) - return self.key - else: - self.plugin.logDebug("%s key not found" % self.__name__) - return None - - - def challenge(self, key=None): - raise NotImplementedError - - - def result(self, server, challenge): - raise NotImplementedError diff --git a/pyload/plugins/internal/Container.py b/pyload/plugins/internal/Container.py deleted file mode 100644 index 3320217ae..000000000 --- a/pyload/plugins/internal/Container.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -import re - -from os import remove -from os.path import basename, exists - -from pyload.plugins.internal.Crypter import Crypter -from pyload.utils import safe_join - - -class Container(Crypter): - __name__ = "Container" - __type__ = "container" - __version__ = "0.01" - - __pattern__ = r'^unmatchable$' - __config__ = [] #: [("name", "type", "desc", "default")] - - __description__ = """Base container decrypter plugin""" - __license__ = "GPLv3" - __authors__ = [("mkaay", "mkaay@mkaay.de")] - - - def preprocessing(self, thread): - """prepare""" - - self.setup() - self.thread = thread - - self.loadToDisk() - - self.decrypt(self.pyfile) - self.deleteTmp() - - self.createPackages() - - - def loadToDisk(self): - """loads container to disk if its stored remotely and overwrite url, - or check existent on several places at disk""" - - if self.pyfile.url.startswith("http"): - self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1] - content = self.load(self.pyfile.url) - self.pyfile.url = safe_join(self.core.config['general']['download_folder'], self.pyfile.name) - try: - with open(self.pyfile.url, "wb") as f: - f.write(content) - except IOError, e: - self.fail(str(e)) - - else: - self.pyfile.name = basename(self.pyfile.url) - if not exists(self.pyfile.url): - if exists(safe_join(pypath, self.pyfile.url)): - self.pyfile.url = safe_join(pypath, self.pyfile.url) - else: - self.fail(_("File not exists")) - - - def deleteTmp(self): - if self.pyfile.name.startswith("tmp_"): - remove(self.pyfile.url) diff --git a/pyload/plugins/internal/Crypter.py b/pyload/plugins/internal/Crypter.py deleted file mode 100644 index 8580def61..000000000 --- a/pyload/plugins/internal/Crypter.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- - -from urlparse import urlparse - -from pyload.plugins.Plugin import Plugin -from pyload.utils import decode, html_unescape, safe_filename - - -class Crypter(Plugin): - __name__ = "Crypter" - __type__ = "crypter" - __version__ = "0.05" - - __pattern__ = r'^unmatchable$' - __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), #: Overrides core.config['general']['folder_per_package'] - ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] - - __description__ = """Base decrypter plugin""" - __license__ = "GPLv3" - __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] - - - html = None #: last html loaded - - - def __init__(self, pyfile): - #: Put all packages here. It's a list of tuples like: ( name, [list of links], folder ) - self.packages = [] - - #: List of urls, pyLoad will generate packagenames - self.urls = [] - - Plugin.__init__(self, pyfile) - - - def process(self, pyfile): - """ main method """ - - self.decrypt(pyfile) - - if self.urls: - self.generatePackages() - - elif not self.packages: - self.error(_("No link extracted"), "decrypt") - - self.createPackages() - - - def decrypt(self, pyfile): - raise NotImplementedError - - - def generatePackages(self): - """ generate new packages from self.urls """ - - packages = map(lambda name, links: (name, links, None), self.core.api.generatePackages(self.urls).iteritems()) - self.packages.extend(packages) - - - def createPackages(self): - """ create new packages from self.packages """ - - package_folder = self.pyfile.package().folder - package_password = self.pyfile.package().password - package_queue = self.pyfile.package().queue - - folder_per_package = self.core.config['general']['folder_per_package'] - try: - use_subfolder = self.getConfig('use_subfolder') - except Exception: - use_subfolder = folder_per_package - try: - subfolder_per_package = self.getConfig('subfolder_per_package') - except Exception: - subfolder_per_package = True - - for pack in self.packages: - name, links, folder = pack - - self.logDebug("Parsed package: %s" % name, - "%d links" % len(links), - "Saved to folder: %s" % folder if folder else "Saved to download folder") - - links = map(decode, links) - - pid = self.core.api.addPackage(name, links, package_queue) - - if package_password: - self.core.api.setPackageData(pid, {"password": package_password}) - - setFolder = lambda x: self.core.api.setPackageData(pid, {"folder": x or ""}) #: Workaround to do not break API addPackage method - - if use_subfolder: - if not subfolder_per_package: - setFolder(package_folder) - self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) - - elif not folder_per_package or name != folder: - if not folder: - folder = urlparse(html_unescape(name)).path.split("/")[-1] - - setFolder(folder) - self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) - - elif folder_per_package: - setFolder(None) diff --git a/pyload/plugins/internal/DeadCrypter.py b/pyload/plugins/internal/DeadCrypter.py index 81b68e00a..427996e51 100644 --- a/pyload/plugins/internal/DeadCrypter.py +++ b/pyload/plugins/internal/DeadCrypter.py @@ -3,7 +3,7 @@ from urllib import unquote from urlparse import urlparse -from pyload.plugins.internal.Crypter import Crypter as _Crypter +from pyload.plugins.Crypter import Crypter as _Crypter from pyload.plugins.internal.SimpleCrypter import create_getInfo diff --git a/pyload/plugins/internal/DeadHoster.py b/pyload/plugins/internal/DeadHoster.py index f066883c6..3930908d3 100644 --- a/pyload/plugins/internal/DeadHoster.py +++ b/pyload/plugins/internal/DeadHoster.py @@ -3,7 +3,7 @@ from urllib import unquote from urlparse import urlparse -from pyload.plugins.internal.Hoster import Hoster as _Hoster +from pyload.plugins.Hoster import Hoster as _Hoster from pyload.plugins.internal.SimpleHoster import create_getInfo diff --git a/pyload/plugins/internal/Hoster.py b/pyload/plugins/internal/Hoster.py deleted file mode 100644 index ea225262e..000000000 --- a/pyload/plugins/internal/Hoster.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -from pyload.plugins.Plugin import Plugin - - -def getInfo(self): - #result = [ .. (name, size, status, url) .. ] - return - - -class Hoster(Plugin): - __name__ = "Hoster" - __type__ = "hoster" - __version__ = "0.02" - - __pattern__ = r'^unmatchable$' - __config__ = [] #: [("name", "type", "desc", "default")] - - __description__ = """Base hoster plugin""" - __license__ = "GPLv3" - __authors__ = [("mkaay", "mkaay@mkaay.de")] diff --git a/pyload/plugins/internal/MultiHoster.py b/pyload/plugins/internal/MultiHoster.py index 44b2da565..e4783395d 100644 --- a/pyload/plugins/internal/MultiHoster.py +++ b/pyload/plugins/internal/MultiHoster.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.internal.Addon import Addon +from pyload.plugins.Addon import Addon from pyload.utils import remove_chars diff --git a/pyload/plugins/internal/OCR.py b/pyload/plugins/internal/OCR.py deleted file mode 100644 index 8e60737b6..000000000 --- a/pyload/plugins/internal/OCR.py +++ /dev/null @@ -1,315 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -try: - from PIL import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin -except ImportError: - import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin - -import logging -import subprocess - -from os.path import abspath, join - - -class OCR(object): - __name__ = "OCR" - __type__ = "ocr" - __version__ = "0.10" - - __description__ = """Base OCR plugin""" - __license__ = "GPLv3" - __authors__ = [("pyLoad Team", "admin@pyload.org")] - - - def __init__(self): - self.logger = logging.getLogger("log") - - - def load_image(self, image): - self.image = Image.open(image) - self.pixels = self.image.load() - self.result_captcha = '' - - - def unload(self): - """delete all tmp images""" - pass - - - def threshold(self, value): - self.image = self.image.point(lambda a: a * value + 10) - - - def run(self, command): - """Run a command""" - - popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - popen.wait() - output = popen.stdout.read() + " | " + popen.stderr.read() - popen.stdout.close() - popen.stderr.close() - self.logger.debug("Tesseract ReturnCode %s Output: %s" % (popen.returncode, output)) - - - def run_tesser(self, subset=False, digits=True, lowercase=True, uppercase=True): - #tmpTif = tempfile.NamedTemporaryFile(suffix=".tif") - try: - tmpTif = open(join("tmp", "tmpTif_%s.tif" % self.__name__), "wb") - tmpTif.close() - - #tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt") - tmpTxt = open(join("tmp", "tmpTxt_%s.txt" % self.__name__), "wb") - tmpTxt.close() - - except IOError, e: - self.logError(e) - return - - self.logger.debug("save tiff") - self.image.save(tmpTif.name, 'TIFF') - - if os.name == "nt": - tessparams = [join(pypath, "tesseract", "tesseract.exe")] - else: - tessparams = ['tesseract'] - - tessparams.extend([abspath(tmpTif.name), abspath(tmpTxt.name).replace(".txt", "")] ) - - if subset and (digits or lowercase or uppercase): - #tmpSub = tempfile.NamedTemporaryFile(suffix=".subset") - with open(join("tmp", "tmpSub_%s.subset" % self.__name__), "wb") as tmpSub: - tmpSub.write("tessedit_char_whitelist ") - - if digits: - tmpSub.write("0123456789") - if lowercase: - tmpSub.write("abcdefghijklmnopqrstuvwxyz") - if uppercase: - tmpSub.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ") - - tmpSub.write("\n") - tessparams.append("nobatch") - tessparams.append(abspath(tmpSub.name)) - - self.logger.debug("run tesseract") - self.run(tessparams) - self.logger.debug("read txt") - - try: - with open(tmpTxt.name, 'r') as f: - self.result_captcha = f.read().replace("\n", "") - except Exception: - self.result_captcha = "" - - self.logger.debug(self.result_captcha) - try: - os.remove(tmpTif.name) - os.remove(tmpTxt.name) - if subset and (digits or lowercase or uppercase): - os.remove(tmpSub.name) - except Exception: - pass - - - def get_captcha(self, name): - raise NotImplementedError - - - def to_greyscale(self): - if self.image.mode != 'L': - self.image = self.image.convert('L') - - self.pixels = self.image.load() - - - def eval_black_white(self, limit): - self.pixels = self.image.load() - w, h = self.image.size - for x in xrange(w): - for y in xrange(h): - if self.pixels[x, y] > limit: - self.pixels[x, y] = 255 - else: - self.pixels[x, y] = 0 - - - def clean(self, allowed): - pixels = self.pixels - - w, h = self.image.size - - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 255: - continue - # No point in processing white pixels since we only want to remove black pixel - count = 0 - - try: - if pixels[x - 1, y - 1] != 255: - count += 1 - if pixels[x - 1, y] != 255: - count += 1 - if pixels[x - 1, y + 1] != 255: - count += 1 - if pixels[x, y + 1] != 255: - count += 1 - if pixels[x + 1, y + 1] != 255: - count += 1 - if pixels[x + 1, y] != 255: - count += 1 - if pixels[x + 1, y - 1] != 255: - count += 1 - if pixels[x, y - 1] != 255: - count += 1 - except Exception: - pass - - # not enough neighbors are dark pixels so mark this pixel - # to be changed to white - if count < allowed: - pixels[x, y] = 1 - - # second pass: this time set all 1's to 255 (white) - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 1: - pixels[x, y] = 255 - - self.pixels = pixels - - - def derotate_by_average(self): - """rotate by checking each angle and guess most suitable""" - - w, h = self.image.size - pixels = self.pixels - - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 0: - pixels[x, y] = 155 - - highest = {} - counts = {} - - for angle in xrange(-45, 45): - - tmpimage = self.image.rotate(angle) - - pixels = tmpimage.load() - - w, h = self.image.size - - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 0: - pixels[x, y] = 255 - - count = {} - - for x in xrange(w): - count[x] = 0 - for y in xrange(h): - if pixels[x, y] == 155: - count[x] += 1 - - sum = 0 - cnt = 0 - - for x in count.values(): - if x != 0: - sum += x - cnt += 1 - - avg = sum / cnt - counts[angle] = cnt - highest[angle] = 0 - for x in count.values(): - if x > highest[angle]: - highest[angle] = x - - highest[angle] = highest[angle] - avg - - hkey = 0 - hvalue = 0 - - for key, value in highest.iteritems(): - if value > hvalue: - hkey = key - hvalue = value - - self.image = self.image.rotate(hkey) - pixels = self.image.load() - - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 0: - pixels[x, y] = 255 - - if pixels[x, y] == 155: - pixels[x, y] = 0 - - self.pixels = pixels - - - def split_captcha_letters(self): - captcha = self.image - started = False - letters = [] - width, height = captcha.size - bottomY, topY = 0, height - pixels = captcha.load() - - for x in xrange(width): - black_pixel_in_col = False - for y in xrange(height): - if pixels[x, y] != 255: - if not started: - started = True - firstX = x - lastX = x - - if y > bottomY: - bottomY = y - if y < topY: - topY = y - if x > lastX: - lastX = x - - black_pixel_in_col = True - - if black_pixel_in_col is False and started is True: - rect = (firstX, topY, lastX, bottomY) - new_captcha = captcha.crop(rect) - - w, h = new_captcha.size - if w > 5 and h > 5: - letters.append(new_captcha) - - started = False - bottomY, topY = 0, height - - return letters - - - def correct(self, values, var=None): - if var: - result = var - else: - result = self.result_captcha - - for key, item in values.iteritems(): - - if key.__class__ == str: - result = result.replace(key, item) - else: - for expr in key: - result = result.replace(expr, item) - - if var: - return result - else: - self.result_captcha = result diff --git a/pyload/plugins/internal/SimpleCrypter.py b/pyload/plugins/internal/SimpleCrypter.py index 4287c4d74..405aff9c5 100644 --- a/pyload/plugins/internal/SimpleCrypter.py +++ b/pyload/plugins/internal/SimpleCrypter.py @@ -4,7 +4,7 @@ import re from urlparse import urlparse -from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Crypter import Crypter from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, replace_patterns, set_cookies from pyload.utils import fixup diff --git a/pyload/plugins/internal/SimpleHoster.py b/pyload/plugins/internal/SimpleHoster.py index ce1ddd2b6..aafbdc8bd 100644 --- a/pyload/plugins/internal/SimpleHoster.py +++ b/pyload/plugins/internal/SimpleHoster.py @@ -9,7 +9,7 @@ from urlparse import urljoin, urlparse from pyload.datatype.PyFile import statusMap as _statusMap from pyload.network.CookieJar import CookieJar from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Hoster import Hoster from pyload.utils import fixup, parseFileSize diff --git a/pyload/plugins/internal/UpdateManager.py b/pyload/plugins/internal/UpdateManager.py index 622374136..ee45cf7a2 100644 --- a/pyload/plugins/internal/UpdateManager.py +++ b/pyload/plugins/internal/UpdateManager.py @@ -7,7 +7,7 @@ from operator import itemgetter from os import path, remove, stat from pyload.network.RequestFactory import getURL -from pyload.plugins.internal.Addon import Expose, Addon, threaded +from pyload.plugins.Addon import Expose, Addon, threaded from pyload.utils import safe_join diff --git a/pyload/plugins/internal/XFSAccount.py b/pyload/plugins/internal/XFSAccount.py index a330d2ff4..7da060c4b 100644 --- a/pyload/plugins/internal/XFSAccount.py +++ b/pyload/plugins/internal/XFSAccount.py @@ -5,7 +5,7 @@ import re from time import gmtime, mktime, strptime from urlparse import urljoin -from pyload.plugins.internal.Account import Account +from pyload.plugins.Account import Account from pyload.plugins.internal.SimpleHoster import parseHtmlForm, set_cookies diff --git a/pyload/plugins/ocr/GigasizeCom.py b/pyload/plugins/ocr/GigasizeCom.py index c8525d000..f83ac4e14 100644 --- a/pyload/plugins/ocr/GigasizeCom.py +++ b/pyload/plugins/ocr/GigasizeCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.OCR import OCR +from pyload.plugins.OCR import OCR class GigasizeCom(OCR): diff --git a/pyload/plugins/ocr/LinksaveIn.py b/pyload/plugins/ocr/LinksaveIn.py index d597efc36..d3e85c5c3 100644 --- a/pyload/plugins/ocr/LinksaveIn.py +++ b/pyload/plugins/ocr/LinksaveIn.py @@ -9,7 +9,7 @@ from glob import glob from os import sep from os.path import abspath, dirname -from pyload.plugins.internal.OCR import OCR +from pyload.plugins.OCR import OCR class LinksaveIn(OCR): diff --git a/pyload/plugins/ocr/NetloadIn.py b/pyload/plugins/ocr/NetloadIn.py index 2fce55d34..a692b1df8 100644 --- a/pyload/plugins/ocr/NetloadIn.py +++ b/pyload/plugins/ocr/NetloadIn.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.OCR import OCR +from pyload.plugins.OCR import OCR class NetloadIn(OCR): diff --git a/pyload/plugins/ocr/ShareonlineBiz.py b/pyload/plugins/ocr/ShareonlineBiz.py index 64753cf78..d7b910240 100644 --- a/pyload/plugins/ocr/ShareonlineBiz.py +++ b/pyload/plugins/ocr/ShareonlineBiz.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.internal.OCR import OCR +from pyload.plugins.OCR import OCR class ShareonlineBiz(OCR): -- cgit v1.2.3