diff options
Diffstat (limited to 'module/plugins/Account.py')
-rw-r--r-- | module/plugins/Account.py | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/module/plugins/Account.py b/module/plugins/Account.py deleted file mode 100644 index 3ba819a6f..000000000 --- a/module/plugins/Account.py +++ /dev/null @@ -1,295 +0,0 @@ -# -*- coding: utf-8 -*- - -from time import time -from traceback import print_exc -from threading import RLock - -from module.utils import compare_time, format_size, parseFileSize, lock, from_string -from module.Api import AccountInfo -from module.network.CookieJar import CookieJar - -from Base import Base - - -class WrongPassword(Exception): - pass - -#noinspection PyUnresolvedReferences -class Account(Base): - """ - Base class for every account plugin. - Just overwrite `login` and cookies will be stored and the account becomes accessible in\ - associated hoster plugin. Plugin should also provide `loadAccountInfo`. \ - An instance of this class is created for every entered account, it holds all \ - fields of AccountInfo ttype, and can be set easily at runtime. - """ - - # constants for special values - UNKNOWN = -1 - UNLIMITED = -2 - - # Default values - owner = None - valid = True - validuntil = -1 - trafficleft = -1 - maxtraffic = -1 - premium = True - activated = True - shared = False - - #: after that time [in minutes] pyload will relogin the account - login_timeout = 600 - #: account data will be reloaded after this time - info_threshold = 600 - - # known options - known_opt = ("time", "limitDL") - - def __init__(self, manager, loginname, password, options): - Base.__init__(self, manager.core) - - if "activated" in options: - self.activated = from_string(options["activated"], "bool") - else: - self.activated = Account.activated - - for opt in self.known_opt: - if opt not in options: - options[opt] = "" - - for opt in options.keys(): - if opt not in self.known_opt: - del options[opt] - - self.loginname = loginname - self.options = options - - self.manager = manager - - self.lock = RLock() - self.timestamp = 0 - self.login_ts = 0 # timestamp for login - self.cj = CookieJar(self.__name__) - self.password = password - self.error = None - - self.init() - - def toInfoData(self): - return AccountInfo(self.__name__, self.loginname, self.owner, self.valid, self.validuntil, self.trafficleft, - self.maxtraffic, - self.premium, self.activated, self.shared, self.options) - - def init(self): - pass - - def login(self, req): - """login into account, the cookies will be saved so the user can be recognized - - :param req: `Request` instance - """ - raise NotImplemented - - def relogin(self): - """ Force a login. """ - req = self.getAccountRequest() - try: - return self._login(req) - finally: - req.close() - - @lock - def _login(self, req): - # set timestamp for login - self.login_ts = time() - - try: - try: - self.login(req) - except TypeError: #TODO: temporary - self.logDebug("Deprecated .login(...) signature omit user, data") - self.login(self.loginname, {"password": self.password}, req) - - self.valid = True - except WrongPassword: - self.logWarning( - _("Could not login with account %(user)s | %(msg)s") % {"user": self.loginname - , "msg": _("Wrong Password")}) - self.valid = False - - except Exception, e: - self.logWarning( - _("Could not login with account %(user)s | %(msg)s") % {"user": self.loginname - , "msg": e}) - self.valid = False - if self.core.debug: - print_exc() - - return self.valid - - def restoreDefaults(self): - self.validuntil = Account.validuntil - self.trafficleft = Account.trafficleft - self.maxtraffic = Account.maxtraffic - self.premium = Account.premium - - def update(self, password=None, options=None): - """ updates the account and returns true if anything changed """ - - self.login_ts = 0 - self.valid = True #set valid, so the login will be retried - - if "activated" in options: - self.activated = from_string(options["avtivated"], "bool") - - if password: - self.password = password - self.relogin() - return True - if options: - # remove unknown options - for opt in options.keys(): - if opt not in self.known_opt: - del options[opt] - - before = self.options - self.options.update(options) - return self.options != before - - def getAccountRequest(self): - return self.core.requestFactory.getRequest(self.__name__, self.cj) - - def getDownloadSettings(self): - """ Can be overwritten to change download settings. Default is no chunkLimit, max dl limit, resumeDownload - - :return: (chunkLimit, limitDL, resumeDownload) / (int, int ,bool) - """ - return -1, 0, True - - @lock - def getAccountInfo(self, force=False): - """retrieve account info's for an user, do **not** overwrite this method!\\ - just use it to retrieve info's in hoster plugins. see `loadAccountInfo` - - :param name: username - :param force: reloads cached account information - :return: dictionary with information - """ - if force or self.timestamp + self.info_threshold * 60 < time(): - - # make sure to login - req = self.getAccountRequest() - self.checkLogin(req) - self.logInfo(_("Get Account Info for %s") % self.loginname) - try: - try: - infos = self.loadAccountInfo(req) - except TypeError: #TODO: temporary - self.logDebug("Deprecated .loadAccountInfo(...) signature, omit user argument.") - infos = self.loadAccountInfo(self.loginname, req) - except Exception, e: - infos = {"error": str(e)} - self.logError(_("Error: %s") % e) - finally: - req.close() - - self.logDebug("Account Info: %s" % str(infos)) - self.timestamp = time() - - self.restoreDefaults() # reset to initial state - if type(infos) == dict: # copy result from dict to class - for k, v in infos.iteritems(): - if hasattr(self, k): - setattr(self, k, v) - else: - self.logDebug("Unknown attribute %s=%s" % (k, v)) - - #TODO: remove user - def loadAccountInfo(self, req): - """ Overwrite this method and set account attributes within this method. - - :param user: Deprecated - :param req: Request instance - :return: - """ - pass - - def getAccountCookies(self, user): - self.logDebug("Deprecated method .getAccountCookies -> use account.cj") - return self.cj - - def getAccountData(self, user): - self.logDebug("Deprecated method .getAccountData -> use fields directly") - return {"password": self.password} - - def isPremium(self, user=None): - if user: self.logDebug("Deprecated Argument user for .isPremium()", user) - return self.premium - - def isUsable(self): - """Check several constraints to determine if account should be used""" - if not self.valid or not self.activated: return False - - if self.options["time"]: - time_data = "" - try: - time_data = self.options["time"] - start, end = time_data.split("-") - if not compare_time(start.split(":"), end.split(":")): - return False - except: - self.logWarning(_("Your Time %s has a wrong format, use: 1:22-3:44") % time_data) - - if 0 <= self.validuntil < time(): - return False - if self.trafficleft is 0: # test explicitly for 0 - return False - - return True - - def parseTraffic(self, string): #returns kbyte - return parseFileSize(string) / 1024 - - def formatTrafficleft(self): - if self.trafficleft is None: - self.getAccountInfo(force=True) - return format_size(self.trafficleft * 1024) - - def wrongPassword(self): - raise WrongPassword - - def empty(self, user=None): - if user: self.logDebug("Deprecated argument user for .empty()", user) - - self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % self.login) - - self.trafficleft = 0 - self.scheduleRefresh(30 * 60) - - def expired(self, user=None): - if user: self.logDebug("Deprecated argument user for .expired()", user) - - self.logWarning(_("Account %s is expired, checking again in 1h") % user) - - self.validuntil = time() - 1 - self.scheduleRefresh(60 * 60) - - def scheduleRefresh(self, time=0, force=True): - """ add a task for refreshing the account info to the scheduler """ - self.logDebug("Scheduled Account refresh for %s in %s seconds." % (self.loginname, time)) - self.core.scheduler.addJob(time, self.getAccountInfo, [force]) - - @lock - def checkLogin(self, req): - """ checks if the user is still logged in """ - if self.login_ts + self.login_timeout * 60 < time(): - if self.login_ts: # separate from fresh login to have better debug logs - self.logDebug("Reached login timeout for %s" % self.loginname) - else: - self.logInfo(_("Login with %s") % self.loginname) - - self._login(req) - return False - - return True |