summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mkaay <mkaay@mkaay.de> 2010-02-02 22:19:59 +0100
committerGravatar mkaay <mkaay@mkaay.de> 2010-02-02 22:19:59 +0100
commit99da0e18722d9343a274e9a96376969a469e3a95 (patch)
treeb612118af4ed934c46d46500960b3ec16f2c09a0
parentFixed time compare thanks prophy (diff)
parentmerge (diff)
downloadpyload-99da0e18722d9343a274e9a96376969a469e3a95.tar.xz
merge no2
-rw-r--r--locale/de/de.po219
-rw-r--r--locale/en/en.po219
-rw-r--r--locale/fr/fr.po215
-rw-r--r--locale/messages.pot191
-rw-r--r--module/PullEvents.py111
-rw-r--r--module/download_thread.py54
-rw-r--r--module/file_list.py28
-rw-r--r--module/gui/Collector.py237
-rw-r--r--module/gui/Queue.py135
-rw-r--r--module/gui/connector.py22
-rw-r--r--module/plugins/container/CCF.py18
-rw-r--r--module/plugins/decrypter/SerienjunkiesOrg.py1
-rw-r--r--module/thread_list.py57
-rwxr-xr-xpyLoadCore.py45
-rwxr-xr-xpyLoadGui.py16
-rw-r--r--systemCheck.py158
16 files changed, 1316 insertions, 410 deletions
diff --git a/locale/de/de.po b/locale/de/de.po
index 471d543cf..1994499df 100644
--- a/locale/de/de.po
+++ b/locale/de/de.po
@@ -4,69 +4,202 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: 0.1\n"
-"POT-Creation-Date: 2009-06-04 15:33+CEST\n"
-"PO-Revision-Date: 2009-06-05 18:27+0100\n"
-"Last-Translator: spoob <spoob@gmx.de>\n"
-"Language-Team: pyLoad <LL@li.org>\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2010-02-02 21:54+CET\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
-#: Core.py:59
+
+#: module/download_thread.py:115
+msgid "Hoster unvailable, wait 60 seconds"
+msgstr ""
+
+#: module/download_thread.py:117
+msgid "Error getting error code: %s"
+msgstr ""
+
+#: module/download_thread.py:163
+msgid "Checksum ok ('%s')"
+msgstr ""
+
+#: module/download_thread.py:165
+msgid "Checksum not matched! ('%s')"
+msgstr ""
+
+#: module/download_thread.py:167
+msgid "Can't get checksum for %s"
+msgstr ""
+
+#: module/download_thread.py:169
+msgid "Checksum not implemented for %s"
+msgstr ""
+
+#: module/file_list.py:87
+msgid "Found %s links in linkcollector"
+msgstr ""
+
+#: module/file_list.py:89
+msgid "Found %s unqueued packages"
+msgstr ""
+
+#: module/file_list.py:91
+msgid "Added %s packages to queue"
+msgstr ""
+
+#: module/thread_list.py:88
+msgid "Get links from: %s"
+msgstr ""
+
+#: module/thread_list.py:90
+msgid "Download starts: %s"
+msgstr ""
+
+#: module/thread_list.py:136
+msgid "Parsed links from %s: %i"
+msgstr ""
+
+#: module/thread_list.py:138
+msgid "No links in %s"
+msgstr ""
+
+#: module/thread_list.py:145
+msgid "Download finished: %s"
+msgstr ""
+
+#: module/thread_list.py:151
+msgid "Download failed: %s | %s"
+msgstr ""
+
+#: module/thread_list.py:156
+msgid "Download aborted: %s"
+msgstr ""
+
+#: module/thread_list.py:206
+msgid "Starting reconnect"
+msgstr ""
+
+#: module/thread_list.py:220
+msgid "Reconnected, new IP: %s"
+msgstr ""
+
+#: pyLoadCore.py:111
+msgid "pycrypto to decode container files"
+msgstr ""
+
+#: pyLoadCore.py:112
+msgid "Python Image Libary (PIL) for captha reading"
+msgstr ""
+
+#: pyLoadCore.py:113
+msgid "pycurl for lower memory footprint while downloading"
+msgstr ""
+
+#: pyLoadCore.py:114
+msgid "Django for webinterface"
+msgstr ""
+
+#: pyLoadCore.py:115
+msgid "tesseract for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:116
+msgid "gocr for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:118
msgid "folder for logs"
-msgstr "Ordner für Logs"
+msgstr ""
-#: Core.py:60
+#: pyLoadCore.py:119
msgid "folder for downloads"
-msgstr "Ordner für Downloads"
+msgstr ""
-#: Core.py:61
+#: pyLoadCore.py:120
msgid "file for links"
-msgstr "Linkdatei"
+msgstr ""
-#: Core.py:62
+#: pyLoadCore.py:121
msgid "file for failed links"
-msgstr "Datei für felgeschlagene Links"
+msgstr ""
-#: Core.py:68
+#: pyLoadCore.py:124
+msgid "OpenSSL for secure connection"
+msgstr ""
+
+#: pyLoadCore.py:125
+msgid "ssl certificate"
+msgstr ""
+
+#: pyLoadCore.py:126
+msgid "ssl key"
+msgstr ""
+
+#: pyLoadCore.py:150
msgid "Downloadtime: %s"
-msgstr "Downloadzeit: %s"
+msgstr ""
-#: Core.py:96
-msgid "added"
-msgstr "Hinzugefügt"
+#: pyLoadCore.py:179
+msgid "restarting pyLoad"
+msgstr ""
-#: Core.py:97
-msgid "created index of plugins"
-msgstr "Plugin Index erstellt"
+#: pyLoadCore.py:183
+msgid "pyLoad quits"
+msgstr ""
-#: Core.py:119
-msgid "new update %s on pyload.org"
-msgstr "Neue Version %s auf pyload.org verfügbar!"
+#: pyLoadCore.py:194
+msgid "Secure XMLRPC Server Started"
+msgstr ""
-#: Core.py:121
-msgid "newst version %s in use:"
-msgstr "Neueste Version %s in Benutzung"
+#: pyLoadCore.py:197
+msgid "Auth XMLRPC Server Started"
+msgstr ""
-#: Core.py:123
-msgid "beta version %s in use:"
-msgstr "Beta Version %s in Benutzung"
+#: pyLoadCore.py:203
+msgid "Failed starting XMLRPC server, CLI and GUI will not be available: %s"
+msgstr ""
-#: Core.py:132
+#: pyLoadCore.py:272
msgid "%s created"
-msgstr "%s erstellt"
+msgstr ""
+
+#: pyLoadCore.py:275
+msgid "could not find %s: %s"
+msgstr ""
+
+#: pyLoadCore.py:277
+msgid "could not create %s: %s"
+msgstr ""
+
+#: pyLoadCore.py:305
+msgid "%s added"
+msgstr ""
-#: Core.py:134
-msgid "could not create %s"
-msgstr "Konnte %s nicht erstellen"
+#: pyLoadCore.py:306
+msgid "created index of plugins"
+msgstr ""
+
+#: pyLoadCore.py:325
+msgid "shutting down..."
+msgstr ""
+
+#: pyLoadCore.py:341
+msgid "No Updates for pyLoad"
+msgstr ""
-#: Core.py:194
-msgid "%i seconds"
-msgstr "%i Sekunden"
+#: pyLoadCore.py:344
+msgid "New pyLoad Version %s available"
+msgstr ""
-#: Core.py:222
-msgid "Server Mode"
-msgstr "Servermodus"
+#: pyLoadCore.py:369
+msgid "Auto install Failed"
+msgstr ""
+
+#: pyLoadCore.py:607
+msgid "killed pyLoad from Terminal"
+msgstr ""
diff --git a/locale/en/en.po b/locale/en/en.po
index 87e646735..4d5bc4ee3 100644
--- a/locale/en/en.po
+++ b/locale/en/en.po
@@ -4,65 +4,206 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: 0.1\n"
-"POT-Creation-Date: 2009-06-05 18:26+CEST\n"
-"PO-Revision-Date: 2009-06-05 18:28+0100\n"
-"Last-Translator: spoob <spoob@gmx.de>\n"
-"Language-Team: pyLoad <LL@li.org>\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2010-02-02 21:54+CET\n"
+"PO-Revision-Date: 2010-02-02 23:05+0200\n"
+"Last-Translator: Marius <mkaay@mkaay.de>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: de\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.0\n"
"Generated-By: pygettext.py 1.5\n"
-#: Core.py:59
+#: module/download_thread.py:115
+msgid "Hoster unvailable, wait 60 seconds"
+msgstr "Hoster unvailable, wait 60 seconds"
+
+#: module/download_thread.py:117
+msgid "Error getting error code: %s"
+msgstr "Error getting error code: %s"
+
+#: module/download_thread.py:163
+msgid "Checksum ok ('%s')"
+msgstr "Checksum ok ('%s')"
+
+#: module/download_thread.py:165
+msgid "Checksum not matched! ('%s')"
+msgstr "Checksum not matched! ('%s')"
+
+#: module/download_thread.py:167
+msgid "Can't get checksum for %s"
+msgstr "Can't get checksum for %s"
+
+#: module/download_thread.py:169
+msgid "Checksum not implemented for %s"
+msgstr "Checksum not implemented for %s"
+
+#: module/file_list.py:87
+msgid "Found %s links in linkcollector"
+msgstr "Found %s links in linkcollector"
+
+#: module/file_list.py:89
+msgid "Found %s unqueued packages"
+msgstr "Found %s unqueued packages"
+
+#: module/file_list.py:91
+msgid "Added %s packages to queue"
+msgstr "Added %s packages to queue"
+
+#: module/thread_list.py:88
+msgid "Get links from: %s"
+msgstr "Get links from: %s"
+
+#: module/thread_list.py:90
+msgid "Download starts: %s"
+msgstr "Download starts: %s"
+
+#: module/thread_list.py:136
+msgid "Parsed links from %s: %i"
+msgstr "Parsed links from %s: %i"
+
+#: module/thread_list.py:138
+msgid "No links in %s"
+msgstr "No links in %s"
+
+#: module/thread_list.py:145
+msgid "Download finished: %s"
+msgstr "Download finished: %s"
+
+#: module/thread_list.py:151
+msgid "Download failed: %s | %s"
+msgstr "Download failed: %s | %s"
+
+#: module/thread_list.py:156
+msgid "Download aborted: %s"
+msgstr "Download aborted: %s"
+
+#: module/thread_list.py:206
+msgid "Starting reconnect"
+msgstr "Starting reconnect"
+
+#: module/thread_list.py:220
+msgid "Reconnected, new IP: %s"
+msgstr "Reconnected, new IP: %s"
+
+#: pyLoadCore.py:111
+msgid "pycrypto to decode container files"
+msgstr "pycrypto to decode container files"
+
+#: pyLoadCore.py:112
+msgid "Python Image Libary (PIL) for captha reading"
+msgstr "Python Image Libary (PIL) for captha reading"
+
+#: pyLoadCore.py:113
+msgid "pycurl for lower memory footprint while downloading"
+msgstr "pycurl for lower memory footprint while downloading"
+
+#: pyLoadCore.py:114
+msgid "Django for webinterface"
+msgstr "Django for webinterface"
+
+#: pyLoadCore.py:115
+msgid "tesseract for captcha reading"
+msgstr "tesseract for captcha reading"
+
+#: pyLoadCore.py:116
+msgid "gocr for captcha reading"
+msgstr "gocr for captcha reading"
+
+#: pyLoadCore.py:118
msgid "folder for logs"
-msgstr ""
+msgstr "folder for logs"
-#: Core.py:60
+#: pyLoadCore.py:119
msgid "folder for downloads"
-msgstr ""
+msgstr "folder for downloads"
-#: Core.py:61
+#: pyLoadCore.py:120
msgid "file for links"
-msgstr ""
+msgstr "file for links"
-#: Core.py:62
+#: pyLoadCore.py:121
msgid "file for failed links"
-msgstr ""
+msgstr "file for failed links"
+
+#: pyLoadCore.py:124
+msgid "OpenSSL for secure connection"
+msgstr "OpenSSL for secure connection"
+
+#: pyLoadCore.py:125
+msgid "ssl certificate"
+msgstr "ssl certificate"
+
+#: pyLoadCore.py:126
+msgid "ssl key"
+msgstr "ssl key"
-#: Core.py:68
+#: pyLoadCore.py:150
msgid "Downloadtime: %s"
-msgstr ""
+msgstr "Downloadtime: %s"
-#: Core.py:96
-msgid " added"
-msgstr ""
+#: pyLoadCore.py:179
+msgid "restarting pyLoad"
+msgstr "restarting pyLoad"
-#: Core.py:97
-msgid "created index of plugins"
-msgstr ""
+#: pyLoadCore.py:183
+msgid "pyLoad quits"
+msgstr "pyLoad quits"
-#: Core.py:119
-msgid "new update %s on pyload.org"
-msgstr ""
+#: pyLoadCore.py:194
+msgid "Secure XMLRPC Server Started"
+msgstr "Secure XMLRPC Server Started"
-#: Core.py:121
-msgid "newst version %s in use:"
-msgstr ""
+#: pyLoadCore.py:197
+msgid "Auth XMLRPC Server Started"
+msgstr "Auth XMLRPC Server Started"
-#: Core.py:123
-msgid "beta version %s in use:"
-msgstr ""
+#~ msgid "Failed starting socket server, CLI and GUI will not be available: %s"
+#~ msgstr ""
-#: Core.py:132
+#: pyLoadCore.py:272
msgid "%s created"
-msgstr ""
+msgstr "%s created"
-#: Core.py:194
-msgid "%i seconds"
-msgstr ""
+#: pyLoadCore.py:275
+msgid "could not find %s: %s"
+msgstr "could not find %s: %s"
-#: Core.py:222
-msgid "Server Mode"
-msgstr ""
+#: pyLoadCore.py:277
+msgid "could not create %s: %s"
+msgstr "could not create %s: %s"
+
+#: pyLoadCore.py:305
+msgid "%s added"
+msgstr "%s added"
+
+#: pyLoadCore.py:306
+msgid "created index of plugins"
+msgstr "created index of plugins"
+
+#: pyLoadCore.py:325
+msgid "shutting down..."
+msgstr "shutting down..."
+
+#: pyLoadCore.py:341
+msgid "No Updates for pyLoad"
+msgstr "No Updates for pyLoad"
+
+#: pyLoadCore.py:344
+msgid "New pyLoad Version %s available"
+msgstr "New pyLoad Version %s available"
+
+#: pyLoadCore.py:369
+msgid "Auto install Failed"
+msgstr "Auto install Failed"
+
+#: pyLoadCore.py:607
+msgid "killed pyLoad from Terminal"
+msgstr "killed pyLoad from Terminal"
+#: pyLoadCore.py:203
+msgid "Failed starting XMLRPC server, CLI and GUI will not be available: %s"
+msgstr "Failed starting XMLRPC server, CLI and GUI will not be available: %s"
diff --git a/locale/fr/fr.po b/locale/fr/fr.po
index fbe233952..1994499df 100644
--- a/locale/fr/fr.po
+++ b/locale/fr/fr.po
@@ -5,64 +5,201 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2009-06-04 15:33+CEST\n"
-"PO-Revision-Date: 2009-06-04 23:09+0100\n"
-"Last-Translator: spoob <spoob@gmx.de>\n"
+"POT-Creation-Date: 2010-02-02 21:54+CET\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
-#: Core.py:59
+
+#: module/download_thread.py:115
+msgid "Hoster unvailable, wait 60 seconds"
+msgstr ""
+
+#: module/download_thread.py:117
+msgid "Error getting error code: %s"
+msgstr ""
+
+#: module/download_thread.py:163
+msgid "Checksum ok ('%s')"
+msgstr ""
+
+#: module/download_thread.py:165
+msgid "Checksum not matched! ('%s')"
+msgstr ""
+
+#: module/download_thread.py:167
+msgid "Can't get checksum for %s"
+msgstr ""
+
+#: module/download_thread.py:169
+msgid "Checksum not implemented for %s"
+msgstr ""
+
+#: module/file_list.py:87
+msgid "Found %s links in linkcollector"
+msgstr ""
+
+#: module/file_list.py:89
+msgid "Found %s unqueued packages"
+msgstr ""
+
+#: module/file_list.py:91
+msgid "Added %s packages to queue"
+msgstr ""
+
+#: module/thread_list.py:88
+msgid "Get links from: %s"
+msgstr ""
+
+#: module/thread_list.py:90
+msgid "Download starts: %s"
+msgstr ""
+
+#: module/thread_list.py:136
+msgid "Parsed links from %s: %i"
+msgstr ""
+
+#: module/thread_list.py:138
+msgid "No links in %s"
+msgstr ""
+
+#: module/thread_list.py:145
+msgid "Download finished: %s"
+msgstr ""
+
+#: module/thread_list.py:151
+msgid "Download failed: %s | %s"
+msgstr ""
+
+#: module/thread_list.py:156
+msgid "Download aborted: %s"
+msgstr ""
+
+#: module/thread_list.py:206
+msgid "Starting reconnect"
+msgstr ""
+
+#: module/thread_list.py:220
+msgid "Reconnected, new IP: %s"
+msgstr ""
+
+#: pyLoadCore.py:111
+msgid "pycrypto to decode container files"
+msgstr ""
+
+#: pyLoadCore.py:112
+msgid "Python Image Libary (PIL) for captha reading"
+msgstr ""
+
+#: pyLoadCore.py:113
+msgid "pycurl for lower memory footprint while downloading"
+msgstr ""
+
+#: pyLoadCore.py:114
+msgid "Django for webinterface"
+msgstr ""
+
+#: pyLoadCore.py:115
+msgid "tesseract for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:116
+msgid "gocr for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:118
msgid "folder for logs"
-msgstr "Dossier pour des logs"
+msgstr ""
-#: Core.py:60
+#: pyLoadCore.py:119
msgid "folder for downloads"
-msgstr "Dossier téléchargement"
+msgstr ""
-#: Core.py:61
+#: pyLoadCore.py:120
msgid "file for links"
-msgstr "Fichier du lien hypertexte"
+msgstr ""
-#: Core.py:68
+#: pyLoadCore.py:121
+msgid "file for failed links"
+msgstr ""
+
+#: pyLoadCore.py:124
+msgid "OpenSSL for secure connection"
+msgstr ""
+
+#: pyLoadCore.py:125
+msgid "ssl certificate"
+msgstr ""
+
+#: pyLoadCore.py:126
+msgid "ssl key"
+msgstr ""
+
+#: pyLoadCore.py:150
msgid "Downloadtime: %s"
-msgstr "Temp du téléchargement: %s"
+msgstr ""
-#: Core.py:96
-msgid " added"
-msgstr "Ajouté."
+#: pyLoadCore.py:179
+msgid "restarting pyLoad"
+msgstr ""
-#: Core.py:97
-msgid "created index of plugins"
-msgstr "Un indice des Plugins a été créé."
+#: pyLoadCore.py:183
+msgid "pyLoad quits"
+msgstr ""
-#: Core.py:119
-msgid "new update %s on pyload.org"
-msgstr "Il y a un mise à jour - pyLoad %s - sur pyload.org"
+#: pyLoadCore.py:194
+msgid "Secure XMLRPC Server Started"
+msgstr ""
-#: Core.py:121
-msgid "newst version %s in use:"
-msgstr "Tu utilises la version %s."
+#: pyLoadCore.py:197
+msgid "Auth XMLRPC Server Started"
+msgstr ""
-#: Core.py:123
-msgid "beta version %s in use:"
-msgstr "Tu utilises pyLoad %s - une version beta."
+#: pyLoadCore.py:203
+msgid "Failed starting XMLRPC server, CLI and GUI will not be available: %s"
+msgstr ""
-#: Core.py:132
+#: pyLoadCore.py:272
msgid "%s created"
-msgstr "%s a été créé."
+msgstr ""
-#: Core.py:134
-msgid "could not create %s"
-msgstr "Il était impossible de créer %s."
+#: pyLoadCore.py:275
+msgid "could not find %s: %s"
+msgstr ""
-#: Core.py:194
-msgid "%i seconds"
-msgstr "%s secondes."
+#: pyLoadCore.py:277
+msgid "could not create %s: %s"
+msgstr ""
+
+#: pyLoadCore.py:305
+msgid "%s added"
+msgstr ""
-#: Core.py:222
-msgid "Server Mode"
-msgstr "Mode de Serveur."
+#: pyLoadCore.py:306
+msgid "created index of plugins"
+msgstr ""
+
+#: pyLoadCore.py:325
+msgid "shutting down..."
+msgstr ""
+
+#: pyLoadCore.py:341
+msgid "No Updates for pyLoad"
+msgstr ""
+
+#: pyLoadCore.py:344
+msgid "New pyLoad Version %s available"
+msgstr ""
+
+#: pyLoadCore.py:369
+msgid "Auto install Failed"
+msgstr ""
+
+#: pyLoadCore.py:607
+msgid "killed pyLoad from Terminal"
+msgstr ""
diff --git a/locale/messages.pot b/locale/messages.pot
index 87e646735..1994499df 100644
--- a/locale/messages.pot
+++ b/locale/messages.pot
@@ -4,65 +4,202 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: 0.1\n"
-"POT-Creation-Date: 2009-06-05 18:26+CEST\n"
-"PO-Revision-Date: 2009-06-05 18:28+0100\n"
-"Last-Translator: spoob <spoob@gmx.de>\n"
-"Language-Team: pyLoad <LL@li.org>\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2010-02-02 21:54+CET\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
-#: Core.py:59
+
+#: module/download_thread.py:115
+msgid "Hoster unvailable, wait 60 seconds"
+msgstr ""
+
+#: module/download_thread.py:117
+msgid "Error getting error code: %s"
+msgstr ""
+
+#: module/download_thread.py:163
+msgid "Checksum ok ('%s')"
+msgstr ""
+
+#: module/download_thread.py:165
+msgid "Checksum not matched! ('%s')"
+msgstr ""
+
+#: module/download_thread.py:167
+msgid "Can't get checksum for %s"
+msgstr ""
+
+#: module/download_thread.py:169
+msgid "Checksum not implemented for %s"
+msgstr ""
+
+#: module/file_list.py:87
+msgid "Found %s links in linkcollector"
+msgstr ""
+
+#: module/file_list.py:89
+msgid "Found %s unqueued packages"
+msgstr ""
+
+#: module/file_list.py:91
+msgid "Added %s packages to queue"
+msgstr ""
+
+#: module/thread_list.py:88
+msgid "Get links from: %s"
+msgstr ""
+
+#: module/thread_list.py:90
+msgid "Download starts: %s"
+msgstr ""
+
+#: module/thread_list.py:136
+msgid "Parsed links from %s: %i"
+msgstr ""
+
+#: module/thread_list.py:138
+msgid "No links in %s"
+msgstr ""
+
+#: module/thread_list.py:145
+msgid "Download finished: %s"
+msgstr ""
+
+#: module/thread_list.py:151
+msgid "Download failed: %s | %s"
+msgstr ""
+
+#: module/thread_list.py:156
+msgid "Download aborted: %s"
+msgstr ""
+
+#: module/thread_list.py:206
+msgid "Starting reconnect"
+msgstr ""
+
+#: module/thread_list.py:220
+msgid "Reconnected, new IP: %s"
+msgstr ""
+
+#: pyLoadCore.py:111
+msgid "pycrypto to decode container files"
+msgstr ""
+
+#: pyLoadCore.py:112
+msgid "Python Image Libary (PIL) for captha reading"
+msgstr ""
+
+#: pyLoadCore.py:113
+msgid "pycurl for lower memory footprint while downloading"
+msgstr ""
+
+#: pyLoadCore.py:114
+msgid "Django for webinterface"
+msgstr ""
+
+#: pyLoadCore.py:115
+msgid "tesseract for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:116
+msgid "gocr for captcha reading"
+msgstr ""
+
+#: pyLoadCore.py:118
msgid "folder for logs"
msgstr ""
-#: Core.py:60
+#: pyLoadCore.py:119
msgid "folder for downloads"
msgstr ""
-#: Core.py:61
+#: pyLoadCore.py:120
msgid "file for links"
msgstr ""
-#: Core.py:62
+#: pyLoadCore.py:121
msgid "file for failed links"
msgstr ""
-#: Core.py:68
+#: pyLoadCore.py:124
+msgid "OpenSSL for secure connection"
+msgstr ""
+
+#: pyLoadCore.py:125
+msgid "ssl certificate"
+msgstr ""
+
+#: pyLoadCore.py:126
+msgid "ssl key"
+msgstr ""
+
+#: pyLoadCore.py:150
msgid "Downloadtime: %s"
msgstr ""
-#: Core.py:96
-msgid " added"
+#: pyLoadCore.py:179
+msgid "restarting pyLoad"
msgstr ""
-#: Core.py:97
-msgid "created index of plugins"
+#: pyLoadCore.py:183
+msgid "pyLoad quits"
msgstr ""
-#: Core.py:119
-msgid "new update %s on pyload.org"
+#: pyLoadCore.py:194
+msgid "Secure XMLRPC Server Started"
msgstr ""
-#: Core.py:121
-msgid "newst version %s in use:"
+#: pyLoadCore.py:197
+msgid "Auth XMLRPC Server Started"
msgstr ""
-#: Core.py:123
-msgid "beta version %s in use:"
+#: pyLoadCore.py:203
+msgid "Failed starting XMLRPC server, CLI and GUI will not be available: %s"
msgstr ""
-#: Core.py:132
+#: pyLoadCore.py:272
msgid "%s created"
msgstr ""
-#: Core.py:194
-msgid "%i seconds"
+#: pyLoadCore.py:275
+msgid "could not find %s: %s"
+msgstr ""
+
+#: pyLoadCore.py:277
+msgid "could not create %s: %s"
+msgstr ""
+
+#: pyLoadCore.py:305
+msgid "%s added"
+msgstr ""
+
+#: pyLoadCore.py:306
+msgid "created index of plugins"
+msgstr ""
+
+#: pyLoadCore.py:325
+msgid "shutting down..."
+msgstr ""
+
+#: pyLoadCore.py:341
+msgid "No Updates for pyLoad"
+msgstr ""
+
+#: pyLoadCore.py:344
+msgid "New pyLoad Version %s available"
+msgstr ""
+
+#: pyLoadCore.py:369
+msgid "Auto install Failed"
msgstr ""
-#: Core.py:222
-msgid "Server Mode"
+#: pyLoadCore.py:607
+msgid "killed pyLoad from Terminal"
msgstr ""
diff --git a/module/PullEvents.py b/module/PullEvents.py
new file mode 100644
index 000000000..7b23cf8b8
--- /dev/null
+++ b/module/PullEvents.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+"""
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License,
+ or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+ @author: mkaay
+"""
+
+from time import time
+
+class PullManager():
+ def __init__(self, core):
+ self.core = core
+ self.clients = []
+
+ def newClient(self, uuid):
+ self.clients.append(Client(uuid))
+
+ def clean(self):
+ for n, client in enumerate(self.clients):
+ if client.lastActive + 30 < time():
+ del self.clients[n]
+
+ def getEvents(self, uuid):
+ events = []
+ validUuid = False
+ for client in self.clients:
+ if client.uuid == uuid:
+ client.lastActive = time()
+ validUuid = True
+ while client.newEvents():
+ events.append(client.popEvent().toList())
+ break
+ if not validUuid:
+ self.newClient(uuid)
+ events = [ReloadAllEvent("queue").toList(), ReloadAllEvent("packages").toList(), ReloadAllEvent("collector").toList()]
+ return events
+
+ def addEvent(self, event):
+ for client in self.clients:
+ client.addEvent(event)
+
+class Client():
+ def __init__(self, uuid):
+ self.uuid = uuid
+ self.lastActive = time()
+ self.events = []
+
+ def newEvents(self):
+ return (len(self.events) > 0)
+
+ def popEvent(self):
+ if not len(self.events):
+ return None
+ return self.events.pop(0)
+
+ def addEvent(self, event):
+ self.events.append(event)
+
+class UpdateEvent():
+ def __init__(self, itype, iid, destination):
+ assert itype == "pack" or itype == "file"
+ assert destination == "queue" or destination == "collector" or destination == "packages"
+ self.type = itype
+ self.id = iid
+ self.destination = destination
+
+ def toList(self):
+ return ["update", self.destination, self.type, self.id]
+
+class RemoveEvent():
+ def __init__(self, itype, iid, destination):
+ assert itype == "pack" or itype == "file"
+ assert destination == "queue" or destination == "collector" or destination == "packages"
+ self.type = itype
+ self.id = iid
+ self.destination = destination
+
+ def toList(self):
+ return ["remove", self.destination, self.type, self.id]
+
+class InsertEvent():
+ def __init__(self, itype, iid, after, destination):
+ assert itype == "pack" or itype == "file"
+ assert destination == "queue" or destination == "collector" or destination == "packages"
+ self.type = itype
+ self.id = iid
+ self.after = after
+ self.destination = destination
+
+ def toList(self):
+ return ["insert", self.destination, self.type, self.id, self.after]
+
+class ReloadAllEvent():
+ def __init__(self, destination):
+ assert destination == "queue" or destination == "collector" or destination == "packages"
+ self.destination = destination
+
+ def toList(self):
+ return ["reload", self.destination]
diff --git a/module/download_thread.py b/module/download_thread.py
index 4a031a04c..7c899b185 100644
--- a/module/download_thread.py
+++ b/module/download_thread.py
@@ -1,28 +1,33 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-#
-#Copyright (C) 2009 sp00b, sebnapi
-#
-#This program is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 3 of the License,
-#or (at your option) any later version.
-#
-#This program is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#See the GNU General Public License for more details.
-#
-#You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-###
+
+"""
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License,
+ or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+ @author: mkaay
+ @author: spoob
+ @author: sebnapi
+ @version: v0.3
+"""
+
import threading
import traceback
from os.path import join
from time import sleep, time
from module.network.Request import AbortDownload
+from module.PullEvents import UpdateEvent
class Status(object):
""" Saves all status information
@@ -107,15 +112,16 @@ class Download_Thread(threading.Thread):
code, msg = e
if code == 7:
sleep(60)
- self.parent.parent.logger.info("Hoster unvailable, wait 60 seconds")
+ self.parent.parent.logger.info(_("Hoster unvailable, wait 60 seconds"))
except Exception, f:
- self.parent.parent.logger.debug("Error getting error code: "+ str(f))
+ self.parent.parent.logger.debug(_("Error getting error code: %s") % f)
if self.parent.parent.config['general']['debug_mode']:
traceback.print_exc()
self.loadedPyFile.status.type = "failed"
self.loadedPyFile.status.error = str(e)
finally:
self.parent.job_finished(self.loadedPyFile)
+ self.parent.parent.pullManager.addEvent(UpdateEvent("file", self.loadedPyFile.id, "queue"))
else:
sleep(3)
sleep(0.8)
@@ -126,6 +132,7 @@ class Download_Thread(threading.Thread):
def download(self, pyfile):
status = pyfile.status
status.type = "starting"
+ self.parent.parent.pullManager.addEvent(UpdateEvent("file", pyfile.id, "queue"))
pyfile.init_download()
@@ -136,6 +143,7 @@ class Download_Thread(threading.Thread):
status.type = "decrypting"
else:
status.type = "downloading"
+ self.parent.parent.pullManager.addEvent(UpdateEvent("file", pyfile.id, "queue"))
location = join(pyfile.folder, status.filename)
pyfile.plugin.proceed(status.url, location)
@@ -152,13 +160,13 @@ class Download_Thread(threading.Thread):
20 - unknown error
"""
if code == 0:
- self.parent.parent.logger.info("Checksum ok ('%s')" % status.filename)
+ self.parent.parent.logger.info(_("Checksum ok ('%s')") % status.filename)
elif code == 1:
- self.parent.parent.logger.info("Checksum not matched! ('%s')" % status.filename)
+ self.parent.parent.logger.info(_("Checksum not matched! ('%s')") % status.filename)
elif code == 5:
- self.parent.parent.logger.debug("Can't get checksum for %s" % status.filename)
+ self.parent.parent.logger.debug(_("Can't get checksum for %s") % status.filename)
elif code == 10:
- self.parent.parent.logger.debug("Checksum not implemented for %s" % status.filename)
+ self.parent.parent.logger.debug(_("Checksum not implemented for %s") % status.filename)
if not check:
raise Checksum(code, location)
diff --git a/module/file_list.py b/module/file_list.py
index 7c68a7427..d251868b9 100644
--- a/module/file_list.py
+++ b/module/file_list.py
@@ -33,6 +33,8 @@ from operator import attrgetter
from os import sep
from time import sleep
+from module.PullEvents import UpdateEvent, RemoveEvent, InsertEvent
+
class NoSuchElementException(Exception):
pass
@@ -82,11 +84,11 @@ class File_List(object):
self.lock.release()
if len(self.data["collector"]) > 0:
- self.core.logger.info("Found %s links in linkcollector" % len(self.data["collector"]))
+ self.core.logger.info(_("Found %s links in linkcollector") % len(self.data["collector"]))
if len(self.data["packages"]) > 0:
- self.core.logger.info("Found %s unqueued packages" % len(self.data["packages"]))
+ self.core.logger.info(_("Found %s unqueued packages") % len(self.data["packages"]))
if len(self.data["queue"]) > 0:
- self.core.logger.info("Added %s packages to queue" % len(self.data["queue"]))
+ self.core.logger.info(_("Added %s packages to queue") % len(self.data["queue"]))
def save(self):
self.lock.acquire()
@@ -148,6 +150,10 @@ class File_List(object):
info["size"] = pyfile.status.size()
info["active"] = pyfile.active
info["plugin"] = pyfile.plugin.props['name']
+ try:
+ info["package"] = pypack.data["id"]
+ except:
+ pass
return info
def continueAborted(self):
@@ -194,6 +200,7 @@ class File_List(object):
try:
n, pyfile = collector._getFileFromID(id)
del collector.file_list.data["collector"][n]
+ collector.file_list.core.pullManager.addEvent(RemoveEvent("file", id, "collector"))
except Exception, e:
raise Exception, e
else:
@@ -211,6 +218,7 @@ class File_List(object):
collector.file_list.lock.acquire()
collector.file_list.data["collector"].append(pyfile)
collector.file_list.lock.release()
+ collector.file_list.core.pullManager.addEvent(InsertEvent("file", pyfile.id, -2, "collector"))
return pyfile.id
def removeFile(collector, id):
@@ -218,6 +226,7 @@ class File_List(object):
removes PyLoadFile instance with the given id from collector
"""
collector.popFile(id)
+ collector.file_list.core.pullManager.addEvent(RemoveEvent("file", id, "collector"))
def replaceFile(collector, newpyfile):
"""
@@ -227,6 +236,7 @@ class File_List(object):
try:
n, pyfile = collector._getFileFromID(newpyfile.id)
collector.file_list.data["collector"][n] = newpyfile
+ collector.file_list.core.pullManager.addEvent(UpdateEvent("file", newpyfile.id, "collector"))
finally:
collector.file_list.lock.release()
@@ -277,6 +287,7 @@ class File_List(object):
if package_name is not None:
pypack.data["package_name"] = package_name
packager.file_list.data["packages"].append(pypack)
+ packager.file_list.core.pullManager.addEvent(InsertEvent("pack", pypack.data["id"], -2, "packages"))
return pypack.data["id"]
def removePackage(packager, id):
@@ -287,6 +298,7 @@ class File_List(object):
pyfile.plugin.req.abort = True
sleep(0.1)
del packager.file_list.data[key][n]
+ packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, key))
finally:
packager.file_list.lock.release()
@@ -312,6 +324,8 @@ class File_List(object):
if key == "packages":
del packager.file_list.data["packages"][n]
packager.file_list.data["queue"].append(pypack)
+ packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, "packages"))
+ packager.file_list.core.pullManager.addEvent(InsertEvent("pack", id, -2, "queue"))
finally:
packager.file_list.lock.release()
@@ -322,6 +336,8 @@ class File_List(object):
if key == "queue":
del packager.file_list.data["queue"][n]
packager.file_list.data["packages"].append(pypack)
+ packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, "queue"))
+ packager.file_list.core.pullManager.addEvent(InsertEvent("pack", id, -2, "packages"))
finally:
packager.file_list.lock.release()
@@ -334,6 +350,7 @@ class File_List(object):
if folder is not None:
pypack.data["folder"] = folder
packager.file_list.data[key][n] = pypack
+ packager.file_list.core.pullManager.addEvent(UpdateEvent("pack", id, key))
finally:
packager.file_list.lock.release()
@@ -352,6 +369,7 @@ class File_List(object):
pyfile.package = pypack
pypack.files.append(pyfile)
packager.file_list.data[key][n] = pypack
+ packager.file_list.core.pullManager.addEvent(InsertEvent("file", pyfile.id, -2, key))
def resetFileStatus(packager, fileid):
packager.file_list.lock.acquire()
@@ -359,6 +377,7 @@ class File_List(object):
key, n, pyfile, pypack, pid = packager._getFileFromID(fileid)
pyfile.init()
pyfile.status.type = None
+ packager.file_list.core.pullManager.addEvent(UpdateEvent("file", fileid, key))
finally:
packager.file_list.lock.release()
@@ -367,15 +386,16 @@ class File_List(object):
try:
key, n, pyfile, pypack, pid = packager._getFileFromID(fileid)
pyfile.plugin.req.abort = True
+ packager.file_list.core.pullManager.addEvent(UpdateEvent("file", fileid, key))
finally:
packager.file_list.lock.release()
- #oooops, duplicate?
def removeFileFromPackage(packager, id, pid):
key, n, pypack = packager._getPackageFromID(pid)
for k, pyfile in enumerate(pypack.files):
if id == pyfile.id:
del pypack.files[k]
+ packager.file_list.core.pullManager.addEvent(RemoveEvent("file", pyfile.id, key))
if not pypack.files:
packager.removePackage(pid)
return True
diff --git a/module/gui/Collector.py b/module/gui/Collector.py
index 0aad5d1ba..ebdbd372d 100644
--- a/module/gui/Collector.py
+++ b/module/gui/Collector.py
@@ -27,7 +27,6 @@ class PackageCollector(QObject):
self.view = view
self.connector = connector
self.collector = []
- self.interval = 2
self.rootItem = self.view.invisibleRootItem()
self.mutex = QMutex()
item = self.PackageCollectorPack(self)
@@ -36,48 +35,82 @@ class PackageCollector(QObject):
item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
self.rootItem.addChild(item)
self.linkCollector = item
- self.pauseIDs = []
- self.updater = self.CollectorUpdater(self.interval)
- self.connect(self.updater, SIGNAL("update()"), self.update)
- class CollectorUpdater(QThread):
- def __init__(self, interval):
- QThread.__init__(self)
- self.interval = interval
- self.running = True
-
- def run(self):
- while self.running:
- self.emit(SIGNAL("update()"))
- self.sleep(self.interval)
-
- def start(self):
- self.updater.start()
-
- def wait(self):
- self.updater.wait()
-
- def stop(self):
- self.updater.running = False
-
- def update(self):
+ def fullReload(self):
locker = QMutexLocker(self.mutex)
+ self.clearAll()
packs = self.connector.getPackageCollector()
- ids = []
for data in packs:
- ids.append(data["id"])
- self.clear(ids)
- for data in packs:
- if data["id"] in self.pauseIDs:
- continue
- ids.append(data["id"])
- pack = self.getPack(data["id"])
- if not pack:
- pack = self.PackageCollectorPack(self)
+ pack = self.PackageCollectorPack(self)
pack.setPackData(data)
+ files = self.connector.getPackageFiles(data["id"])
+ for fid in files:
+ info = self.connector.getLinkInfo(fid)
+ child = self.PackageCollectorFile(self, pack)
+ child.setFileData(info)
+ pack.addPackChild(fid, child)
self.addPack(data["id"], pack)
+
+ def addEvent(self, event):
+ if event[0] == "reload":
+ self.fullReload()
+ elif event[0] == "remove":
+ self.removeEvent(event)
+ elif event[0] == "insert":
+ self.insertEvent(event)
+ elif event[0] == "update":
+ self.updateEvent(event)
+
+ def removeEvent(self, event):
+ if event[2] == "file":
+ for pack in ItemIterator(self.rootItem):
+ for k, child in enumerate(pack.getChildren()):
+ if child.getFileData()["id"] == event[3]:
+ pack.removeChild(child)
+ break
+ else:
+ for k, pack in enumerate(ItemIterator(self.rootItem)):
+ if pack.getPackData()["id"] == event[3]:
+ self.rootItem.removeChild(pack)
+ break
+
+ def insertEvent(self, event):
+ if event[2] == "file":
+ info = self.connector.getLinkInfo(event[3])
+ for pack in ItemIterator(self.rootItem):
+ if pack.getPackData()["id"] == info["package"]:
+ child = self.PackageCollectorFile(self, pack)
+ child.setFileData(info)
+ pack.addPackChild(info["id"], child)
+ break
+ else:
+ data = self.connector.getPackageInfo(event[3])
+ pack = self.PackageCollectorPack(self)
+ pack.setPackData(data)
+ self.addPack(data["id"], pack)
+ files = self.connector.getPackageFiles(data["id"])
+ for fid in files:
+ info = self.connector.getLinkInfo(fid)
+ child = self.PackageCollectorFile(self, pack)
+ child.setFileData(info)
+ pack.addPackChild(fid, child)
+ self.addPack(data["id"], pack)
+
+ def updateEvent(self, event):
+ if event[2] == "file":
+ info = self.connector.getLinkInfo(event[3])
+ if not info:
+ return
+ for pack in ItemIterator(self.rootItem):
+ if pack.getPackData()["id"] == info["package"]:
+ child = pack.getChild(event[3])
+ child.setFileData(info)
+ pack.addPackChild(info["id"], child)
+ else:
+ data = self.connector.getPackageInfo(event[3])
+ pack = self.getPack(event[3])
+ pack.setPackData(data)
files = self.connector.getPackageFiles(data["id"])
- pack.clear(files)
for fid in files:
info = self.connector.getLinkInfo(fid)
child = pack.getChild(fid)
@@ -85,6 +118,7 @@ class PackageCollector(QObject):
child = self.PackageCollectorFile(self, pack)
child.setFileData(info)
pack.addPackChild(fid, child)
+ self.addPack(data["id"], pack)
def addPack(self, pid, newPack):
pos = None
@@ -110,38 +144,10 @@ class PackageCollector(QObject):
return pack
return None
- def clear(self, ids):
- clear = False
- remove = []
+ def clearAll(self):
for k, pack in enumerate(ItemIterator(self.rootItem)):
- if not pack.getPackData()["id"] in ids and not pack.getPackData()["id"] == "fixed":
- clear = True
- remove.append(k)
- if not clear:
- return
- remove.sort()
- remove.reverse()
- for k in remove:
- self.rootItem.takeChild(k)
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == "fixed":
- return
- item = self.PackageCollectorPack(self)
- item.setPackData({"id":"fixed"})
- item.setData(0, Qt.DisplayRole, QVariant("Single Links"))
- item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
- self.rootItem.addChild(item)
- self.linkCollector = item
-
- def pauseItemUpdate(self, pid, pause=True):
- locker = QMutexLocker(self.mutex)
- if pause and not pid in self.pauseIDs:
- self.pauseIDs.append(int(pid))
- else:
- try:
- self.pauseIDs.remove(int(pid))
- except:
- pass
+ if not pack.getPackData()["id"] == "fixed":
+ self.rootItem.removeChild(pack)
class PackageCollectorPack(QTreeWidgetItem):
def __init__(self, collector):
@@ -184,25 +190,6 @@ class PackageCollector(QObject):
if item.getFileData()["id"] == cid:
return item
return None
-
- def clear(self, ids):
- clear = False
- remove = []
- children = []
- for k, file in enumerate(self.getChildren()):
- if not file.getFileData()["id"] in ids:
- remove.append(file.getFileData()["id"])
- if file.getFileData()["id"] in children and not file.getFileData()["id"] in remove:
- remove.append(file.getFileData()["id"])
- continue
- children.append(file.getFileData()["id"])
- if not remove:
- return
- remove.sort()
- remove.reverse()
- parent = self
- for k in remove:
- parent.takeChild(k)
class PackageCollectorFile(QTreeWidgetItem):
def __init__(self, collector, pack):
@@ -226,44 +213,52 @@ class LinkCollector(QObject):
QObject.__init__(self)
self.view = view
self.connector = connector
- self.interval = 2
self.rootItem = root
self.mutex = QMutex()
- self.updater = self.CollectorUpdater(self.interval)
- self.connect(self.updater, SIGNAL("update()"), self.update)
- class CollectorUpdater(QThread):
- def __init__(self, interval):
- QThread.__init__(self)
- self.interval = interval
- self.running = True
-
- def run(self):
- while self.running:
- self.emit(SIGNAL("update()"))
- self.sleep(self.interval)
-
- def start(self):
- self.updater.start()
-
- def wait(self):
- self.updater.wait()
-
- def stop(self):
- self.updater.running = False
-
- def update(self):
+ def fullReload(self):
locker = QMutexLocker(self.mutex)
+ self.clearAll()
ids = self.connector.getLinkCollector()
- self.clear(ids)
for fid in ids:
data = self.connector.getLinkInfo(fid)
- file = self.getFile(fid)
- if not file:
- file = self.LinkCollectorFile(self)
+ file = self.LinkCollectorFile(self)
file.setFileData(data)
self.addFile(fid, file)
+ def addEvent(self, event):
+ if event[0] == "reload":
+ self.fullReload()
+ elif event[0] == "remove":
+ self.removeEvent(event)
+ elif event[0] == "insert":
+ self.insertEvent(event)
+ elif event[0] == "update":
+ self.updateEvent(event)
+
+ def removeEvent(self, event):
+ if event[2] == "file":
+ for k, file in enumerate(ItemIterator(self.rootItem)):
+ if file.getFileData()["id"] == event[3]:
+ self.rootItem.removeChild(file)
+ break
+
+ def insertEvent(self, event):
+ if event[2] == "file":
+ data = self.connector.getLinkInfo(event[3])
+ file = self.LinkCollectorFile(self)
+ file.setFileData(data)
+ self.addFile(event[3], file)
+
+ def updateEvent(self, event):
+ if event[2] == "file":
+ data = self.connector.getLinkInfo(event[3])
+ if not data:
+ return
+ file = getFile(event[3])
+ file.setFileData(data)
+ self.addFile(event[3], file)
+
def addFile(self, pid, newFile):
pos = None
try:
@@ -289,16 +284,10 @@ class LinkCollector(QObject):
return file
return None
- def clear(self, ids):
- clear = False
- for file in ItemIterator(self.rootItem):
- if not file.getFileData()["id"] in ids:
- clear = True
- break
- if not clear:
- return
- self.rootItem.takeChildren()
-
+ def clearAll(self):
+ for k, file in enumerate(ItemIterator(self.rootItem)):
+ self.rootItem.removeChild(file)
+
class LinkCollectorFile(QTreeWidgetItem):
def __init__(self, collector):
QTreeWidgetItem.__init__(self)
diff --git a/module/gui/Queue.py b/module/gui/Queue.py
index 8681d3bb1..bd45e27dc 100644
--- a/module/gui/Queue.py
+++ b/module/gui/Queue.py
@@ -77,28 +77,103 @@ class Queue(QObject):
del d["name"]
del d["status"]
downloading[did] = d
- ids = []
- for data in packs:
- ids.append(data["id"])
- self.clear(ids)
+ for pack in ItemIterator(self.rootItem):
+ for child in pack.getChildren():
+ info = child.getFileData()
+ try:
+ info["downloading"] = downloading[info["id"]]
+ except:
+ info["downloading"] = None
+ child.setFileData(info)
+ pack.addPackChild(info["id"], child)
+ self.addPack(pack.getPackData()["id"], pack)
+
+ def fullReload(self):
+ self.clearAll()
+ packs = self.connector.getPackageQueue()
for data in packs:
- pack = self.getPack(data["id"])
- if not pack:
- pack = self.QueuePack(self)
+ pack = self.QueuePack(self)
pack.setPackData(data)
files = self.connector.getPackageFiles(data["id"])
- pack.clear(files)
+ for fid in files:
+ info = self.connector.getLinkInfo(fid)
+ child = self.QueueFile(self, pack)
+ if not info["status_type"]:
+ info["status_type"] = "queued"
+ child.setFileData(info)
+ pack.addPackChild(fid, child)
self.addPack(data["id"], pack)
+
+ def addEvent(self, event):
+ locker = QMutexLocker(self.mutex)
+ if event[0] == "reload":
+ self.fullReload()
+ elif event[0] == "remove":
+ self.removeEvent(event)
+ elif event[0] == "insert":
+ self.insertEvent(event)
+ elif event[0] == "update":
+ self.updateEvent(event)
+
+ def removeEvent(self, event):
+ if event[2] == "file":
+ for pack in ItemIterator(self.rootItem):
+ for k, child in enumerate(pack.getChildren()):
+ if child.getFileData()["id"] == event[3]:
+ pack.removeChild(child)
+ break
+ else:
+ for k, pack in enumerate(ItemIterator(self.rootItem)):
+ if pack.getPackData()["id"] == event[3]:
+ self.rootItem.removeChild(pack)
+ break
+
+ def insertEvent(self, event):
+ if event[2] == "file":
+ info = self.connector.getLinkInfo(event[3])
+ for pack in ItemIterator(self.rootItem):
+ if pack.getPackData()["id"] == info["package"]:
+ child = self.QueueFile(self, pack)
+ child.setFileData(info)
+ pack.addPackChild(info["id"], child)
+ break
+ else:
+ data = self.connector.getPackageInfo(event[3])
+ pack = self.QueuePack(self)
+ pack.setPackData(data)
+ self.addPack(data["id"], pack)
+ files = self.connector.getPackageFiles(data["id"])
+ for fid in files:
+ info = self.connector.getLinkInfo(fid)
+ child = self.QueueFile(self, pack)
+ if not info["status_type"]:
+ info["status_type"] = "queued"
+ child.setFileData(info)
+ pack.addPackChild(fid, child)
+ self.addPack(data["id"], pack)
+
+ def updateEvent(self, event):
+ if event[2] == "file":
+ info = self.connector.getLinkInfo(event[3])
+ if not info:
+ return
+ for pack in ItemIterator(self.rootItem):
+ if pack.getPackData()["id"] == info["package"]:
+ child = pack.getChild(event[3])
+ if not info["status_type"]:
+ info["status_type"] = "queued"
+ child.setFileData(info)
+ pack.addPackChild(info["id"], child)
+ else:
+ data = self.connector.getPackageInfo(event[3])
+ pack = self.getPack(event[3])
+ pack.setPackData(data)
+ files = self.connector.getPackageFiles(data["id"])
for fid in files:
info = self.connector.getLinkInfo(fid)
child = pack.getChild(fid)
if not child:
child = self.QueueFile(self, pack)
- info["downloading"] = None
- try:
- info["downloading"] = downloading[info["id"]]
- except:
- pass
if not info["status_type"]:
info["status_type"] = "queued"
child.setFileData(info)
@@ -145,19 +220,9 @@ class Queue(QObject):
return pack
return None
- def clear(self, ids):
- clear = False
- remove = []
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if not pack.getPackData()["id"] in ids:
- clear = True
- remove.append(k)
- if not clear:
- return
- remove.sort()
- remove.reverse()
- for k in remove:
- self.rootItem.takeChild(k)
+ def clearAll(self):
+ for pack in ItemIterator(self.rootItem):
+ self.rootItem.removeChild(pack)
def getWaitingProgress(self, q):
locker = QMutexLocker(self.mutex)
@@ -282,24 +347,6 @@ class Queue(QObject):
if item.getFileData()["id"] == cid:
return item
return None
-
- def clear(self, ids):
- clear = False
- remove = []
- children = []
- for k, file in enumerate(self.getChildren()):
- if not file.getFileData()["id"] in ids:
- remove.append(file.getFileData()["id"])
- if file.getFileData()["id"] in children and not file.getFileData()["id"] in remove:
- remove.append(file.getFileData()["id"])
- continue
- children.append(file.getFileData()["id"])
- if not remove:
- return
- remove.sort()
- remove.reverse()
- for k in remove:
- self.takeChild(k)
class QueueFile(QTreeWidgetItem):
def __init__(self, queue, pack):
diff --git a/module/gui/connector.py b/module/gui/connector.py
index 432999161..b6c383956 100644
--- a/module/gui/connector.py
+++ b/module/gui/connector.py
@@ -19,6 +19,7 @@
SERVER_VERSION = "0.3"
from time import sleep
+from uuid import uuid4 as uuid
from PyQt4.QtCore import *
from PyQt4.QtGui import *
@@ -35,6 +36,7 @@ class connector(QThread):
self.running = True
self.proxy = None
self.addr = None
+ self.connectionID = None
self.errorQueue = []
self.connect(self, SIGNAL("proxy_error"), self._proxyError)
@@ -72,6 +74,7 @@ class connector(QThread):
self.proxy = ServerProxy(addr, allow_none=True)
try:
server_version = self.proxy.get_server_version()
+ self.connectionID = uuid().hex
except:
return False
if not server_version == SERVER_VERSION:
@@ -124,9 +127,12 @@ class connector(QThread):
"""
self.mutex.lock()
try:
- return self.proxy.get_file_info(id)
+ info = self.proxy.get_file_info(id)
+ info["downloading"] = None
+ return info
except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getLinkInfo", e)
+ #self.emit(SIGNAL("proxy_error"), "getLinkInfo", e)
+ return None
finally:
self.mutex.unlock()
@@ -421,4 +427,16 @@ class connector(QThread):
self.emit(SIGNAL("proxy_error"), "setCaptchaResult", e)
finally:
self.mutex.unlock()
+
+ def getEvents(self):
+ """
+ get events
+ """
+ self.mutex.lock()
+ try:
+ return self.proxy.get_events(self.connectionID)
+ except Exception, e:
+ self.emit(SIGNAL("proxy_error"), "getEvents", e)
+ finally:
+ self.mutex.unlock()
diff --git a/module/plugins/container/CCF.py b/module/plugins/container/CCF.py
index 88b567904..12728d022 100644
--- a/module/plugins/container/CCF.py
+++ b/module/plugins/container/CCF.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
import os.path
-import random
import re
import tempfile
import urllib2
@@ -36,20 +35,11 @@ class CCF(Plugin):
"upload": open(infile, "rb")}
tempdlc_content = opener.open('http://service.jdownloader.net/dlcrypt/getDLC.php', params).read()
- random.seed()
- tempdir = tempfile.gettempdir()
- if tempdir[0] == '/':
- delim = '/'
- else:
- delim = '\\'
- tempdlc_name = tempdir + delim + str(random.randint(0, 100)) + '-tmp.dlc'
- while os.path.exists(tempdlc_name):
- tempdlc_name = tempfile.gettempdir() + '/' + str(random.randint(0, 100)) + '-tmp.dlc'
-
- tempdlc = open(tempdlc_name, "w")
+ tempdlc = tempfile.NamedTemporaryFile(delete=False, suffix='.dlc')
tempdlc.write(re.search(r'<dlc>(.*)</dlc>', tempdlc_content, re.DOTALL).group(1))
- tempdlc.close
+ tempdlc.close()
- self.links.append(tempdlc_name)
+ self.links.append(tempdlc.name)
return True
+
diff --git a/module/plugins/decrypter/SerienjunkiesOrg.py b/module/plugins/decrypter/SerienjunkiesOrg.py
index af7dc8169..d8396bd0b 100644
--- a/module/plugins/decrypter/SerienjunkiesOrg.py
+++ b/module/plugins/decrypter/SerienjunkiesOrg.py
@@ -5,6 +5,7 @@ import re
from module.Plugin import Plugin
from module.BeautifulSoup import BeautifulSoup
from module.unescape import unescape
+from module.download_thread import CaptchaError
class SerienjunkiesOrg(Plugin):
def __init__(self, parent):
diff --git a/module/thread_list.py b/module/thread_list.py
index 1a66bf6f5..a50d73aaf 100644
--- a/module/thread_list.py
+++ b/module/thread_list.py
@@ -1,22 +1,27 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-#
-#Copyright (C) 2009 sp00b, sebnapi, RaNaN
-#
-#This program is free software; you can redistribute it and/or modify
-#it under the terms of the GNU General Public License as published by
-#the Free Software Foundation; either version 3 of the License,
-#or (at your option) any later version.
-#
-#This program is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#See the GNU General Public License for more details.
-#
-#You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-###
+
+"""
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License,
+ or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+ @author: mkaay
+ @author: spoob
+ @author: sebnapi
+ @author: RaNaN
+ @version: v0.3
+"""
+
from __future__ import with_statement
from os.path import exists
import re
@@ -80,9 +85,9 @@ class Thread_List(object):
self.occ_plugins.append(pyfile.modul.__name__)
pyfile.active = True
if pyfile.plugin.props['type'] == "container":
- self.parent.logger.info('Get links from: ' + pyfile.url)
+ self.parent.logger.info(_("Get links from: %s") % pyfile.url)
else:
- self.parent.logger.info('Download starts: ' + pyfile.url)
+ self.parent.logger.info(_("Download starts: %s") % pyfile.url)
self.lock.release()
return pyfile
@@ -128,27 +133,27 @@ class Thread_List(object):
self.list.packager.removeFileFromPackage(pyfile.id, pyfile.package.data["id"])
if newLinks:
- self.parent.logger.info("Parsed links from %s: %i" % (pyfile.status.filename, newLinks))
+ self.parent.logger.info(_("Parsed links from %s: %i") % (pyfile.status.filename, newLinks))
else:
- self.parent.logger.info("No links in %s" % pyfile.status.filename)
+ self.parent.logger.info(_("No links in %s") % pyfile.status.filename)
#~ self.list.packager.removeFileFromPackage(pyfile.id, pyfile.package.id)
#~ for link in pyfile.plugin.links:
#~ id = self.list.collector.addLink(link)
#~ pyfile.packager.pullOutPackage(pyfile.package.id)
#~ pyfile.packager.addFileToPackage(pyfile.package.id, pyfile.collector.popFile(id))
else:
- self.parent.logger.info("Download finished: %s" % pyfile.url)
+ self.parent.logger.info(_("Download finished: %s") % pyfile.url)
elif pyfile.status.type == "reconnected":
pyfile.plugin.req.init_curl()
elif pyfile.status.type == "failed":
- self.parent.logger.warning("Download failed: " + pyfile.url + " | " + pyfile.status.error)
+ self.parent.logger.warning(_("Download failed: %s | %s") % (pyfile.url, pyfile.status.error))
with open(self.parent.config['general']['failed_file'], 'a') as f:
f.write(pyfile.url + "\n")
elif pyfile.status.type == "aborted":
- self.parent.logger.info("Download aborted: " + pyfile.url)
+ self.parent.logger.info(_("Download aborted: %s") % pyfile.url)
self.list.save()
@@ -198,7 +203,7 @@ class Thread_List(object):
return False
def reconnect(self):
- self.parent.logger.info("Start reconnect")
+ self.parent.logger.info(_("Starting reconnect"))
ip = re.match(".*Current IP Address: (.*)</body>.*", urllib2.urlopen("http://checkip.dyndns.org/").read()).group(1)
self.parent.hookManager.beforeReconnecting(ip)
reconn = subprocess.Popen(self.parent.config['reconnect']['method'])#, stdout=subprocess.PIPE)
@@ -212,7 +217,7 @@ class Thread_List(object):
ip = ""
time.sleep(1)
self.parent.hookManager.afterReconnecting(ip)
- self.parent.logger.info("Reconnected, new IP: " + ip)
+ self.parent.logger.info(_("Reconnected, new IP: %s") % ip)
def stopAllDownloads(self):
self.pause = True
diff --git a/pyLoadCore.py b/pyLoadCore.py
index 0682cc873..1047273d6 100755
--- a/pyLoadCore.py
+++ b/pyLoadCore.py
@@ -59,6 +59,7 @@ from module.network.Request import Request
import module.remote.SecureXMLRPCServer as Server
from module.thread_list import Thread_List
from module.web.ServerThread import WebServer
+from module.PullEvents import PullManager
class Core(object):
""" pyLoad Core """
@@ -107,12 +108,12 @@ class Core(object):
translation = gettext.translation("pyLoad", join(self.path, "locale"), languages=[self.config['general']['language']])
translation.install(unicode=True)
- self.check_install("Crypto", "pycrypto to decode container files")
- self.check_install("Image", "Python Image Libary (PIL) for captha reading")
- self.check_install("pycurl", "pycurl for lower memory footprint while downloading")
- self.check_install("django", "Django for webinterface")
- self.check_install("tesseract", "tesseract for captcha reading", False)
- self.check_install("gocr", "gocr for captcha reading", False)
+ self.check_install("Crypto", _("pycrypto to decode container files"))
+ self.check_install("Image", _("Python Image Libary (PIL) for captha reading"))
+ self.check_install("pycurl", _("pycurl for lower memory footprint while downloading"))
+ self.check_install("django", _("Django for webinterface"))
+ self.check_install("tesseract", _("tesseract for captcha reading"), False)
+ self.check_install("gocr", _("gocr for captcha reading"), False)
self.check_file(self.config['log']['log_folder'], _("folder for logs"), True)
self.check_file(self.config['general']['download_folder'], _("folder for downloads"), True)
@@ -120,7 +121,7 @@ class Core(object):
self.check_file(self.config['general']['failed_file'], _("file for failed links"))
if self.config['ssl']['activated']:
- self.check_install("OpenSSL", "OpenSSL for secure connection", True)
+ self.check_install("OpenSSL", _("OpenSSL for secure connection"), True)
self.check_file(self.config['ssl']['cert'], _("ssl certificate"), False, True)
self.check_file(self.config['ssl']['key'], _("ssl key"), False, True)
@@ -138,7 +139,8 @@ class Core(object):
self.lastGuiConnected = 0
self.server_methods = ServerMethods(self)
- self.file_list = File_List(self)
+ self.file_list = File_List(self)
+ self.pullManager = PullManager(self)
self.thread_list = Thread_List(self)
self.captchaManager = CaptchaManager(self)
@@ -174,11 +176,11 @@ class Core(object):
while True:
sleep(2)
if self.do_restart:
- self.logger.info("restarting pyLoad")
+ self.logger.info(_("restarting pyLoad"))
self.restart()
if self.do_kill:
self.shutdown()
- self.logger.info("pyLoad quits")
+ self.logger.info(_("pyLoad quits"))
exit()
if self.last_update_check + self.update_check_interval <= time.time():
self.update_available = self.check_update()
@@ -189,16 +191,16 @@ class Core(object):
usermap = {self.config['remote']['username']: self.config['remote']['password']}
if self.config['ssl']['activated']:
self.server = Server.SecureXMLRPCServer(server_addr, self.config['ssl']['cert'], self.config['ssl']['key'], usermap)
- self.logger.info("Secure XMLRPC Server Started")
+ self.logger.info(_("Secure XMLRPC Server Started"))
else:
self.server = Server.AuthXMLRPCServer(server_addr, usermap)
- self.logger.info("Auth XMLRPC Server Started")
+ self.logger.info(_("Auth XMLRPC Server Started"))
self.server.register_instance(self.server_methods)
thread.start_new_thread(self.server.serve_forever, ())
except Exception, e:
- self.logger.error("Failed starting socket server, CLI and GUI will not be available: %s" % str(e))
+ self.logger.error(_("Failed starting XMLRPC server CLI and GUI will not be available: %s") % str(e))
if self.config['general']['debug_mode']:
import traceback
traceback.print_exc()
@@ -300,7 +302,7 @@ class Core(object):
break
if plugin_pattern != "":
self.plugins_avaible[plugin_file] = plugin_pattern
- self.logger.debug(plugin_file + _(" added"))
+ self.logger.debug(_("%s added") % plugin_file)
self.logger.info(_("created index of plugins"))
def compare_time(self, start, end):
@@ -320,7 +322,7 @@ class Core(object):
return self.downloadSpeedLimit
def shutdown(self):
- self.logger.info("shutting down...")
+ self.logger.info(_("shutting down..."))
if self.config['webinterface']['activated']:
self.webserver.quit()
self.webserver.join()
@@ -336,10 +338,10 @@ class Core(object):
if self.config['updates']['search_updates']:
version_check = Request().load("http://get.pyload.org/check/%s/" % (CURRENT_VERSION, ))
if version_check == "":
- self.logger.info("No Updates for pyLoad")
+ self.logger.info(_("No Updates for pyLoad"))
return False
else:
- self.logger.info("New pyLoad Version %s available" % version_check)
+ self.logger.info(_("New pyLoad Version %s available") % version_check)
return True
else:
return False
@@ -364,7 +366,7 @@ class Core(object):
__import__("module.Unzip", globals(), locals(), "Unzip", -1).Unzip().extract(tmp_zip_name, "Test/")
return True
except:
- self.logger.info("Auto install Failed")
+ self.logger.info(_("Auto install Failed"))
return False
else:
return False
@@ -571,7 +573,10 @@ class ServerMethods():
return True
else:
return False
-
+
+ def get_events(self, uuid):
+ return self.core.pullManager.getEvents(uuid)
+
#def move_urls_up(self, ids):
# for id in ids:
# self.core.file_list.move(id)
@@ -599,5 +604,5 @@ if __name__ == "__main__":
pyload_core.start()
except KeyboardInterrupt:
pyload_core.shutdown()
- pyload_core.logger.info("killed pyLoad from Terminal")
+ pyload_core.logger.info(_("killed pyLoad from Terminal"))
exit()
diff --git a/pyLoadGui.py b/pyLoadGui.py
index 9e04cc003..c3deb9a6e 100755
--- a/pyLoadGui.py
+++ b/pyLoadGui.py
@@ -87,7 +87,6 @@ class main(QObject):
self.mainloop.start()
self.clipboard = self.app.clipboard()
self.connect(self.clipboard, SIGNAL('dataChanged()'), self.slotClipboardChange)
- self.connect(self.mainWindow, SIGNAL("pauseItemUpdate"), self.packageCollector.pauseItemUpdate)
self.mainWindow.actions["clipboard"].setChecked(self.checkClipboard)
def stopMain(self):
@@ -106,8 +105,6 @@ class main(QObject):
self.mainloop.wait()
self.connector.wait()
self.queue.wait()
- self.linkCollector.wait()
- self.packageCollector.wait()
def connectSignals(self):
"""
@@ -216,7 +213,6 @@ class main(QObject):
view.setDragDropOverwriteMode(True)
self.connect(view, SIGNAL("droppedToPack"), self.slotAddFileToPackage)
self.packageCollector = PackageCollector(view, self.connector)
- self.packageCollector.start()
def initLinkCollector(self):
"""
@@ -224,7 +220,6 @@ class main(QObject):
* refresh thread
"""
self.linkCollector = LinkCollector(self.mainWindow.tabs["collector"]["package_view"], self.packageCollector.linkCollector, self.connector)
- self.linkCollector.start()
def initQueue(self):
"""
@@ -579,6 +574,16 @@ class main(QObject):
def slotCaptchaDone(self, cid, result):
self.connector.setCaptchaResult(str(cid), str(result))
+ def pullEvents(self):
+ events = self.connector.getEvents()
+ for event in events:
+ if event[1] == "queue":
+ self.queue.addEvent(event)
+ elif event[1] == "packages":
+ self.packageCollector.addEvent(event)
+ elif event[1] == "collector":
+ self.linkCollector.addEvent(event)
+
class Loop(QThread):
"""
main loop (not application loop)
@@ -602,6 +607,7 @@ class main(QObject):
self.parent.refreshLog()
self.parent.updateAvailable()
self.parent.checkCaptcha()
+ self.parent.pullEvents()
def stop(self):
self.running = False
diff --git a/systemCheck.py b/systemCheck.py
new file mode 100644
index 000000000..7227bc674
--- /dev/null
+++ b/systemCheck.py
@@ -0,0 +1,158 @@
+import os
+from os.path import dirname
+from os.path import exists
+from os.path import join
+import subprocess
+import sys
+
+def main():
+ print "##### System Information #####"
+ print ""
+ print "Platform:", sys.platform
+ print "Operating System:", os.name
+ print "Python:", sys.version.replace("\n", "")
+ print os.uname()
+ print ""
+
+ try:
+ import pycurl
+ print "pycurl:", pycurl.version
+ except:
+ print "pycurl:", "missing"
+
+ try:
+ import Crypto
+ print "py-crypto:", Crypto.__version__
+ except:
+ print "py-crypto:", "missing"
+
+
+ try:
+ import OpenSSL
+ print "OpenSSL:", OpenSSL.version.__version__
+ except:
+ print "OpenSSL:", "missing"
+
+ try:
+ import Image
+ print "image libary:", Image.VERSION
+ except:
+ print "image libary:", "missing"
+
+ try:
+ import django
+ print "django:", django.get_version()
+ except:
+ print "django:", "missing"
+
+ try:
+ import PyQt4
+ print "pyqt:", "4"
+ except:
+ print "pyqt:", "missing"
+
+ print ""
+ print ""
+ print "##### System Status #####"
+ print ""
+ print "## pyLoadCore ##"
+
+ core_err = []
+
+ if sys.version_info > (2, 7):
+ core_err.append("Your python version is to new, Please use Python 2.6")
+
+ if sys.version_info < (2, 5):
+ core_err.append("Your python version is to old, Please use at least Python 2.5")
+
+ try:
+ import pycurl
+ except:
+ core_err.append("Please install py-curl to use pyLoad.")
+
+ try:
+ import Image
+ except:
+ core_err.append("Please install py-imaging/pil to use Hoster, which uses captchas.")
+
+
+ pipe = subprocess.PIPE
+ try:
+ p = subprocess.call(["tesseract"], stdout=pipe, stderr=pipe)
+ except:
+ core_err.append("Please install tesseract to use Hoster, which uses captchas.")
+
+ try:
+ p = subprocess.call(["gocr"], stdout=pipe, stderr=pipe)
+ except:
+ core_err.append("Install gocr to use some Hoster, which uses captchas.")
+
+ try:
+ import OpenSSL
+ except:
+ core_err.append("Install OpenSSL if you want to create a secure connection to the core.")
+
+
+
+ if core_err:
+ print "The system check has detected some errors:"
+ print ""
+ for err in core_err:
+ print err
+ else:
+ print "No Problems detected, pyLoadCore should work fine."
+
+
+ print ""
+ print "## pyLoadGui ##"
+
+ gui_err = []
+
+ try:
+ import PyQt4
+ except:
+ gui_err.append("GUI won't work without pyqt4 !!")
+
+
+ if gui_err:
+ print "The system check has detected some errors:"
+ print ""
+ for err in gui_err:
+ print err
+ else:
+ print "No Problems detected, pyLoadGui should work fine."
+
+ print ""
+ print "## Webinterface ##"
+
+ web_err = []
+
+ try:
+ import django
+
+ if django.VERSION < (1, 1):
+ web_err.append("Your django version is to old, please upgrade to django 1.1")
+ elif django.VERSION > (1, 2):
+ web_err.append("Your django version is to new, please use django 1.1")
+
+ except:
+ web_err.append("Webinterface won't work without django !!")
+
+
+
+ if not exists(join(dirname(__file__), "module", "web", "pyload.db")):
+ web_err.append("You dont have created database yet.")
+ web_err.append("Please run: python %s syncdb" % join(dirname(__file__), "module", "web", "manage.py"))
+
+
+
+ if web_err:
+ print "The system check has detected some errors:"
+ print ""
+ for err in web_err:
+ print err
+ else:
+ print "No Problems detected, Webinterface should work fine."
+
+if __name__ == "__main__":
+ main() \ No newline at end of file