diff options
author | mkaay <mkaay@mkaay.de> | 2010-09-06 19:14:02 +0200 |
---|---|---|
committer | mkaay <mkaay@mkaay.de> | 2010-09-06 19:14:02 +0200 |
commit | 0b6f0dd36f5b4c02a444825c77cae02cc5066f34 (patch) | |
tree | 6efe97789b316dc80f8d62d322ec19d63109b6fd | |
parent | gui double logging fix (diff) | |
download | pyload-0b6f0dd36f5b4c02a444825c77cae02cc5066f34.tar.xz |
gui: status translation, core: added scheduler -> better account fetching UploadedTo + ShareonlineBiz account fix
-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 | ||||
-rwxr-xr-x | pyLoadCore.py | 19 | ||||
-rwxr-xr-x | pyLoadGui.py | 13 |
9 files changed, 221 insertions, 165 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) diff --git a/pyLoadCore.py b/pyLoadCore.py index 7919ba2b8..263c67274 100755 --- a/pyLoadCore.py +++ b/pyLoadCore.py @@ -64,6 +64,7 @@ from module.ThreadManager import ThreadManager import module.remote.SecureXMLRPCServer as Server from module.web.ServerThread import WebServer from module.FileDatabase import PyFile +from module.Scheduler import Scheduler from codecs import getwriter if os.name == "nt": @@ -230,6 +231,8 @@ class Core(object): self.server_methods = ServerMethods(self) + self.scheduler = Scheduler(self) + #hell yeah, so many important managers :D self.files = FileHandler(self) self.pluginManager = PluginManager(self) @@ -284,7 +287,10 @@ class Core(object): f.close() f = open(link_file, "wb") f.close() - + + self.scheduler.start() + self.scheduler.addJob(0, self.accountManager.cacheAccountInfos) + while True: sleep(2) if self.do_restart: @@ -334,7 +340,6 @@ class Core(object): frm = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s", "%d.%m.%Y %H:%M:%S") console.setFormatter(frm) self.log = logging.getLogger("log") # settable in config - self.log.myhandlers = [] if self.config['log']['file_log']: file_handler = logging.handlers.RotatingFileHandler(join(self.config['log']['log_folder'], 'log.txt'), @@ -708,12 +713,8 @@ class ServerMethods(): def get_events(self, uuid): return self.core.pullManager.getEvents(uuid) - def get_accounts(self): - plugins = self.core.accountManager.getAccountPlugins() - data = {} - for p in plugins: - data[p.__name__] = p.getAllAccounts() - return data + def get_accounts(self, refresh=False): + return self.core.accountManager.getAccountInfos(force=refresh) def update_account(self, plugin, account, password, options=[]): """ create and update account """ @@ -744,5 +745,5 @@ if __name__ == "__main__": except KeyboardInterrupt: pyload_core.shutdown() pyload_core.log.info(_("killed pyLoad from Terminal")) - self.removeLogger() + pyload_core.removeLogger() _exit(1) diff --git a/pyLoadGui.py b/pyLoadGui.py index 3f8a57910..6501fccb4 100755 --- a/pyLoadGui.py +++ b/pyLoadGui.py @@ -439,8 +439,6 @@ class main(QObject): self.core = Core() thread.start_new_thread(self.core.start, (False,False)) self.connector.setAddr(("core", self.core)) - #self.mainWindow.mactions["manager"].setDisabled(True) #workaround to supress bug - self.startMain() @@ -627,7 +625,11 @@ class main(QObject): def pullEvents(self): events = self.connector.getEvents() for event in events: - if event[1] == "queue": + if event[0] == "account": + self.mainWindow.emit(SIGNAL("reloadAccounts"), False) + elif event[0] == "config": + pass + elif event[1] == "queue": self.queue.addEvent(event) try: if event[0] == "update" and event[2] == "file": @@ -646,8 +648,8 @@ class main(QObject): elif event[1] == "collector": self.packageCollector.addEvent(event) - def slotReloadAccounts(self): - self.mainWindow.tabs["accounts"]["view"].model().reloadData() + def slotReloadAccounts(self, force=True): + self.mainWindow.tabs["accounts"]["view"].model().reloadData(force) def slotQuit(self): self.quitInternal() @@ -660,6 +662,7 @@ class main(QObject): if self.core.shuttedDown: break sleep(0.5) + class Loop(): def __init__(self, parent): self.parent = parent |