diff options
Diffstat (limited to 'module')
-rw-r--r-- | module/AccountManager.py | 296 | ||||
-rw-r--r-- | module/PullEvents.py | 8 | ||||
-rw-r--r-- | module/gui/Accounts.py | 10 | ||||
-rw-r--r-- | module/gui/Collector.py | 25 | ||||
-rw-r--r-- | module/gui/Queue.py | 6 | ||||
-rw-r--r-- | module/plugins/accounts/ShareonlineBiz.py | 5 | ||||
-rw-r--r-- | module/plugins/accounts/UploadedTo.py | 4 |
7 files changed, 203 insertions, 151 deletions
diff --git a/module/AccountManager.py b/module/AccountManager.py index c6c14daf7..b5c89dffc 100644 --- a/module/AccountManager.py +++ b/module/AccountManager.py @@ -20,144 +20,166 @@ from os.path import exists from shutil import copy +from module.PullEvents import AccountUpdateEvent + ACC_VERSION = 1 ######################################################################## class AccountManager(): - """manages all accounts""" - - #---------------------------------------------------------------------- - def __init__(self, core): - """Constructor""" - - self.core = core - - self.accounts = {} # key = ( plugin ) - self.plugins = {} - - self.initAccountPlugins() - self.loadAccounts() - - self.saveAccounts() # save to add categories to conf - - #---------------------------------------------------------------------- - def getAccountPlugin(self, plugin): - """get account instance for plugin or None if anonymous""" - if self.accounts.has_key(plugin): - if not self.plugins.has_key(plugin): - self.plugins[plugin] = self.core.pluginManager.getAccountPlugin(plugin)(self, self.accounts[plugin]) - - return self.plugins[plugin] - else: - return None - - def getAccountPlugins(self): - """ get all account instances""" - - plugins = [] - for plugin in self.accounts.keys(): - plugins.append(self.getAccountPlugin(plugin)) - - return plugins - #---------------------------------------------------------------------- - def loadAccounts(self): - """loads all accounts available""" - - if not exists("accounts.conf"): - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION)) - f.close() - - f = open("accounts.conf", "rb") - content = f.readlines() - - version = content.pop(0) - - if int(version.split(":")[1]) < ACC_VERSION: - copy("accounts.conf", "accounts.backup") - f.close() - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION)) - f.close() - self.core.log.warning(_("Account settings deleted, due to new config format.")) - return - - - - plugin = "" - account = "" - - for line in content: - line = line.strip() - - if not line: continue - if line.startswith("#"): continue - if line.startswith("version"): continue - - if line.endswith(":"): - plugin = line[:-1] - self.accounts[plugin] = {} - - elif line.startswith("@"): - option = line[1:].split() - self.accounts[plugin][name]["options"].append(tuple(option)) - - elif ":" in line: - name, pw = line.split(":")[:] - self.accounts[plugin][name] = {"password": pw, "options": []} - - - - #---------------------------------------------------------------------- - def saveAccounts(self): - """save all account information""" - - f = open("accounts.conf", "wb") - f.write("version: " + str(ACC_VERSION) + "\n") - - for plugin, accounts in self.accounts.iteritems(): - f.write("\n") - f.write(plugin+":\n") - - for name,data in accounts.iteritems(): - f.write("\n\t%s:%s\n" % (name,data["password"]) ) - for option in data["options"]: - f.write("\t@%s\n" % " ".join(option) ) - - f.close() - - - #---------------------------------------------------------------------- - def initAccountPlugins(self): - """init names""" - for name in self.core.pluginManager.getAccountPlugins(): - self.accounts[name] = {} - - #---------------------------------------------------------------------- - def updateAccount(self, plugin , user, password, options): - """add or update account""" - - if self.accounts.has_key(plugin): - p = self.getAccountPlugin(plugin) - p.updateAccounts(user, password, options) - - if self.accounts[plugin].has_key(user): - self.accounts[plugin][user]["password"] = password - self.accounts[plugin][user]["options"] = options - else: - self.accounts[plugin][user] = {"password": password, "options": options} - - self.saveAccounts() - - #---------------------------------------------------------------------- - def removeAccount(self, plugin, user): - """remove account""" - - if self.accounts.has_key(plugin): - p = self.getAccountPlugin(plugin) - p.removeAccount(user) - - if self.accounts[plugin].has_key(user): - del self.accounts[plugin][user] - - self.saveAccounts() + """manages all accounts""" + + #---------------------------------------------------------------------- + def __init__(self, core): + """Constructor""" + + self.core = core + + self.accounts = {} # key = ( plugin ) + self.plugins = {} + + self.initAccountPlugins() + self.loadAccounts() + + self.saveAccounts() # save to add categories to conf + + self.cachedAccountInfo = {} + + #---------------------------------------------------------------------- + def getAccountPlugin(self, plugin): + """get account instance for plugin or None if anonymous""" + if self.accounts.has_key(plugin): + if not self.plugins.has_key(plugin): + self.plugins[plugin] = self.core.pluginManager.getAccountPlugin(plugin)(self, self.accounts[plugin]) + + return self.plugins[plugin] + else: + return None + + def getAccountPlugins(self): + """ get all account instances""" + + plugins = [] + for plugin in self.accounts.keys(): + plugins.append(self.getAccountPlugin(plugin)) + + return plugins + #---------------------------------------------------------------------- + def loadAccounts(self): + """loads all accounts available""" + + if not exists("accounts.conf"): + f = open("accounts.conf", "wb") + f.write("version: " + str(ACC_VERSION)) + f.close() + + f = open("accounts.conf", "rb") + content = f.readlines() + + version = content.pop(0) + + if int(version.split(":")[1]) < ACC_VERSION: + copy("accounts.conf", "accounts.backup") + f.close() + f = open("accounts.conf", "wb") + f.write("version: " + str(ACC_VERSION)) + f.close() + self.core.log.warning(_("Account settings deleted, due to new config format.")) + return + + + + plugin = "" + account = "" + + for line in content: + line = line.strip() + + if not line: continue + if line.startswith("#"): continue + if line.startswith("version"): continue + + if line.endswith(":"): + plugin = line[:-1] + self.accounts[plugin] = {} + + elif line.startswith("@"): + option = line[1:].split() + self.accounts[plugin][name]["options"].append(tuple(option)) + + elif ":" in line: + name, pw = line.split(":")[:] + self.accounts[plugin][name] = {"password": pw, "options": []} + + + + #---------------------------------------------------------------------- + def saveAccounts(self): + """save all account information""" + + f = open("accounts.conf", "wb") + f.write("version: " + str(ACC_VERSION) + "\n") + + for plugin, accounts in self.accounts.iteritems(): + f.write("\n") + f.write(plugin+":\n") + + for name,data in accounts.iteritems(): + f.write("\n\t%s:%s\n" % (name,data["password"]) ) + for option in data["options"]: + f.write("\t@%s\n" % " ".join(option) ) + + f.close() + + + #---------------------------------------------------------------------- + def initAccountPlugins(self): + """init names""" + for name in self.core.pluginManager.getAccountPlugins(): + self.accounts[name] = {} + + #---------------------------------------------------------------------- + def updateAccount(self, plugin , user, password, options): + """add or update account""" + + if self.accounts.has_key(plugin): + p = self.getAccountPlugin(plugin) + p.updateAccounts(user, password, options) + + if self.accounts[plugin].has_key(user): + self.accounts[plugin][user]["password"] = password + self.accounts[plugin][user]["options"] = options + else: + self.accounts[plugin][user] = {"password": password, "options": options} + + self.saveAccounts() + + #---------------------------------------------------------------------- + def removeAccount(self, plugin, user): + """remove account""" + + if self.accounts.has_key(plugin): + p = self.getAccountPlugin(plugin) + p.removeAccount(user) + + if self.accounts[plugin].has_key(user): + del self.accounts[plugin][user] + + self.saveAccounts() + + def getAccountInfos(self, force=False): + if not self.cachedAccountInfo: + self.cacheAccountInfos() + elif force: + self.core.scheduler.addJob(0, self.cacheAccountInfos, done=self.sendChange) + return self.cachedAccountInfo + + def cacheAccountInfos(self): + plugins = self.getAccountPlugins() + data = {} + for p in plugins: + data[p.__name__] = p.getAllAccounts() + self.cachedAccountInfo = data + + def sendChange(self): + e = AccountUpdateEvent() + self.core.pullManager.addEvent(e) diff --git a/module/PullEvents.py b/module/PullEvents.py index bbb3f3e6b..16566cfae 100644 --- a/module/PullEvents.py +++ b/module/PullEvents.py @@ -109,3 +109,11 @@ class ReloadAllEvent(): def toList(self): return ["reload", self.destination] + +class AccountUpdateEvent(): + def toList(self): + return ["account"] + +class ConfigUpdateEvent(): + def toList(self): + return ["config"] diff --git a/module/gui/Accounts.py b/module/gui/Accounts.py index f47928c1a..b83ce9827 100644 --- a/module/gui/Accounts.py +++ b/module/gui/Accounts.py @@ -30,8 +30,8 @@ class AccountModel(QAbstractItemModel): self.cols = 4 self.mutex = QMutex() - def reloadData(self): - data = self.connector.proxy.get_accounts() + def reloadData(self, force=True): + data = self.connector.proxy.get_accounts(force) self.beginRemoveRows(QModelIndex(), 0, len(self._data)) self._data = [] self.endRemoveRows() @@ -62,8 +62,6 @@ class AccountModel(QAbstractItemModel): return QVariant(fmtime) else: return QVariant(_("unlimited")) - elif index.column() == 3: - return QVariant(self.toData(index)["trafficleft"]) #elif role == Qt.EditRole: # if index.column() == 0: # return QVariant(index.internalPointer().data["name"]) @@ -145,7 +143,7 @@ class AccountDelegate(QItemDelegate): opts = QStyleOptionProgressBarV2() opts.minimum = 0 if data["trafficleft"]: - if data["trafficleft"] == -1: + if data["trafficleft"] == -1 or data["trafficleft"] is None: opts.maximum = opts.progress = 1 else: opts.maximum = opts.progress = data["trafficleft"] @@ -159,6 +157,8 @@ class AccountDelegate(QItemDelegate): opts.textAlignment = Qt.AlignCenter if data["trafficleft"] and data["trafficleft"] == -1: opts.text = QString(_("unlimited")) + elif data["trafficleft"] is None: + opts.text = QString(_("n/a")) else: opts.text = QString.number(round(float(opts.progress)/1024/1024, 2)) + " GB" QApplication.style().drawControl(QStyle.CE_ProgressBar, opts, painter) diff --git a/module/gui/Collector.py b/module/gui/Collector.py index f7bfcbebf..08d82daf8 100644 --- a/module/gui/Collector.py +++ b/module/gui/Collector.py @@ -37,6 +37,8 @@ statusMap = { } statusMapReverse = dict((v,k) for k, v in statusMap.iteritems()) +translatedStatusMap = {} # -> CollectorModel.__init__ + class CollectorModel(QAbstractItemModel): def __init__(self, view, connector): QAbstractItemModel.__init__(self) @@ -46,6 +48,27 @@ class CollectorModel(QAbstractItemModel): self.cols = 3 self.interval = 1 self.mutex = QMutex() + + global translatedStatusMap # workaround because i18n is not running at import time + translatedStatusMap = { + "finished": _("finished"), + "offline": _("offline"), + "online": _("online"), + "queued": _("queued"), + "checking": _("checking"), + "waiting": _("waiting"), + "reconnected": _("reconnected"), + "starting": _("starting"), + "failed": _("failed"), + "aborted": _("aborted"), + "decrypting": _("decrypting"), + "custom": _("custom"), + "downloading": _("downloading"), + "processing": _("processing") + } + + def translateStatus(self, string): + return translatedStatusMap[string] def addEvent(self, event): locker = QMutexLocker(self.mutex) @@ -150,7 +173,7 @@ class CollectorModel(QAbstractItemModel): status = child.data["status"] else: status = item.data["status"] - return QVariant(statusMapReverse[status]) + return QVariant(self.translateStatus(statusMapReverse[status])) elif index.column() == 1: item = index.internalPointer() plugins = [] diff --git a/module/gui/Queue.py b/module/gui/Queue.py index ca527bb2c..9225df58f 100644 --- a/module/gui/Queue.py +++ b/module/gui/Queue.py @@ -185,9 +185,9 @@ class QueueModel(CollectorModel): status = item.data["status"] if speed is None or status == 7 or status == 10 or status == 5: - return QVariant(statusMapReverse[status]) + return QVariant(self.translateStatus(statusMapReverse[status])) else: - return QVariant("%s (%s KB/s)" % (statusMapReverse[status], speed)) + return QVariant("%s (%s KB/s)" % (self.translateStatus(statusMapReverse[status]), speed)) elif index.column() == 3: item = index.internalPointer() if isinstance(item, Package): @@ -251,7 +251,7 @@ class QueueProgressBarDelegate(QItemDelegate): opts.textVisible = True opts.textAlignment = Qt.AlignCenter if not wait is None: - opts.text = QString("waiting %d seconds" % (wait,)) + opts.text = QString(_("waiting %d seconds") % (wait,)) else: opts.text = QString.number(opts.progress) + "%" QApplication.style().drawControl(QStyle.CE_ProgressBar, opts, painter) diff --git a/module/plugins/accounts/ShareonlineBiz.py b/module/plugins/accounts/ShareonlineBiz.py index 15802c8e2..2eb78bf43 100644 --- a/module/plugins/accounts/ShareonlineBiz.py +++ b/module/plugins/accounts/ShareonlineBiz.py @@ -32,9 +32,8 @@ class ShareonlineBiz(Account): def getAccountInfo(self, user): try: req = self.core.requestFactory.getRequest(self.__name__, user) - src = req.load("https://www.share-online.biz/alpha/user/profile") - - validuntil = re.search(r"Account gültig bis:.*?<span class='.*?'>(.*?)</span>", src).group(1) + src = req.load("http://www.share-online.biz/alpha/lang/set/english") + validuntil = re.search(r"Account valid till:.*?<span class='.*?'>(.*?)</span>", src, re.S).group(1) validuntil = int(mktime(strptime(validuntil, "%m/%d/%Y, %I:%M:%S %p"))) out = Account.getAccountInfo(self, user) diff --git a/module/plugins/accounts/UploadedTo.py b/module/plugins/accounts/UploadedTo.py index e2a977d03..99141f20a 100644 --- a/module/plugins/accounts/UploadedTo.py +++ b/module/plugins/accounts/UploadedTo.py @@ -38,7 +38,7 @@ class UploadedTo(Account): if not data: raise Exception req = self.core.requestFactory.getRequest(self.__name__, user) - html = req.load("http://ul.to/", cookies=True) + html = req.load("http://uploaded.to/?setlang=en", cookies=True) raw_traffic = re.search(r"Traffic left: </span><span class=.*?>(.*?)</span>", html).group(1) raw_valid = re.search(r"Valid until: </span> <span class=.*?>(.*?)</span>", html).group(1) traffic = int(self.parseTraffic(raw_traffic)) @@ -52,4 +52,4 @@ class UploadedTo(Account): def login(self, user, data): req = self.core.requestFactory.getRequest(self.__name__, user) - req.load("http://ul.to/login", post={ "email" : user, "password" : data["password"]}, cookies=True) + req.load("http://uploaded.to/login", post={ "email" : user, "password" : data["password"]}, cookies=True) |