summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mkaay <mkaay@mkaay.de> 2010-09-06 19:14:02 +0200
committerGravatar mkaay <mkaay@mkaay.de> 2010-09-06 19:14:02 +0200
commit0b6f0dd36f5b4c02a444825c77cae02cc5066f34 (patch)
tree6efe97789b316dc80f8d62d322ec19d63109b6fd
parentgui double logging fix (diff)
downloadpyload-0b6f0dd36f5b4c02a444825c77cae02cc5066f34.tar.xz
gui: status translation, core: added scheduler -> better account fetching UploadedTo + ShareonlineBiz account fix
-rw-r--r--module/AccountManager.py296
-rw-r--r--module/PullEvents.py8
-rw-r--r--module/gui/Accounts.py10
-rw-r--r--module/gui/Collector.py25
-rw-r--r--module/gui/Queue.py6
-rw-r--r--module/plugins/accounts/ShareonlineBiz.py5
-rw-r--r--module/plugins/accounts/UploadedTo.py4
-rwxr-xr-xpyLoadCore.py19
-rwxr-xr-xpyLoadGui.py13
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